字符串测试,带有复杂的参数

字符串测试,带有复杂的参数

我有一个命令\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}

相关内容