自动链接代码列表中的标识符

自动链接代码列表中的标识符

我有一些代码清单(使用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} 

输出:

在此处输入图片描述

相关内容