使用 expl3 语法时 makebox 之前出现意外换行

使用 expl3 语法时 makebox 之前出现意外换行

我想要输入如下的一些文字。

some text:____underline_text_______

我希望上面的文本总长度能达到某个给定的长度,下划线部分的长度取决于前面的正常文本,我尽量使用expl3package 的语法。

\documentclass{article}
\usepackage{expl3,xparse}
\begin{document}
\ExplSyntaxOn
\cs_new:Nn \__fillitem:nnn
{
  \hbox_set:Nn \l_tmpa_box{#2}
  \dim_set:Nn \l_tmpa_dim {#1 - \box_wd:N \l_tmpa_box}
  \box_use:N \l_tmpa_box
  \underline{\makebox[\dim_use:N \l_tmpa_dim]{#3}}
}
\NewDocumentCommand\fillitem{mmm}{\__fillitem:nnn{#1}{#2}{#3}}
\ExplSyntaxOff
\parindent0pt
text\rule{100pt}{1pt}\par
text\fillitem{100pt}{a b c}{d e f}\par
\fillitem{100pt}{a b c}{d e f}\\
\fillitem{100pt}{a b c}{d e f}\\
\rule{100pt}{1pt}
\end{document}

结果如图所示。

在此处输入图片描述

\underline如果\fillitem命令出现在段落的开头,则命令前面会出现意外的换行符。

否则,如果在整个命令之前有一些先前的文本\fillitem,则换行符会消失,即使它位于之后一行的开头\\

这很奇怪。有人能解释一下吗?非常感谢!

此外,如果简单地替换\box_use:N \l_tmpa_box#2问题就会消失。

答案1

后面的“TeXhackers”注释\box_use:n说这和原始的 相同\copy。特别是,它不会启动 LR 模式(用 TeX 的通俗说法就是“水平模式”)。

如果您希望框启动水平模式,您需要相当于\leavevmode,即,

\mode_leave_vertical:

已修复代码。您应该使用,\cs_new_protected:Nn因为该函数执行分配和更好的命名约定。

您不需要\dim_use:n,因为可选参数\makebox接受长度。

\documentclass{article}

%\usepackage{expl3,xparse} % not necessary with LaTeX 2020-10-01 or later

\ExplSyntaxOn

\NewDocumentCommand\fillitem{mmm}{\jia_fillitem:nnn{#1}{#2}{#3}}

\cs_new_protected:Nn \jia_fillitem:nnn
 {
  \hbox_set:Nn \l_tmpa_box {#2}
  \dim_set:Nn \l_tmpa_dim {#1 - \box_wd:N \l_tmpa_box}
  \mode_leave_vertical:
  \box_use:N \l_tmpa_box
  \underline{\makebox[\l_tmpa_dim]{#3}}
 }

\ExplSyntaxOff

\setlength{\parindent}{0pt}

\begin{document}

text\rule{100pt}{1pt}

text\fillitem{100pt}{a b c}{d e f}

\fillitem{100pt}{a b c}{d e f}\\
\fillitem{100pt}{a b c}{d e f}\\
\rule{100pt}{1pt}

\end{document}

在此处输入图片描述

相关内容