奇怪的错误:“\csname if@chapter@pp\endcsname”位于 \if ~ \fi 内

奇怪的错误:“\csname if@chapter@pp\endcsname”位于 \if ~ \fi 内

我不明白为什么下面的方法不起作用:

\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

相关内容