expl3:如何获取控制序列的名称

expl3:如何获取控制序列的名称

\__cs_get_function_name:N似乎已被弃用。如何修改下面的代码以返回函数的名称?

\documentclass{l3doc}
\usepackage{expl3}

\ExplSyntaxOn

\cs_set:Nn \__foo:n{(#1)}

\ExplSyntaxOff
\begin{document}
\ExplSyntaxOn

\exp_last_unbraced:No \use_i:nnn {\cs_split_function:N \__foo:n} % expect __foo % returns __foo:n`


\ExplSyntaxOff

\end{document}

更新:

日志的头部:

This is pdfTeX, Version 3.14159265-2.6-1.40.19 (TeX Live 2018) (preloaded format=pdflatex 2018.6.16)  17 JUN 2018 19:54
entering extended mode
 restricted \write18 enabled.
 %&-line parsing enabled.
**split_function_name.tex
(./split_function_name.tex
LaTeX2e <2018-04-01> patch level 5
(/usr/local/texlive/2018/texmf-dist/tex/latex/l3kernel/l3doc.cls
(/usr/local/texlive/2018/texmf-dist/tex/latex/l3kernel/expl3.sty
Package: expl3 2018-06-01 L3 programming layer (loader) 

(/usr/local/texlive/2018/texmf-dist/tex/latex/l3kernel/expl3-code.tex
Package: expl3 2018-06-01 L3 programming layer (code)
\c_max_int=\count80
\l_tmpa_int=\count81
\l_tmpb_int=\count82
\g_tmpa_int=\count83

答案1

__使用另一个模块中名称以 开头的函数总是已弃用:不保证此类功能的稳定性。

\documentclass{article}
\usepackage{expl3}

\ExplSyntaxOn

\cs_new:Nn \erwann_get_function_name:N
 {
  \__erwann_get_function_name_a:f { \cs_split_function:N \__foo:n }
 }
\cs_new:Nn \__erwann_get_function_name_a:n
 {
  \use_i:nnn #1
 }
\cs_generate_variant:Nn \__erwann_get_function_name_a:n { f }

\tl_set:Nf \l_tmpa_tl { \erwann_get_function_name:N \__foo:n }
\tl_show:N \l_tmpa_tl

% shows 
% > \l_tmpa_tl=__foo.

你会得到相同的结果

\exp_last_unbraced:Nf \use_i:nnn \cs_split_function:N \__foo:n

例如,

\tl_set:Nf \l_tmpa_tl
 {
  \exp_last_unbraced:Nf \use_i:nnn \cs_split_function:N \__foo:n
 }
\tl_show:N \l_tmpa_tl

会再次显示

> \l_tmpa_tl=__foo.

所以你可以定义

\cs_new:Nn \erwann_get_function_name:N
 {
  \exp_last_unbraced:Nf \use_i:nnn \cs_split_function:N #1
 }

随你选择。在这两种情况下,该函数都适用于f-expansion。

答案2

是什么让你认为\cs_split_function:N \__foo:n扩展后会产生结果once(由o参数指示)?改用\exp_last_unbraced:Nx(eX详尽扩展)。

相关内容