He estado usando LaTeX durante años y nunca había visto esto antes: si un elemento (en enumerate
) comienza con \hbox
, entonces \hbox
se colocaantes¡la etiqueta!
\documentclass[12pt]{article}
\def\Blank#1{\relax{\hbox to 1in{\hrulefill\textsl{#1}\hrulefill}}}
\begin{document}
\section{Example}
Here's a list:
\begin{enumerate}
\item
\Blank{test}, plus stuff after.
\item{}
\Blank{test}, plus stuff after.
\item\relax
\Blank{test}, plus stuff after.
\item{ }
\Blank{test}, plus stuff after.
\item{ }\relax
\hbox to 1in{\hrulefill\textsl{test}\hrulefill}, plus stuff after.
\item{ X }
\Blank{test}, plus stuff after.
% etc.
\end{enumerate}
\end{document}
El resultado es inesperado, excepto en el último punto.
Espacios en blanco \relax
, nada impide que \hbox
se retroceda excepto el texto real.
¿Qué estoy haciendo mal?
Respuesta1
Como se explica en
Diferenciar entre \hbox y \mbox
\hbox
es una primitiva de TeX, no un comando de LaTeX y no reacciona bien con la mayoría de las construcciones de LaTeX; en particular, no está centrado en un center
entorno y tiene varios comportamientos quizás inesperados al comienzo de un párrafo.
Sin embargo, la interacción específica con las listas no se menciona allí, por lo que responder aquí en lugar de sugerir que es un duplicado.
LaTeX implementa etiquetas de elementos de lista al componer la etiqueta en un registro de cuadro y luego insertar la etiqueta al comienzo del siguiente párrafo. \hbox
no comienza un párrafo, esta construcción de cuadro primitivo inserta el hbox directamente en la lista vertical circundante, por lo que la etiqueta del elemento guardado no se inserta hasta que el texto siguiente comience el párrafo. Entonces la etiqueta viene después de la caja.
Entonces, podrías solucionar este problema usando \leavevmode\hbox
en lugar de simplemente \hbox
(esa es la parte principal de la definición de \mbox
) o, como estás usando la \hbox to
sintaxis, podrías usar el equivalente de látex estándar, es decir
\makebox[1cm]{...}
que se aplicará automáticamente \leavevmode
además de construir la caja de 1 cm de ancho.
Respuesta2
Lo que pasa es que la etiqueta se coloca con \everypar
comando.
\everypar
El contenido se inserta al principio de cada párrafo, cuando TeX ingresa al modo horizontal (después de la sangría).
La \hbox
primitiva no comienza un nuevo párrafo, es decir, se agrega a la lista vertical, por lo que la etiqueta esperará cosas adicionales que comiencen un nuevo párrafo (coma ,
en el OP).
Mira estopregunta
ECM
\documentclass{article}
\def\myitem{\setbox0=\hbox{\textbullet\quad}\everypar{\unhbox0\everypar{}}}
\begin{document}
\myitem foo bar.
\myitem you see.
\myitem \mbox{OK. here} every thing is good.
\myitem \hbox {No!} but not here.
\end{document}
ECM
\documentclass{article}
\begin{document}
\begingroup
\everypar{\textbf{Foo} }
yes
\mbox{yes} again
\hbox{what's} now
\endgroup
\end{document}