Самоописывающий образец
% 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.