Como copiar o conteúdo de uma caixa sem copiar a própria caixa?

Como copiar o conteúdo de uma caixa sem copiar a própria caixa?

Amostra autodescritiva

% pdfTeX
\newbox\thbx
\newbox\thhbx

\setbox\thbx\hbox{abc}
% HOW TO COPY THE CONTENTS OF THE BOX
%  WITHOUT ACTUALLY COPYING THE BOX
%   ITSELF ALONG WITH THOSE CONTENTS?
\setbox\thhbx\hbox{\copy\thbx}
% I NEED \hbox{abc} NOT \hbox{\hbox{abc}}

\showbox\thhbx
\bye

saídas

\thbx=\box16
\thhbx=\box17
> \box17=
\hbox(6.94444+0.0)x15.27782
.\hbox(6.94444+0.0)x15.27782
..\tenrm a
..\tenrm b
..\kern0.27779
..\tenrm c

mas preciso apenas abccopiar, não a caixa com o arquivo abc.

Responder1

Resposta curta: Para copiar uma caixa, use \copy. Se você não quiser o anexo \hbox, simplesmente não escreva. Ou seja, em vez de

\setbox\thhbx=\hbox{\copy\thbx}

escrever

\setbox\thhbx=\copy\thbx

para fazer com que a caixa \thhbxseja igual a \thbx. De maneira mais geral, você pode \unhcopycopiar apenas o conteúdo de uma caixa, embora não seja necessário aqui: se você usasse, teria que colocar os resultados novamente em uma caixa, como:

\setbox\thhbx=\hbox{\unhcopy\thbx}

o que neste caso é simplesmente desnecessário em comparação com \copy\thbx.


Aqui está um exemplo que, esperamos, deixará tudo claro:

\setbox0=\hbox{ab}              % The original box
\setbox1=\hbox{xy\copy0 rs}
\setbox2=\hbox{\copy0}
\setbox3=\copy0                 % Now box 3 is identical to box 0
\setbox4=\hbox{xy\unhcopy0 rs}
\setbox5=\hbox{\unhcopy0}       % Now box 5 is identical to box 0

O restante desta resposta é apenas uma elaboração do exemplo acima.


Suponha que você escreva

\setbox0=\hbox{ab}

Então a caixa 0 é a seguinte:

\hbox(6.94444+0.0)x10.55559
.\tenrm a
.\tenrm b

Então, quando você usá-lo em caixas maiores, seja de forma destrutiva \boxou não destrutiva \copy, você obterá a caixa. Por exemplo, se você escrever

\setbox1=\hbox{xy\copy0 rs}

você obtém:

\hbox(6.94444+1.94444)x28.9723
.\tenrm x
.\tenrm y
.\hbox(6.94444+0.0)x10.55559
..\tenrm a
..\tenrm b
.\tenrm r
.\tenrm s

onde há uma caixa no lugar de \copy0. Da mesma forma, se você escrever

\setbox2=\hbox{\copy0}

você obterá a caixa 2 para ser

\hbox(6.94444+0.0)x10.55559
.\hbox(6.94444+0.0)x10.55559
..\tenrm a
..\tenrm b

semelhante à situação da pergunta.

Ao copiar para outra caixa, se você não quiseradicionalanexo externo \hbox, então simplesmente não escreva! Então, se você escrever

\setbox3=\copy0

você receberá a caixa 3 para ser

\hbox(6.94444+0.0)x10.55559
.\tenrm a
.\tenrm b

o mesmo que a caixa original 0.

Nos casos em que isso não pode ser usado, você pode copiar apenas o “conteúdo” (retirando a outra caixa) com \unhbox(destrutivamente) ou \unhcopy(não destrutivamente). (Da mesma forma \unvboxe \unvcopypara caixas verticais.) Por exemplo:

\setbox4=\hbox{xy\unhcopy0 rs}

\hbox(6.94444+1.94444)x28.9723
.\tenrm x
.\tenrm y
.\tenrm a
.\tenrm b
.\tenrm r
.\tenrm s

e

\setbox5=\hbox{\unhcopy0}

\hbox(6.94444+0.0)x10.55559
.\tenrm a
.\tenrm b

novamente o mesmo que a caixa original 0.

informação relacionada