使用 `*` 时自动从目录中删除下级标题级别

使用 `*` 时自动从目录中删除下级标题级别

通常,当您使用时,section*{}只会从目录中删除该部分。为了删除从属子部分,您必须添加*

是否可以定义一个命令,当您从目录中删除较高级别的标题时,该命令会自动删除下属级别?这可以节省一些时间。

在文档中:

\section*{}
\subsection{}

通过所需的调整,将删除(部分和子部分)——即使只有部分配备了*

理想的解决方案是能够删除所有从属级别,无论它们是用于部分、节、小节、小小节还是段落等。

答案1

这有效,而且据我所知没有破坏任何东西。手动执行所有条件很麻烦,所以我使用了评论中建议的包,tocvsec2让生活变得轻松很多。

  • 如果某个分段命令带有星号,则所有下级分段级别将不带编号,并从目录中隐藏,直到遇到相同或更高级别的未带星号的分段命令。发生这种情况时,目录和编号将重置以显示所有下级级别。这将适用于articlebook文档类别中的所有分段命令(祝你好运)。

  • 已添加:宏\maxdepths[<numbering>]{<toc>},其中可选的<numbering>将最大深度设置为数字,例如subsection使用默认值subparagraph,而必需的第二个参数<toc>设置在目录中显示的最大深度。如果缺少命令,则两者都默认为subparagraph

代码:

\documentclass{article}
\usepackage{tocvsec2}
\usepackage{xparse}
% loc levels for sectioning commands
% part = -1
% chapter = 0
% section = 1
% subsection = 2
% etc.
\ExplSyntaxOn
% stores last hidden toc level
\tl_new:N \g_last_star_depth_tl
\tl_new:N \g_max_toc_depth_tl
\tl_new:N \g_max_numbering_depth_tl
\tl_set:Nn \g_max_numbering_depth_tl {subparagraph}
\tl_set:Nn \g_max_toc_depth_tl {subparagraph}

\NewDocumentCommand{ \maxdepths } { O {subparagraph} m }
{
  \tl_gset:Nn \g_max_numbering_depth_tl {#1}
  \tl_gset:Nn \g_max_toc_depth_tl {#2}
}
\makeatletter
% \@part and \@spart are the commands used by doc classes for
% parts and starred parts respectively.  Redefine them to
% make changes to toc and star depth
\cs_gset_eq:NN \old_part: \@part
\cs_gset:Npn \@part
    {
      \tl_gset:Nn \g_last_star_depth_tl {5}
      \old_part:
    }

\cs_gset_eq:NN \old_star_part: \@spart
\cs_gset:Npn \@spart 
    {
      \tl_gset:Nn \g_last_star_depth_tl {-1} % the level of part is -1
      \settocdepth{part} % don't show parts and below in toc
      \setsecnumdepth{part} % don't number parts and below
      \old_star_part:
    }

%same for chapters
\cs_gset_eq:NN \old_chapter: \@chapter  
\cs_gset:Npn \@chapter
    {
      \int_compare:nTF { 0 > \g_last_star_depth_tl }
        {
          \old_chapter:
        }
        {
          \setsecnumdepth{\g_max_numbering_depth_tl}
          \settocdepth{\g_max_toc_depth_tl}
          \tl_gset:Nn \g_last_star_depth_tl {5}
          \old_chapter:
        }   
    }

\cs_gset_eq:NN  \old_star_chapter: \@schapter
\cs_gset:Npn \@schapter
    {
      \tl_gset:Nn \g_last_star_depth_tl {0}
      \settocdepth{chapter}
      \setsecnumdepth{chapter}
      \old_star_chapter:
    }

% this is the code from source2e responsible for making sections and below  
\def\@startsection#1#2#3#4#5#6{ 
\if@noskipsec \leavevmode \fi
\par
\@tempskipa #4\relax
\@afterindenttrue
\ifdim \@tempskipa <\z@
\@tempskipa -\@tempskipa \@afterindentfalse
\fi
\if@nobreak
\everypar{}%
\else
\addpenalty\@secpenalty\addvspace\@tempskipa
\fi                    
\@ifstar
    {
      % if sectioning command is starred save toc level (#2)
      % and use package to adjust toc and numbering settings
      \tl_gset:Nn \g_last_star_depth_tl {#2}
      \settocdepth{#1}
      \setsecnumdepth{#1}
      \@ssect{#3}{#4}{#5}{#6}%
    }
    {
    % if not starred, then check if below last hidden level, ie. higher number
    \int_compare:nTF {#2 > \g_last_star_depth_tl}
        {
          % if below then hide
          \@ssect{#3}{#4}{#5}{#6}
        }
        {
          % if not below, then set toc to show all
          \setsecnumdepth{\g_max_numbering_depth_tl}
          \settocdepth{\g_max_toc_depth_tl}
          \tl_gset:Nn \g_last_star_depth_tl {5}
          \@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}
        }

    }
}
\makeatother
\ExplSyntaxOff
\begin{document}

% the first optional arg sets the max numbering depth (default = subparagraph)
% the mandatory arg sets the max toc depth, if this command
% is missing, then both values default to subparagraph
%\maxdepths[subsection]{subsection}

\tableofcontents

\part*{This part should hide}
\section{This section should hide}
\part{This part should show}
\section*{This section should hide}
\subsection{This subsection should hide}
\section{This section should show}
\subsection{This subsection should show}

\end{document}

其结果为:

在此处输入图片描述

相关内容