Что происходит с элементом, который начинается с hbox?

Что происходит с элементом, который начинается с hbox?

Я пользуюсь LaTeX уже много лет и никогда раньше не видел такого: если элемент (в enumerate) начинается с \hbox, то , \hboxпомещаетсядонаклейка!

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

Результат неожиданный, за исключением последнего пункта. показывает текст, предшествующий меткам

Пробелы \relax, ничто не мешает \hboxперемещению назад, кроме самого текста.

Что я делаю не так?

решение1

Как объяснено в

Различия между \hbox и \mbox

\hboxявляется примитивом TeX, а не командой LaTeX и плохо взаимодействует с большинством конструкций LaTeX, в частности, он не центрируется окружением centerи имеет различные, возможно, неожиданные поведения в начале абзаца.

Однако конкретное взаимодействие со списками там не упоминается, поэтому ответ здесь, а не предположение, будет дублированием.

LaTeX реализует метки элементов списка, набирая метку в регистре ящика и затем вставляя метку в начало следующего абзаца. \hboxне начинает абзац, эта примитивная конструкция ящика вставляет hbox непосредственно в окружающий вертикальный список, поэтому сохраненная метка элемента не вставляется, пока какой-либо следующий текст не начнет абзац. Таким образом, метка идет после ящика.

Таким образом, вы можете исправить это, используя \leavevmode\hboxвместо просто \hbox(это основная часть определения \mbox) или, как вы используете синтаксис, \hbox toвы можете использовать стандартный эквивалент Latex, а именно

\makebox[1cm]{...}

который будет применен автоматически, \leavevmodeа также будет построен ящик шириной 1 см.

решение2

Происходит следующее: метка размещается с помощью \everyparкоманды.

\everyparСодержимое вставляется в начало каждого абзаца, когда TeX переходит в горизонтальный режим (после отступа).

Примитив \hboxне начинает новый абзац, т.е. он добавляется в вертикальный список, поэтому метка будет ждать дополнительных элементов, которые начинают новый абзац (запятая ,в OP).

Видеть этовопрос

ЕСМ

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

ЕСМ

\documentclass{article}

\begin{document}
\begingroup
\everypar{\textbf{Foo} }
yes

\mbox{yes} again

\hbox{what's} now
\endgroup
\end{document}

Связанный контент