\setbox 的问题

\setbox 的问题

我写了下面的框,其中包含垂直显示的我的名字:

\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而不是。如果空间不够,\hssTeX 会抛出一个溢出警告。\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 根据\baselineskipegreg 的评论. 极端情况是在框 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

相关内容