“sections” 的字母前缀

“sections” 的字母前缀

在章节和节级之间,我有时需要另一个级别,用字母前缀表示。目录可能如下所示:

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

相关内容