第 6 章 コマンドとマークアップ 65
6.2 記号とコマンド
LATEXはコンピュータプログラムですから,人間の意図を知るするためには何か特別な 命令を人間から受け付けることになります.そのため原稿にはコマンドと呼ばれる特別 な記号の綴りを使ったり,いくつかの記号に特別な意味を持たせます.
H 6.2.1 記号の分類
LATEXではユーザが出力したい意味を理解するために全ての記号にLATEXなりの意味 を割り当てています.人間がキーボードから‘<’という記号を入力しても数学の比較演算 子とは知ることができません.‘$<$’としなければ「ここからここは数式であり,‘<’は比 較演算子として使う.」という意味を理解してくれません.そのためLATEXに入力を与え るユーザーはLATEXの文法を覚える必要があります.詳しく覚える必要はありませんが
\ { } $ & # ^ _ ~ %
という10個の記号には特別な意味があることを覚えてください.
H 6.2.2 コマンド
テキストを入力していると‘<’というキーボードからの入力が‘ ¡’になってしまいます.
これは一体どういうことでしょうか.考えてみると‘<’という入力は‘<’という記号を出 力するという命令ではなく別の命令,‘ ¡’を出力するという命令に割り当てられていると 考えられます.さらに\%のようなバックスラッシュ(円)の次に記号が来るようなコマ ンドも存在します.ここでLATEXのコマンドは「バックスラッシュと文字列」という話 ではないことが分かります.正確には「バックスラッシュと記号の綴り」をコントロール シークエンスと呼び,特殊記号1文字をコントロールシンボルと呼びます.LATEXにおけ るコマンドは大きく分けると三つに分類できます.
コントロールシークエンス バックスラッシュ‘\’(‘Y=’)と記号の綴り.制御綴りと訳さ れることもあります.これを本書では狭義のコマンドとして表現しています.
コントロールワード バックスラッシュと英字の綴り.例えば‘\section’など.
コントロールシンボル バックスラッシュと英文字以外の綴り.例えば‘\3’とか
‘\#’など.
コントロールスペース バックスラッシュとスペース一つの綴り.‘\␣’のこと.
特殊記号 特別な意味を持つ記号.予約文字と呼ばれることもあります.例として‘{’,
‘$’など.
英数字など バックスラッシュの付かない普通の文字列.
現段階では大きく分けると
• バックスラッシュと文字列の綴り.
• 特殊な記号.
• 普通の文字列.
の三つがあることを理解してください.本冊子では制御綴り(コントロールシークエン ス)のことをコマンドと呼び命令,宣言,環境の三つに分類します.
命令 特定の処理がそのときに実行されるコマンド.他の参考書ではこの命令のことをコ マンドと呼ぶことが多いようです.引数を取ることがあり,その引数のことを要 素と呼んだり,オプションと呼んだりします.例として\maketitleや\section などがあります.
宣言 特定の処理がそれ以降継続して行われるコマンド.処理の適用される範囲を限定す る(グルーピング)こともできる.引数をとることは稀.よく宣言のことも命令や 宣言方命令とか宣言型コマンドと呼ばれます.例として \ttfamilyがあります.
宣言型のコマンドは命令に比べると少ないので,本冊子でも断り書きとして宣言型 コマンドと呼ぶことが多いです.
環境 \begin{h何々i}と\end{h何々i}によって要素を囲むコマンド,または囲まれてい る領域のこと.引数を取ることがあります.例としてdocument環境などがあり
6.2 記号とコマンド 67
6
ます.
H 6.2.3 コマンドの定義
LATEXの原稿では新しい命令などの定義をすることができます.
\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{出版}\par
\example[]{大学} \example[函館]{出版}
私は未来大学にいます. 私は未来出版にいます.
私は大学にいます. 私は函館出版にいます.
このように任意引数や必須引数の定義なども,\newcommand命令を使うことにより実 現できます.定義の中で引数は‘#hni’として扱い,1から9までの整数が使えます.この ような定義は数式の記述などに威力を発揮します.
\newcommand{\seq}[2][n]{%
\{#2_{0},#2_{1},\ldots,#2_{#1}\}}
数式の集合もマクロを使って$\seq{a}$や
$\seq[k]{x}$とできます.
数式の集合もマクロを使って{a0, a1, . . . , an}や {x0, x1, . . . , xk}とできます.
\newcommandでは任意引数を一つしか設けることができませんが,引数は合計9個ま で使うことができます.\renewcommandでは一度定義した命令を再度定義することがで きます.
さらに通常LATEXでよく見かける環境型のコマンドの定義に関しては以下の四つの命 令が使えます.
\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}
されましたか?
ここの文章は通常通り出力され,
この中の文章は中央揃えで強調表示 されましたか?
H 6.2.4 文字やコマンドの区切り
私たち人間はある文や節の区切りをどのように判断しているのでしょうか.一つは文と 文のあいだや単語と単語のあいだに挿入される空白です.空白は文字列の区切りを示し,
その空白には意味の区切りがあります.では節はどうでしょうか.一つの例としてメール アドレスの場合を考えてみます.メールアドレスはそもそもコンピュータ上で手紙のやり 取りをするための住所ですからコンピュータが分かりやすい表現になっていますが,人間 にも分かりやすい表記になっています.仮に
name@server.co.jp
というメールアドレスがあったとします.するとこれは
‘name’ ‘@’ ‘server’ ‘.’ ‘co’ ‘.’ ‘jp’
に分けられます.それぞれ
name メールアドレスを使っている人の「名前」.
@ ‘@’は‘at’の意味でもあって,これ以降の文字は「住所」を表すことを示す.
jp その人の「国」を表す.
co その人がどんな「地域(組織)」に所属しているのかを表す.
server 地域の中のどこにいるのかをあらわす住所.
. 住所を区切るために使われている.
という意味合いを持っています.住所の区切りが空白ではなくピリオドなのは仕方のない ことです.コンピュータの世界ではなるべく文字列は空白を含んでいないほうが処理が行 いやすいのです.さて,これはどのようにして区切りを見つけたのでしょうか.メールア ドレスの例では‘@’や‘.’を文字の区切りとして住所を判定しています.LATEXでも同じ
6.2 記号とコマンド 69
6
ようなことをやっています.
このことからLATEXにおいての命令の定義には英字のみにすることが求められるよう です.そして英字以外の文字列は,そこをコマンドの区切りとして英字以外の文字列を引 数として受け取るということです.
この文字の分類を利用してLATEXではマクロの中において特別な処理をしています.
マクロは容易に変更してもらっては困るのでユーザからそのマクロを簡単に変更されない ようにしています.その方法の一つとしてマクロの中ではアットマーク‘@’を英字と同じ 分類として扱うのです.‘@’を英字と同じ分類にすると,そこでコマンドは区切られない ので
\newcommand{\h@ge}[2]{あ,#1だよ,ほら#2}
のような定義ができるわけです.そして
\newcommand{\hoge}{\h@ge}
という定義がマクロの中では可能なので,ユーザーから\hoge命令の実態を隠すことが できます.
実際ヘッダーやフッターを自分流にカスタマイズしたいときはそれらの命令に‘@’が含 まれているために変更できない,という事態に陥ります.マクロで行っていること,‘@’
を英字と同じ分類にしてコマンドを定義するためには
\makeatletter(‘@’を英字と同じ分類にする.)
\makeatother(‘@’を違う分類にする.)
という二つの命令を使います.この命令の中身を見てみると
\def\makeatletter{\catcode‘\@11\relax}
\def\makeatother{\catcode‘\@12\relax}
となっています.どうやら‘@’の\catcodeというものを11にすると英字と同じになり,
12にすると違う分類になるようです.このような記号の分類を通常カテゴリーコードと 呼びます(表6.1参照).
そのため何かマクロの中のコマンドに変更を加えたいときは
\documentclass{jsarticle}
\makeatletter
\newcommand{\h@ge}[2]{あ,#1だよ,ほら#2}
\newcommand{\hoge}{\h@ge}
\makeatother
\begin{document}
\hoge{函館}{未来}.
\end{document}
のように‘@’を含む箇所を\makeatletterと\makeatotherで囲んであげます.