\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
定义不会使其完全可扩展。