Если я делаю закладку \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
определенную выше.