
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:
- Por que a primeira linha do meu documento está recuada? (Ok, este é o menor problema.)
- Tive que adicionar
\hspace*{0pt}
logo antes\leaders
e 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.) - Existe alguma maneira de reescrever o
\fullrule
comando para usar o tamanho real da fonte em vez de 10pt (veja% MARK 1
no código acima) e calcular o aumento da regra usando o tamanho real da fonte (veja% MARK 2
no 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ê \fullrule
inicia um parágrafo e, portanto, é recuado.
Vamos ver o que a nova definição faz:
\noindent
inicia um parágrafo sem recuo; se já estamos dentro de um parágrafo, não faz nada.\null
deixa cair uma caixa invisível que fará com que\fullrule
não seja engolido no início de uma linha.Em vez de repetir uma caixa, usamos o
\leaders\hrule
recurso do TeX: preencher com uma regra o espaço especificado no final (neste caso\hfill
).\null
evitará que os líderes sejam ignorados no final de um parágrafo (o TeX sempre o faz\unskip
quando 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 \hrule
especificaçã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
\leaders
no modo vertical, espere cola vertical. Portanto, \leaders
with \hfill
nã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, \leavemode
mas \hspace*
ou outro elemento invisível como \null
(definido no kernel do LaTeX como uma caixa horizontal vazia:) \hbox{}
.
\hfill
no 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 \hspace
sem estrela) ou \kern0pt
(isso é o que foi feito no kernel do LaTeX em casos semelhantes), por exemplo, \dotfill
ou \hrulefill
.
Para detectar a altura e profundidade de uma linha você pode usar \ht\strutbox
e \dp\strutbox
.
Aqui está uma sugestão com uma versão adaptada do \hrulefill
kernel 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.