如何在 expl3 语法下插入连接线(~,不间断空格,波浪号)?

如何在 expl3 语法下插入连接线(~,不间断空格,波浪号)?

我需要定义以下形式的标记列表

\tl_new:N  \g_silly_tl
\tl_set:Nn \g_silly_tl { Text ~ and ~ a ~ tie:?? }

我该怎么做呢?


更一般地说,是否有参考资料可以看到如何在 expl3 语法下“正常”输入字符?

答案1

这个问题有两个不同的部分,其中一个比另一个更容易!

这里的具体问题(大概)不是插入波浪号,而是在某些“固定”文本存储(如 LaTeX3 变量内)中插入不间断空格tl。虽然波浪号在文档级别是一种方便的快捷方式,但在这里我认为我只需使用宏即可\nobreakspace

\tl_set:Nn \l_silly_tl { Text ~ and ~ a \nobreakspace tie:?? }

(请注意,目前没有expl3代码级的“不间断空格”功能。)

对于“插入非标准类别代码字符”这一更广泛的问题,\char_generate:nn可以使用可扩展函数来创建(几乎)所有合理类别代码的标记

\tl_set:Nx \l_silly_tl
  {
    \char_generate:nn { `\a } { 4 }
  }

这种方法不涵盖一些情况。例如,在旧expl3版本中,我们无法处理活动字符,因此您需要使用正则表达式引擎:

\RequirePackage{expl3}
\ExplSyntaxOn
\tl_clear:N \l_tmpa_tl
\regex_replace_all:nnN { } { \cA\~ } \l_tmpa_tl 

的较新版本expl3可以使用 来执行此操作\char_generate:nn,因此它更像是一个历史记录。

第二种选择是坚持“传统”\lowercase技巧,expl3当然使用命名

\group_begin:
\char_set_catcode_active:n { `\@ }
\char_set_lccode:nn { `\@ } { `\~ }
\tex_lowercase:D
   {
     \group_end:
     \tl_set:Nn \l_silly_tl { Text ~ and ~ a @ tie:?? }
   }

\lowercase(请注意,除了已保存原语之外,没有其他公共接口。)

答案2

我最近制作了一个包来执行此操作。(现在在 CTAN 上。)

(备注:显然该包可以做的所有事情l3regex以及lowercase还可以做的所有事情,但是该包提供了更方便的语法......)

使用这个包,你可以写

\documentclass{article}
\usepackage{precattl}    % ← this package!
\begin{document}

\ExplSyntaxOn
\precattl_exec:n {
    \tl_new:N  \g_silly_tl
    \tl_set:Nn \g_silly_tl { Text ~ and ~ a \cA\~ tie:?? }
    % ↑ l3regex-replacement-like syntax, but not exactly identical.
    % Note that you can embed it directly into the code itself
}
\ExplSyntaxOff

\end{document}

相关内容