.png)
\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 コード用であり、ボックスはタイプセットされたテキスト用です。特定の状況に適したものを選択してください。