編集済み (09/12/09 UTC 2:45)

編集済み (09/12/09 UTC 2:45)

\defはボックス構造の省略形として使用されることがありますが、その出力は\boxの代わりにレジスタを使用した出力と同じになることがあります\def

ここで質問です。\boxではなく レジスタ を使用すべきなのはどのような場合ですか\def? どちらかが他方よりも優れている特定の状況はありますか?


編集済み (09/12/09 UTC 2:45)

編集された質問

\setboxとその出力コマンドのペア ( だけでなく\box0\copy0\unhbox0など) を、最終的にボックスとして展開されるマクロ定義に置き換えることができるケースはありますか?

もしそのようなケースがあった場合、どちらかが他方よりも優れているという具体的な状況はあるのでしょうか?

私が考えた例

ケース1:

\def\excuse{I should have made my question more clearer before the post.}
\setbox0=\hbox{I should have made my question more clearer before the post.}

上記のケースは、ボックスレジスタを で呼び出す限り同じだと思います\unhcopy0。ただし、メモリを節約できるため、最初の方法のほうが 2 番目の方法よりも優れているかどうかは疑問です。

ケース2:

\def\excuse{\hbox{I should have made my question more clearer before the post.}}
\setbox0=\hbox{I should have made my question more clearer before the post.}

ボックスレジスタを で呼び出す限り、上記の場合も同様だと思います\copy0

ケース3:

\def\myhrulefill{\line{\leaders\hrule\hfill}}
\setbox0=\line{\leaders\hrule\hfill}

この場合、\hboxコマンドが含まれており、それらが同じであると言えるかどうか疑問に思いました。

残念ながら、いくつかのコマンドを含む十分に複雑な例を示すことはできません。おそらく、上記の例に のような条件構文や の\ifような繰り返し構文が含まれている場合\loop...\repeat、一方が他方の代わりとなることはできません。私は特にそのようなケースを知りたいです。

答え1

のみボックスとマクロ ( で定義) の共通点は、\def内容を保存することです。以上。


マクロは、さまざまな理由で文書内で再利用される任意のTeXコードを保存します。マクロを使用すると、文章作成の簡素化からアーノルド・シュワルツェネッガーの名前をTeX自体をエミュレートするただし、適切な処理を実行するマクロが十分にあることが前提です。

一方、ボックスにはタイプセットされたテキストが格納されます。それだけです。

単純な用途であれば、どちらも思われる同じことを行います。例:

\setbox0=\hbox{Arnold Schwarzenegger}
\def\arnold{Arnold Schwarzenegger}
Here's \box0{} and \arnold{} again.

タイプセットされます:

ここに画像の説明を入力してください

しかし、上記の例における\box0との基本的な違いは、\arnold\box0すでにボックスに名前をタイプセットし、コマンドは\box0それをページに配置するだけです。\arnold一方、は文字列に展開され、タイプセットされて起こりました同じ出力が得られます。

違いを確認するために、ボックスを設定した後、書き出す前にフォントを変更するとします。

\setbox0=\hbox{Arnold Schwarzenegger}
\def\arnold{Arnold Schwarzenegger}
\bf Here's \box0{} and \arnold{} again.

出力は次のようになります。

ここに画像の説明を入力してください

箱の中身が太字で書かれていないのが分かります。これは、その時点ですでに文字化けがされており、箱が使用済み

もう 1 つの違いは、テキストがボックスにタイプセットされると、それを測定できることです。

\setbox0=\hbox{Arnold Schwarzenegger}
Here's \copy0{} typeset in a \the\wd0{} box.

ここに画像の説明を入力してください

マクロでそれを実行することもできますが、機能しません。

ただし、マクロを使用すると「動的なコンテンツ」を作成できますが、ボックスの場合は、上記のフォント変更の例で説明したように、使用時にすべてが固定されます\setbox。(非常に単純な)例:

\def\arnold#1{Arnold #1}
Here's \arnold{Schwarzenegger} and another \arnold{Foo}.

これはボックスでは実行できません。


したがって、どちらかを選択するときは、保存しようとしているデータの種類を確認してから選択する必要があります。最初の例のような些細なケースの場合のみ、選択があいまいになる可能性がありますが、例を少し変更すると (フォントの変更を追加するなど)、どちらかが間違ってしまいます。

つまり、マクロは TeX コード用であり、ボックスはタイプセットされたテキスト用です。特定の状況に適したものを選択してください。

関連情報