\mbox{} 대신 \c_empty_box를 사용하려고 합니까?

\mbox{} 대신 \c_empty_box를 사용하려고 합니까?

언뜻 보면 \c_empty_box를 대체하는 것으로 이해했지만 \mbox{}다음 MWE(이상한 동작을 지적함 \c_empty_box: "æ"로 대체됨)는 나에게 심각한 의구심을 줍니다.

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\tl_new:N \l_foo_tl%
\tl_new:N \l_bar_tl%

\tl_set:Nn \l_foo_tl {%
  \mbox{} \hfill Foo
}
\tl_set:Nn \l_bar_tl {%
  \c_empty_box \hfill Bar
}

\NewDocumentCommand{\baz}{ }
{
  \l_foo_tl
  \par
  \l_bar_tl
}%

\ExplSyntaxOff

\begin{document}
\baz
\end{document}

답변1

다른 상수 변수와 마찬가지로 \c_empty_box비교 예시에 사용하기 위한 고정 데이터 포인트로 사용됩니다. 이는 할당되어서는 안 되며 \box_use:Na가 '예상'으로 표시되지 않은 컨텍스트에서 사용하여 액세스해야 합니다 <box>.

expl3언어는 낮은 수준의 프로그래밍을 위한 것이므로 모든 LaTeX2e 문서 명령과 동등한 기능을 가질 것으로 기대해서는 안 되며 동시에 아직 개발해야 할 영역도 있습니다. 고급 LaTeX2e \mbox는 매우 다른 구성이며 주어진 인수를 포함하는 수평 상자를 삽입하기 위한 것입니다. 내부적으로 \mbox는 를 사용하고 \leavevmode, 이는 를 사용합니다 \voidb@x. \c_empty_box와 의 동등성은 \voidb@x혼란을 야기했을 수도 있습니다.

현재 \leavevmode기능을 가장 잘 처리하는 방법에 대한 논의가 여전히 진행 중입니다. 거의 확실한 것은 다음과 같은 것을 사용하여 구현될 것이라는 점입니다.

\protected\def\leavevmode{%
  \ifvmode
    \expandafter\indent
  \fi
}

unbox 작업이 아닌. 이는 위의 구성이 \everypar삽입되기 전에 완료되도록 수평 모드로 전환하는 반면, '고전적인' \leavevmode정의에서는 토큰 뒤에 언박싱을 남겨두기 때문입니다 \everypar. (pdfTeX와 LuaTeX는 \quitvmode위의 '개선된' 정의와 동일한 효과를 가지지만 XeTeX에는 이것이 부족하며 어떤 경우에도 추가 기본 요소로부터 이득이 없습니다.)

답변2

아니요, 이름에서 알 수 있듯이 인수를 사용하지 않습니다. 실제로는

> \c_empty_box=\char"1A.
l.5 \show\c_empty_box

> \box26=void

즉, 다음 \voidb@x과 같이 정의 됩니다.

\newbox\voidb@x % permanently void box register

2e 또는 일반 텍스트로.

\mbox단락을 시작한 \leavevmode다음 \hbox내부 내용이 없는 단락을 만듭니다.

모든 상자 할당과 마찬가지로 실제로 저장되는 것은 숫자(또는 프리미티브로 전달될 수 있음)입니다 \box. \setbox일반적 \wd으로 할당 루틴은 \chardef토큰을 사용하여 숫자를 저장합니다. 따라서 상자 명령을 접두사로 지정하지 않고 토큰에 액세스하면 다음과 같은 결과를 얻습니다. \char26따라서 현재 글꼴 인코딩의 해당 슬롯에 있는 것은 무엇이든 됩니다.

관련 정보