如何修复指向错误位置的目录链接?(小节*,setcounter)

如何修复指向错误位置的目录链接?(小节*,setcounter)

简而言之,目录中的链接无法按我想要的方式工作。对于第二个子部分(子部分 B),所有子部分链接都指向第一个子部分(子部分 A)中的子部分。

目录图片

因此,例如,“子小节 x”的链接指向的是“子小节 b”。

这是一个可复制的小例子来复制该问题。

\documentclass{article}

\usepackage[pdftex]{graphicx}
\usepackage[colorlinks=true, linkcolor=blue]{hyperref}

\begin{document}

\tableofcontents
\subsection*{Subsection A}
    \addcontentsline{toc}{subsection}{Subsection A}
    \setcounter{subsubsection}{0}
    \subsubsection{subsubsection a}
        \newpage
    \subsubsection{subsubsection b}
        \newpage
    \subsubsection{subsubsection c}
        \newpage
    \subsubsection{subsubsection d}
        \newpage

\subsection*{Subsection B}
    \addcontentsline{toc}{subsection}{Subsection B}
    \setcounter{subsubsection}{0}
    \subsubsection{subsubsection a}
        \newpage
    \subsubsection{subsubsection x}
        \newpage
    \subsubsection{subsubsection y}

\end{document}

问题似乎是同时使用了subsection*(即带星号的版本)和setcounter{subsubsection}{0}两次。如果您解决此问题的方法不使用这些命令,则完全没问题。但是,

  • 文件中出现的“小节 A”和“小节 B”没有编号;
  • 目录中出现“小节 A”和“小节 B”;
  • 两个小节中的子小节的编号均从 0.0.1 开始。

该文件使用 pdflatex 连续编译多次。

我该如何解决这个问题?

答案1

您可以使用hypertexnames=false包选项hyperref

\documentclass{article}
\usepackage{graphicx}
\usepackage[colorlinks=true, linkcolor=blue
  ,hypertexnames=false% <- added
]{hyperref}

\begin{document}
\tableofcontents

\subsection*{Subsection A}
\addcontentsline{toc}{subsection}{Subsection A}
\setcounter{subsubsection}{0}
\subsubsection{subsubsection a}\newpage
\subsubsection{subsubsection b}\newpage
\subsubsection{subsubsection c}\newpage
\subsubsection{subsubsection d}\newpage

\subsection*{Subsection B}
\addcontentsline{toc}{subsection}{Subsection B}
\setcounter{subsubsection}{0}
\subsubsection{subsubsection a}\newpage
\subsubsection{subsubsection x}\newpage
\subsubsection{subsubsection y}
\end{document}

补充说明:如果你加载包titlesec,那么您必须使用\subsection*{\phantomsection Subsection X}(其中 X = A 或 X = B)而不是简单地\subsection*{Subsection X}手动为链接设置锚点。

答案2

我将为此定义一个特殊命令,并在发出subsubsection时使用标准函数来重置计数器。\subdivision

\documentclass{article}

\usepackage{graphicx}
\usepackage[colorlinks=true, linkcolor=blue]{hyperref}

\newcounter{subdivision}
\counterwithin*{subsubsection}{subdivision}
\renewcommand{\thesubsubsection}{\arabic{subsubsection}}

\newcommand{\subdivision}[1]{%
  \refstepcounter{subdivision}%
  \subsection*{#1}%
  \addcontentsline{toc}{subsection}{#1}%
}

\begin{document}

\tableofcontents
\subdivision{Subsection A}

\subsubsection{subsubsection a}
        \newpage
\subsubsection{subsubsection b}
        \newpage
\subsubsection{subsubsection c}
        \newpage
\subsubsection{subsubsection d}
        \newpage

\subdivision{Subsection B}

\subsubsection{subsubsection a}
        \newpage
\subsubsection{subsubsection x}
        \newpage
\subsubsection{subsubsection y}

\end{document}

在此处输入图片描述

您可以检查链接是否指向正确的位置。

答案3

您所需要的只是\phantomsection来自 hyperref。

\documentclass{article}

\usepackage[pdftex]{graphicx}
\usepackage[colorlinks=true, linkcolor=blue]{hyperref}

\begin{document}

\tableofcontents

\phantomsection
\subsection*{Subsection A}
    \addcontentsline{toc}{subsection}{Subsection A}
    \setcounter{subsubsection}{0}
    \subsubsection{subsubsection a}
        \newpage
    \subsubsection{subsubsection b}
        \newpage
    \subsubsection{subsubsection c}
        \newpage
    \subsubsection{subsubsection d}
        \newpage

\phantomsection
\subsection*{Subsection B}
    \addcontentsline{toc}{subsection}{Subsection B}
    \setcounter{subsubsection}{0}
    \subsubsection{subsubsection a}
        \newpage
    \subsubsection{subsubsection x}
        \newpage
    \subsubsection{subsubsection y}

\end{document}

我突然想到它\thesubsection仍然在使用,\thesubsubsection所以您需要重新定义其中至少一个。

\documentclass{article}

\usepackage[pdftex]{graphicx}
\usepackage[colorlinks=true, linkcolor=blue]{hyperref}

\renewcommand{\thesubsection}{\Alph{subsection}}
\renewcommand{\thesubsubsection}{\arabic{subsubsection}}

\begin{document}

\tableofcontents

\refstepcounter{subsection}%
\addcontentsline{toc}{subsection}{Subsection A}%
\subsection*{Subsection A}

    \subsubsection{subsubsection a}
        \newpage
    \subsubsection{subsubsection b}
        \newpage
    \subsubsection{subsubsection c}
        \newpage
    \subsubsection{subsubsection d}
        \newpage

\refstepcounter{subsection}%
\addcontentsline{toc}{subsection}{Subsection B}%
\subsection*{Subsection B}

    \subsubsection{subsubsection a}
        \newpage
    \subsubsection{subsubsection x}
        \newpage
    \subsubsection{subsubsection y}

\end{document}

相关内容