强制完全扩展令牌

强制完全扩展令牌

我有一个别名的逐字命令(特别是 lstinline),例如

\def\verbalias{\lstinline[morekeywords={thing}]}

接下来我有几个想要在文本和逐字命令中使用的命令,例如:

\def\foo{thing}
\def\inner#1{inner #1}
\def\outer#1{outer \inner{#1}}

现在我想写以下命令:

\def\formattedfoo{\verbalias!\foo!}
\def\formattedinner#1{\verbalias!\inner{#1}!}
\def\formattedouter#1{\verbalias!\outer{#1}!}

% test cases
\formattedfoo
\formattedinner{thing}
\formattedinner{\foo}
\formattedouter{thing}
\formattedouter{\foo}

当然,现在由于显而易见的原因,这些都不能按照我希望的方式发挥作用。

所以我尝试了

\def\formattedthing{\expandafter\verbalias\expandafter!\foo!}
\def\formattedinner#1{\expandafter\verbalias\expandafter!\inner{#1}!}
\def\formattedouter#1{\expandafter\verbalias\expandafter!\outer{#1}!}

对于前两个测试用例有效,但对于其余的测试用例则失败。

我找到的解决方案:

\def\formattedinner#1{%
    \edef\tmp{\inner{#1}}%
    \expandafter\verbalias\expandafter!\tmp!
}
\def\formattedouter#1{%
    \edef\tmp{\outer{#1}}%
    \expandafter\verbalias\expandafter!\tmp!
}

我想写的是:

\def\formattedinner#1{%
    \expandafter\verbalias\expandafter!\expandfull{\inner{#1}}!
}
\def\formattedouter#1{%
    \expandafter\verbalias\expandafter!\expandfull{\outer{#1}}!
}

除了 edef 之外,还有其他更好的强制扩展方法吗?是否可以编写expandfull宏?

请注意我不感兴趣:

\def\expand#1\as#2{%
    \edef#2{#1}%
}
\def\formattedinner#1{%
    \expand{\inner{#1}}\as{\tmp}%
    \expandafter\verbalias\expandafter!\tmp!%
}

编辑完整示例:

\documentclass{article}
\usepackage{listings}
\def\inner#1{inner #1}
\def\outer#1{outer \inner{#1}}
\def\verbalias{\lstinline[morekeywords={thing}]}

% Working syntaxes
\def\foo{thing}
\def\formattedthing{\expandafter\verbalias\expandafter!\foo!}

\def\expand#1\as#2{%
    \edef#2{#1}%
}
\def\formattedinner#1{%
    \expand{\inner{#1}}\as{\tmp}%
    \expandafter\verbalias\expandafter!\tmp!%
}

\def\formattedouter#1{%
    \edef\tmp{\outer{#1}}%
    \expandafter\verbalias\expandafter!\tmp!%
}

% Desired syntax
% \def\formattedinner#1{%
%    \expandafter\verbalias\expandafter!\expandfull{\inner{#1}}!%
% }
%
% \def\formattedouter#1{%
%    \expandafter\verbalias\expandafter!\expandfull{\outer{#1}}!%
% }

\begin{document}

\formattedthing

\formattedinner{thing}

\formattedinner{\foo}

\formattedouter{thing}

\formattedouter{\foo}

\end{document}

相关内容