Vad är skillnaderna mellan \hbox
och \mbox
?
Relaterat:
- Detta svar på ”Vilka är de olika typerna av rutor i ( La) TeX? ” diskuterar i allmänhet olika rutor.
- Detta svar på” Skillnad mellan olika metoder för att producera text i matematikläge ” skiljer
\text
från\mbox
.
Kommentarer
- Huvudskillnaden är att användning av
\hbox
i LaTeX kan leda till oväntade resultat. Så använd alltid det senare, såvida du inte vet vad du ' gör med\hbox
.
Svar
\hbox
är en TeX-primitiv och \mbox
är ett LaTeX-makro definierat via
\long\def\mbox#1{\leavevmode\hbox{#1}}
\leavevmode
betyder att det startar ett stycke, jämför:
\hbox{one} \hbox{two} three
med
\mbox{one} \mbox{two} three
Den andra skillnaden är att argumentet analyseras som ett normalt makroargument, så till exempel fungerar \mbox a
och är identisk med \mbox{a}
medan \hbox a
är ett syntaxfel. \mbox{\verb|{|}
kommer att leda till fel men \hbox{\verb|{|}
kommer att markera ett ordligt {
.
Om du använder en klammergrupp för argumentet måste det vara tydligt {}
(eller andra tecken med catcodes 1 och 2) men \hbox
kan använda implicita hakparenteser som \hbox\bgroup
… \egroup
(i synnerhet kan du starta en ruta i ett makro och avsluta den i en annan).
Använd inte \hbox
i ett LaTeX-dokument (även om du ofta ser det i intern paketkod).
På begäran, några ytterligare detaljer om \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}
Efter den första compare
är en styckebrytning, så TeX går in i vertikalt läge. I vertikalt läge staplas rutor vertikalt. De två följande rutorna är \hbox
es med och two
så att de läggs vertikalt till den aktuella vertikala listan. Sedan kommer bokstaven t
i three
; bokstäver är inte tillåtna i vertikalt läge så TeX skjuter tillbaka det i ingången och startar istället ett nytt stycke, lägger till styckeindragningen och ser sedan three
igen i horisontellt läge.
Efter den första with
finns det igen en styckebrytning, men den här gången ser TeX \leavevmode
(eller mer exakt \unhbox
i sin definition), så det startar ett nytt stycke, lägger till fördjupningen och sedan ser \hbox{one}
i horisontellt läge . \leavevmode
gör ingenting i h-läge så efter limet från ordet space som härrör från slutet på linjen ser TeX \hbox{two}
, som kommer horisontellt efter one
och three
följer i samma stycke.
Efter det andra compare
är TeX igen i vertikalt läge, men den här gången startas stycket av zero
, så TeX är redan i horisontellt läge innan det ser \hbox
, så \hbox
och \mbox
agerar på samma sätt.
I grund och botten går LaTeX till en viss längd för att aldrig exponera det primitiva TeX-rutans beteende: alla LaTeX-rutor börjar med \leavevmode
så att de agerar som \mbox
och inte \hbox
. (Skillnaden är i princip samma som skillnaden mellan \parbox
(LaTeX) och \vbox
(TeX) och \rule
(LaTeX) och \hrule
(TeX) till exempel.)