什么原因造成 Plain TeX 中这些中心线之间的差异?

什么原因造成 Plain TeX 中这些中心线之间的差异?

我目前正在通过 TeXbook 学习 TeX,并尝试使用实际定义实现一些宏。我试图弄清楚 \centerline 的工作原理,但这些定义中的每一个都不会以完全相同的方式使文本居中。

\centerline{This should be centered.}
\line{\hss This should be centered. \hss} % This is off by a bit.
\hbox to \hsize{\hss This should be centered.\hss}
\hbox to \hsize{\hskip 0pt plus 1fil minus 1fil This should be centered.
                \hskip 0pt plus 1fil minus 1fil} % This is also off by a bit.

对我来说这个输出:

关于 TeX 有什么我没有考虑到的吗?

答案1

plain.tex这些是来自(第 575 行和 578 行)的相关定义:

\def\line{\hbox to\hsize}
\def\centerline#1{\line{\hss#1\hss}}

这个定义意味着\centerline后面跟着一个参数,\centerline扩展为标记序列\line,,,,参数,,。{\hss\hss}

因此,在问题中的四个示例中,第一个是:

\centerline{This should be centered.}

相当于输入以下内容\line{\hss This should be centered.\hss},而这又相当于第三个:

\hbox to \hsize{\hss This should be centered.\hss}

而第二个:

\line{\hss This should be centered. \hss} % This is off by a bit.

不同:它在第二个 之前包含一个额外的空格标记\hss。因此,行中居中的是 中的字符This should be centered.(末尾有空格),而不是This should be centered.像第一个示例中那样 中的字符(末尾没有空格)。

第四个:

\hbox to \hsize{\hskip 0pt plus 1fil minus 1fil This should be centered.
                \hskip 0pt plus 1fil minus 1fil} % This is also off by a bit.

有同样的问题,在 之后包含一个额外的空格(请注意,这里的多个空格甚至换行符都相当于一个空格).


您可以通过添加来调试

\tracingoutput = 1
\showboxbreadth = \maxdimen % or at least 29, for this example

.tex文件(然后查看.log文件,或添加\tracingonline=1)。第一行显示:

..\hbox(6.94444+0.0)x469.75499, glue set 181.19687fil
...\glue 0.0 plus 1.0fil minus 1.0fil
...\tenrm T
...\tenrm h
...\tenrm i
...\tenrm s
...\glue 3.33333 plus 1.66666 minus 1.11111
...\tenrm s
...\tenrm h
...\tenrm o
...\tenrm u
...\tenrm l
...\tenrm d
...\glue 3.33333 plus 1.66666 minus 1.11111
...\tenrm b
...\kern0.27779
...\tenrm e
...\glue 3.33333 plus 1.66666 minus 1.11111
...\tenrm c
...\tenrm e
...\tenrm n
...\kern-0.27779
...\tenrm t
...\tenrm e
...\tenrm r
...\tenrm e
...\tenrm d
...\tenrm .
...\glue 0.0 plus 1.0fil minus 1.0fil

第二行显示:

..\hbox(6.94444+0.0)x469.75499, glue set 178.97464fil
...\glue 0.0 plus 1.0fil minus 1.0fil
...\tenrm T
...\tenrm h
...\tenrm i
...\tenrm s
...\glue 3.33333 plus 1.66666 minus 1.11111
...\tenrm s
...\tenrm h
...\tenrm o
...\tenrm u
...\tenrm l
...\tenrm d
...\glue 3.33333 plus 1.66666 minus 1.11111
...\tenrm b
...\kern0.27779
...\tenrm e
...\glue 3.33333 plus 1.66666 minus 1.11111
...\tenrm c
...\tenrm e
...\tenrm n
...\kern-0.27779
...\tenrm t
...\tenrm e
...\tenrm r
...\tenrm e
...\tenrm d
...\tenrm .
...\glue 4.44444 plus 4.99997 minus 0.37036
...\glue 0.0 plus 1.0fil minus 1.0fil

并且在靠近第二条日志的末尾,你可以看到额外的内容...\glue 4.44444 plus 4.99997 minus 0.37036(句末粘合内容),就在\hss粘合内容之前。

相关内容