
Creé un comando para llenar una línea con un rectángulo negro. Se llama \fullrule
, puedes encontrarlo en el código siguiente.
Tengo varias preguntas 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}
Esto es lo que produce:
- ¿Por qué la primera línea de mi documento tiene sangría? (Está bien, este es el problema más pequeño).
- Tuve que agregar
\hspace*{0pt}
justo antes\leaders
y después de "la\leaders
parte completa" para que funcionara con líneas sin caracteres principales antes\fullrule
. ¿Por qué? (Me gustaría entender esto, porque me tomó mucho tiempo entenderlo al intentarlo). - ¿Hay alguna forma de reescribir el
\fullrule
comando para usar el tamaño de fuente real en lugar de 10 puntos (ver% MARK 1
en el código anterior) y calcular el aumento de la regla usando el tamaño de fuente real (ver% MARK 2
en el código anterior)?
¡Gracias!
Respuesta1
\newcommand{\fullrule}{%
\noindent\null\leaders\hrule height \dimexpr\ht\strutbox-\fboxrule\relax
depth \dimexpr\dp\strutbox-\fboxrule\relax\hfill
\null}
Como comenta al unísono, \fullrule
comienza un párrafo, por lo que tiene sangría.
Veamos qué hace la nueva definición:
\noindent
comienza un párrafo sin sangría; si ya estamos dentro de un párrafo no hace nada.\null
deja caer una caja invisible que hará que\fullrule
no sea tragado al principio de una línea.En lugar de repetir un cuadro, utilizamos la
\leaders\hrule
característica de TeX: rellenar con una regla el espacio especificado al final (en este caso\hfill
).\null
evitará que los líderes sean ignorados al final de un párrafo (TeX siempre lo hace\unskip
cuando escanea el final de un párrafo).
Para los puntos 2 y 4 es importante saber que los líderes se tratan igual que el pegamento, aparte de llenar el espacio con algo en lugar de espacio en blanco.
La \hrule
especificación le dice a TeX que la regla debe ser tan alta y profunda como un puntal (con una pequeña corrección que usted mismo puede ajustar); por lo tanto, la altura y profundidad de la regla dependerán del salto de línea de base actual.
Respuesta2
\leaders
en modo vertical espere pegamento vertical. Por lo tanto \leaders
, \hfill
no se puede utilizar en modo vertical. Al comienzo de un nuevo párrafo estás en modo vertical. Entonces primero debes salir del modo vertical. Puede hacer esto no solo con \leavemode
sino \hspace*
u otro elemento invisible como \null
(definido en el kernel de LaTeX como un cuadro horizontal vacío:) \hbox{}
.
\hfill
al final de una línea no llena nada, porque TeX elimina el último espacio horizontal al final de los párrafos. Puedes evitar esto usando material invisible nuevamente o un espacio horizontal más (incluso \hspace
sin estrella) o \kern0pt
(eso es lo que se ha hecho en el kernel de LaTeX en casos similares), por ejemplo \dotfill
o \hrulefill
.
Para detectar la altura y profundidad de una línea puede utilizar \ht\strutbox
y \dp\strutbox
.
Aquí una sugerencia con una versión adaptada del \hrulefill
kernel de LaTeX (solo se ha agregado la altura y la profundidad de la regla):
\newcommand{\fullrule}{%
\leavevmode
\leaders\hrule height\ht\strutbox depth\dp\strutbox\hfill\kern0pt}%
Esta versión no elimina la sangría del párrafo. Si desea eliminar la sangría del párrafo, utilice la solución de egreg.