
此\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 的笨拙解決方法
垂直位置via (專案\pdfsavepos
模組提供介面)可以在pdfTeX中新增在基線和via (目前行之後)和(目前行之前)。後者是 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
將以下框分離為其“高度部分”和“深度部分”,並將結果放入適當的“行”中。這種複雜化的原因是我們需要像正常水平模式一樣從左到右設定框的基線方向。