通常,当您使用时,section*{}
只会从目录中删除该部分。为了删除从属子部分,您必须添加*
。
是否可以定义一个命令,当您从目录中删除较高级别的标题时,该命令会自动删除下属级别?这可以节省一些时间。
在文档中:
\section*{}
\subsection{}
通过所需的调整,将删除(部分和子部分)——即使只有部分配备了*
。
理想的解决方案是能够删除所有从属级别,无论它们是用于部分、节、小节、小小节还是段落等。
答案1
这有效,而且据我所知没有破坏任何东西。手动执行所有条件很麻烦,所以我使用了评论中建议的包,tocvsec2
让生活变得轻松很多。
如果某个分段命令带有星号,则所有下级分段级别将不带编号,并从目录中隐藏,直到遇到相同或更高级别的未带星号的分段命令。发生这种情况时,目录和编号将重置以显示所有下级级别。这将适用于
article
和book
文档类别中的所有分段命令(祝你好运)。已添加:宏
\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}
其结果为: