如何在乳胶中检查目录在添加到文档之前是否为空

如何在乳胶中检查目录在添加到文档之前是否为空

我为某人创建了一个简单的模板,并将目录添加到第一页,如下所示

\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 的软件包可能会因以下内容而受到影响。此外,我假设\tableofcontentsarticle类中有一个标准命令。

\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}

相关内容