以下代码不起作用。我想可能是因为\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:eeTF
from 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
问题在于,您使用的\IfStrEq
which 是用来比较字符串的,而为了\ifthenelse
发挥它的魔力,它实际上并没有计算字符串。正如您所注意到的,\edef
在这种情况下它没有帮助。
您需要做的是修改命令以定义具有所需结果的宏,例如,
\newcommand\f{\ifthenelse{\equal{a}{a}}{\def\foo{abc}}{\def\foo{def}}}
(如果您不担心\f
可重复使用,那么您可以使用\def\f
而不是\def\foo
。然后您的调用\IfStrEq
将按预期进行评估。