
Примитив \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
(модуль zref-savepos
проекта zref
предоставляет интерфейс) могут быть добавлены в pdfTeX на базовой линии и via \vadjust
(после) и \vadjust pre
(до текущей строки). Последнее является специальностью pdfTeX. Глубина и высота могут быть рассчитаны, а вертикальная пунктирная линия может быть установлена.
Однако это не будет работать во всех обстоятельствах. Например, другой материал может быть добавлен путем \vadjust
вмешательства в измерение положения.
Эскиз решения с LuaTeX
LuaTeX предоставляет новую функцию "атрибут". Таким образом, нормаль \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 см, а глубина — 2 см. Второй пример эквивалентен \hbox{Hello\vrule you}
.
Здесь он \valign
разработан с двумя "линиями", первая "линия" включает только высоты блоков, а вторая "линия" - только глубины тех же блоков. Макрос \putbox
разделяет следующий блок на его "высотную часть" и "глубинную часть" и помещает результаты в соответствующие "линии". Причина этого усложнения в том, что нам нужно установить блоки слева направо с аспектом их базовой линии, как в обычном горизонтальном режиме.