我正在尝试定义一个命令,该命令根据最后定义的部分/章节/节/小节/...创建一个部分/章节/节/小节/...
它看起来应该像这个伪代码:
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
来调整当前级别。