
La \vrule
primitiva 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}
¿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
\dotfill
se define mediante \cleaders
y una especificación de pegamento infinita ( \hfill
). Una definición similar de \vdotfill
tiene dos problemas:
\leaders
y 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-savepos
del proyecto zref
proporciona 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 \vadjust
con la medición de la posición.
Bosquejo de la solución con LuaTeX
LuaTeX proporciona una nueva característica "atributo". Por lo tanto, \vrule
se 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 \vrule
se 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 \vdotfil
más de 5 cm de altura y 2 cm de profundidad. El segundo ejemplo es equivalente a \hbox{Hello\vrule you}
.
Aquí está \valign
diseñ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 \putbox
separa 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.