![Что происходит с элементом, который начинается с hbox?](https://rvso.com/image/399852/%D0%A7%D1%82%D0%BE%20%D0%BF%D1%80%D0%BE%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%B8%D1%82%20%D1%81%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%BC%2C%20%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B9%20%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D0%B5%D1%82%D1%81%D1%8F%20%D1%81%20hbox%3F.png)
Я пользуюсь 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
является примитивом 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}