我有一些代码清单(使用listings
环境或包lstinline
中的宏listings
),我想将当前文档中定义的所有标识符链接到它们的定义。我只关心通过 pdflatex 输出 PDF。
我对现有的索引基础架构感到满意,我可以手动指示每个标识符的定义位置,并且可以手动将标识符的出现与其定义联系起来。例如(为了回答这个问题,大大简化了)我可以编写代码\DefinedHere{foo}
来创建索引条目和 hyperref 目标,然后\LinkDefinition{foo}
对其进行排版foo
并将其链接到 hyperref 目标。
我的问题是如何使listings
基础设施调用\LinkDefinition
自动地(或具有不同语法的某些类似宏),用于所有标识符或用于预定义的标识符列表,以便每个标识符都超链接到 PDF 中手动定义的目标。
梅威瑟:
\documentclass{article}
\usepackage{hyperref}
\usepackage{alltt}
\usepackage{listings}
\lstset{basicstyle=\ttfamily,columns=flexible}
\newcommand{\DefinedHere}[1]{\hypertarget{def.#1}{}}
\newcommand{\LinkToDefinition}[1]{\hyperlink{def.#1}{#1}}
\begin{document}
\section{Yin}
\begin{alltt}
def \LinkToDefinition{yin} = not \LinkToDefinition{yang}
\end{alltt}
\begin{lstlisting}
def yin = not yang
\end{lstlisting}
\newpage
\section{Yang}
\hypertarget{def.yang}{}
\begin{alltt}
def \LinkToDefinition{yang} = not \LinkToDefinition{yin}
\end{alltt}
\begin{lstlisting}
def yang = not yin
\end{lstlisting}
\end{document}
这些alltt
部分说明了 的手动使用\LinkToDefinition
。(如果我手动执行此操作,我可能不会在定义本身中索引出现的内容,即我不会def yin
链接到 的定义yin
,但我不在乎是否发生这种情况:。)我想使用listings
包并自动实现与示例中相同的链接alltt
,而不必在每个列表中添加注释。
我想在我的序言中添加这样的内容:
\lstset{emph={yin,yang},emphstyle={\LinkToDefinition}}
但emphstyle
密钥需要状态改变命令,它不接受单词作为参数。或者
\lstset{index={yin,yang},indexstyle={\LinkToDefinition}}
但这会将标识符排版两次,因为 的参数indexstyle
不需要排版单词。我可以改为\LinkToDefinition
不排版任何内容,但这会创建一个零宽度链接,而不是链接单词。有没有办法将两者结合起来?
答案1
您可以literate
在您的内部使用lstset
:
\lstset{basicstyle=\ttfamily,columns=flexible,
literate={yin}{\LinkToDefinition{yin}}{4}{yang}{\LinkToDefinition{yang}}{5},
}
梅威瑟:
\documentclass{article}
\usepackage{hyperref}
\usepackage{listings}
\lstset{basicstyle=\ttfamily,columns=flexible,
literate={yin}{\LinkToDefinition{yin}}{4}{yang}{\LinkToDefinition{yang}}{5},
}
\newcommand{\DefinedHere}[1]{\hypertarget{def.#1}{}}
\newcommand{\LinkToDefinition}[1]{\hyperlink{def.#1}{#1}}
\begin{document}
\section{Yin}
\DefinedHere{yin}
\begin{lstlisting}
def yin = not yang
\end{lstlisting}
\newpage
\section{Yang}
\DefinedHere{yang}
\begin{lstlisting}
def yang = not yin
\end{lstlisting}
\end{document}
输出: