这并不是为了展示我在基于 TeX 的工作中尽可能多地使用 LaTeX3/ 而遇到的问题expl3
,而是为了寻求有关恰当的在那种情况下的方法。
在 LaTeX3/ 中更改 catcode 的正确方法是什么expl3
?特别是,当使用l3keys
设置一些标记列表并稍后检索其内容时,使“空格字符”重新获得 catcode 10(块代码之外的常规方式expl3
),建议的进行方式是什么?有人可以提供更详细的描述来说明要使用的方式吗\tl_set_rescan:Nnn
?我特别考虑了这个setup
论点。
接下来是可能出现这种情况的上下文:我希望能够在\my_name:n
不使用的情况下保留函数参数中的空格~
。
\RequirePackage{expl3}
\documentclass{memoir}
\ExplSyntaxOn
\tl_new:c { g_my_name_tl }
\cs_new:cpn { my_name :n } #1
{
\tl_gset:cn { g_my_name_tl } {#1} %{ \tl_to_str:n {#1} }
}
\my_name:n {the name}
\ExplSyntaxOff
\begin{document}
\g_my_name_tl
\end{document}
答案1
总体而言,我们强烈反对更改类别代码。事实上,我想设想从长远来看,我们可以提供一套足够的工具,使类别代码的更改实际上根本不需要(例如,我的感觉是我们应该在文档级别拥有一组更大但固定的“活动”字符)。
就空格而言,代码块中的空格 ( ) 会被忽略,而波浪号 (
~
) 可用于表示空格。如果您想要“硬”空格,那么“文档级”方法可能不太正确,但目前我们没有该命令的版本,因此我会使用\nobreakspace
。
正如评论中提到的,如果你抓取的是文档级别的东西,那么它将被标记正常空间,所以你应该不会有问题。我在密钥上下文中会做的是不是在键名中使用空格:例如,所有的键名都
siunitx
使用连字符是有原因的!
使用起来\tl_set_rescan:Nnn
很棘手,我强烈反对。事实上,我正在考虑完全删除它,siunitx
因为我认为我之前选择的方法在这方面是错误的。当然,在推荐使用它之前,我希望看到一个明确的例子。
以问题中的具体例子为例,你确实以错误的方式使用了“代码级别”函数。实际上有两种情况。第一种情况是,在代码中设置一些“类似文档”的材料是有意义的,例如
\keys_define:nn { mymodule }
{
key .tl_set:N = \l_my_tl ,
key .initial:n = { Some~text }
}
在这种情况下,您必须使用“类似代码”输入(~
用于空格)。这几乎总是用于短文本。
(在这种情况下,值得注意的是,我们确实一度对消息文本进行了“catcode 欺骗”,因为~
在消息中输入所有这些内容有点繁琐。然而,当我们再次审视事情时,很明显这不是一个好计划。)
第二种情况是你确实在查看正确的文档类输入,在这种情况下使用文档命令
\cs_new_protected:Npn \my_command:n #1
{
...
}
\NewDocumentCommand { \mycommand } { m }
{ \my_command:n {#1} }
特别要记住的是,虽然你可以expl3
在文档序言中使用代码,但主要使用方式应该是在包中使用,然后在新的文档命令中使用生成的代码通过 \usepackage
。