
この\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
2 つの問題があります。
\leaders
およびその仲間は、水平モードでは水平接着、垂直モードでは垂直接着でのみ機能します。直交バリアントは使用できません。水平方向が 1 つではなく、垂直方向が 2 つ (高さと奥行き) あります。これにより、多くの新しい質問が生じます。塗りつぶしはどこから始まるのでしょうか。方向と量はどのように指定するのでしょうか。
PDF 演算子
TeX ルールが PDF ページ記述内の行で実装されている場合、グラフィックスの状態を変更して破線にすることができます。破線の端は丸みを帯びている可能性があります。ただし、ルールは塗りつぶされた四角形で実装することもできますが、その場合はこのトリックは機能しません。
pdfTeX の不器用な回避策
pdfTeX では、(プロジェクトの\pdfsavepos
モジュールがインターフェイスを提供します) を介してベースラインに垂直位置を追加したり、 (後) および(現在の行の前) を介して垂直位置を追加したりできます。後者は pdfTeX の特殊機能です。深さと高さを計算し、垂直の点線を設定できます。zref-savepos
zref
\vadjust
\vadjust pre
ただし、これはすべての状況で機能するわけではありません。たとえば、\vadjust
位置測定に干渉して他の材料が追加される可能性もあります。
LuaTeX によるソリューション スケッチ
LuaTeX は、新しい機能「属性」を提供します。したがって、正しい幅の法線を、\vrule
垂直の点線を意味する属性で設定できます。次に、構築されたページ (そのノード ツリー) をトラバースして、そのようなルールを見つけ、それらを点線の垂直線に置き換えます。
答え2
\vrule
高さと奥行きのみを外側のボックスの寸法に合わせることができます。高さと奥行きが不明な 2 つ以上のボックスの間に点線の 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 cm 以上、奥行きは 2 cm 以上になります。 2 番目の例は と同等です\hbox{Hello\vrule you}
。
\valign
ここでは 2 つの「行」が設計されています。最初の「行」にはボックスの高さのみが含まれ、2 番目の「行」には同じボックスの深さのみが含まれま す。マクロは、次\putbox
のボックスを「高さ部分」と「深さ部分」に分離し、結果を適切な「行」に配置します。この複雑さの理由は、通常の水平モードと同様に、ボックスを左から右にベースラインのアスペクト比で設定する必要があるためです。