ボックス自体をコピーせずにボックスの内容をコピーするにはどうすればよいですか?

ボックス自体をコピーせずにボックスの内容をコピーするにはどうすればよいですか?

自己記述サンプル

% 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と同じです。

関連情報