带有变量输入的 \hspace 无法与 \ExplSyntaxOn 正确配合使用

带有变量输入的 \hspace 无法与 \ExplSyntaxOn 正确配合使用

在玩弄 expl3 时,我发现了奇怪的效果,它在“环境”\hspace中使用时有时不起作用:\ExplSyntaxOn

\documentclass{article}

\ExplSyntaxOn           % <= removing this will make the code work correctly

\newlength{\numberedlistitemspacing}
\settowidth{\numberedlistitemspacing}{s.}

\NewDocumentCommand{\invoiceitem}{mmm}
{
    #1 \hspace{\numberedlistitemspacing} & 
    #2 & #3 \\
}

\ExplSyntaxOff          % <= removing this will make the code work correctly

\begin{document}
    \begin{tabular}{rcl}
        right & center & left \\
        \invoiceitem{1}{2}{3}  \\
    \end{tabular}
\end{document}

此代码的行为就像\hspace不存在一样。删除\ExplSyntaxOn\ExplSyntaxOff可使代码完美运行。

但这并不总是可行的。 特别是当使用 expl3 语法变量或函数时...

答案1

当表格单元格结束时,LaTeX 会\unskip删除可能输入的空格。

使用\ExplSyntaxOn您的代码相当于

#1\hspace{\numberedlistitemspacing}&

LaTeX 会适时地消除水平间距。

没有\ExplSyntaxOn你的代码

#1 \hspace{\numberedlistitemspacing} &

并且不仅标准空格被删除,而且由于后面有一个空格,您会得到更多的正常空格#1

在输入 a 时在输入框中留空格tabular是好的。在命令代码中,这可能不好。你应该使用

#1\hspace*{\numberedlistitemspacing}&

如果不低于\ExplSyntaxOn,则可以

#1 \hspace*{\numberedlistitemspacing} &

如果\ExplSyntaxOn有效。

经验法则是

  • 用于\hspace*永远不会被移除的空间;
  • \hspace{...}或之前切勿留空格\hspace*{...}
  • \hspace{...}或之后切勿留空格\hspace*{...}

相关内容