我需要定义以下形式的标记列表
\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}