我正在尝试使用\usepackage{hyperref}
在文本中按名称引用某个部分。要引用的部分是
\section{whatever}\label{sec:marker}
然而,当我在文本中
\nameref{sec:marker}
我只看到一个狭窄的红色矩形,其中没有文本(我期望那里出现“whatever”文本)。我还能做些什么来解决这个问题吗?
以下是我所遇到的问题的 MWE:
\documentclass[onecolumn,twoside]{revtex4}
%\usepackage{float}
%\usepackage{graphicx}
%\usepackage{sansmath}
%\usepackage{amsmath}
%\usepackage{tikz}
%\pdfpagewidth 8.32in
%\pdfpageheight 11in
%\setlength{\topmargin}{-20mm}
%\setlength{\columnsep}{10mm}
%\setlength{\oddsidemargin}{-2mm}
%\setlength{\evensidemargin}{-2mm}
%\setlength{\textwidth}{170mm}
%\usepackage{anttor}
%\bibpunct{(}{)}{;}{s}{,}{,}
%\usepackage{fancyhdr}
%\usepackage{longtable}
%\usepackage{pgothic}
%\usepackage[T1]{fontenc}
%\usepackage{eufrak}
%\usepackage{oldgerm}
%\usepackage[normalem]{ulem}
%\usepackage{cancel}
%\usepackage{wasysym}
\usepackage{hyperref}
\begin{document}
\section*{FirstSection}
In \nameref{sec:marker} it is stated that ...
\section*{SecondSection} \label{sec:marker}
\end{document}
答案1
是的,revtex4
耍花招hyperref
也就是重新定义正在利用的、导致“丢失”的revtex4
部分宏。hyperref
\nameref
要解决此问题,您需要xpatch
包裹并修补正确的分段宏:\@ssect@ltx
和\@sect@ltx
,每个宏的调用取决于您是否使用分段命令的星号变体(或不使用)。
这是一个最小的工作示例:
\documentclass{revtex4}% http://ctan.org/pkg/revtex4
\usepackage{xpatch}% http://ctan.org/pkg/xpatch
\makeatletter
\xpatchcmd{\@ssect@ltx}{\@xsect}{\protected@edef\@currentlabelname{#8}\@xsect}{}{}% Patch \<section>*
\xpatchcmd{\@sect@ltx}{\@xsect}{\protected@edef\@currentlabelname{#8}\@xsect}{}{}% Patch \<section>
\makeatother
\usepackage{hyperref}% http://ctan.org/pkg/hyperref
\begin{document}
\section{FirstSection} \label{sec:marker1}
In \nameref{sec:marker2} it is stated that \ldots
\section*{SecondSection} \label{sec:marker2}
You can also see in \nameref{sec:marker1} that \ldots
\end{document}
\nameref
依赖于包含部分单元中使用的标题的宏\@currentlabelname
。此标题存储在#8
对 或 的调用的参数\@ssect@ltx
中\@sect@ltx
。因此,补丁会在宏中的适当位置恢复此定义。