如何设置书签锚点,使 \section- 和 \section*-bookmark 的行为相同

如何设置书签锚点,使 \section- 和 \section*-bookmark 的行为相同

如果我创建\section\section*书签,锚点会指向不同位置的两个部分。会添加一个小的垂直空间\section*(参见.png-files)。如何确保锚点位于同一位置?

我需要这个解决方案,因为我想做一个附录目录,其中条目只需要显示在LoA而不是ToC,但我仍然需要文本中的章节编号和LoA

\documentclass{book}

\usepackage{bookmark}
\hypersetup{bookmarksnumbered=true}

\begin{document}
\chapter{Chapter one}

References here:

ref: \ref{chap2} (chapter)

ref: \ref{chap2sec1} (section)

ref: \ref{chap2sec2} (star-section)

\chapter{Chapter two}\label{chap2}

...(contents of chapter 2)...

\section{Sec one}\label{chap2sec1}

...(contents of chapter 2 - section 1)...

\refstepcounter{section}
\section*{\thesection{}{\quad}Sec two}\label{chap2sec2}
\addcontentsline{toc}{section}{\protect\numberline{\thesection}Sec two}

...(contents of chapter 2 - section 2)...

\end{document}

普通部分书签(\section) 星形书签 (\section*)

编辑(1):我添加了一个红框来显示错误的书签锚点\section*。各节之间的间距是正确的,只是锚点设置错误。

答案1

您可以调整工作方式\section并使其\section*以相同的方式运行\section,只需进行一些细微的修改:

\documentclass{book}

\usepackage{bookmark}
\hypersetup{bookmarksnumbered=true}

\usepackage{xparse}
\makeatletter
\renewcommand{\@seccntformat}[1]{\csname the#1\endcsname\space}% Just for this example
\let\oldsection\section
\let\oldaddcontentsline\addcontentsline
\RenewDocumentCommand{\section}{s o m}{%
  \IfBooleanTF{#1}
    {{% \section*
      \renewcommand{\refstepcounter}[1]{\phantomsection}% Gobble counter stepping
      \renewcommand{\@seccntformat}[1]{}% Gobble section number formatting
      \renewcommand{\addcontentsline}[3]{\oldaddcontentsline{toc}{section}{#3}}% Next entry _will_ be a section
      \oldsection{#3}% \section*[.]{..}
    }}{% \section
      \IfNoValueTF{#2}
        {\oldsection{#3}}% \section{..}
        {\oldsection[#2]{#3}}% \section[.]{..}
    }%
}
\makeatother

\begin{document}
\chapter{Chapter one}

References here:

ref: \ref{chap2} (chapter)

ref: \ref{chap2sec1} (section)

ref: \ref{chap2sec2} (star-section)

\chapter{Chapter two}\label{chap2}

...(contents of chapter 2)...

\section{Sec one}\label{chap2sec1}

...(contents of chapter 2 - section 1)...

\stepcounter{section}%
\section*{\thesection{} Sec two}\label{chap2sec2}

...(contents of chapter 2 - section 2)...

\end{document}

xparse用于轻松捕获通常由\section(星号版本、可选和强制参数)管理的参数。

\section*被调用时,我们会更新三件典型的内容\section*

  1. 反击步进\refstepcounter变为无操作;

  2. 节计数器格式化宏\@seccntformat转换为无操作;

  3. 与内容相关的写作被更新为特定于输入,从而避免了可能的\numberline打印。

由于\section\section*现在使用相同的程序打印页眉(即\@sect,内部),输出超链接跳转到相同的垂直位置。

\refstepcounter您的示例有点做作,因为它在 2.2 节中包含了手册。但是,使用\section上面定义的更新版本,我发现超链接跳转没有任何问题。

相关内容