• 検索結果がありません。

記号とコマンド

第 6 章 コマンドとマークアップ 89

6.2 記号とコマンド

L

A

TEX

はコンピュータプログラムですから,人間の意志を理解するためには何か特別な 命令を人間から受け付けないとなりません.

「もしかしてこの辺は太字にしたいのですか?」

などと対応することはありません.皆無というわけではありませんが,基本的にこちらか ら命令するまで何もしない性格です.そのため原稿にはコマンドと呼ばれる特別な記号の 綴りを使ったり,いくつかの記号に特別な意味を持たせます.ですから

L

A

TEX

での記号 の意味とコマンドの役割を知っておきましょう.

6.2.1 記号の分類

いきなり

TEX

/LA

TEX

の記号の分類を考えるよりも,普段使用している日本語や英語の 記号と言語を考えましょう.私たちはコンピュータが理解するのが難しい言語を使ってい ます.特に日本語はコンピュータが理解しづらいものとなっています.それでも私たち人 間はそれらを文脈などを道筋に意味を読み取ります.

「今日は

1,000

円を持って,砂糖さんの商店に塩を買いに行った.」

という

1

文を考えると,人間はすぐに「

1,000

円」のコンマ

‘,’

を「お金の

3

桁目に入れ る区切り」,最後の句点「.」を「文の終わり」であると理解できます.私たちが複雑な日 常文を理解できる理由として,文の中に必ず文法が存在するということです.

人間はある程度曖昧な表現を見つけてもそれを柔軟に理解できますが,コンピュータは 何しろ

1

0

しか分からない融通の利かない機械ですから正規文法しか理解できません.

正規文法については別の機会に紹介しようと思いますが,とにかく人間の使う日本語とは 違いきっかりしているということです.この正規文法に基づいた正規言語を理解するのが コンピュータプログラムなわけです.

TEX

/LA

TEX

も正規言語しか理解できないのでユー ザから入力される記号には全て明確な意味を持たせる必要があります.曖昧な意味を持た せることはできません.

L

A

TEX

ではユーザが出力したい意味を理解するために全ての記号に

L

A

TEX

なりの意味 を割り当てています.人間がキーボードから

‘<’

という記号を入力しても数学の比較演算 子とは理解してくれません.

‘$<$’

としなければ「ここからここは数式であり,

‘<’

は比較 演算子として使う.」という意味を理解してくれません.そのため

L

A

TEX

に入力を与える ユーザーは

L

A

TEX

の文法を覚える必要があります.詳しく覚える必要はありませんが

\ { } $ & # ^ _ ~ %

という

10

個の記号には特別な意味があることを覚えてください.それぞれの記号の使い 方はその時々に説明しますので,今はざっと

10

個の記号が特別な意味を持ち,英文字と 漢字,それに平仮名や片仮名だけが普通の単語を作るための文字として理解してくれると 思ってください.

6.2.2 コマンド

テキストを入力していると

‘<’

というキーボードからの入力が

‘¡’

になってしまいます.

これは一体どういうことでしょうか.考えてみると

‘<’

という入力は

‘<’

という記号を出 力するという命令ではなく別の命令,

‘¡’

を出力するという命令に割り当てられていると 考えられます.さらに

\%

のようなバックスラッシュ(円)の次に記号が来るようなコマ ンドも存在します.ここで

L

A

TEX

のコマンドは「バックスラッシュと文字列」という話 ではないことが分かります.正確には「バックスラッシュと記号の綴り」をコントロール

好き好き

L

A

TEX 2ε 6.2

記号とコマンド

6

シークエンスと呼び,特殊記号

1

文字をコントロールシンボルと呼びます.

L

A

TEX

におけ るコマンドは大きく分けると

3

つに分類できます.

コントロールシークエンス バックスラッシュ

‘\’

‘Y =’

)と記号の綴り.制御綴りと訳さ れることもあります.これを本書では狭義のコマンドとして表現しています.

コントロールワード バックスラッシュと英字の綴り.例えば

‘\section’

など.

コントロールシンボル バックスラッシュと英文字以外の綴り.例えば

‘\3’

とか

‘\#’

など.

コントロールスペース バックスラッシュとスペース

1

つの綴り.

‘\’

のこと.

特殊記号 特別な意味を持つ記号.予約文字と呼ばれることもあります.例として

