我有一个命令\mycom{}
,它接受 1 个参数。该命令应该对参数执行测试并执行相应的操作。对于简单的参数,我可以使用\ifthenelse
,但我需要考虑更一般的参数,例如包含命令或环境。以下 MWE 遵循更强大的字符串测试解决方案,该解决方案在这个帖子:
\documentclass{article}
\makeatletter
\newcommand{\strtest}[2]{%
\ifnum\pdfstrcmp{#1}{#2}=\z@
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
\makeatother
\newcommand{\mycom}[1]{%
\strtest{#1}{}%
{content : empty}%
{content : #1}%
}
\begin{document}
\mycom{}
\mycom{coucou}
\end{document}
这可行。但如果我尝试调用\mycom{\textbf{coucou}}
,则编译会失败。
答案1
原\pdfstrcmp
语会完全展开其参数。因此,无法展开的宏(包括)会出错\textbf
。您可以使用\unexpanded
原语来防止这种情况:
\newcommand{\strtest}[2]{%
\ifnum\pdfstrcmp{\unexpanded{#1}}{\unexpanded{#2}}=\z@
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
}
答案2
我想展示一种替代方案。基于 LaTeX3 引擎,一种方法是:
\documentclass{article}
\usepackage{xparse,expl3,}
\ExplSyntaxOn
\NewDocumentCommand{ \mycom } { m } {
\tl_if_empty:nTF { #1 }
{content:~empty}
{content:~#1}
}
\ExplSyntaxOff
\begin{document}
\mycom{}
\mycom{coucou}
\mycom{\textbf{coucou}}
\end{document}
根据评论问题,您可以将字符串与以下内容进行比较:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\mystringcase}{ m }
{
\prg_case_str:nnn { #1 }
{
{ a } { Your~string~\textbf{a} }
{ b } { Your~string~\textbf{b} }
{ c } { Your~string~\textbf{c} }
}
{ Not~in~list }
}
\ExplSyntaxOff
\begin{document}
\mystringcase{a}
\mystringcase{b}
\mystringcase{d}
\end{document}