![在 beamer 中输入 newcommand 和 ifthenelse 时出现一个有趣的错误](https://linux22.com/image/465291/%E5%9C%A8%20beamer%20%E4%B8%AD%E8%BE%93%E5%85%A5%20newcommand%20%E5%92%8C%20ifthenelse%20%E6%97%B6%E5%87%BA%E7%8E%B0%E4%B8%80%E4%B8%AA%E6%9C%89%E8%B6%A3%E7%9A%84%E9%94%99%E8%AF%AF.png)
首先我写了一个名为 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
标记(由空行生成)。如果没有剩余(或只有空格),则文件被视为空。