我已经看到几篇帖子,用户建议避免使用该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}