我写了下面的框,其中包含垂直显示的我的名字:
\setbox0\vbox{\hbox{M}\hbox{a}\hbox{t}\hbox{t}\hbox{e}\hbox{o}}
我想在一行中显示两次,因此我写道:
\line{\hss \box0 \hss \box0 \hss}
但有一个问题:\box0 只出现了一次!我只看到了一个我的名字的副本!
相反,如果我写
\line{\hss \vbox{\hbox{M}\hbox{a}\hbox{t}\hbox{t}\hbox{e}\hbox{o}} \hss \vbox{\hbox{M}\hbox{a}\hbox{t}\hbox{t}\hbox{e}\hbox{o}}\hss}
我得到了期望的输出。
使用\setbox0
或有什么问题\box0
?
(所有操作均在纯 TeX 下完成。)
答案1
\box
还会清除框寄存器。请使用\copy
。
\line{\hss \copy0 \hss \copy0 \hss}
我会使用\hfill
而不是。如果空间不够,\hss
TeX 会抛出一个溢出警告。\hbox
可以通过以下方式实现居中版本\halign
:
\setbox0\vbox{\halign{\hfil#\hfil\cr M\cr a\cr t\cr t\cr e\cr o\cr}}
\line{\hfill \copy0 \hfill \copy0 \hfill}
\bye
字母之间的间距较小
以下示例使用不同的方法来减少字母之间的间距。前几个框 0、2、4(小于 10 的偶数框是用于局部分配的临时框)保持基线之间的距离不变。框 0 是未修改的版本。框 2 根据\baselineskip
egreg 的评论. 极端情况是在框 4 中,其中测量了最大字母高度,结果是两个“t”相接触。
第 6 和第 8 个方框保持字母之间的距离不变。由于\baselineskip=0pt
,TeX 改为使用 set \lineskip
。它的默认值是1pt
。第 8 个方框最终不会在字母之间留下任何空格。
\def\test{\halign{\hfil##\hfil\cr M\cr a\cr t\cr t\cr e\cr o\cr}}
\setbox0\vbox{\test}
\setbox2\vbox{%
\advance\baselineskip-2pt\relax
\test
}
\setbox4\hbox{atteo}
\setbox4\vbox{%
\baselineskip=\ht4
\lineskiplimit=0pt
\test
}
\setbox6\vbox{%
\baselineskip=0pt
\test
}
\setbox8\vbox{%
\baselineskip=0pt
\lineskip=0pt
\test
}
\line{\hfill\copy0 \hfill\copy2 \hfill\copy4 \hfill\copy6 \hfill\copy8 \hfill}
\bye
答案2
\box
清空盒子,你\copy0
不需要\box0
。