¿Es posible definir una versión con puntos de `\vrule`?

¿Es posible definir una versión con puntos de `\vrule`?

La \vruleprimitiva tiene una característica interesante: tiene la capacidad de adaptarse a la altura y profundidad de la caja envolvente:

\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}

ingrese la descripción de la imagen aquí

¿Es posible definir un comando similar, digamos \vdotfill, que sea un equivalente con puntos de \vrule? ¿Si es así, cómo? De lo contrario, ¿por qué no?

Respuesta1

\dotfillse define mediante \cleadersy una especificación de pegamento infinita ( \hfill). Una definición similar de \vdotfilltiene dos problemas:

  • \leadersy amigos solo trabajan con pegamentos horizontales en modo horizontal o pegamento vertical en modo vertical. Las variantes ortogonales no están disponibles.

  • Hay dos direcciones verticales (alto y profundidad) en lugar de una horizontal. Esto plantea muchas preguntas nuevas: ¿dónde comienza el relleno? ¿Cómo se especifican las direcciones y los montos?

Operadores de PDF

Si la regla TeX se implementa mediante una línea en la descripción de la página PDF, entonces el estado de los gráficos podría cambiarse para obtener una línea discontinua, puede tener extremos de línea redondeados. Sin embargo, una regla también se puede implementar mediante un rectángulo relleno, donde este truco no funciona.

Solución torpe para pdfTeX

Las posiciones verticales vía \pdfsavepos(el módulo zref-saveposdel proyecto zrefproporciona una interfaz) se pueden agregar en pdfTeX en la línea base y vía \vadjust(después) y \vadjust pre(antes de la línea actual). Este último es una especialidad de pdfTeX. Se puede calcular la profundidad y la altura y se puede establecer la línea de puntos vertical.

Sin embargo, esto no funcionará en todas las circunstancias. Por ejemplo, se podría añadir otro material interfiriendo \vadjustcon la medición de la posición.

Bosquejo de la solución con LuaTeX

LuaTeX proporciona una nueva característica "atributo". Por lo tanto, \vrulese puede establecer una normal con el ancho correcto con un atributo que signifique una línea de puntos vertical. Luego, se recorre la página construida (su árbol de nodos) para encontrar dichas reglas y reemplazarlas con líneas verticales de puntos.

Respuesta2

Sólo \vrulese puede adaptar su altura más fondo a las dimensiones de la caja exterior. Si necesita colocar una regla de puntos entre dos o más cuadros con altura y profundidad desconocidas, puede usar \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                                                              

En este ejemplo, tendrán \vdotfilmás de 5 cm de altura y 2 cm de profundidad. El segundo ejemplo es equivalente a \hbox{Hello\vrule you}.

Aquí está \valigndiseñado con dos "líneas", la primera "línea" incluye solo las alturas de las cajas y la segunda "línea" solo las profundidades de las mismas cajas. La macro \putboxsepara el siguiente cuadro en su "parte de altura" y "parte de profundidad" y coloca los resultados en las "líneas" apropiadas. La razón de esta complicación es que necesitamos configurar los cuadros de izquierda a derecha con el aspecto de su línea base como en el modo horizontal normal.

información relacionada