O que está acontecendo com um item que começa com hbox?

O que está acontecendo com um item que começa com hbox?

Eu uso LaTeX há anos e nunca vi isso antes: se um item (in enumerate) começa com um \hbox, então o \hboxé colocadoanteso rótulo!

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

O resultado é inesperado, exceto no último item. mostra o texto antes dos rótulos

Espaços em branco \relax, nada impede o \hboxretrocesso, exceto o texto real.

O que estou fazendo de errado?

Responder1

Como explicado em

Diferenciando entre \hbox e \mbox

\hboxé um comando TeX primitivo, não um comando LaTeX e não reage bem com a maioria das construções LaTeX, notavelmente não é centralizado por um centerambiente e tem vários comportamentos talvez inesperados no início de um parágrafo.

A interação específica com listas não é mencionada lá, portanto, responda aqui em vez de sugerir que é uma duplicata.

O LaTeX implementa rótulos de itens de lista compondo o rótulo em um registro de caixa e depois inserindo o rótulo no início do parágrafo seguinte. \hboxnão inicia um parágrafo, esta construção de caixa primitiva insere o hbox diretamente na lista vertical circundante, de modo que o rótulo do item salvo não é inserido até que algum texto seguinte inicie o parágrafo. Então a etiqueta vem depois da caixa.

Portanto, você pode corrigir isso usando \leavevmode\hboxem vez de simplesmente \hbox(essa é a parte principal da definição de \mbox) ou, ao usar a \hbox tosintaxe, você pode usar o equivalente padrão do látex, ou seja,

\makebox[1cm]{...}

que será aplicado automaticamente, \leavevmodebem como a construção da caixa de 1 cm de largura.

Responder2

O que acontece é que o rótulo é colocado com \everyparcomando.

\everyparo conteúdo é inserido no início de cada parágrafo, quando o TeX entra no modo horizontal (após o recuo).

A \hboxprimitiva não inicia um novo parágrafo, ou seja, é adicionada à lista vertical, então o rótulo aguardará por itens adicionais que iniciem um novo parágrafo (vírgula ,no OP).

Veja issopergunta

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}

informação relacionada