是否可以定义 `\vrule` 的点状版本?

是否可以定义 `\vrule` 的点状版本?

\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-saveposzref\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将以下框分离为其“高度部分”和“深度部分”,并将结果放入适当的“线”。这种复杂化的原因是我们需要将框从左到右设置,其基线的方面与正常水平模式相同。

相关内容