如何在 LaTeX3 消息中的命令后添加空格?

如何在 LaTeX3 消息中的命令后添加空格?

我正在尝试定义一条包含计算数字的消息。

\RequirePackage{expl3}
\ExplSyntaxOn

\int_set:Nn \l_tmpa_int { 42 }
\msg_new:nnn { package } { message } {
  The~number~ \int_use:N \l_tmpa_int ~is~too~large
}
\msg_error:nn { package } { message }

这导致

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
! package error: "message"
! 
! The number 42is too large
! 
! See the package documentation for further information.
! 
! Type <return> to continue.
!...............................................  

请注意数字后面缺少空格。要插入它,我可以

  • 将数字设为参数,在发出消息时传递。这将解决消息中的问题,但我认为它会影响所有输出材料。
  • 用 替换数字后的空格\c_space_tl也有效。但这看起来不像是\c_space_tl故意为之。使用起来是否安全\c_space_tl,还是必须用 包裹\tl_use:N

有没有更好的甚至推荐的方法在这样的 LaTeX3 命令后插入空格?

答案1

看起来整数控制序列\l_tmpa_int正在吞噬其后的显式空格。

为了防止这种行为,我确实认为\c_space_tl这是一个不错的选择。它的定义来自我的expl3-code.tex副本

\tl_const:Nn \c_space_tl { ~ }

因此,标记列表只是一个包裹在控制序列中的空格字符。在完成对控制序列后面的空格字符的所有吞噬之后,将其~放入输入流中,任务就完成了。

变量\c_space_tl本身是可用的,因为引用 API 文档的话,“可以<tl var>直接使用,而无需访问函数。”我从来没有遇到过\tl_use:N需要的情况(并不是说从来没有),并且认为它可能主要是为了生成极其有用的变体而存在的\tl_use:c

另一个选项是使用计数器作为函数的参数,该函数将输出计数器的值。我想到的三种方法是

  • \int_use:c{l_tmpa_int}
  • \int_eval:n{\l_tmpa_int}
  • \int_to_arabic:n{\l_tmpa_int}

我最喜欢的是最后一个,因为它非常明确地说明了它正在做什么。


旁注:为了防止在普通文本中出现这种情况,我会{}在序列末尾附加一个空组,但这似乎会{}在这种情况下生成一个文字,这是不好的。

答案2

控制序列之后空格消失这一事实令人遗憾但又不可避免(这与 TeX 忽略命令后文档中的空格时的情况相同)。

在消息中,使用\(反斜杠后跟空格) 来产生空格。当然,您也可以使用\c_space_tl,但那样会更长。

以你的例子来说,你可以这样做:

\RequirePackage{expl3}
\ExplSyntaxOn

\int_set:Nn \l_tmpa_int { 42 }
\msg_new:nnn { package } { message } {
  The~number~ \int_use:N \l_tmpa_int \ is~too~large
}
\msg_error:nn { package } { message }

不过,我建议将的值\l_tmpa_int作为参数传递给消息:

\RequirePackage{expl3}
\ExplSyntaxOn

\int_set:Nn \l_tmpa_int { 42 }
\msg_new:nnn { package } { message } {
  The~number~#1~is~too~large
}
\msg_error:nnx { package } { message } { \int_use:N \l_tmpa_int }

这样就不必担心空格了,而且如果有一天您想为您的错误消息提供不同的语言选择,这样您就可以更好地将消息文本与使用实现细节分开\l_tmpa_int

相关内容