expl3:将 `\int_compare` 应用于表达式

expl3:将 `\int_compare` 应用于表达式

\int_compare表达式生成的参数失败,其扩展 (3==3==3) 似乎合适。为什么?有解决方案吗?

\documentclass{l3doc}
\usepackage{expl3}

\ExplSyntaxOn

\cs_set:Npn \erw_split:nnn #1 #2 #3
{
    \tl_head:n{#1}
    \use:c{exp_args:#3}  \tl_map_inline:nn 
    {
        \tl_tail:n
        {
            #1
        }
    }{#2##1}    
}


\ExplSyntaxOff
\begin{document}
\ExplSyntaxOn

\erw_split:nnn
{
    {3}{3}{3}
}{==}{Nf} % prints as '3==3==3' as expected

\\

\exp_last_unbraced:Nf \tl_if_eq:nnTF{{
    \erw_split:nnn
    {
        {3}{3}{3}
    }{==}{Nf}
}{3==3==3}{T}{F}} % F, why?

\\

\int_compare:nTF{3==3==3}{T}{F} % 'T', as expected

\\

%\exp_args:Nf
%\int_compare:nTF
%{
%   \erw_split:nnn
%   {
%       {3}{3}{3}
%   }{==}{Nf}
%}
%% Haven't found an inner/outer exp_args signature that works. 
%% For example, Nf/Nf yields this error:
%% ! Undefined control sequence.
%%<argument> \LaTeX3 error: 
%%                           Relation '\tex_global:D ' unknown: use =, <, >, =...

\ExplSyntaxOff
\end{document}

答案1

让我们看看通话中会发生什么

\erw_split:nnn{{3}{3}{3}}{==}{Nf}

这变成

\tl_head:n{{3}{3}{3}} \exp_args:Nf \tl_map_inline:nn { \tl_tail:n {{3}{3}{3}} } {==##1}

进而

3\tl_map_inline:nn{{3}{3}}{==##1}

哪个印刷“3==3==3”,但是不是可以在 的上下文中使用\int_compare:nTF,因为\tl_map_inline:nn是不可扩展的(它的描述中没有星号或空心星号)。

如果用定义的内容不完全可扩展,则\erw_split:nnn\cs_new:Npn\cs_set:Npn定义不会使其完全可扩展。

相关内容