测试 chapter 是否是有效命令

测试 chapter 是否是有效命令

我想测试该类是否支持章节。但是,对于该包,titlesec命令检查\chapter失败,因为它始终被定义为:

\documentclass[]{scrartcl}
\usepackage{etoolbox}
\usepackage{titlesec}
\begin{document}
\ifcsdef{chapter}{chapter is defined}{chapter is NOT defined}

\chapter{title}
\end{document}

打印出:chapter is defined

我可以在加载之前进行测试titlesec并创建一个布尔值进行测试,但我更希望在文档的任何位置通过一次检查来测试它。我该怎么做?

答案1

来自以下文档etoolbox

\ifdef{<control sequence>}{<true>}{<false>}
<true>如果<control sequence>已定义,则 扩展为,<false>否则扩展为 。请注意,即使控制序列的含义是 ,也将被视为已定义\relax。此命令是 e-TeX 原语的 LaTeX 包装器\ifdefined

\ifundef{<control sequence>}{<true>}{<false>}
<true>如果<control sequence>未定义,则 扩展为<false>,否则扩展为。除了反转测试逻辑之外,此命令还不同于,\ifdef如果命令的含义为,则命令将被视为未定义\relax

\ifcsdef{<csname>}{<true>}{<false>}
类似于,\ifdef但它将控制序列名称作为其第一个参数。此命令是 e-TeX 原语的 LaTeX 包装器\ifcsname

\ifcsundef{<csname>}{<true>}{<false>}
类似于,\ifundef但它将控制序列名称作为其第一个参数。此命令可以用作\@ifundefinedLaTeX 内核中测试的临时替代品。

因此您应该使用\ifcsundef(反转两个参数):

\ifcsundef{chapter}{chapter is NOT defined}{chapter is defined}

或者

\ifundef\chapter{chapter is NOT defined}{chapter is defined}

titlesec包执行测试\@ifundefined{chapter}{...}{...},因此\chapter变得等同于\relax

答案2

简单来说\ifChapter

\documentclass[]{scrbook}

\makeatletter
\newif\ifChapter
\@ifundefined{chapter}{\Chapterfalse}{\Chaptertrue}
\makeatletter
\ifChapter \usepackage{titlesec} \fi
\begin{document}
\ifChapter \chapter{title} \else \section{title}\fi
\ifChapter chapter is defined \else chapter is NOT defined \fi
\end{document}

相关内容