该\vrule
图元有一个很好的特性:它能够适应封闭盒子的高度和深度:
\documentclass{article}
\newcommand\TestBox{\parbox[c][3cm][c]{1em}{\centering A}}
\begin{document}
\noindent
\TestBox\vrule\TestBox
\noindent
\rule{10pt}{1cm}\,\vrule\,\rule[3cm]{10pt}{1cm}
\end{document}
是否可以定义一个类似的命令,比如\vdotfill
,它是 的点分等效命令\vrule
?如果可以,该怎么做?否则,为什么不可以?
答案1
\dotfill
\cleaders
是通过和无限胶合规范( )定义的\hfill
。类似的定义\vdotfill
有两个问题:
\leaders
和其同类元素在水平模式下只能使用水平粘连,在垂直模式下只能使用垂直粘连。正交变体不可用。有两个垂直方向(高度和深度),而不是一个水平方向。这引发了许多新问题:填充从哪里开始?如何指定方向和数量?
PDF 运算符
如果 TeX 规则是通过 PDF 页面描述中的一条线来实现的,那么图形状态可能会改变为虚线,可能带有圆角线端。但是,规则也可以通过填充矩形来实现,在这种情况下,此技巧不起作用。
笨拙的 pdfTeX 解决方法
pdfTeX 中可以通过(项目\pdfsavepos
模块提供接口)在基线处添加垂直位置,也可以通过(当前行之后)和(当前行之前)添加垂直位置,后者是 pdfTeX 的特色,可以计算深度和高度,并设置垂直虚线。zref-savepos
zref
\vadjust
\vadjust pre
然而,这种方法并非在所有情况下都有效。例如,其他材料可能会通过\vadjust
干扰位置测量而添加。
使用 LuaTeX 的解决方案草图
LuaTeX 提供了一个新功能“属性”。因此,可以为具有正确宽度的法线\vrule
设置一个表示垂直虚线的属性。然后遍历构建的页面(其节点树)以查找此类规则并将其替换为垂直虚线。
答案2
只能\vrule
使其高度加深度适应外箱的尺寸。 如果您需要在两个或多个高度和深度未知的箱子之间放置虚线 Vrule,则可以使用\valign
:
\def\putbox{\afterassignment\putboxA\setbox0=}
\def\putboxA{\aftergroup\putboxB}
\def\putboxB{\global\dimen0=\dp0 \dp0=0pt \box0 & \kern\dimen0 \cr}
\def\puttext#1{\putbox\hbox{#1}}
\def\vdotfil{\omit\span\omit
\kern-.1pt\xleaders\vbox{\kern.1pt\hbox{.}\kern.1pt}\vfil\kern-.1pt\cr}
\valign{\vfil#&#\vfil\cr
\putbox\vbox{\kern 5cm \hbox{A}} % more than 5 cm height, 0pt depth
\vdotfil
\putbox\vbox{\hbox{B\vrule depth2cm width0pt}} % B height, 2 cm depth
}
\valign{\vfil#&#\vfil\cr
\puttext {Hello}\vdotfil \puttext {you}
}
\end
在此示例中,的\vdotfil
高度将超过 5 厘米,深度将超过 2 厘米。第二个示例相当于\hbox{Hello\vrule you}
。
这里\valign
设计了两条“线”,第一条“线”仅包含框的高度,第二条“线”仅包含相同框的深度。宏\putbox
将以下框分离为其“高度部分”和“深度部分”,并将结果放入适当的“线”。这种复杂化的原因是我们需要将框从左到右设置,其基线的方面与正常水平模式相同。