![为什么 \hrule 需要在其周围绘制文本?](https://linux22.com/image/317307/%E4%B8%BA%E4%BB%80%E4%B9%88%20%5Chrule%20%E9%9C%80%E8%A6%81%E5%9C%A8%E5%85%B6%E5%91%A8%E5%9B%B4%E7%BB%98%E5%88%B6%E6%96%87%E6%9C%AC%EF%BC%9F.png)
为什么\hrule
需要在周围添加文字才能起作用?示例不是画一条线:
\documentclass{article}
\begin{document}
%foo
\hrule
%bar
\end{document}
如果删除%
前面的%foo
或%bar
(或两者),线条绘制得非常好。根据评论,这是因为规则不需要处于垂直模式。该命令\hrule
显示了一个非常明确的意图:“亲爱的编译器,请绘制一条水平线!”那么,为什么不\hrule
自动离开垂直模式呢?
当然,这可能是一个纯粹的“学术”问题,因为在任何现实世界的文档中,一些内容。 ;)
答案1
\hrule
是“原始”指令。此指令绘制的规则的自然或默认宽度是包围该\hrule
指令的垂直框的宽度(请参阅 TeXbook 第 21 章“制作框”)。如果包围框的宽度为零,并且您没有指定明确的宽度,则不会生成水平线。
\hrule
具有明确宽度的示例和没有周围文字将会:
\documentclass{article}
\begin{document}
\hrule width3cm
\end{document}
之所以
\documentclass{article}
\begin{document}
\leavevmode
\hrule
\end{document}
生成一条宽度为的线\textwidth
,\leavevmode
定义如下(参见 TeXbook 第 356 页):
\def\leavevmode{\unhbox\voidb@x} % begins a paragraph, if necessary
其中\voidb@x
(不出所料,鉴于其名称)生成一个完全空的“盒子”(在 TeX 意义上),并且\unhbox
是一个 TeX 原语,它解压其参数的内容(必须是“盒子”)并将它们置于水平模式。(由于\voidb@x
没有内容,因此\unhbox
不返回任何内容。但是,它在水平模式下“什么也不做”。)因此,在\leavevmode
完成后,TeX 立即处于“水平模式”。封闭垂直框的宽度由给出,您猜对了\textwidth
;因此,\hrule
绘制一条宽度为的线\textwidth
。
答案2
亲爱的 TeX,如果您正在排版一个段落,请结束该段落,并制定一个规则,其默认高度为(0.4pt)和深度为(0pt),宽度与规则最终所在的框一样宽。
现在,如果我编译以下文档
\documentclass{article}
\showoutput
\begin{document}
\hrule
\end{document}
我在日志文件中得到以下内容:
Completed box being shipped out [1]
\vbox(633.0+0.0)x407.0
.\glue 16.0
.\vbox(617.0+0.0)x345.0, shifted 62.0
..\vbox(12.0+0.0)x345.0, glue set 12.0fil
...\glue 0.0 plus 1.0fil
...\hbox(0.0+0.0)x345.0
..\glue 25.0
..\glue(\lineskip) 0.0
..\vbox(550.0+0.0)x0.0, glue set 539.94232fil
...\write-{}
...\glue(\topskip) 9.6
...\rule(0.4+0.0)x*
...\glue 0.0 plus 1.0fil
...\glue 0.0
...\glue 0.0 plus 0.0001fil
..\glue(\baselineskip) 23.55556
..\hbox(6.44444+0.0)x345.0, glue set 170.0fil
...\glue 0.0 plus 1.0fil
...\OT1/cmr/m/n/10 1
...\glue 0.0 plus 1.0fil
横幅后的第一行描述了要发送的页面,其高度为 633pt(\textheight
加上页眉和页脚),无深度,宽度为 407pt(\textwidth)。然后
..\vbox(12.0+0.0)x345.0, glue set 12.0fil
...\glue 0.0 plus 1.0fil
...\hbox(0.0+0.0)x345.0
是(空)标题,后面跟着 25pt 的空间(\headsep
)和\lineskip
(因为下面的框很高)。
下面的框是页面主体
..\vbox(550.0+0.0)x0.0, glue set 539.94232fil
高度为 550pt(\textheight
),宽度为 0pt,因为它不包含框:只是一个\write
始终添加到第一页的默认值、\topskip
、规则和填充粘连。接下来的内容是,
..\glue(\baselineskip) 23.55556
..\hbox(6.44444+0.0)x345.0, glue set 170.0fil
...\glue 0.0 plus 1.0fil
...\OT1/cmr/m/n/10 1
...\glue 0.0 plus 1.0fil
是居中显示页码 1 的页脚。
该规则表示为
...\rule(0.4+0.0)x*
意思和我在一开始描述的完全一致:宽度由规则最终所在的(垂直)框决定。
注意\hrule
请垂直命令,因此它结束了正在排版的段落;TeX 不在规则前后添加行间粘连。
你可以试试
\hbox{aaa}
\hrule
\hbox{bbb}
相反,
因为框的宽度由里面最宽的框决定。由于没有段落开始,规则最终的宽度与底部相同\hbox
。
TeX 原语非常特殊,不是吗?