超链接 \item 和 \ref

超链接 \item 和 \ref

我有一个自定义环境,它只是一个为我enumerate编写\item的。我希望枚举标签是一个超链接 - 在下面的 MWE 中,它只是链接到文档末尾的一个页面。

使用打印版本引用环境时\ref看起来不错。但是,您会注意到,创建的超链接\ref{testref}指向枚举标签指向的相同链接,而不是它引用的环境。

需要进行哪些更改才能使超链接按预期运行?

\documentclass{article}

\usepackage{lipsum}     % sample text
\usepackage{enumitem}   % enumerations
\usepackage{hyperref}   % hyperlinks        

\newcounter{problem}
\newcounter{subproblem}
\newenvironment{problem}{\setcounter{subproblem}{0}\refstepcounter{problem}{\bfseries Problem \theproblem}}{}
\newenvironment{subproblem}{%
    \stepcounter{subproblem}%
    \begin{enumerate}[label=\protect\hyperlink{newpage}{\theproblem.\thesubproblem},leftmargin=*]
     \item}{\end{enumerate}}

\begin{document}

\begin{problem}
 \begin{subproblem}
  \lipsum[1]
 \end{subproblem}
 \begin{subproblem}\label{testref}
  \lipsum[1]
 \end{subproblem}
\end{problem}

Test reference: \ref{testref}

\begin{problem}
 \begin{subproblem}
  \lipsum[1]
 \end{subproblem}
 \begin{subproblem}
  \lipsum[1]
 \end{subproblem}
\end{problem}

\newpage

\hypertarget{newpage}{We'll link to this}

\end{document}

答案1

以下是您的 MWE 中包含的一些更正。它们包括:

  • subproblem使用主计数器在每次增量时重置或problem

    \newcounter{subproblem}[problem]
    

    这消除了在环境启动时每次设置subproblem计数器()的要求。0\setcounter{subproblem}{0}problem

  • 使用添加子问题计数器的参考步进

    \refstepcounter{subproblem}
    
  • 明确说明环境中包含的引用enumerate,即使它与 相似,也label应避免label被视为与 相同ref。这纠正了对元素的错误引用:

    \begin{enumerate}%
      [label=\protect\hyperlink{newpage}{\theproblem.\thesubproblem},% label
       ref=\theproblem.\thesubproblem,% reference
       leftmargin=*]% left margin
    

\documentclass{article}

\usepackage{lipsum}     % sample text
\usepackage{enumitem}   % enumerations
\usepackage{hyperref}   % hyperlinks        

\newcounter{problem}
\newcounter{subproblem}[problem]
\newenvironment{problem}{\refstepcounter{problem}{\bfseries Problem~\theproblem}}{}
\newenvironment{subproblem}{%
    \refstepcounter{subproblem}%
    \begin{enumerate}[label=\protect\hyperlink{newpage}{\theproblem.\thesubproblem},ref=\theproblem.\thesubproblem,leftmargin=*]
     \item}{\end{enumerate}}

\begin{document}

\begin{problem}
 \begin{subproblem}
  \lipsum[1]
 \end{subproblem}
 \begin{subproblem}\label{testref}
  \lipsum[1]
 \end{subproblem}
\end{problem}

Test reference: \ref{testref}

\begin{problem}
 \begin{subproblem}
  \lipsum[1]
 \end{subproblem}
 \begin{subproblem}
  \lipsum[1]
 \end{subproblem}
\end{problem}

\newpage

\hypertarget{newpage}{We'll link to this}

\end{document}

相关内容