为什么 \hrule 需要在其周围绘制文本?

为什么 \hrule 需要在其周围绘制文本?

为什么\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 原语非常特殊,不是吗?

相关内容