‘{’,

‘$’

など.

英数字など バックスラッシュの付かない普通の文字列.

現段階では大きく分けると

• バックスラッシュと文字列の綴り.

特殊な記号.

普通の文字列.

3

つがあることを理解してください.本冊子では制御綴り(コントロールシークエン ス)のことをコマンドと呼び命令,宣言,環境の

3

つに分類します.

命令 特定の処理がそのときに実行されるコマンド.他の参考書ではこの命令のことをコ マンドと呼ぶことが多いようです.引数を取ることがあり,その引数のことを要 素と呼んだり,オプションと呼んだりします.例として

\maketitle

\section

など.

宣言 特定の処理がそれ以降継続して行われるコマンド.処理の適用される範囲を限定す る(グルーピング)することもできる.引数をとることは稀.よく宣言のことも命 令や宣言方命令とか宣言型コマンドと呼ばれます.例として

\ttfamily

.宣言型 のコマンドは命令に比べると少ないので,本冊子でも断り書きとして宣言型コマン ドと呼ぶことが多いです.

環境

\begin{

h何々i

}

\end{

h何々i

}

によって要素を囲むコマンド,または囲まれてい る領域のこと.引数を取ることがあります.例として

document

環境.

6.2.3 コマンドの定義

L

A

TEX

の原稿では新しい命令などの定義をすることができます.

\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

命令を使うことにより実 現できます.定義の中で引数は

‘#’

h

n

iとして扱い,

1

から

9

までの整数を使えます.この ような定義が何に使えるのかと少し疑問に思う方がいるかも知れませんが,以下の例題を ご覧ください.

\newcommand{\seq}[2][n]{%

\{#2_{0},\ldots,\,#2_{#1}\}}

ぶっちゃけ$\seq{a}$って$\seq[k]{x}$だよね.

ぶっちゃけ{a0, . . . ,an}って{x0, . . . , xk}だよね.

\newcommand

では任意引数を

1

つしか設けることができませんが,引数は合計

9

個ま で使うことができます.

\renewcommand

では一度定義した命令を再度定義することがで きます.

さらに通常

L

A

TEX

でよく見かける環境型のコマンドの定義に関しては以下の

4

つの命 令が使えます.

\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

好き好き

L

A

TEX 2ε 6.2

記号とコマンド

6

については一度定義した環境型のコマンドを再度定義する機能があります.中央揃えして 書体を強調したい環境は次のように

cemph

のように作成します.

\newenvironment{cemph}%

{\begin{center}\begin{em}}%

{\end{em}\end{center}}

ここの文章は通常通り出力され,

\begin{cemph}

この中の文章は中央揃えで強調表示

\end{cemph}

されましたか?

ここの文章は通常通り出力され,

この中の文章は中央揃えで強調表示 されましたか?

\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}

とあります.これが

\DeclareRobustCommand

\moroiyen

命令を定義しなかった結果 となります.

L

A

TEX

の命令を何か別のファイルに書き出す場合は丈夫な命令として定義し ていた方が無難なようです.ただし,次のように

\protect

命令を使った場合はうまく行 くことを確認してください.

\section{もろい{\protect\moroiyen}は壊れやすい}

\protect

を使うと

\moroiyen

が壊れずにhfilei

.toc

やhfilei

.aux

に出力されていること も確認してください.

6.2.4 文字やコマンドの区切り

私たち人間はある文や節の区切りをどのように判断しているのでしょうか.

1

つは文と 文のあいだや単語と単語のあいだに挿入される空白です.空白は文字列の区切りを示し,

その空白には意味の区切りがあります.では節はどうでしょうか.例えば日本語では

「公園の中のベンチのうえ」

という名詞があったとすると,これはそれぞれ

「公園」「の」「中」「の」「ベンチ」「の」「うえ」

に分けて文を解釈し,名詞や助動詞などの品詞に分けることができます.

もう

1

つの例としてメールアドレスの場合を考えて見ましょう.メールアドレスはそも そもコンピュータ上で手紙のやり取りをするための住所ですからコンピュータが分かりや すい表現になっていますが,人間にも分かりやすい表記になっています.仮に

[email protected]

というメールアドレスがあったとします.するとこれは

‘name’ ‘@’ ‘server’ ‘.’ ‘co’ ‘.’ ‘jp’