![O que está acontecendo com um item que começa com hbox?](https://rvso.com/image/399852/O%20que%20est%C3%A1%20acontecendo%20com%20um%20item%20que%20come%C3%A7a%20com%20hbox%3F.png)
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.
Espaços em branco \relax
, nada impede o \hbox
retrocesso, 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 center
ambiente 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. \hbox
nã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\hbox
em vez de simplesmente \hbox
(essa é a parte principal da definição de \mbox
) ou, ao usar a \hbox to
sintaxe, você pode usar o equivalente padrão do látex, ou seja,
\makebox[1cm]{...}
que será aplicado automaticamente, \leavevmode
bem como a construção da caixa de 1 cm de largura.
Responder2
O que acontece é que o rótulo é colocado com \everypar
comando.
\everypar
o conteúdo é inserido no início de cada parágrafo, quando o TeX entra no modo horizontal (após o recuo).
A \hbox
primitiva 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}