.png)
\def
às vezes é usado como uma abreviatura de uma construção de caixa, então sua saída às vezes é igual à saída com um \box
registro em vez de \def
.
Aqui está a questão. Quando devo usar um \box
registro em vez de \def
? Existe alguma situação específica em que um seja melhor que o outro?
EDITADO (12/09/09 UTC 2:45)
Pergunta editada
Existe algum caso em que \setbox
seu par de comandos de saída (não apenas \box0
, mas também \copy0
, \unhbox0
e assim por diante) pode ser substituído por uma definição de macro que eventualmente é expandida como uma caixa?
Se existisse tal caso, existe alguma situação específica em que um seja melhor que o outro?
Exemplos que pensei
Caso 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.}
Acho que o caso acima é o mesmo, desde que eu chame o registro da caixa com \unhcopy0
. No entanto, pergunto-me se o primeiro é melhor que o segundo porque pode economizar memória.
Caso2:
\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.}
Acho que o caso acima também é o mesmo, desde que eu chame o registro da caixa com \copy0
.
Caso3:
\def\myhrulefill{\line{\leaders\hrule\hfill}}
\setbox0=\line{\leaders\hrule\hfill}
neste caso, \hbox
contém comandos e dos quais eu suspeitava se posso dizer que são iguais ou não.
Infelizmente, não posso mostrar um exemplo suficientemente complexo que contenha alguns comandos. Talvez, se os exemplos acima contivessem sintaxe condicional como \if
, sintaxe de repetição como \loop...\repeat
, um não pode ser uma alternativa ao outro. Gosto especialmente de conhecer um caso assim.
Responder1
OapenasO que há de comum entre uma caixa e uma macro (definida com \def
) é que elas armazenam coisas. Período.
Uma macro armazena código TeX arbitrário para ser reutilizado no documento por uma infinidade de razões. Com macros você pode fazer qualquer coisa, desde simplificar a escritaArnold Schwarzeneggero nome deemulando o próprio TeX, desde que você tenha macros suficientes fazendo as coisas certas.
Uma caixa, por outro lado, armazena texto digitado. Só isso.
Para usos bastante simples, ambos podemparecerpara fazer o mesmo. Por exemplo:
\setbox0=\hbox{Arnold Schwarzenegger}
\def\arnold{Arnold Schwarzenegger}
Here's \box0{} and \arnold{} again.
irá digitar:
no entanto, a diferença básica entre \box0
e \arnold
, no exemplo acima, é que \box0
tevejádigite o nome na caixa e o comando \box0
apenas o expõe na página. \arnold
, por outro lado, foi expandido para uma sequência de caracteres que foi então composta eocorridopara ter a mesma saída.
Para ver a diferença, suponha que eu altere a fonte depois de definir a caixa, mas antes de escrevê-la:
\setbox0=\hbox{Arnold Schwarzenegger}
\def\arnold{Arnold Schwarzenegger}
\bf Here's \box0{} and \arnold{} again.
a saída será:
Veja como o conteúdo da caixa não usava negrito. Isso porque já estava tipografado naquela época, e a caixa só estavausado.
Outra diferença é que uma vez o texto digitado em uma caixa você pode medi-lo:
\setbox0=\hbox{Arnold Schwarzenegger}
Here's \copy0{} typeset in a \the\wd0{} box.
você pode tentar fazer isso com uma macro, mas não funcionará.
Com uma macro, porém, você pode ter “conteúdo dinâmico”, enquanto com a caixa, como explicado no exemplo de alteração de fonte acima, tudo fica fixo na hora que você usa \setbox
. Para um exemplo (muito simples):
\def\arnold#1{Arnold #1}
Here's \arnold{Schwarzenegger} and another \arnold{Foo}.
o que não pode ser feito com caixas.
Portanto, ao escolher um ou outro você deve observar que tipo de dados está tentando armazenar e depois escolher. Somente para casos triviais, como o primeiro exemplo, a escolha pode ser ambígua e, ainda assim, se você alterar um pouquinho o exemplo (como adicionar uma alteração de fonte), então de uma forma ou de outra estará errado.
Resumindo, as macros são para código TeX e as caixas são para texto digitado. Escolha o que for certo para a situação específica.