Можно ли определить точечную версию `\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

Вертикальные позиции 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разделяет следующий блок на его "высотную часть" и "глубинную часть" и помещает результаты в соответствующие "линии". Причина этого усложнения в том, что нам нужно установить блоки слева направо с аспектом их базовой линии, как в обычном горизонтальном режиме.

Связанный контент