第 6 章 コマンドとマークアップ 79
6.2 記号とコマンド
L
ATEX
はコンピュータプログラムですから,人間の意志を理解するためには何か特別な 命令を人間から受け付けないとなりません.「もしかしてこの辺は太字にしたいのですか?」
などと対応することはありません.皆無というわけではありませんが,基本的にこちらか ら命令するまで何もしない性格です.そのため原稿にはコマンドと呼ばれる特別な記号の 綴りを使ったり,いくつかの記号に特別な意味を持たせます.ですから
L
ATEX
での記号 の意味とコマンドの役割を知っておきましょう.6.2.1 記号の分類
いきなり
TEX/L
ATEX
の記号の分類を考えるよりも,普段使用している日本語や英語の記号と言語を考えましょう.私たちはコンピュータが理解するのが難しい言語を使ってい
ます.特に日本語はコンピュータが理解しづらいものとなっています.それでも私たち人 間はそれらを文脈などを道筋に意味を読み取ります.
「今日は
1,000
円を持って,砂糖さんの商店に塩を買いに行った.」という
1
文を考えると,人間はすぐに「1,000
円」のコンマ‘,’
を「お金の3
桁目に入れ る区切り」,最後の句点「.」を「文の終わり」であると理解できます.私たちが複雑な日 常文を理解できる理由として,文の中に必ず文法が存在するということです.人間はある程度曖昧な表現を見つけてもそれを柔軟に理解できますが,コンピュータは 何しろ
1
と0
しか分からない融通の利かない機械ですから正規文法しか理解できません.正規文法については別の機会に紹介しようと思いますが,とにかく人間の使う日本語とは 違いきっかりしているということです.この正規文法に基づいた正規言語を理解するのが コンピュータプログラムなわけです.
TEX/ L
ATEX
も正規言語しか理解できないのでユー ザから入力される記号には全て明確な意味を持たせる必要があります.曖昧な意味を持た せることはできません.L
ATEX
ではユーザが出力したい意味を理解するために全ての記号にL
ATEX
なりの意味 を割り当てています.人間がキーボードから‘<’
という記号を入力しても数学の比較演算 子とは理解してくれません.‘$<$’
としなければ「ここからここは数式であり,‘<’
は比較 演算子として使う.」という意味を理解してくれません.そのためL
ATEX
に入力を与える ユーザーはL
ATEX
の文法を覚える必要があります.詳しく覚える必要はありませんが\ { } $ & # ^ _ ~ %
という
10
個の記号には特別な意味があることを覚えてください.それぞれの記号の使い 方はその時々に説明しますので,今はざっと10
個の記号が特別な意味を持ち,英文字と 漢字,それに平仮名や片仮名だけが普通の単語を作るための文字として理解してくれると 思ってください.6.2.2 コマンド
テキストを入力していると
‘<’
というキーボードからの入力が‘¡’
になってしまいます.これは一体どういうことでしょうか.考えてみると
‘<’
という入力は‘<’
という記号を出 力するという命令ではなく別の命令,‘¡’
を出力するという命令に割り当てられていると 考えられます.さらに\%
のようなバックスラッシュ(円)の次に記号が来るようなコマ ンドも存在します.ここでL
ATEX
のコマンドは「バックスラッシュと文字列」という話 ではないことが分かります.正確には「バックスラッシュと記号の綴り」をコントロール シークエンスと呼び,特殊記号1
文字をコントロールシンボルと呼びます.L
ATEX
におけ るコマンドは大きく分けると三つに分類できます.コントロールシークエンス バックスラッシュ
‘\’
(‘Y =’
)と記号の綴り.制御綴りと訳さ れることもあります.これを本書では狭義のコマンドとして表現しています.コントロールワード バックスラッシュと英字の綴り.例えば
‘\section’
など.好き好き
L
ATEX 2
ε初級編6.2
記号とコマンド6
コントロールシンボル バックスラッシュと英文字以外の綴り.例えば
‘\3’
とか‘\#’
など.コントロールスペース バックスラッシュとスペース一つの綴り.
‘\ ’
のこと.特殊記号 特別な意味を持つ記号.予約文字と呼ばれることもあります.例として
‘{’,
‘$’
など.英数字など バックスラッシュの付かない普通の文字列.
現段階では大きく分けると
• バックスラッシュと文字列の綴り.
• 特殊な記号.
• 普通の文字列.
の三つがあることを理解してください.本冊子では制御綴り(コントロールシークエン ス)のことをコマンドと呼び命令,宣言,環境の三つに分類します.
命令 特定の処理がそのときに実行されるコマンド.他の参考書ではこの命令のことをコ マンドと呼ぶことが多いようです.引数を取ることがあり,その引数のことを要 素と呼んだり,オプションと呼んだりします.例として
\maketitle
や\section
などがあります.宣言 特定の処理がそれ以降継続して行われるコマンド.処理の適用される範囲を限定す る(グルーピング)こともできる.引数をとることは稀.よく宣言のことも命令や 宣言方命令とか宣言型コマンドと呼ばれます.例として
\ttfamily
.宣言型のコ マンドは命令に比べると少ないので,本冊子でも断り書きとして宣言型コマンドと 呼ぶことが多いです.環境
\begin{
h何々i}
と\end{
h何々i}
によって要素を囲むコマンド,または囲まれてい る領域のこと.引数を取ることがあります.例としてdocument
環境などがあり ます.6.2.3 コマンドの定義
L
ATEX
の原稿では新しい命令などの定義をすることができます.\newcommand{
h命令i}[
h整数i][
h標準値i]{
h定義i}
\renewcommand{
h命令i}[
h整数i][
h標準値i]{
h定義i}
\newcommand
についてですが,この命令によって,まだ定義されていないh命令iを新規 に定義することができます.\newcommand{\example}{これは例です.} として,本文中で
{\example}
と記述するとこれは例です.
という出力になります.さらに
\newcommand{\example}[2]{#1は#2です.}
として,本文中で
\example{
ボブ}{
背が高い}
と記述すると,ボブは背が高いです.
という出力になります.さらにこの
\example
命令に任意引数があっても良いことを宣言 するためには次のようにしますが,任意引数も引数の総和に勘定します.\newcommand{\example}[2][標準]{任意引数は #1 で,必須引数は #2 です.}
\example{ほげ}\\ \example[オプション]{ほげ}
任意引数は 標準 で,必須引数は ほげ です.
任意引数は オプション で,必須引数は ほげ です.
このように任意引数や必須引数の定義なども,
\newcommand
命令を使うことにより実 現できます.定義の中で引数は‘#’hni
として扱い,1
から9
までの整数を使えます.この ような定義が何に使えるのかと少し疑問に思う方がいるかも知れませんが,以下の例題を ご覧ください.\newcommand{\seq}[2][n]{%
\{#2_{0},\ldots,\,#2_{#1}\}}
ぶっちゃけ$\seq{a}$って$\seq[k]{x}$だよね.
ぶっちゃけ{a0, . . . , an}って{x0, . . . , xk}だよね.
\newcommand
では任意引数を一つしか設けることができませんが,引数は合計9
個ま で使うことができます.\renewcommand
では一度定義した命令を再度定義することがで きます.さらに通常
L
ATEX
でよく見かける環境型のコマンドの定義に関しては以下の四つの命 令が使えます.\newenvironment{
h命令i}[
h整数i][
h標準i]{
h始めi}{
h終わりi}
\renewenvironment{
h命令i}[
h整数i][
h標準i]{
h始めi}{
h終わりi}
\newenvironment
では環境の始めの部分と終わりの部分を定義して,新たに環境型の命 令を作成します.引数に関する扱いは\newcommand
と同じです.\renewenvironment
については一度定義した環境型のコマンドを再度定義する機能があります.中央揃えして 書体を強調したい環境は次のようにcemph
のように作成します.\newenvironment{cemph}%
{\begin{center}\begin{em}}%
{\end{em}\end{center}}
ここの文章は通常通り出力され,
\begin{cemph}
この中の文章は中央揃えで強調表示
\end{cemph}
されましたか?
ここの文章は通常通り出力され,
この中の文章は中央揃えで強調表示 されましたか?
好き好き
L
ATEX 2
ε初級編6.2
記号とコマンド6
\providecommand{
h命令i}[
h整数i][
h標準値i]{
h定義i}
\DeclareRobustCommand{
h命令i}[
h数値i][
h標準i]{
h設定i}
という命令も使えます.この
\providecommand
はすでに命令が定義済みならば何もせ ず,もし定義されていないならば指定された内容の通りに命令を定義することができま す.\DeclareRobustCommand
を使った場合は頑丈な命令を作成できます..例題6.1
\DeclareRobustCommand
を使った例を示します.次のファイルをタイプセッ トし,その結果を吟味してください.\documentclass{jarticle}
\DeclareRobustCommand{\joubuyen}{{\ooalign{Y\crcr\hss=\hss}}}
\newcommand{\moroiyen}{{\ooalign{Y\crcr\hss=\hss}}}
\begin{document}
\tableofcontents
\section{もろい{\moroiyen}は壊れやすい} どうですかねぇ。
\section{丈夫な{\joubuyen}は壊れにくい} 大丈夫ですか?
\end{document}
この例では
1
回目のタイプセットで! Illegal parameter number in definition of \reserved@a.
<to be read again> \crcr
l.6 \section{もろい{\moroiyen}は壊れやすい}
?
と表示されエラーとなります.さらに
2
回目のタイプセットでは目次ファイルhfilei.toc
が作成され,それが読み込まれるのでさらにエラーとなります.hfilei.toc
とhfilei.aux
に何が記述されているのかを吟味してください.hfilei.aux
には\relax
\@writefile{toc}{\contentsline{section}{\numberline{1}もろい
{{\lineskiplimit -\maxdimen \unhbox \voidb@x \vtop {\baselineskip
\z@skip \lineskip .25ex\everycr{}\tabskip \z@skip \halign {##\crcr Y\crcr \hss =\hss \crcr }}}}は壊れやすい}{1}}
\@writefile{toc}{\contentsline{section}{\numberline{2}丈夫な {\joubuyen}は壊れにくい}{1}}
などと出力されており,凄いことになっています.さらにhfilei
.toc
には\contentsline{section}{\numberline{1}もろい{{\lineskiplimit -\maxdimen \unhbox\voidb@x \vtop {\baselineskip \z@skip
\lineskip .25ex\everycr{}\tabskip \z@skip \halign {####\crcr Y\crcr \hss =\hss \crcr}}}}は壊れやすい}{1}
\contentsline{section}{\numberline{2}丈夫な{\joubuyen}
は壊れにくい}{1}