我有一个别名的逐字命令(特别是 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}