在章节和节级之间,我有时需要另一个级别,用字母前缀表示。目录可能如下所示:
1
1.1
1.2
2
A.2.1
A.2.2
B.2.1
B.2.2
3
3.1
现在我给自己写了一个小命令来设置前缀:
\makeatletter
\newcommand{\setsectionprefix}[1]{
\renewcommand*\thesection{#1\@arabic\c@chapter.\@arabic\c@section}
\setcounter{section}{0}
}
\makeatother
问题在于hyperref
,因为它生成的标签与不匹配\thesection
。单击目录中的 B.2.1 条目会跳转到 B.2.1,因为标签只有 2.1 并hyperref
采用第一个。我该如何解决这个问题?
答案1
据我理解,“愚蠢的风格指南”的目的不是在章节和节之间创建一个“真正的”中间分段级别(您的示例中没有“A.2”和“B.2”,并且某些节仅标有章节加节号,例如“1.1”),但偶尔会为节添加前缀,并能够通过前缀区分节(“A.2.1”与“B.2.1”)。因此,这是我的看法:
\documentclass{report}
\usepackage{etoolbox}
\newcounter{sectionprefix}
\newcounter{fakesection}
\pretocmd{\chapter}{%
\setcounter{sectionprefix}{0}%
\setcounter{fakesection}{0}%
\renewcommand{\thesection}{\thechapter.\arabic{section}}%
}{}{}
\pretocmd{\section}{\stepcounter{fakesection}}{}{}
\newcommand*{\stepsectionprefix}{%
\stepcounter{sectionprefix}%
\setcounter{fakesection}{0}%
\renewcommand{\thesection}{\Alph{sectionprefix}.\thechapter.\arabic{fakesection}}%
}
\makeatletter
\renewcommand*\l@section{\@dottedtocline{1}{1.5em}{2.8em}}
\makeatother
\usepackage{hyperref}
\begin{document}
\tableofcontents
\chapter{first}
\section{first-first}
\section{first-second}
\chapter{second}
\stepsectionprefix
\section{alpha-second-first}
\section{alpha-second-second}
\stepsectionprefix
\section{bravo-second-first}
\section{bravo-second-second}
\chapter{third}
\section{third-first}
\section{third-second}
\end{document}
答案2
答案定义自定义切片命令给你 (予以适当修改) 借助该titlesec
包定义新的分段单元所需的所有元素。以下是改编版:
\documentclass{scrbook}
\usepackage{titlesec}
\usepackage{hyperref}
\titleclass{\Asection}{straight}[\chapter]
\newcounter{Asection}
\titleformat{\Asection}
{\sffamily\Large\bfseries}{\theAsection}{0.5em}{}
\titlespacing*{\Asection}
{0pt}{3.5ex plus 1ex minus .2ex}{2.3ex plus .2ex}
\renewcommand\theAsection{\Alph{Asection}.\thesection}
\newcommand{\Asectionautorefname}{New section}
\makeatletter
\def\toclevel@Asection{1}
\def\l@Asection{\@dottedtocline{1}{1.5em}{2.8em}}
\makeatother
\begin{document}
\tableofcontents
\chapter{Test chapter}
\section{Test section}
\Asection{Test new level one}\label{sec:one}
\Asection{Test new level two}\label{sec:two}
In \autoref{sec:one} ...
In \autoref{sec:two} ...
\end{document}
答案3
从这个例子中我看不出存在这样的问题:
\documentclass{scrbook}
\let\theSection\thesection
\newcommand\setsectionprefix[1]{%
\def\thesection{\csname#1\endcsname{section}.\thechapter}}
\newcommand\restoreprefix{\let\thesection\theSection}
\setcounter{secnumdepth}{4}
\setcounter{tocdepth}{4}
\usepackage{hyperref}
\begin{document}
\tableofcontents
\chapter{foo}
\section{foo}\subsection{bar}\newpage
\subsubsection{baz}\newpage
\section{foo}\subsection{bar}\subsubsection{baz}\newpage
\chapter{foo}
\setsectionprefix{Alph}
\section{foo}\subsection{bar}\newpage
\subsubsection{baz}\newpage
\section{foo}\subsection{bar}\subsubsection{baz}\newpage
\restoreprefix
\chapter{foo}
\section{foo}\subsection{bar}\newpage
\subsubsection{baz}\newpage
\section{foo}\subsection{bar}\subsubsection{baz}
\end{document}
答案4
好的,我查看了 hyperref 代码后自己找到了解决方案。Hyperref 用于\theHsection
标签。所以我可以像这样扩展我的宏:
\makeatletter
\newcommand{\setsectionprefix}[1]{
\renewcommand*\thesection{#1\@arabic\c@chapter.\@arabic\c@section}
\renewcommand*\theHsection{#1\@arabic\c@chapter.\@arabic\c@section}
\setcounter{section}{0}
}
\makeatother