我不明白为什么下面的方法不起作用:
\documentclass{beamer}
\newif\iftemp \tempfalse
\iftemp
\csname if@chapter@pp\endcsname
\addcontentsline{toc}{part}{Appendices}
\fi
\fi
\begin{document}
\begin{frame}{Test}
\end{frame}
\end{document}
而以下工作:
\documentclass{beamer}
\usepackage{ifthen}
\def\temptemp{temp}
\ifthenelse{\equal{\temptemp}{wrong}}{
\csname if@chapter@pp\endcsname
\addcontentsline{toc}{part}{Appendices}
\fi
}{}
\begin{document}
\begin{frame}{Test}
\end{frame}
\end{document}
似乎\iftemp ... \fi
即使 \iftemp 为假也不会忽略其内容。
出于另一个原因,我想使用\iftemp
而不是\ifthenelse{...}
。这里有修补程序吗?
答案1
\if@chapter@pp
需要定义条件,以便代码执行合理的操作。根据名称,我猜您正在加载appendix
。
\documentclass{beamer}
\usepackage{appendix}
\newif\iftemp
%\tempfalse % a new conditional always starts false
\expandafter\iftemp
\csname if@chapter@pp\endcsname
\addcontentsline{toc}{part}{Appendices}
\fi
\fi
\begin{document}
\begin{frame}{Test}
\end{frame}
\end{document}
问题是什么?当\iftemp
返回 false 时,会跳过“真分支”,但明确的条件会被考虑。但\csname if...\endcsname
由于没有执行扩展,因此会被跳过,因此它不算作显式条件。
使用\expandafter
,令牌\if@chapter@pp
是在\iftemp
被检查之前形成的。
更简单地说,使用\makeatletter
和\makeatother
:
\makeatletter
\iftemp
\if@chapter@pp
\addcontentsline{toc}{part}{Appendices}
\fi
\fi
\makeatother
答案2
在第一个条件中
\iftemp
\csname if@chapter@pp\endcsname
\addcontentsline{toc}{part}{Appendices}
\fi
\fi
\iftemp
发现第一的 \fi
因为没有其他明确的 \if<...>
。由于\tempfalse
,有一个额外的(未配对的)\fi
,因此出现错误
! Extra `\fi`.
在第二个条件中
\ifthenelse{\equal{\temptemp}{wrong}}{%
\csname if@chapter@pp\endcsname
\addcontentsline{toc}{part}{Appendices}
\fi
}{}
您应该明白\ifthenelse
被定义为只接受一个参数 - 条件。在评估条件后,它要么执行 ,\@firstoftwo
要么\@secondoftwo
。 在下面\ifthenelse
不需要关闭\fi
。