
Есть ли предпочтительный способ реализовать следующее, не выходя из синтаксиса 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).
Однако при определении значения для активного двоеточия using \c_colon_active_tl
будет использовать его, поскольку активный символ является макросом. \scan_stop:
(То есть, \relax
) используется для избежания расширения сгенерированного активного двоеточия.