Hyperref, Оглавление и подразделы

Hyperref, Оглавление и подразделы

Я столкнулся с проблемой в latex, которую не смог решить. Хотя пакет hyperref генерирует кликабельные ссылки в таблице содержания, он не связывает ни один подраздел с фактическим подразделом, а с разделом, в котором они находятся. Можно ли как-то изменить это поведение, чтобы оно либо связывало сам подраздел, либо страницу, на которой находится подраздел?

После более детального изучения, похоже, что для отображения этой проблемы требуется отключить нумерацию разделов и использовать пакет titlesec. Ниже приведен пример этой проблемы:

\documentclass{report}
\usepackage[linktoc=all]{hyperref}
\setcounter{secnumdepth}{0}
\usepackage{titlesec}
\hypersetup{
    colorlinks,
    citecolor=black,
    filecolor=black,
    linkcolor=black,
    urlcolor=black
}

\begin{document}
\tableofcontents
\chapter{test}

Test text
\newpage
\section{A section}

Lorem Ipsum
\newpage
\subsection{This link is wrong}

\end{document}

решение1

Поскольку вы устанавливаете значение secnumdepthна ноль, для гиперссылок не создаются якоря, и это приводит к упомянутому нежелательному эффекту; следующий код работает так, как и ожидалось:

\documentclass{report}
\usepackage[linktoc=all]{hyperref}
\usepackage{titlesec}
\hypersetup{
    colorlinks,
    citecolor=black,
    filecolor=black,
    linkcolor=black,
    urlcolor=black
}

\begin{document}
\tableofcontents
\chapter{test}

Test text
\newpage
\section{A section}

Lorem Ipsum
\newpage
\subsection{This link is correct}

\end{document}

Если вы хотите, чтобы все ваши разделы и подразделы были ненумерованными, но включены в оглавление и при этом генерировали правильные гиперссылки, одним из вариантов будет использование команды \phantomsectionдля генерации якорей:

\documentclass{report}
\usepackage[linktoc=all]{hyperref}
\setcounter{secnumdepth}{0}
\usepackage{titlesec}
\hypersetup{
    colorlinks,
    citecolor=black,
    filecolor=black,
    linkcolor=black,
    urlcolor=black
}

\begin{document}
\tableofcontents
\chapter{test}

Test text
\newpage
\phantomsection
\section{A section}

Lorem Ipsum
\newpage
\phantomsection
\subsection{This link is correct}

\end{document}

Другим вариантом было бы использование пакетов titlesecи titletocдля удаления нумерации как из тела документа, так и из оглавления:

\documentclass{report}
\usepackage[linktoc=all]{hyperref}
\usepackage{titlesec}
\usepackage{titletoc}

\titleformat{\section}
  {\normalfont\Large\bfseries}{}{1em}{}
\titleformat{\subsection}
  {\normalfont\large\bfseries}{}{1em}{}
\titlecontents{section}
  [1.5em] {}{}{}
  {\titlerule*[1em]{.}\contentspage}
\titlecontents{subsection}
  [3.8em] {}{}{}
  {\titlerule*[1em]{.}\contentspage}

\hypersetup{
    colorlinks,
    citecolor=black,
    filecolor=black,
    linkcolor=black,
    urlcolor=black
}

\begin{document}
\tableofcontents
\chapter{test}

Test text
\newpage
\section{A section}

Lorem Ipsum
\newpage
\subsection{This link is correct}

\end{document}

Еще одним вариантом было бы использование отмеченных звездочкой версий секционных единиц (т. е. \section*, \subsection*) и использование \addcontentslineдля ручного добавления записей в оглавление:

\documentclass{report}
\usepackage[linktoc=all]{hyperref}

\hypersetup{
    colorlinks,
    citecolor=black,
    filecolor=black,
    linkcolor=black,
    urlcolor=black
}

\begin{document}
\tableofcontents
\chapter{test}

Test text
\newpage
\section*{A section}
\addcontentsline{toc}{section}{A section}

Lorem Ipsum
\newpage
\subsection*{This link is correct}
\addcontentsline{toc}{subsection}{This link is correct}

\end{document}

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