如何立即获取宏的值

如何立即获取宏的值

以下代码不起作用。我想可能是因为\f

所以我的问题是:如何立即从宏中获取值(在我的情况下,我希望立即\f获取abc)?是否可以\f通过定义宏\edef

我尝试过\edef\f{\ifthenelse{\equal{a}{a}}{abc}{def}},但失败了。

\documentclass{article}
\usepackage{ifthen,xstring}
\begin{document}
\newcommand\f{\ifthenelse{\equal{a}{a}}{abc}{def}}
\def\g{abc}
\IfStrEq{\f}{\g}{Yes}{No}
\end{document} 

答案1

问题是可扩展性,\ifthenelse不可扩展。要比较两个字符串并在比较之前对其进行扩展,可以使用\str_if_eq:eeTFfrom expl3。请注意,字符串比较不考虑类别代码,因此以下内容并不完全等同于您的\ifthenelse实现(会考虑类别代码)。

\documentclass[]{article}

\ExplSyntaxOn
\cs_new_eq:NN \myifstreq \str_if_eq:eeTF
\ExplSyntaxOff


\begin{document}
\newcommand*\f{\myifstreq{a}{a}{abc}{def}}
\newcommand*\g{abc}
\myifstreq{\f}{\g}{Yes}{No}

\end{document}

答案2

您的问题是您使用的是不可扩展的 LaTeX 宏,而不是直接使用 TeX 基元。\if...基元是可扩展的:

\def\f{\ifx aaabc\else def\fi}  % instead \newcommand\f{\ifthenelse{\equal{a}{a}}{abc}{de
\def\g{abc}
\edef\test{\f} % the current (expandable) value of \f in in \test
\ifx\g\test Yes\else No\fi % instead \IfStrEq{\f}{\g}{Yes}{No}
\bye

命令\if...描述如下TeX 简介, 例如。

答案3

问题在于,您使用的\IfStrEqwhich 是用来比较字符串的,而为了\ifthenelse发挥它的魔力,它实际上并没有计算字符串。正如您所注意到的,\edef在这种情况下它没有帮助。

您需要做的是修改命令以定义具有所需结果的宏,例如,

\newcommand\f{\ifthenelse{\equal{a}{a}}{\def\foo{abc}}{\def\foo{def}}}

(如果您不担心\f可重复使用,那么您可以使用\def\f而不是\def\foo。然后您的调用\IfStrEq将按预期进行评估。

相关内容