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 구별하기

\hboxLaTeX 명령이 아닌 TeX 기본 요소이며 대부분의 LaTeX 구성과 잘 반응하지 않습니다. 특히 center환경의 중심에 있지 않으며 단락 시작 부분에서 예상치 못한 다양한 동작이 있습니다.

목록과의 구체적인 상호 작용은 거기에 언급되어 있지 않으므로 그것이 중복임을 제안하는 대신 여기에 대답합니다.

LaTeX는 레이블을 박스 레지스터에 조판한 후 다음 단락의 시작 부분에 레이블을 삽입하여 목록 항목 레이블을 구현합니다. \hbox단락을 시작하지 않는 경우 이 기본 상자 구성은 hbox를 주변 수직 목록에 직접 삽입하므로 다음 텍스트가 단락을 시작할 때까지 저장된 항목 레이블이 삽입되지 않습니다. 따라서 lable은 상자 뒤에 옵니다.

따라서 단순히 (의 정의의 주요 부분임 ) \leavevmode\hbox대신을 사용하여 이 문제를 해결할 수 있습니다. 또는 구문을 사용하면서 표준 라텍스 등가물을 사용할 수 있습니다.\hbox\mbox\hbox to

\makebox[1cm]{...}

자동으로 적용되어 \leavevmode1cm 너비의 상자를 구성합니다.

답변2

무슨 일이 일어나는지는 레이블이 \everypar명령으로 배치된다는 것입니다.

\everyparTeX가 수평 모드로 들어갈 때(들여쓰기 후) 모든 단락의 시작 부분에 내용이 삽입됩니다.

기본 \hbox요소는 새 단락을 시작하지 않습니다. 즉 수직 목록에 추가되므로 레이블은 새 단락을 시작하는 추가 항목( ,OP의 쉼표)을 기다립니다.

이것 좀 봐질문

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}

관련 정보