在 beamer 中输入 newcommand 和 ifthenelse 时出现一个有趣的错误

在 beamer 中输入 newcommand 和 ifthenelse 时出现一个有趣的错误

首先我写了一个名为 thequest 的文本,如下所示:

\begin{quest}
Just a problem.
\end{quest}

然后在正文中我写道

\newtheorem{quest}{Question}
\newcommand{\Fakeframe}[1]{\ifthenelse{\equal{#1}{}}{}{
    \begin{frame}[t]
       #1
    \end{frame}
    }}
\FakeFrame{\input{thequest.tex}}

然后是 xelatex。会出现“\reserved@a 的参数有一个额外的 }。”和“段落在 \reserved@a 完成之前结束。”但 pdf 是正确的。

为什么?如果我不使用 ifthenelse,或者只是不使用输入,一切都会正常。但如果我使用带有 ifthenelse 和该输入的 newcommand,则必定会出现两个错误。

这太奇怪了。

答案1

我不确定这有什么用:检查参数是否为空是没有意义的,在这种情况下就不要使用\FakeFrame{}

无论如何,\equal尝试扩展其论点但\input失败了。使用xifthen\isempty

\begin{filecontents*}{\jobname-quest}
\begin{quest}
Just a problem.
\end{quest}
\end{filecontents*}

\documentclass{beamer}
\usepackage{xifthen}

\newtheorem{quest}{Question}
\newcommand{\FakeFrame}[1]{\ifthenelse{\isempty{#1}}{}{%
    \begin{frame}[t]
       #1
    \end{frame}
    }}

\begin{document}

\FakeFrame{\input{\jobname-quest.tex}}

\end{document}

如果您只想在文件非空时加载文件,请使用不同的策略。

\begin{filecontents*}{\jobname-quest}
\begin{quest}
Just a problem.
\end{quest}
\end{filecontents*}

\begin{filecontents*}{\jobname-empty}

\end{filecontents*}

\documentclass{beamer}

\newtheorem{quest}{Question}

\ExplSyntaxOn

\NewDocumentCommand{\FakeFrameInput}{m}
 {% #1 = filename
  \file_get:nnN { #1 } { } \l_tmpa_tl
  \tl_remove_all:Nn \l_tmpa_tl { \par }
  \tl_if_blank:VF \l_tmpa_tl
   {
    \begin{frame}[t] \input{#1} \end{frame}
   }
 }

\ExplSyntaxOff

\begin{document}

\FakeFrameInput{\jobname-quest.tex}
\FakeFrameInput{\jobname-empty.tex}

\end{document}

这只会生成一个帧。文件被读入一个标记列表变量,我们在该变量中删除所有\par标记(由空行生成)。如果没有剩余(或只有空格),则文件被视为空。

相关内容