¿Qué sucede con un elemento que comienza con hbox?

¿Qué sucede con un elemento que comienza con hbox?

He estado usando LaTeX durante años y nunca había visto esto antes: si un elemento (en enumerate) comienza con \hbox, entonces \hboxse 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. muestra el texto que viene antes de las etiquetas

Espacios en blanco \relax, nada impide que \hboxse retroceda excepto el texto real.

¿Qué estoy haciendo mal?

Respuesta1

Como se explica en

Diferenciar entre \hbox y \mbox

\hboxes 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 centerentorno 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. \hboxno 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\hboxen lugar de simplemente \hbox(esa es la parte principal de la definición de \mbox) o, como estás usando la \hbox tosintaxis, podrías usar el equivalente de látex estándar, es decir

\makebox[1cm]{...}

que se aplicará automáticamente \leavevmodeademás de construir la caja de 1 cm de ancho.

Respuesta2

Lo que pasa es que la etiqueta se coloca con \everyparcomando.

\everyparEl contenido se inserta al principio de cada párrafo, cuando TeX ingresa al modo horizontal (después de la sangría).

La \hboxprimitiva 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}

información relacionada