如果我创建\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}
编辑(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*
:
反击步进
\refstepcounter
变为无操作;节计数器格式化宏
\@seccntformat
转换为无操作;与内容相关的写作被更新为特定于输入,从而避免了可能的
\numberline
打印。
由于\section
和\section*
现在使用相同的程序打印页眉(即\@sect
,内部),输出超链接跳转到相同的垂直位置。
\refstepcounter
您的示例有点做作,因为它在 2.2 节中包含了手册。但是,使用\section
上面定义的更新版本,我发现超链接跳转没有任何问题。