我为某人创建了一个简单的模板,并将目录添加到第一页,如下所示
\begin{document}
% title and date here
\maketitle
\tableofcontents
\indent \newline
%
\end{document}
但我发现有人没有在目录中添加任何内容,但文档中会显示“目录”一词,即使目录是空的。我是否无论如何都要提前检查目录是否为空,以便决定下一步该怎么做?谢谢。
答案1
更新这埃托克包中有一个命令,用于v1.08e
不打印空目录。这主要针对本地目录的情况,但还有一个额外的开关也用于全局目录(批量处理许多文档的情况,其中一些文档有目录,而另一些没有)。
\documentclass{article}
\usepackage{etoc}
\etocchecksemptiness % do not display empty local table of contents
\etocnotocifnotoc % do not display empty global table of contents
\begin{document}
\tableofcontents
% nothing will be printed if empty contents
\etocifwasempty {do something if was empty}
{do something if was not empty}
document contents
\end{document}
我正在更新这个答案,以提供一种更灵活的方法,它不假设目录的标题应该是什么样的。正如我原来的答案一样,重点是测试文件的存在或空是.toc
不够的。babel
例如,这个文件中总会有一些东西。因此,我们检查文件是否至少包含一个\contentsline
实例。在新的答案中,包埃托克之所以使用 ,是因为它将文件的内容存储.toc
在一些我们可以检查的内部寄存器中,然后我们相应地设置一个切换。然后\tableofcontents
重新定义为首先检查此切换。只要 像etoc
这里一样处于兼容模式,它就不会修改 的外观TOC
。如果tocloft
被使用,则必须在 之前加载etoc
。
\documentclass{article}
\usepackage[french]{babel} % for testing
\usepackage{hyperref} % for testing
% Testing if the .toc file exists is not sufficient, (with Babel, there
% will be some info added to it automatically). We need to make
% sure it doesn't contain some \contentsline
\usepackage{etoc}
\newif\ifNonEmptyContents
\makeatletter
\expandafter\in@\expandafter\contentsline\expandafter{\the\Etoc@toctoks}%
\ifin@\expandafter\NonEmptyContentstrue\else
\expandafter\NonEmptyContentsfalse
\fi
\makeatother
\AtBeginDocument{\let\originaltableofcontents\tableofcontents
\renewcommand{\tableofcontents}%
{\ifNonEmptyContents\expandafter\originaltableofcontents\fi}%
}
\begin{document}
\tableofcontents
% \section{A}
% a
% \section{B}
% b
% \subsection{C}
nothing
\end{document}
初始答案:
但请注意,有些处理TOC
's 的软件包可能会因以下内容而受到影响。此外,我假设\tableofcontents
在article
类中有一个标准命令。
\documentclass{article}
\usepackage[french]{babel} % for testing
\usepackage{hyperref} % for testing
\newif\iftoctitledone
\makeatletter
\def\printcontentsnameifnotalreadydone{%
\iftoctitledone\else
\section *{\contentsname \@mkboth {\MakeUppercase \contentsname }
{\MakeUppercase \contentsname }}\fi
\toctitledonetrue}
\AtBeginDocument{%
\let\mygoodoldcontentsline\contentsline
\def\contentsline{\printcontentsnameifnotalreadydone\mygoodoldcontentsline}
\renewcommand\tableofcontents{\@starttoc {toc}}
}
\makeatother
\begin{document}
\tableofcontents
% \section{test}
nothing
\end{document}
另一种风格也一样,略显优雅。
\documentclass{article}
\usepackage[french]{babel} % for testing
\usepackage{hyperref} % for testing
\makeatletter
\def\printcontentsnameifnotalreadydone{%
\section *{\contentsname \@mkboth {\MakeUppercase \contentsname }
{\MakeUppercase \contentsname }}%
\def\printcontentsnameifnotalreadydone{}}
\AtBeginDocument{%
\let\mygoodoldcontentsline\contentsline
\def\contentsline{\printcontentsnameifnotalreadydone\mygoodoldcontentsline}
\renewcommand\tableofcontents{\@starttoc {toc}}
}
\makeatother
\begin{document}
\tableofcontents
% \section{A}
% a
% \section{B}
% b
% \subsection{C}
nothing
\end{document}
答案2
关于jfbu的回答:
这与以下内容有何不同(\@mkboth 除外):
\documentclass{article}
\usepackage[french]{babel} % for testing
\usepackage{hyperref} % for testing
\makeatletter
\AtBeginDocument{%
\let\oldcontentsline\contentsline
\renewcommand{\contentsline}{
\section*{\contentsname}
\let\contentsline\oldcontentsline
\oldcontentsline
}
\renewcommand{\tableofcontents}{\@starttoc{toc}}
}
\makeatother
\begin{document}
\tableofcontents
% \section{A}
% a
% \section{B}
% b
% \subsection{C}
nothing
\end{document}