第 6 章 コマンドとマークアップ 79
6.5 相互参照
6
宣言型コマンド 使用してからそれ以降ずっと有効なコマンド.環境型のコマンドに使わ れたり,単独で使われる.
命令型コマンド 使用した場所で有効なコマンド.通常は引数に与えられたものを処理 する.
の二つがあることになります.
例として命令型の
\textsf
と宣言型の\sffamily
を考えてみましょう.命令型の場 合はRoman. \textsf{Roman? \par This is sans serif family.} Roman!
のような使い方はできませんが,宣言型ならば新規に
sffont
環境を定義できます.\newenvironment{sffont}{\sffamily}{}
Roman.
\begin{sffont}
Roman? \par This is sans serif family.
\end{sffont}
Roman!
Roman. Roman?
This is sans serif family. Roman!
宣言型のコマンドはそれ以降ずっと有効なので有効範囲を決めてあげます.
\sffamily
などの書体を変更するコマンドはグルーピングする必要があります.Roman! {\sffamily sans serif family.}
Roman! Roman!sans serif family.Roman!
今まで使ってきた
\begin{
h何々i}
と\end{
h何々i}
というコマンドは,このグルーピン グの作業をやってくれているのです.補足的なことですが\begin{<何々>} <要素> \end{<何々>}
というのは
L
ATEX
の中で{\何々 <始めの処理> <要素> <終わりの処理>}
に変換されるので
\sffamily
のような宣言も Roman?\begin{sffamily}
This is sans serif family.
\end{sffamily}
Roman!
Roman? This is sans serif family. Roman!
とできます.こうすると特に長い文章が読みやすくなります.
6.5 相互参照
文章の論理構造を明確にしてくれるものの一つに相互参照があります.相互参照の仕方 は参照したいものにラベルを貼り,挿入したい場所でラベルを参照するという二つの作業 に分けられます.相互参照できる項目は以下の四つ程に限られています.
• 章節命令 (
\section
命令など)• 番号付き数式 (
equation
環境など)•
float
環境の要素(図や表など)•
enumerate
環境内の個々の項目要は通し番号のついているものには付けても良いようです.ラベルは単純に貼りたいもの に
\label
命令でh参照したい要素i
\label{
hラベル名i}
のようにします.参照の仕方にはその番号を参照する
\ref
とページを参照する\pageref
の2
通りがあります.\ref{
hラベルi}
(通し番号)\pageref{
hラベルi}
(ページ番号)参照の仕方は以下のようになります.通し番号を参照する
\ref
命令は\section
命令の ようなものを参照するときに非常に便利です.%\section{相互参照}\label{sec:xr}
詳しくは\pageref{sec:xr}~ページの
\ref{sec:xr}~節で述べているのでそ ちらを参照されたい.
詳しくは91ページの6.5節で述べているのでそちらを 参照されたい.
相互参照や目次を作成しているときはタイプセットを
3
回程行う必要があります.ラベ ルの名前が重複しないように工夫することも必要です.6.5.1 相互参照の仕組み
節(見出し)や図表には通し番号付けます.これは同じ名前の節(見出し)が同じペー ジに存在しても区別できるという利点があります.そして節(見出し)を参照するときは その番号を示します.このような機能を実現するために
L
ATEX
ではカウンタを使います.ユーザーが特にこのことを意識しなくても半自動的に番号付けなどをやってくれます.一 応さわり程度にはその仕組みを説明します.
相互参照する対象が通し番号ですので,節なら節などの要素に応じたカウンタがあらか じめ用意されています.
L
ATEX
では表6.2
の通りにあらかじめ定義されているカウンタが あります.カウンタは「素の番号」と実際に出力すべき「表示用の番号」と「参照用の文 字列」の三つの要素を持っています.例えば\newcounter{section}[chapter]
というのは
\newcount\c@section %素の番号用
\def\thesection{\thechapter.\c@section}%表示用
\def\p@section{\thechapter.\c@section}%参照用
好き好き
L
ATEX 2
ε初級編6.5
相互参照6
表6.2 あらかじめ定義されているカウンタ名 カウンタ名 割り当て
part
部見出しchapter
章見出しsection
節見出しsubsection
小節見出しsubsubsection
少少節見出しparagraph
段落見出しsubparagraph
小段落見出しpage
ページ番号equation
式番号figure
図見出しtable
表見出しfootnote
脚注番号mpfootnote minipage
環境中の脚注番号enumi
一つ目の階層のenumerate
環境の番号enumii
二つ目の階層のenumerate
環境の番号enumiii
三つ目の階層のenumerate
環境の番号enumiv
四つ目の階層のenumerate
環境の番号などの処理と同じことになります.
\newcounter
とは新しいカウンタを定義するための 命令です.\label{hoge}, \ref{hoge}
としたときの動作を実際に見るのが早いと思います.ファイル名を
hoge.tex
として\documentclass{jsarticle}
\begin{document}
\newcounter{hoge} \thehoge
\refstepcounter{hoge} \thehoge
\end{document}
というファイルを作成し,
1
回だけタイプセットしてください.ここで\refstepcounter
はカウンタの値を一つ増やす命令で\thehoge
はカウンタhoge
の値を表示するための命 令だと思ってください.結果として端末にはNo file hoge.aux というメッセージが表示 されるはずです.この段階でhoge.aux
をmore
かless
コマンドで見ると\relax
としか出力されていません.
\refstepcounter
命令だけでは参照できる状態にはないよ うです.次に\refstepcounter{hoge} \thehoge
の
1
行に対して\refstepcounter{hoge} \thehoge \label{cnt:hoge}
のように書き足して
1
回だけタイプセットを行ってください.すると端末には Label(s) may have changed. Return to get cross-ferecenses right.という
L
ATEX
の警告が表示されます.ラベルが変更されたと思われるので解消しなさい と言われています.ここでhoge.aux
を見ると\relax
\newlabel{cnt:hoge}{{1}{1}}
という新しい情報が出力されています.これで
cnt:hoge
という名前のラベルを参照する 準備ができていることが分かります.\newcounter{hoge} \thehoge
\refstepcounter{hoge} \thehoge \label{cnt:hoge}
という
2
行に対してref=\ref{cnt:hoge}, page=\pageref{cnt:hoge}
の
1
行 を 付 け 足 し て1
回 だ け タ イ プ セ ッ ト す る と 端 末 に 警 告 は 表 示 さ れ ま せ ん .hoge.aux
の内容も変わっていません.さて,ここでL
ATEX
に意地悪をして\setcounter{page}{100}
\newcounter{hoge} \thehoge
\refstepcounter{hoge} \thehoge \label{cnt:hoge}
ref=\ref{cnt:hoge}, page=\pageref{cnt:hoge}
として,ページ番号を
‘100’
にしてから1
回だけタイプセットするとどうなるでしょう か.再び端末にはLabel(s) may have changed. Return to get cross-ferecenses right.
という警告が表示されてしまいました.そして
hoge.aux
のファイルの中身は\relax
\newlabel{cnt:hoge}{{1}{100}}
に変更されています.
以上の結果から分かるようにhfilei
.aux
には相互参照の情報が保存されていることが分 かりました.L
ATEX
ではそれらを前回のタイプセットの結果が保存されていたhfilei.aux
と新しい相互参照の情報を比較してユーザーに対しても警告を出しているということが分 かります.\ref
命令と\pageref
命令は相互参照用の情報からカウンタ番号やページ番 号をラベルによって知ることができるということです.もう少し詳しい話(\r@
ラベル)もいつの日にか.