使用 hyperref 引用特定列表项

使用 hyperref 引用特定列表项

使用以下代码,当我单击引用(带有红色框)时,它们没有指向正确的位置。

\documentclass{article}
\usepackage{array,longtable}
\usepackage{hyperref}

\begin{document}

\renewcommand\theenumii{\alph{enumii}}
\makeatletter
\def\subitem{\omit\@arstrut 
\ifnum\value{enumii}=0 \stepcounter{enumi}\fi
\refstepcounter{enumii}\theenumi\theenumii\hfill}
\def\item{\omit\setcounter{enumii}{0}\let\omit\relax}
\makeatother

\begin{longtable}{>{\refstepcounter{enumi}\setcounter{enumii}{0}\theenumi}lr}
\item
\subitem \label{1a}& fooo \\
\subitem \label{1b}& foo \\
\item
\subitem \label{2a}& foo \\
\subitem \label{2b}& foo \\
\label{3}& foo  \\
\label{4}& foooo \\
\end{longtable}

we have \ref{1a}, \ref{2b}, \ref{4}

\end{document}

答案1

两个问题:

  • 锚点名称不唯一。可以通过重新定义\theHenumi和来解决这个问题\theHenumii
  • 锚点位置是基线。锚点由 设定\refstepcounter。这可以通过 解决\raisebox{\ht\@arstrutbox}[0pt]{...}。但然后\refstepcounter在组内调用 ,并且\@currentlabel(\ref所见内容) 和\@currentHref(锚点名称,如果localanchorname使用选项) 的含义。因此,这些值被放入全局临时变量中,以便在 之后恢复它们\raisebox

示例文件已更新,添加了括号和点。此外还更新了表格中的粗体数字。

\documentclass{article}
\usepackage{array,longtable}
\usepackage[verbose]{hyperref}

\begin{document}

\renewcommand\theenumii{(\alph{enumii})}
\renewcommand*{\theHenumi}{\theenumi}
\renewcommand*{\theHenumii}{\theenumi\alph{enumii}}
\makeatletter
\newcommand*{\raiserefstepcounter}[1]{%
  \raisebox{\ht\@arstrutbox}[0pt]{%
    \hypersetup{localanchorname}%
    \refstepcounter{#1}%
    \global\let\g@currentlabel\@currentlabel
    \global\let\g@currentHref\@currentHref
  }%
  \let\@currentlabel\g@currentlabel
  \let\@currentHref\g@currentHref
}
\def\subitem{%
  \omit\@arstrut
  \ifnum\value{enumii}=0 %
    \stepcounter{enumi}%
  \fi
  \raiserefstepcounter{enumii}%
  \bfseries
  \theenumi\theenumii.\hfill
}
\def\item{%
  \omit
  \setcounter{enumii}{0}%
  \let\omit\relax
}
\makeatother

\makeatletter
\begin{longtable}{%
  >{%
    \raiserefstepcounter{enumi}%
    \setcounter{enumii}{0}%
    \bfseries\theenumi
  }l<{\unskip.}r%
}
\item
\subitem \label{1a}& fooo \\
\subitem \label{1b}& foo \\
\item
\subitem \label{2a}& foo \\
\subitem \label{2b}& foo \\
\label{3}& foo  \\
\label{4}& foooo \\
\end{longtable}

we have \ref{1a}, \ref{2b}, \ref{4}

\end{document}

结果

相关内容