我正在尝试定义一条包含计算数字的消息。
\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
。