我目前正在通过 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
粘合内容之前。