我想测试该类是否支持章节。但是,对于该包,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
但它将控制序列名称作为其第一个参数。此命令可以用作\@ifundefined
LaTeX 内核中测试的临时替代品。
因此您应该使用\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}