如何访问给定切片命令的深度?

如何访问给定切片命令的深度?

在里面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

在标准类别以及memoirKOMA-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-1
  • chapter0
  • section1
  • subsection2
  • subsubsection3
  • paragraph4
  • subparagraph5

答案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

相关内容