.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.}
Я думаю, что приведенный выше случай тот же самый, пока я вызываю box register с помощью \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.}
Я думаю, что приведенный выше случай также является тем же самым, если я вызываю box register с помощью \copy0
.
Случай3:
\def\myhrulefill{\line{\leaders\hrule\hfill}}
\setbox0=\line{\leaders\hrule\hfill}
в данном случае \hbox
содержит команды и которые я подозревал, могу ли я сказать, являются ли они одним и тем же или нет.
К сожалению, я не могу показать вам достаточно сложный пример, который содержит некоторые команды. Возможно, если бы приведенные выше примеры содержали условный синтаксис типа \if
, синтаксис повторения типа \loop...\repeat
, один не мог бы быть альтернативой другому. Мне особенно хотелось бы узнать такой случай.
решение1
TheтолькоОбщее между ящиком и макросом (определяемым с помощью \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, а блоки — для набранного текста. Выбирайте то, что подходит для конкретной ситуации.