xstring 无法比较包含 \\ 的文本

xstring 无法比较包含 \\ 的文本

使用 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

相关内容