使用以下代码,当我单击引用(带有红色框)时,它们没有指向正确的位置。
\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}