É possível definir uma versão pontilhada de `\vrule`?

É possível definir uma versão pontilhada de `\vrule`?

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

insira a descrição da imagem aqui

É 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 \cleadersde uma especificação de cola infinita ( \hfill). Uma definição semelhante de \vdotfilltem dois problemas:

  • \leaderse 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-saveposdo projeto zreffornece 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 \vadjustinterferindo na medição de posição.

Esboço de solução com LuaTeX

LuaTeX fornece um novo recurso "atributo". Assim, uma normal \vrulecom 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

\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 \vdotfilterá 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 \putboxfaz 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.

informação relacionada