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

Связанный контент