Jakie są różnice między \hbox
a \mbox
?
Powiązane:
- Ta odpowiedź na pytanie „Jakie są rodzaje pól w ( La) TeX? ” omawia ogólnie różne pola.
- Ta odpowiedź na pytanie„ Różnica między różnymi metodami tworzenia tekstu w trybie matematycznym ” odróżnia
\text
od\mbox
.
Komentarze
- Główna różnica polega na tym, że użycie
\hbox
w LaTeX może prowadzić do nieoczekiwanych rezultatów. Dlatego zawsze używaj tego drugiego, chyba że wiesz, co ' robisz z\hbox
.
Odpowiedź
\hbox
to prymityw TeX, a \mbox
to makro LaTeX zdefiniowane za pomocą
\long\def\mbox#1{\leavevmode\hbox{#1}}
\leavevmode
oznacza, że rozpoczyna akapit, porównaj:
\hbox{one} \hbox{two} three
with
\mbox{one} \mbox{two} three
Inna różnica polega na tym, że argument jest analizowany jako zwykły argument makra, na przykład \mbox a
działa i jest identyczny z \mbox{a}
, podczas gdy \hbox a
to błąd składniowy. \mbox{\verb|{|}
spowoduje błędy, ale \hbox{\verb|{|}
będzie oznaczać dosłownie {
.
Jeśli używasz nawiasów klamrowych jako argumentu, musi to być jawne {}
(lub inne znaki z catcodes 1 i 2), ale \hbox
może używać niejawnych nawiasów klamrowych, takich jak \hbox\bgroup
… \egroup
(w szczególności możesz rozpocząć ramkę w jednym makrze i zakończyć w innym).
Nie używaj \hbox
w dokumencie LaTeX (chociaż często zobaczysz to w wewnętrznym kodzie pakietu).
Zgodnie z prośbą, dodatkowe szczegóły dotyczące \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}
Po pierwszym compare
znajduje się podział akapitu, więc TeX przechodzi w tryb pionowy . W trybie pionowym pudełka są układane w stos w pionie. Kolejne dwa pola to \hbox
i i two
, aby zostały dołączone pionowo do bieżącej listy pionowej. Następnie pojawia się litera t
z three
; litery nie są dozwolone w trybie pionowym, więc TeX wpycha go z powrotem do wejścia i zamiast tego rozpoczyna nowy akapit, dodaje wcięcie akapitu, a następnie widzi three
ponownie w trybie poziomym.
Po pierwszym with
jest znowu podział akapitu, ale tym razem TeX widzi \leavevmode
(a dokładniej \unhbox
w swojej definicji), więc rozpoczyna nowy akapit, dodaje wcięcie i następnie widzi \hbox{one}
w trybie poziomym . \leavevmode
nic nie robi w trybie h, więc po sklejeniu ze spacji wynikającej ze znaku końca wiersza TeX widzi \hbox{two}
, który pojawia się poziomo po one
, a three
następuje w tym samym akapicie.
Po drugim compare
TeX jest ponownie w trybie pionowym, ale tym razem akapit jest rozpoczynany przez zero
, więc TeX jest już włączony tryb poziomy, zanim zobaczy \hbox
, więc \hbox
i \mbox
działają w ten sam sposób.
Zasadniczo LaTeX dokłada wszelkich starań, aby nigdy nie ujawniać pierwotnego zachowania okienek TeX-a: wszystkie pola LaTeX-a zaczynają się od \leavevmode
, aby działały na przykład \mbox
, a nie \hbox
. (Różnica jest zasadniczo taka sama, jak różnica między \parbox
(LaTeX) i \vbox
(TeX) i \rule
(LaTeX) i \hrule
(TeX) na przykład.)