使用 `\ifblank` 作为 `\ifstrequal` 的测试

使用 `\ifblank` 作为 `\ifstrequal` 的测试

为了检查传递给环境的某些参数,我需要:

  1. 检查参数是否为空;
  2. 传递默认值或提供的值;
  3. 将最终值与字符串进行比较,然后决定做什么。

不去深究背景细节,我认为情况可以归结为这个 MWE:

\usepackage{etoolbox}

\newcommand{\foo}[1]{
    \expandafter\ifstrequal\expandafter{#1}{pluto}
        {a}
        {b}%
}

\newcommand{\foofoo}[1][]{\ifblank{#1}{pluto}{#1}}

\begin{document}

\foo{\foofoo}

\foo{\foofoo[]}

\foo{\foofoo[ ]}

\foo{\foofoo[pluto]}

\foo{\foofoo[pippo]}

\end{document}

运行这些命令时,我期望除了最后一种情况外,其他情况都会得到“a”。但结果总是打印“b”。

我做错了什么? 有没有办法得到我想要的结果?

编辑:

新 MWE 尝试更好地理解这个问题。

\documentclass{article}
\usepackage{etoolbox}

\newcounter{mycounter}
\setcounter{mycounter}{0}

\newcounter{mysecondcounter}
\setcounter{mysecondcounter}{1}

\newcommand{\counterFormat}[1]{%
    \thesubsection.\arabic{#1}
}

\newcommand{\myTitle}[3]{%
    \expandafter\ifstrequal\expandafter{\expanded{#1}}{hidecounter}
        {#2}
        {#2 \counterFormat{#3}}%
}

\NewDocumentCommand{\foo}{ O{} O{} O{} }{
    \myTitle
        {\ifblank{#1}{hidecounter}{#1}}
        {\ifblank{#2}{Example}{#2}}
        {\ifblank{#3}{mycounter}{#3}}%
}

\begin{document}

\foo

\foo[showcounter][][ ]

\foo[showcounter][][mysecondcounter]

\foo[][Demo]

\foo[showcounter][Demo][ ]

\end{document}

我的问题是,以这种方式处理参数是否有意义? 或者有更正确和干净的解决方案?

答案1

无论你应用多少扩展步骤\foofoo,它都会绝不生成一个空白标记列表(空的或者仅由空格组成)。

为什么?因为你用可选参数来定义它。但即使你用强制参数来定义它,情况也不会有太大变化,而且一个扩展步骤是不够的。代码

\documentclass{article}
\usepackage{etoolbox}

\newcommand{\foo}[1]{%
    \expandafter\ifstrequal\expandafter{#1}{pluto}
        {a}
        {b}%
}

\newcommand{\foofoo}[1]{\ifblank{#1}{pluto}{#1}}

\begin{document}

\foo{\foofoo{}}

\foo{\foofoo{ }}

\foo{\foofoo{pluto}}

\foo{\foofoo{pippo}}

\end{document}

产生四个 b。你想充分扩张#1

\documentclass{article}
\usepackage{etoolbox}

\newcommand{\foo}[1]{%
    \expandafter\ifstrequal\expandafter{\expanded{#1}}{pluto}
        {a}
        {b}%
}

\newcommand{\foofoo}[1]{\ifblank{#1}{pluto}{#1}}

\begin{document}

\foo{\foofoo{}}

\foo{\foofoo{ }}

\foo{\foofoo{pluto}}

\foo{\foofoo{pippo}}

\end{document}

在此处输入图片描述

相关内容