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