比较类文件中的字符串

比较类文件中的字符串

我正在修改一个正常运行的类文件以添加一些功能。我需要比较两个字符串 -
a)\@stringtextfromuser
b) ABC

我已经加载了etoolbox,并且xtsring尝试了几种可能性:

  1. \ifstrequal{\@stringtextfromuser}{ABC}{If equal}{If unequal}

  2. \myifstrequal{\@stringtextfromuser}{ABC}{If equal}{If unequal}, 在哪里\newcommand\myifstrequal{\expandafter\ifstrequal\expandafter}

  3. \IfStrEq{\@stringtextfromuser}{ABC}{If equal}{If unequal}

  4. \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

相关内容