![Was passiert mit einem Artikel, der mit einer Hbox beginnt?](https://rvso.com/image/399852/Was%20passiert%20mit%20einem%20Artikel%2C%20der%20mit%20einer%20Hbox%20beginnt%3F.png)
Ich benutze LaTeX seit Jahren und habe das noch nie zuvor gesehen: Wenn ein Element (in enumerate
) mit einem beginnt \hbox
, dann \hbox
wird 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.
Leerzeichen, \relax
, nichts verhindert das \hbox
Zurückschieben außer dem eigentlichen Text.
Was mache ich falsch?
Antwort1
Wie in
Unterscheidung zwischen \hbox und \mbox
\hbox
ist ein TeX-Grundelement, kein LaTeX-Befehl, und reagiert nicht gut mit den meisten LaTeX-Konstrukten. Insbesondere wird es nicht durch eine center
Umgebung 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. \hbox
beginnt 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\hbox
anstelle von einfach verwenden \hbox
(das ist der Hauptteil der Definition von \mbox
) oder wie bei der \hbox to
Syntax das Standard-Latex-Äquivalent verwenden, nämlich
\makebox[1cm]{...}
die automatisch angewendet wird \leavevmode
und auch die 1 cm breite Box konstruiert.
Antwort2
Was passiert, ist, dass das Etikett mit Befehl platziert wird \everypar
.
\everypar
Inhalt wird am Anfang jedes Absatzes eingefügt, wenn TeX in den horizontalen Modus wechselt (nach der Einrückung).
Das \hbox
Grundelement 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}