在里面LaTeX 维基百科,我们可以看到一个表格,其中给出了分段命令的深度:
部分:-1
章:0
节:1
小节:2
ETC。
有没有办法通过 LaTeX2e 或 L3 动态访问这些信息?也许像
\section_depth { section } :=> 1
编辑
根据 Marco 在评论中所说,这些信息可能有用:
$ texdef --tex latex @startsection
\@startsection:
macro:#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
{\@ssect {#3}{#4}{#5}{#6}}{\@dblarg {\@sect {#1}{#2}{#3}{#4}{#5}{#6}}}
答案1
在标准类别以及memoir
KOMA-Script 类别中,部分和章节的级别不可直接使用。您可以\getsectionlevel
按以下方式定义命令:
\documentclass{book}
%\documentclass{memoir}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\getsectionlevel}{m}
{
\sean_get_section_level:N #1
}
\cs_new_protected:Npn \sean_get_section_level:N #1
{
\cs_if_exist:NTF #1
{
\str_case_x:nnn { \cs_to_str:N #1 }
{
{ book } { \cs_gset:cpx { booklevel } { -1 } }
{ part } { \cs_gset:cpx { partlevel } { -1 } }
{ chapter } { \cs_gset:cpx { chapterlevel } { 0 } }
}
{ \__sean_get_lower_level:No #1 { #1 } }
}
{
\ddt % should be a proper error message
}
}
\cs_new_protected:Npn \__sean_get_lower_level:Nn #1 #2
{
\__sean_get_lower_level:Nw #1 #2 \q_stop
}
\cs_new_protected:Npn \__sean_get_lower_level:Nw #1 #2 #3 #4 #5 #6 \q_stop
{
\str_if_eq:nxTF { #4 } { \cs_to_str:N #1 }
{% we're with memoir
\cs_gset:cpx { \cs_to_str:N #1 level } { #5 }
}
{
\cs_gset:cpx { \cs_to_str:N #1 level } { #4 }
}
}
\cs_generate_variant:Nn \__sean_get_lower_level:Nn { No }
\cs_generate_variant:Nn \str_if_eq:nnTF { nx }
\ExplSyntaxOff
\getsectionlevel{\chapter}
\show\chapterlevel
\getsectionlevel{\subsection}
\show\subsectionlevel
该宏\getsectionlevel<command>
定义\<command>level
。
我们对内置命令进行直接定义;对于较低级别,我们利用它们由类似的东西定义的事实
\newcommand\section{\@startsection {section}{1}{\z@}...
因此当我们展开一次时,<command>
第三位就是我们要找的。因为memoir
必须使用稍微不同的路径,因为该类添加了一个钩子,\@startsection
所以我们需要的参数会向右移动一位。
请注意,如果加载了诸如此类的包,这将变得疯狂titlesec
。在正常设置中,自信可能要简单得多:
book
-2(仅限memoir
)part
-1chapter
0section
1subsection
2subsubsection
3paragraph
4subparagraph
5
答案2
如果hyperref
加载了包,则数字将以宏进行编码\toclevel@<section>
,并且\sectiondepth
可以定义为(不进行错误检查):
\newcommand*{\sectiondepth}[1]{\csname toclevel@#1\endcsname}
否则,最简单的方法可能是定义这样的命令,例如:
\makeatletter
\newcommand*{\secnum@book}{-2}% memoir
% test, if \chapter is defined without defining it
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname chapter\endcsname\relax
\newcommand*{\secnum@part}{0}% article
\else
\newcommand*{\secnum@part}{-1}%
\newcommand*{\secnum@chapter}{0}%
\fi
\newcommand*{\secnum@section}{1}
\newcommand*{\secnum@subsection}{2}
\newcommand*{\secnum@subsubsection}{3}
\newcommand*{\secnum@paragraph}{4}
\newcommand*{\secnum@subparagraph}{5}
\newcommand*{\sectiondepth}[1]{%
\@ifundefined{secnum@#1}{%
??% error: section type is not known
}{%
\csname secnum@#1\endcsname
}%
}
\makeatother