在我的文档(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 会给我在行中正确的数字和正确的名称,但那里的数字又差了一个,这次是偏高了一个。subsubsection
scenario
\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