\hbox_overlap_right:n{} против \makebox[0pt][l]{}

\hbox_overlap_right:n{} против \makebox[0pt][l]{}

Я наткнулся на некоторое, насколько я понимаю, неожиданное поведение команды expl3. \hbox_overlap_right:nЯ ожидал, что все примеры ниже дадут тот же результат, то есть, что рамка будет находиться в том же положении, что и желтый блок. Но только этот \makeboxпример дает ожидаемый результат. В expl3примерах даже вставлен перенос строки между желтым и рамочным блоками. Что не так?

\documentclass{article}
\usepackage{color}
\usepackage{expl3}

\begin{document}
\ExplSyntaxOn
%doesn't work
\hbox_overlap_right:n{\color{yellow}\rule{1in}{0.5in}}\frame{\phantom{\rule{1in}{0.5in}}}
\par
%doesn't work either
\hbox_to_zero:n{\color{yellow}\rule{1in}{0.5in}\hss}\frame{\phantom{\rule{1in}{0.5in}}}
\par
%LaTeX2e working as expected
\makebox[0pt][l]{\color{yellow}\rule{1in}{0.5in}}\frame{\phantom{\rule{1in}{0.5in}}}
\ExplSyntaxOff
\end{document}

введите описание изображения здесь

решение1

Функция \hbox_overlap_right:nточно такая же, как и у Plain TeX \rlap(за исключением \protected), в то время как \hbox_to_zero:nона такая же, как \hbox to 0pt:

> texdef -t latex -p expl3 'hbox_overlap_right:n'

\hbox_overlap_right:n:
\protected\long macro:#1->\hbox_to_zero:n {#1\tex_hss:D }

> texdef -t latex -p expl3 'hbox_to_zero:n'

\hbox_to_zero:n:
\protected\long macro:#1->\tex_hbox:D to\c_zero_dim {#1}

> texdef -t latex frame

\frame:
\long macro:#1->\leavevmode \hbox {\hskip -\@wholewidth \vbox {\vskip -\@wholewidth \hrule \@height \@wholewidth \hbox {\vrule \@width \@wholewidth #1\vrule \@width \@wholewidth }\hrule \@height \@wholewidth \vskip -\@wholewidth }\hskip -\@wholewidth }

Поскольку примитив \hboxне запускает горизонтальный режим, while \frameи \makeboxdo, результат, который вы получаете, является нормальным.

Добавить \leavevmodeперед \hbox_overlap_right:n.

Связанный контент