为了检查传递给环境的某些参数,我需要:
- 检查参数是否为空;
- 传递默认值或提供的值;
- 将最终值与字符串进行比较,然后决定做什么。
不去深究背景细节,我认为情况可以归结为这个 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}