访问 LaTeX 框的子内容(附加/连接 TeX 框材料)?

访问 LaTeX 框的子内容(附加/连接 TeX 框材料)?

这有点类似于阅读盒子的内容,但使用一个特别简单的 Latex 示例;我在撰写这篇文章时已经解决了这个问题,所以我将这样表述这个问题:下面的内容就是全部内容吗?

基本上,我遇到这样一种情况,我想将输入文本连接/附加为框材料;下面的 MWE “手动”演示了这种连接:

\documentclass{article}

\loggingoutput\scrollmode
\tracingonline=1 % shows just \box42=[] in terminal, unless \loggingoutput\scrollmode above is enabled!

% https://tex.stackexchange.com/questions/46480/setbox-vs-sbox-and-savebox-what-are-the-differences-i-need-to-know-about
\newsavebox{\mainbox}
\newsavebox{\firstchildbox}
\newsavebox{\secondchildbox}

\begin{document}

\savebox\mainbox{inner2 inner1 main}
\typeout{Mainbox with inline contents:}
\showbox\mainbox

% "Manual" concatenation/appending of box material
\setbox\secondchildbox\hbox{inner2}
% \box will clear the box register (\usebox or \copy will not erase it)
\savebox\firstchildbox{\box\secondchildbox inner1}
\setbox\mainbox\hbox{\usebox\firstchildbox main}
\typeout{Mainbox with nested contents:}
\showbox\mainbox

% unhbox via https://tex.stackexchange.com/questions/6183/reading-the-contents-of-a-box
\setbox\secondchildbox\hbox{inner2}
% \box will clear the box register (\usebox or \copy will not erase it)
\savebox\firstchildbox{\unhbox\secondchildbox\space inner1}
\setbox\mainbox\hbox{\unhbox\firstchildbox\space main}
\typeout{Mainbox with unnested contents:}
\showbox\mainbox

\end{document}

MWE 不生成 PDF 输出,所有输出都输出到终端/日志文件。基本上,如果我将像“ inner2 inner1 main”这样的文本直接放入\hbox内联中,则终端输出中的框如下所示:

Mainbox with inline contents:
> \box26=
\hbox(6.67859+0.0)x82.83351
.\OT1/cmr/m/n/10 i
.\OT1/cmr/m/n/10 n
.\OT1/cmr/m/n/10 n
.\OT1/cmr/m/n/10 e
.\OT1/cmr/m/n/10 r
.\OT1/cmr/m/n/10 2
.\glue 3.33333 plus 1.66666 minus 1.11111
.\OT1/cmr/m/n/10 i
.\OT1/cmr/m/n/10 n
.\OT1/cmr/m/n/10 n
.\OT1/cmr/m/n/10 e
.\OT1/cmr/m/n/10 r
.\OT1/cmr/m/n/10 1
.\glue 3.33333 plus 1.66666 minus 1.11111
.\OT1/cmr/m/n/10 m
.\OT1/cmr/m/n/10 a
.\OT1/cmr/m/n/10 i
.\OT1/cmr/m/n/10 n

如果我进行“手动”连接/附加,则我有:

Mainbox with nested contents:
> \box26=
\hbox(6.67859+0.0)x76.16685
.\hbox(6.67859+0.0)x54.50012
..\hbox(6.67859+0.0)x27.25006
...\OT1/cmr/m/n/10 i
...\OT1/cmr/m/n/10 n
...\OT1/cmr/m/n/10 n
...\OT1/cmr/m/n/10 e
...\OT1/cmr/m/n/10 r
...\OT1/cmr/m/n/10 2
..\OT1/cmr/m/n/10 i
..\OT1/cmr/m/n/10 n
..\OT1/cmr/m/n/10 n
..\OT1/cmr/m/n/10 e
..\OT1/cmr/m/n/10 r
..\OT1/cmr/m/n/10 1
.\OT1/cmr/m/n/10 m
.\OT1/cmr/m/n/10 a
.\OT1/cmr/m/n/10 i
.\OT1/cmr/m/n/10 n

因此,“连接”产生了一个带有父/子关系的嵌套框层次结构。

我最初的问题是,如何才能扁平化层次结构并获得像“内联”版本那样的空间;然后我看到了阅读盒子的内容,并意识到我可以用来\unhbox“解包”,从而使用给定盒子的“第一个子”内容(直接内容);并且添加可确保盒子内容中存在与“内联”情况下\space相同的内容:\glue

Mainbox with unnested contents:
> \box26=
\hbox(6.67859+0.0)x82.83351
.\OT1/cmr/m/n/10 i
.\OT1/cmr/m/n/10 n
.\OT1/cmr/m/n/10 n
.\OT1/cmr/m/n/10 e
.\OT1/cmr/m/n/10 r
.\OT1/cmr/m/n/10 2
.\glue 3.33333 plus 1.66666 minus 1.11111
.\OT1/cmr/m/n/10 i
.\OT1/cmr/m/n/10 n
.\OT1/cmr/m/n/10 n
.\OT1/cmr/m/n/10 e
.\OT1/cmr/m/n/10 r
.\OT1/cmr/m/n/10 1
.\glue 3.33333 plus 1.66666 minus 1.11111
.\OT1/cmr/m/n/10 m
.\OT1/cmr/m/n/10 a
.\OT1/cmr/m/n/10 i
.\OT1/cmr/m/n/10 n

对我来说这已经够好了 - 但这就是全部了吗?

答案1

一般来说你不能在 TeX 中做到这一点(luatex 不同)。

如果您的第一个框以 结尾,.那么\space在 后面添加\unhbox不会因空间因子拉伸而增加额外空间,它只会添加一个正常空间。如果第一个框以 胶水 结尾,您可以看到有多少胶水,\lastskip但如果它是一个字符节点,例如.它无法通过 TeX 访问。

\documentclass{article}
\begin{document}
\showoutput

\setbox0\hbox{This.}
\setbox0\hbox{\unhbox0 \space That.}
\showbox0
\setbox0\hbox{This. That.}
\showbox0
\stop

生产

\hbox(6.94444+0.0)x50.05565
.\OT1/cmr/m/n/10 T
.\OT1/cmr/m/n/10 h
.\OT1/cmr/m/n/10 i
.\OT1/cmr/m/n/10 s
.\OT1/cmr/m/n/10 .
.\glue 3.33333 plus 1.66666 minus 1.11111
.\OT1/cmr/m/n/10 T
.\OT1/cmr/m/n/10 h
.\OT1/cmr/m/n/10 a
.\OT1/cmr/m/n/10 t
.\OT1/cmr/m/n/10 .

在第一种情况下,一个框有 3.33pt 的空间。

第二个

\hbox(6.94444+0.0)x51.16676
.\OT1/cmr/m/n/10 T
.\OT1/cmr/m/n/10 h
.\OT1/cmr/m/n/10 i
.\OT1/cmr/m/n/10 s
.\OT1/cmr/m/n/10 .
.\glue 4.44444 plus 4.99997 minus 0.37036
.\OT1/cmr/m/n/10 T
.\OT1/cmr/m/n/10 h
.\OT1/cmr/m/n/10 a
.\OT1/cmr/m/n/10 t
.\OT1/cmr/m/n/10 .

此处句末的空格为 4.44pt。

相关内容