Anomalias e uma dúvida sobre uma regra de preenchimento de linha

Anomalias e uma dúvida sobre uma regra de preenchimento de linha

Criei um comando para preencher uma linha com um retângulo preto. Chama-se \fullrule, você pode encontrá-lo no código abaixo.

Tenho várias perguntas sobre este MWE:

\documentclass[10pt]{article}
\usepackage[a4paper]{geometry}

\newlength{\mylift}
\setlength{\mylift}{-10pt} % MARK2
\addtolength{\mylift}{-1ex}
\addtolength{\mylift}{\baselineskip}

\newcommand{\fullrule}{%
    {\hspace*{0pt}\leaders\hbox{\rule[\mylift]{1pt}{10pt}}\hfill}% % MARK 1
    \hspace*{0pt}}

\begin{document}
aaa

\fullrule

aaa\fullrule{}\\
\fullrule{}\\
\fullrule{}

\fullrule

aaa\fullrule{}aaa

\fullrule{}\\
\fullrule{}aaa\\
\fullrule
\end{document}

Isto é o que produz:

regra completa

  1. Por que a primeira linha do meu documento está recuada? (Ok, este é o menor problema.)
  2. Tive que adicionar \hspace*{0pt}logo antes \leaderse depois da "parte inteira \leaders" para que funcionasse com linhas sem caracteres iniciais antes de \fullrule. Por que? (Eu gostaria de entender isso, porque demorou muito para descobrir como tentar.)
  3. Existe alguma maneira de reescrever o \fullrulecomando para usar o tamanho real da fonte em vez de 10pt (veja % MARK 1no código acima) e calcular o aumento da regra usando o tamanho real da fonte (veja % MARK 2no código acima).

Obrigado!

Responder1

\newcommand{\fullrule}{%
  \noindent\null\leaders\hrule height \dimexpr\ht\strutbox-\fboxrule\relax
                          depth  \dimexpr\dp\strutbox-\fboxrule\relax\hfill
  \null}

Como observações sincronizadas, você \fullruleinicia um parágrafo e, portanto, é recuado.

Vamos ver o que a nova definição faz:

  1. \noindentinicia um parágrafo sem recuo; se já estamos dentro de um parágrafo, não faz nada.

  2. \nulldeixa cair uma caixa invisível que fará com que \fullrulenão seja engolido no início de uma linha.

  3. Em vez de repetir uma caixa, usamos o \leaders\hrulerecurso do TeX: preencher com uma regra o espaço especificado no final (neste caso \hfill).

  4. \nullevitará que os líderes sejam ignorados no final de um parágrafo (o TeX sempre o faz \unskipquando verifica o final de um parágrafo).

Para os pontos 2 e 4 é importante saber que os líderes são tratados como cola, exceto preencher o espaço com algo em vez de espaço em branco.

A \hruleespecificação diz ao TeX que a regra deve ser tão alta e profunda quanto um suporte (com uma pequena correção que você mesmo pode ajustar); portanto, a altura e a profundidade da regra dependerão do salto da linha de base atual.

Responder2

\leadersno modo vertical, espere cola vertical. Portanto, \leaderswith \hfillnão pode ser usado no modo vertical. No início de um novo parágrafo você está no modo vertical. Então você tem que sair do modo vertical primeiro. Você pode fazer isso não apenas com, \leavemodemas \hspace*ou outro elemento invisível como \null(definido no kernel do LaTeX como uma caixa horizontal vazia:) \hbox{}.

\hfillno final de uma linha não preenche nada, pois o TeX remove o último espaço horizontal no final dos parágrafos. Você pode evitar isso usando material invisível novamente ou mais um espaço horizontal (mesmo \hspacesem estrela) ou \kern0pt(isso é o que foi feito no kernel do LaTeX em casos semelhantes), por exemplo, \dotfillou \hrulefill.

Para detectar a altura e profundidade de uma linha você pode usar \ht\strutboxe \dp\strutbox.

Aqui está uma sugestão com uma versão adaptada do \hrulefillkernel LaTeX (apenas altura e profundidade da regra foram adicionadas):

\newcommand{\fullrule}{%
  \leavevmode
  \leaders\hrule height\ht\strutbox depth\dp\strutbox\hfill\kern0pt}%

Esta versão não remove o recuo do parágrafo. Se você deseja remover o recuo do parágrafo, use a solução do egreg.

informação relacionada