Was passiert mit einem Artikel, der mit einer Hbox beginnt?

Was passiert mit einem Artikel, der mit einer Hbox beginnt?

Ich benutze LaTeX seit Jahren und habe das noch nie zuvor gesehen: Wenn ein Element (in enumerate) mit einem beginnt \hbox, dann \hboxwird das platziertVordas Etikett!

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

Das Ergebnis ist, mit Ausnahme des letzten Punkts, unerwartet. zeigt Text an, der vor Beschriftungen steht

Leerzeichen, \relax, nichts verhindert das \hboxZurückschieben außer dem eigentlichen Text.

Was mache ich falsch?

Antwort1

Wie in

Unterscheidung zwischen \hbox und \mbox

\hboxist ein TeX-Grundelement, kein LaTeX-Befehl, und reagiert nicht gut mit den meisten LaTeX-Konstrukten. Insbesondere wird es nicht durch eine centerUmgebung zentriert und weist zu Beginn eines Absatzes verschiedene möglicherweise unerwartete Verhaltensweisen auf.

Die spezifische Interaktion mit Listen wird dort jedoch nicht erwähnt, daher ist die Antwort hier, anstatt dies vorzuschlagen, ein Duplikat.

LaTeX implementiert Listenelementbeschriftungen, indem die Beschriftung in ein Boxregister gesetzt und dann am Anfang des folgenden Absatzes eingefügt wird. \hboxbeginnt keinen Absatz, diese primitive Boxkonstruktion fügt die Hbox direkt in die umgebende vertikale Liste ein, sodass die gespeicherte Elementbeschriftung erst eingefügt wird, wenn ein nachfolgender Text den Absatz beginnt. Die Beschriftung kommt also nach der Box.

Sie können dies beheben, indem Sie \leavevmode\hboxanstelle von einfach verwenden \hbox(das ist der Hauptteil der Definition von \mbox) oder wie bei der \hbox toSyntax das Standard-Latex-Äquivalent verwenden, nämlich

\makebox[1cm]{...}

die automatisch angewendet wird \leavevmodeund auch die 1 cm breite Box konstruiert.

Antwort2

Was passiert, ist, dass das Etikett mit Befehl platziert wird \everypar.

\everyparInhalt wird am Anfang jedes Absatzes eingefügt, wenn TeX in den horizontalen Modus wechselt (nach der Einrückung).

Das \hboxGrundelement beginnt keinen neuen Absatz, d. h. es fügt der vertikalen Liste etwas hinzu, sodass das Etikett auf zusätzliches Material wartet, das einen neuen Absatz beginnt (Komma ,im OP).

Sieh dir das anFrage

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}

verwandte Informationen