Wat zijn de verschillen tussen \hbox en \mbox?

Gerelateerd:

Reacties

  • Het belangrijkste verschil is dat het gebruik van \hbox in LaTeX tot onverwachte resultaten kan leiden. Gebruik dus altijd het laatste, tenzij je weet wat je ' doet met \hbox.

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} 

voer hier een afbeeldingbeschrijving in

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.)

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *