Vad är skillnaderna mellan \hbox och \mbox?

Relaterat:

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} 

ange bildbeskrivning här

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

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *