
\def
\box
有時用作盒子結構的縮寫,那麼它的輸出有時與寄存器而不是 的輸出相同\def
。
這是問題所在。我什麼時候應該使用\box
寄存器而不是\def
?有沒有什麼具體情況,其中一種比另一種更好?
已編輯(2009 年 9 月 12 日 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:
\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.
輸出將是:
看看盒子裡的內容如何沒有使用粗體字體。那是因為當時已經排版好了,盒子只是用過的。
另一個區別是,一旦文字在框中排版,您就可以測量它:
\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 程式碼,而框用於排版文字。選擇適合具體情況的任何內容。