Hva er forskjellene mellom \hbox
og \mbox
?
Relatert:
- Dette svaret på «Hva er de forskjellige typene bokser i ( La) TeX? « diskuterer generelt forskjellige bokser.
- Dette svaret på» Forskjellen mellom forskjellige metoder for å produsere tekst i matematikkmodus « skiller
\text
fra\mbox
.
Kommentarer
- Hovedforskjellen er at bruk av
\hbox
i LaTeX kan føre til uventede resultater. Så bruk alltid sistnevnte, med mindre du vet hva du ' gjør med\hbox
.
Svar
\hbox
er en TeX-primitiv og \mbox
er en LaTeX-makro definert via
\long\def\mbox#1{\leavevmode\hbox{#1}}
\leavevmode
betyr at den starter et avsnitt, sammenlign:
\hbox{one} \hbox{two} three
med
\mbox{one} \mbox{two} three
Den andre forskjellen er at argumentet blir analysert som et vanlig makroargument, så for eksempel fungerer \mbox a
og er identisk med \mbox{a}
mens \hbox a
er en syntaksfeil. \mbox{\verb|{|}
vil føre til feil, men \hbox{\verb|{|}
vil bokse ordrett {
.
Hvis du bruker en avstivningsgruppe for argumentet, må den være eksplisitt {}
(eller andre tegn med koden 1 og 2), men \hbox
kan bruke implisitte bukseseler som \hbox\bgroup
… \egroup
(spesielt kan du starte en rute i en makro og avslutte den i en annen).
Ikke bruk \hbox
i et LaTeX-dokument (selv om du ofte vil se det i intern pakkekode).
Som forespurt, noen ytterligere 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}
Etter den første compare
er et avsnittskifte, så TeX går i vertikal modus. I vertikal modus stables boksene vertikalt. De neste to boksene er \hbox
es med og two
slik at de blir lagt vertikalt til den gjeldende vertikale listen. Så kommer bokstaven t
i three
; bokstaver er ikke tillatt i vertikal modus, så TeX skyver den tilbake i inngangen og starter i stedet et nytt avsnitt, legger til avsnittinnrykk og ser deretter three
igjen i horisontal modus.
Etter den første with
er det igjen et avsnittbrudd, men denne gangen ser TeX \leavevmode
(eller mer nøyaktig \unhbox
i definisjonen), så den starter et nytt avsnitt, legger til fordypningen og deretter ser \hbox{one}
i horisontal modus . \leavevmode
gjør ingenting i h-modus, så etter limet fra ordet space som kommer fra end-of-line-tegnet, ser TeX \hbox{two}
, som kommer horisontalt etter one
, og three
følger i samme avsnitt.
Etter det andre compare
er TeX igjen i vertikal modus, men denne gangen startes avsnittet av zero
, så TeX er allerede i horisontal modus før den ser \hbox
, så \hbox
og \mbox
fungerer på samme måte.
LaTeX går i utgangspunktet til å aldri avsløre den primitive TeX-boksens oppførsel: alle LaTeX-bokser starter med \leavevmode
slik at de handler som \mbox
og ikke \hbox
. (Forskjellen er i utgangspunktet den samme som forskjellen mellom \parbox
(LaTeX) og \vbox
(TeX) og \rule
(LaTeX) og \hrule
(TeX) for eksempel.)