不建议使用 ifthen 包吗?

不建议使用 ifthen 包吗?

我已经看到几篇帖子,用户建议避免使用该ifthen软件包,但是,我发现它最近已更新(2020)。

我试图利用的一个功能是扩展字符串比较。etoolbox通过提供未扩展的字符串比较\ifstrequal(我猜想目的是在宏中使用它来检查参数字符串?),或者它可以通过扩展第一个参数中的字符串(仅一次扩展?)\ifdefstring。 我的需求是需要完全扩展,比如连接两个定义。 请参阅下面的 MWE

\documentclass{scrartcl}

\usepackage{ifthen}
\usepackage{etoolbox}

% \newcommand{\ifstringeqx}[4]{% will not work in section here, use robust cmd
\newrobustcmd{\ifstringeqx}[4]{%
\ifthenelse%
    {\equal{#1}{#2}}%
    {#3}%
    {#4}%
}


\begin{document}

\def\hello{Hi}
\def\world{Earth}

\section{\ifstringeqx{\hello\world}{HiEarth}{Yes}{No}}

\def\world{Saturn}
\def\planet{Saturn}
\ifstringeqx{\hello\world}{Hi\planet}{Yes}{No}

\ifstringeqx{\hello\world}{HiJupiter}{Yes}{No}

\end{document}

10年前的帖子:为什么 ifthen 包已经过时了?

答案1

David 的建议满足所有要求。\pdfstrcmp在比较之前扩展了它的论点,并且它本身也是可扩展的。

请注意,实现是特定于引擎的,因此如果使用 lualatex,则需要加载额外的包。

\documentclass{scrartcl}
%%%%%%%%%%%%% WORKS FOR LUA + XELATEX + PDFLATEX ENGINES
\usepackage{pdftexcmds}
\makeatletter
\let\strcmp\pdf@strcmp
\makeatother
%%%%%%%%%%%%% WORKS ONLY FOR PDFLATEX AND XELATEX ENGINES
%\let\strcmp\pdfstrcmp
%%%%%%%%%%%%% END

\newcommand{\ifstringeqx}[4]{%
    \ifnum\strcmp{#1}{#2}=0 #3\else#4\fi
}
\begin{document}
\def\hello{Hi}
\def\world{Earth}

\section{\ifstringeqx{\hello\world}{HiEarth}{Yes}{No}}

\def\world{Saturn}
\def\planet{Saturn}
\ifstringeqx{\hello\world}{Hi\planet}{Yes}{No}

\edef\isitexpandable{\ifstringeqx{\hello\world}{HiJupiter}{Yes}{No}}

---$>$ \isitexpandable
\end{document}

在此处输入图片描述


补充

如果有人担心和\else/或\fi妨碍\ifstringeqx#3#4他们的事情(例如,如果他们需要吸收位于之外的令牌\fi),我们可以从包中复制/粘贴一点逻辑tokcycle来执行,同时消除和\ifnum的影响:\else\fi

\makeatletter
\long\def\tctestifnum#1{\tctestifcon{\ifnum#1\relax}}
\long\def\tctestifcon#1{#1\expandafter\tc@exfirst\else\expandafter\tc@exsecond\fi}
\long\def\tc@exfirst#1#2{#1}
\long\def\tc@exsecond#1#2{#2}
\makeatother

\newcommand{\ifstringeqx}[4]{%
    \tctestifnum{\strcmp{#1}{#2}=0}{#3}{#4}}

这里有一个例子,原来的定义和\else不起作用\fi,但这个修改后的定义可以正常工作。

\documentclass{scrartcl}
%%%%%%%%%%%%% WORKS FOR LUA + XELATEX + PDFLATEX ENGINES
\usepackage{pdftexcmds}
\makeatletter
\let\strcmp\pdf@strcmp
\makeatother
%%%%%%%%%%%%% WORKS ONLY FOR PDFLATEX AND XELATEX ENGINES
%\let\strcmp\pdfstrcmp
%%%%%%%%%%%%% END

\makeatletter
\long\def\tctestifnum#1{\tctestifcon{\ifnum#1\relax}}
\long\def\tctestifcon#1{#1\expandafter\tc@exfirst\else\expandafter\tc@exsecond\fi}
\long\def\tc@exfirst#1#2{#1}
\long\def\tc@exsecond#1#2{#2}
\makeatother

\newcommand{\ifstringeqx}[4]{%
    \tctestifnum{\strcmp{#1}{#2}=0}{#3}{#4}}


\def\Yes#1{#1 yes!}
\def\No#1{#1 no!}
\begin{document}
\def\hello{Hi}
\def\world{Earth}

\section{\ifstringeqx{\hello\world}{HiEarth}{\Yes}{\No}{Hell}}

\def\world{Saturn}
\def\planet{Saturn}
\ifstringeqx{\hello\world}{Hi\planet}{Yes}{No}

\edef\isitexpandable{\ifstringeqx{\hello\world}{HiJupiter}{\Yes}{\No}{Absolutely}}

---$>$ \isitexpandable
\end{document}

在此处输入图片描述

相关内容