Wat zijn de verschillen tussen \hbox
en \mbox
?
Gerelateerd:
- Dit antwoord op “Wat zijn de verschillende soorten vakken in ( La) TeX? “ bespreekt verschillende kaders in het algemeen.
- Dit antwoord op” Verschil tussen verschillende methoden voor het produceren van tekst in wiskundige modus “ onderscheidt
\text
van\mbox
.
Reacties
Answer
\hbox
is een TeX-primitief en \mbox
is een LaTeX-macro gedefinieerd via
\long\def\mbox#1{\leavevmode\hbox{#1}}
De \leavevmode
betekent dat het een alinea begint, vergelijk:
\hbox{one} \hbox{two} three
with
\mbox{one} \mbox{two} three
Het andere verschil is dat het argument wordt geparseerd als een normaal macroargument, dus bijvoorbeeld \mbox a
werkt en is identiek aan \mbox{a}
terwijl \hbox a
een syntaxisfout is. \mbox{\verb|{|}
leidt tot fouten, maar \hbox{\verb|{|}
zal een woordelijke {
weergeven.
Als je een accolade-groep gebruikt voor het argument, moet dit expliciet {}
zijn (of andere tekens met catcodes 1 en 2) maar \hbox
kan impliciete accolades gebruiken zoals \hbox\bgroup
… \egroup
(in het bijzonder kun je een box starten in een macro en eindigen in een andere).
Gebruik \hbox
niet in een LaTeX-document (hoewel je het vaak zult zien in interne pakketcode).
Zoals gevraagd, wat meer details over \leavevmode
:
\documentclass{article} \begin{document} compare \hbox{one} \hbox{two} three with \mbox{one} \mbox{two} three see? compare zero \hbox{one} \hbox{two} three with zero \mbox{one} \mbox{two} three see? \end{document}
Na de eerste compare
is een alinea-einde, dus TeX gaat in de verticale modus. In verticale modus worden dozen verticaal gestapeld. De volgende twee dozen zijn \hbox
es met en two
zodat ze verticaal aan de huidige verticale lijst worden toegevoegd. Dan komt de letter t
van three
; letters zijn niet toegestaan in verticale modus, dus TeX duwt het terug in de invoer en begint in plaats daarvan een nieuwe alinea, voegt de alinea-inspringing toe en ziet dan de three
weer in horizontale modus.
Na de eerste with
is er weer een alinea-einde, maar deze keer ziet TeX \leavevmode
(of beter gezegd de \unhbox
in zijn definitie), dus het begint een nieuwe alinea, voegt de inspringing toe en dan ziet \hbox{one}
in horizontale modus . \leavevmode
doet niets in de h-modus, dus na de lijm van de woordruimte die het resultaat is van het einde-van-regel-teken, ziet TeX \hbox{two}
, die horizontaal na one
komt, en three
volgt in dezelfde alinea.
Na de tweede compare
bevindt TeX zich weer in verticale modus, maar deze keer wordt de alinea gestart door zero
, dus TeX is al in horizontale modus voordat het de \hbox
ziet, dus \hbox
en \mbox
werken op dezelfde manier.
In principe gaat LaTeX tot het uiterste om nooit het primitieve TeX-boxgedrag bloot te leggen: alle LaTeX-boxen beginnen met \leavevmode
zodat ze handelen zoals \mbox
en niet \hbox
. (Het verschil is in principe hetzelfde als het verschil tussen \parbox
(LaTeX) en \vbox
(TeX) en \rule
(LaTeX) en \hrule
(TeX) bijvoorbeeld.)
\hbox
in LaTeX tot onverwachte resultaten kan leiden. Gebruik dus altijd het laatste, tenzij je weet wat je ' doet met\hbox
.