\vbox
no cambia de modo y \hbox
no cambia de modo, como lo demuestran los siguientes dos grupos de ejemplos.
Los dos ejemplos siguientes producen resultados idénticos:
\hbox{A}
\end
\noindent A
\end
Los dos ejemplos siguientes también producen resultados idénticos:
\vbox{\hrule width 1em}
\end
\noindent\vbox{\hrule width 1em}
\end
Además, el contenido vacío cambia el modo de vertical a horizontal, como en \unhbox\voidb@x
. Ese mismo contenido vacío se puede obtener mediante \unvbox\voidb@x
. Pero usar esto no cambia el modo de vertical a horizontal (consulte los dos ejemplos siguientes). ¿Por qué?
\leavevmode\hbox{A}
\end
\catcode`\@=11
\unvbox\voidb@x\hbox{A}
\end
(Aquí, en el primer ejemplo, se agrega sangría y en el segundo, no).
\vbox
puede estar dentro del párrafo, como \hbox
. ¿Qué secuencia de control se puede utilizar para crear un \vbox
párrafo en el medio y al principio?
Respuesta1
El comando para iniciar el modo horizontal con a \vbox
es \leavevmode
. ¿Por qué necesitarías algo más?
Me temo que su suposición es errónea: no son los “contenidos vacíos” los que desencadenan el cambio de modo. Esprecisamente \unhbox
Eso hace.
A diferencia de \box
y \copy
, \unhbox
es un comando horizontal, por lo que activa el modo horizontal si TeX está en modo vertical. La macro \leavevmode
sirve \voidb@x
para que no se agregue nada a la lista horizontal (posiblemente después de haberla iniciado).
El comando analógico \unvbox
es un comando vertical yterminaun párrafo.
\catcode`@=11
\def\leavehmode{\unvbox\voidb@x}
\catcode`@=12
\everypar{PAR}% to show a paragraph has started
abc\leavehmode def
\bye
Respuesta2
No sé si esto está claro o no, pero digámoslo explícitamente (del TeXbook):
|\leavevmode| is an abbreviation for `|\unhbox\voidbox|',
where |\voidbox| is a permanently empty box register.
Ahora bien, ¿qué hace \unhbox\voidbox
realmente? Echemos un vistazo entex.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 puedes ver cualquiera de esas combinaciones de modo y algo más inicia un párrafo, pero vmode+un_vbox
no está entre ellas.
A título personal, me parece interesante que Knuth no dejara vmode+<*>vbox
empezar un párrafo pero vmode+valign
lo hace.