Por que não existe nenhum comando para iniciar um parágrafo com \vbox?

Por que não existe nenhum comando para iniciar um parágrafo com \vbox?

\vboxnão alterna modos e \hboxnã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.)

\vboxpode estar dentro de um parágrafo, como \hbox. Que sequência de controle pode ser usada para criar um parágrafo \vboxno 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 \unhboxisso faz.

Diferentemente de \boxe \copy, \unhboxé um comando horizontal, então ele aciona o modo horizontal se o TeX estiver no modo vertical. A macro \leavevmodeusa \voidb@xpara 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

insira a descrição da imagem aqui

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\voidboxrealmente 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_vboxnão está entre elas.

A título pessoal, acho interessante que Knuth não tenha deixado vmode+<*>vboxcomeçar um parágrafo, mas vmode+valigno faz.

informação relacionada