定义自定义切片命令

定义自定义切片命令

在我的文档(scrbook类)中,我必须将几种不同的场景描述为子部分的一部分。我最初\subsubsection为每个场景使用了未使用默认设置编号的计数器secnumdepth。我可以更改该计数器,但1.2.3.1为场景设置一些东西看起来不太好。问题是我无法正确\ref处理这样的特定场景,因为会\label指向父级\subsection。在这里使用enumerate环境实际上也不是一种选择。

我现在要定义一个类似分段的宏\scenario

  • 格式与\subsubsection*使用的类类似(scrbook就我的情况而言)。
  • 以 开头Scenario \thescenario:~,其中\thescenario是独立于父节编号的单个整数 (1、2、...)。
  • 可以使用s\label进行正确编辑和引用。hyperref\autoref

我的第一个方法如下:

\documentclass{scrbook}
\usepackage{hyperref}
\newcounter{scenario}
\newcommand{\scenarioautorefname}{scenario}
\newcommand{\scenario}[1]{%
   \refstepcounter{scenario}%
   \subsubsection*{Scenario~\thescenario: #1}%
   %\refstepcounter{scenario}%
}%

\begin{document}
\chapter{MWE}
\section{Grandparent}
\subsection{Parent}
\scenario{Foo}\label{sce:foo}
...
\scenario{Bar}\label{sce:bar}
...
In \autoref{sce:foo} ...
\end{document}

这给了我 的格式\subsubsection*,但问题是它会干扰\refstepcounter。如果我把它放在\refstepcounter{scenario}前面,场景编号是正确的,但不会\autoref用作参考。如果我把它放在宏的末尾,参考名称是正确的,但数字却差了一个,即一个偏低。最初将数字设置为 1 会给我在行中正确的数字和正确的名称,但那里的数字又差了一个,这次是偏高了一个。subsubsectionscenario\scenario\autoref

我该如何定义这种类似分段的宏?我个人不介意使用 Koma-Script 宏来做到这一点,但更欢迎独立于类的解决方案。

答案1

一个可能的解决方案是使用titlesec(为“场景”定义一个新的部分单元),并且hyperref

\documentclass{scrbook}
\usepackage{titlesec}
\usepackage{hyperref}

\titleclass{\scenario}{straight}[\chapter]
\newcounter{scenario}

\setcounter{secnumdepth}{3}

\titleformat{\scenario}
  {\sffamily\normalsize\bfseries}{}{0em}{Scenario \thescenario:~}
\titlespacing*{\scenario}{0pt}{3.25ex plus 1ex minus .2ex}{1.5ex plus .2ex}

\newcommand{\scenarioautorefname}{scenario}

\begin{document}

\tableofcontents
\chapter{MWE}
\section{Grandparent}
\subsection{Parent}
\scenario{Foo}\label{sce:foo}
\scenario{Bar}\label{sce:bar}
...
In \autoref{sce:foo} ...
In \autoref{sce:bar} ...

\end{document}

编辑:正如 Martin Scharrer 在评论中提到的,这些设置中每个设置scenario都有一个与章节级别相关的 PDF 书签。要控制书签级别,只需定义\toclevel@scenario适当的值(例如,书签所需分段单元的深度)即可。

要设置场景目录深度,需要定义\l@scenario,它将控制目录中条目的实际排版。

举例来说,为了强制scenario在目录(无条目,除非将值tocdepth设置为 3 或更大)和 PDF 书签(无书签)中充当子小节,需要在上面的示例代码中添加类似以下代码行:

\makeatletter
  \def\toclevel@scenario{3}
  \def\l@scenario{\@dottedtocline{3}{3.8em}{3.2em}}
\makeatother

相关内容