\vbox로 단락을 시작하는 명령이 없는 이유는 무엇입니까?

\vbox로 단락을 시작하는 명령이 없는 이유는 무엇입니까?

\vbox\hbox다음 두 예제 그룹에서 설명한 것처럼 모드를 전환하지 않으며 모드를 전환하지 않습니다.

다음 두 예제는 동일한 출력을 생성합니다.

\hbox{A}
\end
\noindent A
\end

다음 두 예제도 동일한 출력을 생성합니다.

\vbox{\hrule width 1em}
\end
\noindent\vbox{\hrule width 1em}
\end

또한 빈 콘텐츠는 에서와 같이 모드를 수직에서 수평으로 전환합니다 \unhbox\voidb@x. 를 통해 동일한 빈 콘텐츠를 얻을 수 있습니다 \unvbox\voidb@x. 그러나 이것을 사용해도 모드가 수직에서 수평으로 전환되지는 않습니다(다음 두 예 참조). 왜?

\leavevmode\hbox{A}
\end
\catcode`\@=11
\unvbox\voidb@x\hbox{A}
\end

(첫 번째 예에서는 들여쓰기가 추가되고 두 ​​번째 예에서는 들여쓰기가 추가되지 않습니다.)

\vbox와 같은 단락 안에 있을 수 있습니다 \hbox. \vbox단락의 시작 부분과 중간 부분에 어떤 제어 순서를 사용할 수 있습니까 ?

답변1

a를 사용하여 수평 모드를 시작하는 명령 \vbox은 입니다 \leavevmode. 왜 다른 것이 필요합니까?

귀하의 가정은 틀렸습니다. 유감스럽게도 모드 변경을 유발하는 것은 "빈 내용"이 아닙니다. 그것은정확하게 \unhbox그렇죠.

\box\copy와 다르게 \unhbox는 수평 명령이므로 TeX가 수직 모드인 경우 수평 모드를 트리거합니다. 매크로는 수평 목록에 아무 것도 추가되지 않도록 \leavevmode사용합니다 \voidb@x(아마도 시작한 후).

아날로그 명령 \unvbox은 수직 명령이며단락.

\catcode`@=11
\def\leavehmode{\unvbox\voidb@x}
\catcode`@=12

\everypar{PAR}% to show a paragraph has started

abc\leavehmode def

\bye

여기에 이미지 설명을 입력하세요

답변2

이것이 명확한지 아닌지는 모르겠지만 (TeXbook에서) 명시적으로 설명하겠습니다.

|\leavevmode| is an abbreviation for `|\unhbox\voidbox|',
where |\voidbox| is a permanently empty box register.

이제 \unhbox\voidbox실제로 무엇을 합니까? 좀 살펴보자tex.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;

보시다시피 모드와 다른 것의 조합은 단락을 시작하지만 vmode+un_vbox그 조합에는 포함되지 않습니다.

개인적으로 Knuth가 vmode+<*>vbox문단을 시작 하지 않고 vmode+valign시작했다는 점이 흥미롭습니다.

관련 정보