連載 / てくてく ' I 20 乗除算 maildesc 環境の定義 I*TEX には乗除算のコマンドは用意されていないの で、 ' I しのコマンドを使うことになります。 こまでの説明にしたがって、 maildesc 環境を定 かけ算は \multiply コマンド、割り算は \divide 義してみましよう。 \desclength と \desccolsep コマンドです。指定する形式は、どちらも \advance の 2 つの長さコマンドを宣言して値を設定したら、最 コマンドと同じです。 初に示した maildesc 環境の "7cm ”という部分を \desclength に変更します。 \multiply く長さコマンド〉 by く数値 \divide く長さコマンド〉 by く数値 1 : \newlength{\desclength} 2 : \newlength{\desccolsep} \advance コマンドと同様に、 by は省略でぎます。 3 : \desccolsep = 5mm 4 : \desclength = \textwidth \declength の計算 \advance\desclength by —\desccolsep 5 : \divide \desclength by 2 6 : \desclength の値は、組み幅全体 (\textwidth) 7 : \newenvironment{maildesc}% から \desccolsep ふんの長さを差し引き、残りの長 {\def\middesc{\end{screen}\end{minipage} 8 : \hfill\begin{minipage}{\desclength}} 9 : さを半分にしたもので茆。 \par\no indent 10 : には 2 項演算のコマンドしか用意されていませ \begin{minipage}{\desclength} 11 : んから、実際の \desclength の値を得るまでの過程 \begin{screen}}% 12 : 13 : {\end{minipage}\par} は次のようになります。 1 . \desclength ← - \textwidth 印刷されたものだと括弧の対応が分かりにくくなっ 2. \desclength ← \desclength ー \desccolsep てしまうので、ちょっとたけ説明しておきます。 3. \desclength ← - \desclength 十 2 最初の 2 行でコマンドを宣言し、 3 行めから 6 行め これをコマンドに直すと、次のようになります。 でパラメータに値を設定しています。 7 行め力、ら maildesc 環境の定義をしていて、 8 行 \desclength = \textwidth め力、ら 12 行めが \begin{maildesc} 、 13 行め力、 \advance\desclength by ¯\desccolsep \divide \desclength by 2 \end{maildesc} で実行されます。また、 8 行めと 9 行めでは、 \middesc コマンドの定義をしています。 ところで、上のように定義した maildesc 環境は、 本文部分にし力、使用できません。横幅を \textwidth にしているため、組み幅が \textwidth になってい るところでしか使用できないのです。つまり、 quote 環境や itemize 環境のなかで使用したり、別の minipage 環境のな力、で使うと、 2 つの minipage が 別々の行に出力されてしまいます。 そんなときに便利なパラメータを 1 つ紹介しておき ます。 マクロには \linewidth \textwidth は、そのドキュメント全体でいつでも 同じ値になっているパラメータです。マクロを作成す 三 6 一を当 illustration•小沼卓児 135 UNIX MAGAZINE 1990.12
連載 / てくてく rIbX 20 るうえでは、「そのときの組み幅」を使用するほうが都 合がよいことがよくあります。それが \linewidth で す。 今回の maildesc 環境でも、 \textwidth ではなく \linewidth を使用することにしましよう。そうして おけば、 quote 環境や minipage 環境のなかでも、ま た 2 段組にしているときでも問題なく maildesc 環境 が使えるようになります。 1 : \newlength{\desclength} 2 : \newlength{\desccolsep} 3 : \desccolsep = 5mm 4 : \newenvironment{maildesc}% {\desclength = \linevidth 5 : \advance\desclength by -\desccolsep 6 : \divide \desclength by 2 7 : \def\middesc{\end{screen}\end{minipage} 8 : \hfill\begin{minipage}{\desclength}} 9 : \par\noindent 10 : \begin{minipage}{\desclength} 11 : \begin{screen}}% 12 : 13 : {\end{minipage}\par} この定義では、 \desclength を maildesc 環境 のなかで計算 ( 5 行め ~ 7 行め ) している点に注意 してください。 maildesc 環境を使用した時点での \linewidth の値で計算したいので、 maildesc 環境 のなかで設定する必要があるのです。 ただし、 \newlength{\desclength} コマンドは、 環境のな力、で実行してはし、けません。 \newlength コ マンドはグロー / くルな宣言ですから、一番はしめにあ る maildesc 環境ではうまくいきますが、その後の maildesc 環境では、 ! Command name 'desclength' already used. と、おこられてしまいます。 I*TEX には、このほかに LR ポックス、ルール・ ポックスという種類のポックスもあります。この 3 種 類のポックスを作り出すコマンドを簡単に紹介します。 LR ホックス LR ポックスとは、ポックスの内部を LR モードで処 理したポックスてす。以前、 \mbox というコマンドが 出てきたのを覚えていますか ? \mbox の引数に指定し た文字列は LR モードで処理されるので、文字列の途 中で改行するのを防ぐことができました。 \mbox コマ ンドは LR;R ックスを生成するコマンドのひとつです。 LR ポックスを作るコマンド ( 1 ) LR ポックスを作る代表的なコマンドが \makebox コマンドです。 \makebox にはオフ。シ・ヨン引数があり、 引数の文字列を組むためのポックスの幅を指定できま す。引数に指定した文字列は、ポックスの中央に出力 されます。 \makebox コマンドの前後のスペースが出力されて いるところに注意して、次の例を見てくたさい。 ホックスの \makebox[lin]{\gt 真中 } てす。 真中 です。 / 、ツクスの じつは、 \makebox コマンドにはオフ。ション引数が もう 1 つあり、そこには指定した幅のポックスのどの 位置にテキストを出力するかを指定します。省略すると 中央で、 1 ( 左切とて ( 右寄せ ) カ鮨定できます。 ホックスの \makebox[lin] {\bf 真中 } てす。 ポックスの \makebox [ 1 土司 [ 1 ] {\bf 左 } てす。 ポックスの \makebox [lin] [ て ] {\bf 右 } てす。 minipage 環境の親戚コマンド minipage 環境は、環境の内容を指定した組み幅に したがってテキストを組み、全体で 1 つの“ポックス” を作成する環境でした。このように内容をパラグラフ・ モードで処理したポックスをパーポックスといいます。 真中 ポックスの ポックスの 左 / 、ツクスの すすす ででで 136 UNIX MAGAZINE 1990.12
連載 / てくてく 20 言しておく必要があります。 そのためのコマンドが \newlength です。このコマ ンドの引数に、自分が定義するパラメータ名を指定して ください。たたし、すでに設定されているパラメータ名 はもちろん、定義済みのコマンドと同し名前のパラメー というエラーになります。 ! Undefined CO trol sequence . ドを使用すると、 \newlength コマンドを忘れてこれらの長さコマン \newlength{\desccolsep} \newlength{\desclength} タ名も使用できません。 言した長さコマンドは、その環境が終了した後でも使用 という大きな特徴があります。つまり、ある環境内で宣 介してきた宣言コマンドとは異なり、「有効範囲がない」 すね。ところが、 \newlength コマンドはいままで紹 し、同じようなエラー・メッセージを表示するようで \newlength は \newcommand とちょっと似ている 次はパラメータを あるいは、ふうに次のように指定してもかまい \set1ength{\descc01sep}{5mm} 使います。 ンドに長さを設定するには、 \setlength コマンドを は 5mm にすればし、いのですから簡単です。長さコマ これから設定するパラメータのうち、 \desccolsep ません。 134 \textwidth と \desccolsep から計算した結果を設 もう 1 つのパラメータ \desclength のほうには、 \desccolsep = 5mm できるのです。このような宣言のことを、グロ (global) な宣言と呼びます。 長さコマンドの宣言ができたら、 設定しましよう。 パラメータの値は・・ ーノく丿レ こで、 'IVX の加減乗除コ 以前、長さパラメータの足し算に \addtolength と の加減乗除 マンドを紹介しておきましよう。 定しなければなりません。 UNIX MAGAZINE 1990.12 ースを入れておし、てください。 by は省略可能です。省略したときには代わりにスペ \advance \textwidth by 2cm 例と同しことをするには、次のようにします。 \advance を使って上の \addtolength コマンドの つまり、 \addtolength コマンドと同じなんです。 た、く長さ〉には負の長さを指定することもできます。 加算し、その値をく長さコマンド〉に設定します。ま このコマンドは、く長さコマンド〉の値にく長さ〉を \advance く長さコマンド〉 by く長さ〉 は次のような形式で指定します。 rIVJX の \advance コマンド 0 ー茆。 \advance コマンド L\TEX の \addtolength コマンドにあたるのカ : 、 ます。 負の数を指定すれば、長さパラメータの引き算になり \addtolength コマンドの 2 つめの引数く長さ〉に \addt01ength{\textheight}{2cm} を 2cm 増やすには、次のように指定します。 け増やすために使用します。たとえば、 \textheight このコマンドは、く長さコマンド〉の値をく長さ〉だ \addtolength{ く長さコマンド〉 } { く長さ〉 } 使います。 I*TEX の \addtolength コマンドは、次のように 加減算 使って計算することにします。 そこで、今回は足し算も含めて ' I のコマンドを のコマンドは用意されていません。 要になります。。。い TEX のコマンド ' ' としては、乗除算 いうコマンドを使いました。今回の場合は、割り算も必
連載 / てくてく rIbX 20 ただし、この定義では minipage 環境の横幅を "7cm ”と直接指定しているため、レイアウトの都合な どで \textwidth の値に変更があると、 maildesc 環 境の再定義が必要になってしまいます。 今回は約束どおりもう一歩前進して、組み幅の変化 にも対応できるような maildesc 環境を作ってみます。 自分用のパラメータづくり \textwidth の変更にも動じなし、 maildesc 環 境」を作るには、 \textwidth の値力、ら minipage 環 境の幅を決めるようにすればいいのです。 すこし月リ、この連載のなかで IATEX の長さパラ メータの話をしたことがありました。そのとき、 ージ・レイアウトを図で示し、 \textwidth のほか、 \textheight 、 \topmargin 、 \oddsidemargin な どの長さコマンドの意味を説明しました。長さコマン ドとは、長さパラメータの値を保持するコントロール・ シーケンスのことです。 このような定義済みのパラメータのほかに、自分用 の長さパラメータを作成することもでぎます。この機 能を使って、さらに柔軟性のあるマクロを作るように 心がけましよう。 とうしたい ? まず、これから何を始めるのかを説明しておきまし よう。 maildesc 環境では、同じ幅の 2 つの minipage を 横に並べて組み幅いつばし、に出力します。通常のテキ ストの組み幅は \textwidth です牙 2 つの minipage のあいだに 5mm の空白を入れる ことにして、簡単に図を書くと、次のようになります。 \textwidth こは画面出力の 左右の minipage 環境の幅は同じです力、ら、次のよ うな計算で minipage の幅を決めることがでぎます。 mnipage の幅 (\textwidth パラメータの名前を決めて minipage 環境の幅を決める計算を始める前に、ど んなパラメータを用意しておけばいいかを考えておか なくてはなりません。その後で、パラメータの名前を 決めることにしましよう。 2 つの minipage 環境の幅は同じなので、 こで必 要なパラメータは次の 2 つの値を保持するものという ことになります。 minipage 環境の幅 ・ 2 つの minipage 環境のあいだに空けるスペースの 大きさ パラメータの名前が長さコマンドとも呼ばれている ことからもわかるように、ふつうのコマンドのときと 同じ規則にしたがってパラメータの名前を決めてくだ さい。念のために この規則をもういちど書いておき 2 バックスラッシュ ( \ ) に続く英字と漢字の組 合せ。 2. 英字の大文字と小文字は区男ける。 3. 数字や記号は使用できない。 4. \end で始めることはできない。 “ \ 説明文 ' とカ、 "\minipage の幅などのコマンド 名は定義できますが、“ \ タイトル 1 ”のように数字と組 み合才ブることはできません。たたし、全角の数字なら 大丈夫です。また、 \TextWidth と \textwidth と は異なるコマンドです。 こでは、上の 2 つのパラメータの名前をそれそれ \desclength と \desccolsep ということにしてお きましよう。 さて、長さパラメータづくリ 自分で定義したパラメータを使う場合には、まず「こ のコントロール・シーケンスは長さコマンドて一」と宣 1. こは左の画面の説明 こ文 例です。 トー minipage の幅ー H. 」・ -- minipage の幅 --H 5mm 133 UNIX MAGAZINE 1990.12