在玩弄 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*{...}
。