使用 xstring 来比较包含以下内容的文本\\
会产生编译错误。这是我的 MWE:
\documentclass{report}
\usepackage{xstring}
\makeatletter
\def\Example#1{\def\@Example{#1}}
\def\printExample{\@Example}
\makeatother
\Example{not \\ void}
\AtBeginDocument{
\begin{titlepage}
\centering
\IfStrEq{}{\printExample}
{void}
{\printExample}
\end{titlepage}
}
\begin{document}
\end{document}
第一个错误信息是:
! 未定义控制序列。\ ->\let \reserved@e \relax \let \reserved@f \relax @ifstar {\let \reserv... l.15 \begin{document}
\Example
此处定义的命令应接受。\\
我该如何让它工作?解决方案应考虑到此处使用的 (La)TeX 发行版是 Linux Mint 18.3 中包含的版本,即 TeX Live 2017/Debian,该版本无法更改。
答案1
如果只需要对空参数进行测试,则可以使用\ifx
:
\documentclass{report}
\makeatletter
\def\Example#1{\def\@Example{#1}}
\def\printExample{\@Example}
\makeatother
\Example{}
\AtBeginDocument{%
\begin{titlepage}
\expandafter\ifx\printExample\empty
void\else\printExample\fi
\end{titlepage}
}
\begin{document}
\Example{not \\ void}
\expandafter\ifx\printExample\empty
void\else\printExample\fi
\end{document}
答案2
我猜你还有其他宏,例如\Example
和\printExample
。
您可以定义一个宏来完成获取所需存储箱作为输入的工作。
\documentclass{report}
\makeatletter
\newcommand{\void@or@print}[1]{%
\if\relax\detokenize\expandafter{#1}\relax
void%
\else
#1%
\fi
}
\def\printExample{\void@or@print{\@Example}}
\def\Example#1{\def\@Example{#1}}
\Example{} % initialize
\makeatother
\Example{not \\ void}
\AtBeginDocument{
\begin{titlepage}
\centering
\printExample
\end{titlepage}
}
\begin{document}
\end{document}
更通用的实现:
\makeatletter
\newcommand{\print@conditionally}[3]{%
\if\relax\detokenize\expandafter{#1}\relax
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{#2}{#3}%
}
\def\printExample{\print@conditionally{\@Example}{void}{\@Example}}
\def\Example#1{\def\@Example{#1}}
\Example{} % initialize
\makeatother