Wenn ich ein \section
und \section*
-Lesezeichen setze, verweist der Anker auf die beiden Abschnitte an einer anderen Stelle. Es wird ein kleiner vertikaler Abstand hinzugefügt \section*
(siehe .png
-files). Wie kann ich sicherstellen, dass der Anker an derselben Stelle platziert wird?
Ich brauche diese Lösung, da ich gerne eineListe der AnhängeLoA
, wobei die Einträge nur in und nicht angezeigt werden müssen ToC
, ich aber trotzdem die Abschnittsnummern im Text und benötige 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}
BEARBEITEN (1):Ich habe ein rotes Kästchen hinzugefügt, um den falschen Lesezeichenanker anzuzeigen \section*
. Der Abstand zwischen den Abschnitten ist korrekt, nur die Ankereinstellungen sind falsch.
Antwort1
Sie können die Funktionsweise anpassen \section
und dafür sorgen, dass sie sich, nur mit einigen geringfügigen Änderungen, \section*
genauso verhält wie bisher:\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
wird verwendet, um die Argumente einfach zu erfassen, die normalerweise von \section
(mit Sternchen gekennzeichnete Version, optionale und obligatorische Argumente) verwaltet werden.
Wenn \section*
aufgerufen wird, aktualisieren wir drei Dinge, die typisch für sind \section*
:
Der Gegenschritt
\refstepcounter
wird zu einer No-Op gemacht;Das Formatierungsmakro für den Abschnittszähler
\@seccntformat
wird in ein No-Op umgewandelt.Die inhaltsbezogene Schrift wird eingabebezogen aktualisiert und ein eventueller
\numberline
Ausdruck vermieden.
Da \section
und \section*
nun dasselbe Verfahren zum Drucken der Kopfzeile verwenden (nämlich \@sect
, intern), springen die Ausgabe-Hyperlinks an die gleiche vertikale Position.
Ihr Beispiel ist etwas konstruiert, da es ein Handbuch \refstepcounter
als Teil von Abschnitt 2.2 enthält. Ich sehe jedoch keine Probleme mit den Hyperlink-Sprüngen unter Verwendung der aktualisierten Version von \section
oben definiert.