我正在修改一个正常运行的类文件以添加一些功能。我需要比较两个字符串 -
a)\@stringtextfromuser
和
b) ABC
。
我已经加载了etoolbox
,并且xtsring
尝试了几种可能性:
\ifstrequal{\@stringtextfromuser}{ABC}{If equal}{If unequal}
。\myifstrequal{\@stringtextfromuser}{ABC}{If equal}{If unequal}
, 在哪里\newcommand\myifstrequal{\expandafter\ifstrequal\expandafter}
。\IfStrEq{\@stringtextfromuser}{ABC}{If equal}{If unequal}
。\ifdefstring{\@stringtextfromuser}{ABC}{If equal}{If unequal}
。
这些似乎都没有起到任何作用(真实案例中的代码没有在应该执行的时候执行)。我知道 LaTeX 对字符串比较有点挑剔,但我肯定我漏掉了一些东西。它不可能这么复杂。
答案1
\IfStrEq
只要您没有篡改其默认设置,示例就可以工作\expandargs
:
\documentclass{article}
\usepackage{xstring}
\makeatletter
\newcommand\userinput[1]{\def\@stringtextfromuser{#1}}
\newcommand{\decide}[3]{%
\IfStrEq{\@stringtextfromuser}{#1}{#2}{#3}%
}
\makeatother
\begin{document}
\userinput{ABC}
\decide{ABC}{EQUAL}{UNEQUAL}
\decide{DEF}{EQUAL}{UNEQUAL}
\end{document}
如果你设置\noexpandarg
(这样做有充分的理由),那么
\newcommand{\decide}[3]{%
\expandafter\IfStrEq\expandafter{\@stringtextfromuser}{#1}{#2}{#3}%
}
会做。
几乎无包装的解决方案可以使用\pdfstrcmp
:
\documentclass{article}
\usepackage{pdftexcmds}
\makeatletter
\newcommand\userinput[1]{\def\@stringtextfromuser{#1}}
\newcommand{\decide}[3]{%
\ifnum\pdf@strcmp{\@stringtextfromuser}{#1}=\z@ #2\else#3\fi
}
\makeatother
\begin{document}
\userinput{ABC}
\decide{ABC}{EQUAL}{UNEQUAL}
\decide{DEF}{EQUAL}{UNEQUAL}
\end{document}
加载效果pdftexcmds
更好,因为相同的代码也适用于 XeLaTeX 和 LuaLaTeX。请注意,pdftex
具有原语\pdfstrcmp
,因此如果您只打算使用此引擎,则包不是必需的,并且\pdf@strcmp
变为\pdfstrcmp
。