ОТРЕДАКТИРОВАНО (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.}

Я думаю, что приведенный выше случай тот же самый, пока я вызываю 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, а блоки — для набранного текста. Выбирайте то, что подходит для конкретной ситуации.

Связанный контент