Как скопировать содержимое коробки, не копируя саму коробку?

Как скопировать содержимое коробки, не копируя саму коробку?

Самоописывающий образец

% 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

выходы

\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

но мне нужна только abcкопия, а не коробка с abc.

решение1

Короткий ответ: Чтобы скопировать поле, используйте \copy. Если вам не нужен закрывающий \hbox, просто не пишите его. То есть, вместо

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

писать

\setbox\thhbx=\copy\thbx

чтобы сделать поле \thhbxтаким же, как \thbx. В более общем смысле, вы можете использовать \unhcopyдля копирования только содержимого поля, хотя здесь это не обязательно: если бы вы использовали его, вам пришлось бы снова заключить результаты в поле, например:

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

что в данном случае просто излишне по сравнению с \copy\thbx.


Вот пример, который, надеюсь, все прояснит:

\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

Остальная часть этого ответа представляет собой просто развитие приведенного выше примера.


Предположим, вы пишете

\setbox0=\hbox{ab}

Тогда поле 0 будет следующим:

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

Так что когда вы используете его в больших коробках, либо деструктивно с , \boxлибо недеструктивно с \copy, вы получите коробку. Например, если вы напишете

\setbox1=\hbox{xy\copy0 rs}

Вы получаете:

\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

где есть коробка вместо \copy0. Аналогично, если вы напишете

\setbox2=\hbox{\copy0}

вы получите ящик 2, который будет

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

аналогично ситуации в вопросе.

При копировании в другой ящик, если вы не хотитедополнительныйвнешний ограждающий \hbox, тогда просто не пишите его! Так что если вы пишете

\setbox3=\copy0

вы получите ящик 3, который будет

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

то же самое, что и исходная коробка 0.

В случаях, когда это невозможно использовать, вы можете скопировать только «содержимое» (удалив другой блок) либо \unhbox(деструктивно), либо \unhcopy(недеструктивно). (Аналогично \unvboxи \unvcopyдля вертикальных блоков.) Например:

\setbox4=\hbox{xy\unhcopy0 rs}

дает

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

и

\setbox5=\hbox{\unhcopy0}

дает

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

снова то же самое, что и исходное поле 0.

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