如何判断最后的分段命令是章节/节/小节/......?

如何判断最后的分段命令是章节/节/小节/......?

我正在尝试定义一个命令,该命令根据最后定义的部分/章节/节/小节/...创建一个部分/章节/节/小节/...

它看起来应该像这个伪代码:

global string currentSection;

function level(arg, sectioningArgs ...) { 
  switch(arg) {
    case '+' {
      switch(currentSection) {
        case 'none' {
          \part(sectioningArgs)
        }
        case 'part' {
          \chapter(sectioningArgs)
        }
        case 'chapter' {
          \section(sectioningArgs)
        }
        ...
      }
    }
    case '-' {
      ...
    }      
    case '0' {
      ...
    }
  }
}

(想象一下每个案例之后的‘休息’......)

使用方法如下:

\documentclass[a4paper,12pt,oneside]{book}

\newcommand{\level}[<?>]{<?>}

\begin{document}
  \level{+}{A part}
  \level{+}{A chapter}
  \level{+}{A section}
  \level{0}{Another section}
  \level{-}{A chapter}
  \level{-}{A part}
\end{document}

理由:我经常发现自己将主文档中包含的子文件中的子节更改为节等等 --- 这应该可以使该过程自动化。

如有任何帮助我将不胜感激,先谢谢您。

答案1

+-0是不够的,因为通常您需要在章节结束时跳升级别。

\level宏有一个强制参数;它可以是+-=一个整数(介于 -1 和 5 之间,包括极值)。

我发现使用+或容易出错,除非你的编辑器允许你在 处折叠-。但是,使用绝对级别很容易。=\level

\documentclass{book}

\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\level}{m}
 {
  \mch_level:n { #1 }
 }

\int_new:N \g_mch_level_int

\cs_new_protected:Nn \mch_level:n
 {
  \str_case:nnF { #1 }
   {
    {+}{ \int_gincr:N \g_mch_level_int }
    {-}{ \int_gdecr:N \g_mch_level_int }
    {=}{ }
   }
   { \int_gset:Nn \g_mch_level_int { #1 } }
  \int_case:nnF { \g_mch_level_int }
   {
    {-1}{\part}
     {0}{\chapter}
     {1}{\section}
     {2}{\subsection}
     {3}{\subsubsection}
     {4}{\paragraph}
     {5}{\subparagraph}
   }
   {Beyond limit!}
 }
\ExplSyntaxOff

\begin{document}

\mainmatter

\level{0}{Introduction}

Text

\level{-}{First part}

\level{+}{First chapter}

\level{+}{First section}

\level{+}{First subsection}

\level{=}{Second subsection}

\level{-}{Second section}

\level{+}{First subsection}

\level{=}{Second subsection}

\level{0}[Second chapter]{Second chapter with a very very very long title}

\end{document}

在此处输入图片描述

答案2

这是一个非常基本的实现,不包括错误检查(但可以添加)和轻微的界面变化 - 一个可选参数,而不是用于切换部分单元的相对级别的强制参数。

在此处输入图片描述

\documentclass{book}

\newcounter{cursecdepth}
\setcounter{cursecdepth}{-1}
\makeatletter
\@namedef{seclevel@0}{\part}
\@namedef{seclevel@1}{\chapter}
\@namedef{seclevel@2}{\section}
\@namedef{seclevel@3}{\subsection}
\@namedef{seclevel@4}{\subsubsection}
\@namedef{seclevel@5}{\paragraph}
\@namedef{seclevel@6}{\subparagraph}

\newcommand{\level}[1][=]{%
  \ifnum\pdfstrcmp{#1}{+}=0
    \stepcounter{cursecdepth}% Jump down a level
  \else\ifnum\pdfstrcmp{#1}{-}=0
    \addtocounter{cursecdepth}{-1}% Jump up a level
  \else\ifnum\pdfstrcmp{#1}{=}=0
    % Stay at this level
  \else
    \setcounter{cursecdepth}{#1}% Set the current level
  \fi\fi\fi
  \csname seclevel@\arabic{cursecdepth}\endcsname
}
\makeatother
\newcommand{\uplevel}{\addtocounter{cursecdepth}{-1}}
\newcommand{\downlevel}{\stepcounter{cursecdepth}}

\begin{document}

\tableofcontents

\level[+]{A part}
\level[+]{A chapter}
\level[+]{A section}
\level[2]{Another section}
\level[=]{Yet another section}
\level   {Another, final section}
\level[+]{A subsection}
\level[1]{A chapter}
\level[-]{A part}

\end{document}

cursecdepth我在开始时将计数器设置为 -1,这需要您可以使用\level[+]来以 开头。但是,以(或)\part开头会更直观。\level\level[0]\part

固定深度跳转是通过将可选参数设置为数字来实现的,其中数字表示分段单元的级别:

  0.
  第 1部分。第
  2章。第
  3 节
  。第 4 小节
  。第 5 小节
  。第 6 款。第 7 小段

可以根据需要使用\uplevel\downlevel来调整当前级别。

相关内容