我想要输入如下的一些文字。
some text:____underline_text_______
我希望上面的文本总长度能达到某个给定的长度,下划线部分的长度取决于前面的正常文本,我尽量使用expl3
package 的语法。
\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}