
O \vrule
primitivo tem uma característica interessante: tem a capacidade de se adaptar à altura e profundidade da caixa 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}
É possível definir um comando semelhante, digamos \vdotfill
, que seja um equivalente pontilhado de \vrule
? Se sim, como? Caso contrário, por que não?
Responder1
\dotfill
é definido por meio \cleaders
de uma especificação de cola infinita ( \hfill
). Uma definição semelhante de \vdotfill
tem dois problemas:
\leaders
e amigos só trabalham com colas horizontais no modo horizontal ou com cola vertical no modo vertical. Variantes ortogonais não estão disponíveis.Existem duas direções verticais (altura e profundidade) em vez de uma horizontal. Isso levanta muitas questões novas: onde começa o preenchimento? Como são especificadas as direções e os valores?
Operadores de PDF
Se a regra TeX for implementada por uma linha na descrição da página PDF, então o estado dos gráficos poderá ser alterado para obter uma linha tracejada, podendo ter extremidades de linha arredondadas. Entretanto, uma regra também pode ser implementada por um retângulo preenchido, onde esse truque não funciona.
Solução alternativa desajeitada para pdfTeX
As posições verticais via \pdfsavepos
(o módulo zref-savepos
do projeto zref
fornece uma interface) podem ser adicionadas no pdfTeX na linha base e via \vadjust
(depois) e \vadjust pre
(antes da linha atual). Este último é uma especialidade do pdfTeX. A profundidade e a altura podem ser calculadas e a linha pontilhada vertical pode ser definida.
No entanto, isso não funcionará em todas as circunstâncias. Por exemplo, outro material pode ser adicionado \vadjust
interferindo na medição de posição.
Esboço de solução com LuaTeX
LuaTeX fornece um novo recurso "atributo". Assim, uma normal \vrule
com a largura correta pode ser definida com um atributo que significa uma linha pontilhada vertical. Em seguida, a página construída (sua árvore de nós) é percorrida para encontrar tais regras para substituí-las por linhas verticais pontilhadas.
Responder2
Só \vrule
é possível adaptar a sua altura mais profundidade à dimensão da caixa exterior. Se você precisar colocar uma regra pontilhada entre duas ou mais caixas com altura e profundidade desconhecidas, você pode 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
O \vdotfil
terá mais de 5 cm de altura e 2 cm de profundidade neste exemplo. O segundo exemplo é equivalente a \hbox{Hello\vrule you}
.
O \valign
é projetado com duas "linhas" aqui, a primeira "linha" inclui apenas as alturas das caixas e a segunda "linha" apenas as profundidades das mesmas caixas. A macro \putbox
faz a separação da caixa seguinte em sua "parte de altura" e "parte de profundidade" e coloca os resultados nas "linhas" apropriadas. A razão desta complicação é que precisamos definir as caixas da esquerda para a direita com o aspecto da sua linha de base como no modo horizontal normal.