关于 LaTeX3/expl3 中的 catcode 和 Family

关于 LaTeX3/expl3 中的 catcode 和 Family

这并不是为了展示我在基于 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

相关内容