从 expl3 中保存活动冒号

从 expl3 中保存活动冒号

有没有一种优先的方法来实现以下内容而不必离开 expl3 语法?

\documentclass{article}
\usepackage{expl3}
\usepackage[french]{babel}
\begin{document}

\ExplSyntaxOn
% suppose I am within a package here -- else the definition could just be made
% outside of the expl3 scope
\group_begin:
\char_set_catcode_active:N \:
% now expl3 syntax isn't possible any more
\gdef \c_colon_active_tl {:}
\endgroup

% just for showing things are working as expected:
a \c_colon_active_tl {} ~ vs~ a:
\ExplSyntaxOff

\end{document}

答案1

这是一个常见的“先有鸡还是先有蛋”的问题,可以用以下\lowercase技巧来解决:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\group_begin:
\char_set_catcode_active:N \^^@
\char_set_lccode:nn { `^^@ } { `: }
\tl_to_lowercase:n { \group_end:
  \tl_const:Nn \c_colon_active_tl { ^^@ }
}

\tl_show_analysis:N \c_colon_active_tl

输出为

The token list \c_colon_active_tl contains the tokens:
>  : (active character=undefined).

(对于 TeX Live 2017 之前的版本,您还需要\usepackage{l3tl-analysis}才能\usepackage{xparse}正常工作。)


2020 年更新

现在有更好的方法来做同样的事情(顺便说一下,上面的代码无法在最近的expl3内核上运行)。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\group_begin:
\char_set_active_eq:nN { `: } \scan_stop:
\tl_const:Nx \c_colon_active_tl { \char_generate:nn { `: } { 13 } }
\group_end:

\tl_analysis_show:N \c_colon_active_tl

由此可见

The token list \c_colon_active_tl contains the tokens:
>  : (active character=undefined).

但是,在为活动冒号定义含义时,使用\c_colon_active_tl将使用该含义,因为活动字符是宏。使用\scan_stop:(即\relax)可避免扩展生成的活动冒号。

相关内容