Anomalías y una pregunta sobre una regla de llenado de líneas

Anomalías y una pregunta sobre una regla de llenado de líneas

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:

regla completa

  1. ¿Por qué la primera línea de mi documento tiene sangría? (Está bien, este es el problema más pequeño).
  2. Tuve que agregar \hspace*{0pt}justo antes \leadersy después de "la \leadersparte 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).
  3. ¿Hay alguna forma de reescribir el \fullrulecomando para usar el tamaño de fuente real en lugar de 10 puntos (ver % MARK 1en el código anterior) y calcular el aumento de la regla usando el tamaño de fuente real (ver % MARK 2en 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, \fullrulecomienza un párrafo, por lo que tiene sangría.

Veamos qué hace la nueva definición:

  1. \noindentcomienza un párrafo sin sangría; si ya estamos dentro de un párrafo no hace nada.

  2. \nulldeja caer una caja invisible que hará que \fullruleno sea tragado al principio de una línea.

  3. En lugar de repetir un cuadro, utilizamos la \leaders\hrulecaracterística de TeX: rellenar con una regla el espacio especificado al final (en este caso \hfill).

  4. \nullevitará que los líderes sean ignorados al final de un párrafo (TeX siempre lo hace \unskipcuando 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 \hruleespecificació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

\leadersen modo vertical espere pegamento vertical. Por lo tanto \leaders, \hfillno 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 \leavemodesino \hspace*u otro elemento invisible como \null(definido en el kernel de LaTeX como un cuadro horizontal vacío:) \hbox{}.

\hfillal 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 \hspacesin estrella) o \kern0pt(eso es lo que se ha hecho en el kernel de LaTeX en casos similares), por ejemplo \dotfillo \hrulefill.

Para detectar la altura y profundidad de una línea puede utilizar \ht\strutboxy \dp\strutbox.

Aquí una sugerencia con una versión adaptada del \hrulefillkernel 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.

información relacionada