部分名称中的超链接

部分名称中的超链接

我正在尝试使用该类memoir来排版一个文档,其中章节标题使用该包充当指向文档中其他位置的超链接hyperref。 和 \hyperlink 不能真正协作的原因之一\section是我无法在( }\hyperlink内调用,这会导致错误。为了解决这个问题,我发现可以在 的第二个参数内调用。然而,这种解决方法会产生意想不到的和不想要的后果,即抛出该部分内引文的间距。我没有得到我通常会看到的正文底线和引用文本第一行之间的间距。我查看了和文档和来源,但说实话,代码对我来说几乎难以理解,我找不到解决方案。我可以通过在引用之前的段落末尾手动换行来近似一个,但我更喜欢更优雅的解决方案(并且想了解出了什么问题)。 \section\section{\hyperlink{..}{...}\section\hyperlinkhyperrefmemoirhyperref

这是我的 MWE,其中包括我调用的所有包。我正在使用 XeLaTeX。

\PassOptionsToPackage{svgnames,x11names,hyperref}{xcolor}
\documentclass[article,12pt]{memoir}

\usepackage{booktabs}
\usepackage{graphicx}
\usepackage{pdfpages}
\usepackage{lettrine}
\usepackage{fixltx2e}
\usepackage{etex}
\usepackage{verbatim}
\usepackage{bookmark}
\usepackage{lipsum}
\usepackage{hyperref}

\pagestyle{empty}

\begin{document}

\mainmatter

\hyperlink{a}{\section{what i want in the section, but not in the quote}}
\lipsum[1]
\begin{quote}
\lipsum[2]
\end{quote}
\section{what i don't want in the section, but do in the quote}
\lipsum[3]
\begin{quote}
\lipsum[4]
\end{quote}
\end{document}

我知道可能有更好的方法来完成这项任务(\ref等)。但目标和链接已经设置好了,我强烈不希望对它们进行重新编码,因为这需要一些创造性的正则表达式查找和替换。这很容易出错。

答案1

此变体定义\slink\sref。它们以名称作为参数并位于分段命令之前。\slink然后将节标题转换为指向给定目标名称的链接。\sref使用名称作为标签名称。支持星号形式和分段命令的可选参数,示例:

\slink{a}\section{what i want in the section, ...}...\hypertarget{a}{...}
\sref{foo}\subsection*{Section with star}...\label{foo}

目录、书签和标题行的链接已被删除。完整示例文件:

\PassOptionsToPackage{svgnames,x11names,hyperref}{xcolor}
\documentclass[article,12pt]{memoir}

\usepackage{booktabs}
\usepackage{graphicx}
\usepackage{pdfpages}
\usepackage{lettrine}
\usepackage{fixltx2e}
\usepackage{etex}
\usepackage{verbatim}
\usepackage{bookmark}
\usepackage{lipsum}
\usepackage{hyperref}
\usepackage{bookmark}
\bookmarksetup{open,numbered}

\pagestyle{headings}

\makeatletter
\newcommand*{\slink}[2]{%
  \begingroup
  \@ifstar{%
    \toks@{\endgroup#2*}%
    \slink@star{\texorpdfstring{\hyperlink{#1}}{}}%
  }{%
    \toks@{\endgroup#2}%
    \@ifnextchar[{%
      \slink@opt{\texorpdfstring{\hyperlink{#1}}{}}{#2}%
    }{%
      \slink@{\texorpdfstring{\hyperlink{#1}}{}}{#2}%
    }%
  }%
}
\newcommand*{\sref}[2]{%
  \begingroup
  \@ifstar{%
    \toks@{\endgroup#2*}%
    \slink@star{\texorpdfstring{\hyperref[{#1}]}{}}%
  }{%
    \toks@{\endgroup#2}%
    \@ifnextchar[{%
      \slink@opt{\texorpdfstring{\hyperref[{#1}]}{}}{#2}%
    }{%
      \slink@{\texorpdfstring{\hyperref[{#1}]}{}}{#2}%
    }%
  }%
}
\def\slink@star#1#2{%
  \the\toks@{#1{#2}}%
}
\def\slink@opt#1#2[#3]#4{%
  \the\toks@[{#3}]{#1{#4}}%
}
\def\slink@#1#2#3{%
  \the\toks@[{#3}]{#1{#3}}%
}  
\makeatother

\begin{document}

\frontmatter
\tableofcontents

\mainmatter

\slink{a}\section{what i want in the section, but not in the quote}
\lipsum[1]
\begin{quote}
\lipsum[2]   
\end{quote}  
\section{what i don't want in the section, but do in the quote}
\lipsum[3]
\hypertarget{a}{}
\begin{quote}
\lipsum[4]   
\end{quote}  

% more test cases
\newpage
\sref{eq:abc}\section{Section with link to equation}
\sref{eq:abc}\section*{Star section}
\sref{eq:abc}\section[Toc entry]{Section with link}
\begin{equation}
a+b=c\label{eq:abc}
\end{equation}
\end{document}

答案2

不确定这是否是您想要的(因为您没有提供\hypertarget),但您可以使用\protect该命令:\hyperlink\texorpdfstring

\PassOptionsToPackage{svgnames,x11names,hyperref}{xcolor}
\documentclass[article,12pt]{memoir}

\usepackage{booktabs}
\usepackage{graphicx}
\usepackage{pdfpages}
\usepackage{lettrine}
\usepackage{fixltx2e}
\usepackage{etex}
\usepackage{verbatim}
\usepackage{bookmark}
\usepackage{lipsum}
\usepackage{hyperref}

\pagestyle{empty}

\begin{document}

\mainmatter

\section{\texorpdfstring{\protect\hyperlink{a}{what i want in the section, but not in the quote}}{what i want in the section, but not in the quote}}
\lipsum[1]
\begin{quote}
\lipsum[2]
\end{quote}
\section{what i don't want in the section, but do in the quote}
\lipsum[3]
\begin{quote}
\lipsum[4]
\end{quote}
\end{document}

并且也许您可能还想使用可选参数来防止链接出现在最终的目录中(或标题):

\section[Text for the ToC]{\texorpdfstring{\protect\hyperlink{a}{what i want in the section, but not in the quote}}{what i want in the section, but not in the quote}}

答案3

就我而言@Gonzalo Medina的答案不适用于hyperlink,但用 代替则href可以。

相关内容