\vbox
não alterna modos e \hbox
não alterna modos, conforme demonstrado pelos dois grupos de exemplos a seguir.
Os dois exemplos a seguir produzem resultados idênticos:
\hbox{A}
\end
\noindent A
\end
Os dois exemplos a seguir também produzem resultados idênticos:
\vbox{\hrule width 1em}
\end
\noindent\vbox{\hrule width 1em}
\end
Além disso, o conteúdo vazio muda o modo de vertical para horizontal, como em \unhbox\voidb@x
. Esse mesmo conteúdo vazio pode ser obtido via \unvbox\voidb@x
. Mas usar isso não muda o modo de vertical para horizontal (veja os dois exemplos a seguir). Por que?
\leavevmode\hbox{A}
\end
\catcode`\@=11
\unvbox\voidb@x\hbox{A}
\end
(Aqui no primeiro exemplo é adicionado recuo e no segundo não.)
\vbox
pode estar dentro de um parágrafo, como \hbox
. Que sequência de controle pode ser usada para criar um parágrafo \vbox
no meio e também no início do parágrafo?
Responder1
O comando para iniciar o modo horizontal com a \vbox
é \leavevmode
. Por que você precisaria de algo mais?
Receio que sua suposição esteja errada: não é o “conteúdo vazio” que desencadeia a mudança de modo. Isso éprecisamente \unhbox
isso faz.
Diferentemente de \box
e \copy
, \unhbox
é um comando horizontal, então ele aciona o modo horizontal se o TeX estiver no modo vertical. A macro \leavevmode
usa \voidb@x
para que nada seja anexado à lista horizontal (possivelmente após tê-la iniciado).
O comando analógico \unvbox
é um comando vertical eterminaum parágrafo.
\catcode`@=11
\def\leavehmode{\unvbox\voidb@x}
\catcode`@=12
\everypar{PAR}% to show a paragraph has started
abc\leavehmode def
\bye
Responder2
Não sei se isso está claro ou não, mas vamos afirmar explicitamente (do TeXbook):
|\leavevmode| is an abbreviation for `|\unhbox\voidbox|',
where |\voidbox| is a permanently empty box register.
Agora, o que \unhbox\voidbox
realmente faz? Vamos dar uma olhadatex.web
:
@ @<Cases of |main_control| that build...@>=
vmode+start_par: new_graf(cur_chr>0);
vmode+letter,vmode+other_char,vmode+char_num,vmode+char_given,
vmode+math_shift,vmode+un_hbox,vmode+vrule,
vmode+accent,vmode+discretionary,vmode+hskip,vmode+valign,
vmode+ex_space,vmode+no_boundary:@t@>@;@/
begin back_input; new_graf(true);
end;
Como você pode ver, qualquer uma dessas combinações de modo e outra coisa inicia um parágrafo, mas vmode+un_vbox
não está entre elas.
A título pessoal, acho interessante que Knuth não tenha deixado vmode+<*>vbox
começar um parágrafo, mas vmode+valign
o faz.