setlength コマンドについて

setlength コマンドについて

- 栗田 哲郎 の投稿
返信数: 13
長さ変数の設定は、
\setlength{\textwidth}{15cm}

と setlength コマンドを使った解説がよくありますが、

\textwidth=15cm

としても同じように変数を変更できるようです。
何か違いがあるのでしょうか?

きっと、setlength コマンドの使用が推奨されると想像しますが、
その理由などあるのでしょうか?

よろしくお願いします。

栗田 哲郎 への返信

Re: setlength コマンドについて

- TONE Kozaburo の投稿
もっと詳しい方から解説があると思いますが・・・

簡単に言えば、前者は LaTeX での書式、後者は plain TeX での書式です。
栗田 哲郎 への返信

Re: setlength コマンドについて

- Z. R. の投稿

\setlength{\textwidth}{15cm}
\textwidth=15cm

①はLaTeXの文法に従った書き方で、②はTeX言語(=TeXの機能を直接使う)での書き方です。

従って、もしLaTeX文書ソースを「完全にLaTeXで」書くという方針を取るなら、必然的に①を使うことになります。一方で、「LaTeXとTeX言語を混ぜて書く」という方針であれば、①と②のどちらを使うかは好みの問題、ということになります。

LaTeXの既定では両者(\setlength と“TeX形式の代入”)は全く等価です。一方で、calcパッケージを読み込んだ場合は、両者に違いが生じます。なぜなら、calcはあくまで「LaTeXの文法」を対象にしたものであって、“TeX形式の代入”のような「LaTeX外のもの」は対象外だからです。

Z. R. への返信

Re: setlength コマンドについて

- 帯田 木偶太 の投稿

「等価」ではないですよね?

例えば
    \setlength{\parskip}{15cm}Plus 10cm
という入力では、期待どおり「Plus 10cm」と出力されますが、
    \parskip=15cm Plus 10cm
という入力に対しては、(大方の直感に反して)何も出力されません。

こういう事故を防ぐ意味では、LaTeX 流に \setlength を使う方がお奨めです。
ランポートさんの作意(の一つ)もそこにあるのだろうと思います。

私自身も、文書の作成時には、\setlength を使用しています。
一方、パッケージやドキュメント・クラスを作成するときには
TeX のプリミティブな代入構文を使いますが、上記のような事故が
起こり得る文脈かどうかは考慮せず、常に \relax を後置しています。

帯田 木偶太 への返信

Re: setlength コマンドについて

- 栗田 哲郎 の投稿
\parskip=15cm Plus 10cm
の場合は、
15cm Plus 10cm
の結果が、\parskip に代入されるということでしょうか?
栗田 哲郎 への返信

Re: setlength コマンドについて

- 帯田 木偶太 の投稿

》 15cm Plus 10cm
》 の結果が、\parskip に代入されるということでしょうか?

「結果」と言えばそうなのですが、算術的な結果ではありません。
普通の算術では 15cm plus 10cm の「結果」は
25cm になりますが、25cm が代入されるわけではありません。
\parskip の基本長が 15cm になって、伸張度(伸びやすさ)が 10cm に
なるのです。

ソース中で
    \parskip=15pt Plus 10pt
    \showthe\parskip
なんてことをやれば確かめられます。

なお、左辺が固定長しか保持し得ないパラメーターやレジスター(dimen
register)であれば、このような現象は生じません。

帯田 木偶太 への返信

Re: setlength コマンドについて

- 栗田 哲郎 の投稿
ありがとうございます。長さに範囲を指定できるとは知りませんでした。
勉強になります。
栗田 哲郎 への返信

Re: setlength コマンドについて

- 帯田 木偶太 の投稿

「範囲」と言ったのでは語弊があります。

例えば、
    A\hspace{15cm plus 5cm}B
という記述(LaTeX 流と TeX 流が混在していますがエラーにはなりません)で
A と B との間のスペースは必ず 15cm 以上 20cm 以下になる、と認識していると
そのうち痛い目に遭います(経験者は語るってやつです)。

伸縮長は、伸張度(上の「5cm」の部分)が 0pt でない限り状況によって
いくらでも長くなります(たとえ伸張度が負であっても)。伸張度は
伸びやすさ(伸びたときのペナルティの増え具合)を規定するものであって、
限度を指定するものではありません。

ちなみに縮小度(「15cm plus 5cm minus 3cm」というように指定した場合の
「3cm」の部分)は、縮みやすさの指定であると同時に、縮む量の限度にも
なります(この例においては 12cm より短くなることは決してありません)。

栗田 哲郎 への返信

Re: setlength コマンドについて

- 北見 けん の投稿
\setlength は次のように定義されたマクロですから、

> \setlength=macro:
#1#2->#1#2\relax .

\setlength{\textwidth}{15cm} は \textwidth15cm\relax に展開されます。
TeX の代入では = を省略できるので、これは \textwidth=15cm\relax と同じですね。
\relax は何もしない命令だといわれることが多いですが、
TeX の読み取りルーチンで数値や長さのリテラルの読み取りをさえぎる機能がありますから、
帯田さんの指摘されたように、スキップ値の読み取りを続けるかどうかの違いが出ますね。
他にも、長さ単位の読み込みで直後の空白トークンを飲み込むかどうかなどでも違ってきます。
下のは、その例です。

\documentclass{article}

\nofiles

\begin{document}

I have a pen.
\setlength{\textwidth}{15cm}
I have an apple.

I have a pen.
\textwidth=15cm
I have an apple.

\end{document}
北見 けん への返信

Re: setlength コマンドについて

- 栗田 哲郎 の投稿
I have a pen.
\setlength{\textwidth}{15cm}
I have an apple.

だと、二つの文の間に大きめ空白が挿入されるようですね。

以下は等価と理解したつもりですが、文と文の間は小さな空白で、同じ結果になりません。なぜでしょうか?
I have a pen.
\textwidth=15cm\relax
I have an apple.


栗田 哲郎 への返信

Re: setlength コマンドについて

- 帯田 木偶太 の投稿

TeX においては、行端は(内部処理のかなり早い段階で)空白に
置き換えられます(行端の直前が和文字である場合を除きます)。

最初の入力例の場合、1 行目の行端による空白が文間スペースとして
出力され、さらに 2 行目の行端による空白が単語間スペースとして
現れるので、「大きめの空白」に見えます。
通常、このような場合は、2 行目の最後に「%」を付けて、
行端をコメント・アウトします。
※  コマンドの直後で改行する場合には、基本的に % を打つように
    習慣づけておくのがいいでしょう。

2 番目の入力例の場合、1 行目の行端が文間スペースになるのは
同じですが、2 行目の行端に由来する空白は、直前が \relax となって
いるので、コントロール・シーケンスの終端を表わす空白として
解釈され、出力に反映されません。