\__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详尽扩展)。