(可点击)列表中的交叉引用

(可点击)列表中的交叉引用

为了为“应用程序编程接口”生成文档,我想要一个语法突出显示区域(带有类声明),其中包含指向文档的可点击链接(每个方法特定)。

可点击链接的原因有两个:

  • 允许快速跳转到方法文档。
  • 避免必须在文档的其他地方同步类声明和方法声明。

迄今已尝试:

  1. lstlistingescapeinside选项结合使用。链接有效;但是,链接文本不是语法高亮。
  2. minted,它有一个mathescape选项,但没有escapeinside。如果支持,我怀疑它是否会突出显示链接文本。

有人有想法吗?

梅威瑟:

\documentclass{article}

\usepackage{hyperref}
\usepackage{listings}
\usepackage{color}

% #1: label name
% #2: function declaration
\makeatletter
\newcommand*{\func}[2]
{
    % Label for full declaration
    \edef\@currentlabel{#2}
    \phantomsection
    \label{#1}
    % Text printed where \func{...} is used
    #2
}
\makeatother

\begin{document}

% Method info
\func{fn:getage}{int GetAge()} \\
More info...

% Class declaration
\begin{lstlisting}[language=c++,keywordstyle=\color{blue},escapeinside='']
class Employee
{
    % Would like to insert (clickable) link here, like
    % \ref{fn:getage}
    int GetAge();
}
\end{lstlisting}

% Reference to method (full declaration)
\ref{fn:getage}

\end{document}

尝试escapeinside(仅lstlisting

\begin{lstlisting}[language=c++,keywordstyle=\color{blue},escapeinside='']
class Employee
{
    % Clickable link works, but no highlighting/formatting
    '\ref{fn:getage}'
}
\end{lstlisting}

答案1

这是一个非常常见的问题,与listings处理其输入。当您在列表中退出时,不会发生与列表相关的处理,因此您会发现不仅格式会发生变化,而且自然间距也会发生变化。此外,您会注意到 via 提供的间距lstlisting与 inline提供的间距之间存在差异lstinline。无论哪种方式,以下都是实现您想要的方法,尽管相当麻烦:

在此处输入图片描述

\documentclass{article}

\usepackage{hyperref}
\usepackage{listings}
\usepackage{color}

% #1: label name
% #2: function declaration
\makeatletter
\newcommand*{\func}[2]
{%
    % Label for full declaration
    \edef\@currentlabel{#2}%
    \phantomsection
    \label{#1}%
    % Text printed where \func{...} is used
    #2%
}
\makeatother

\newsavebox{\lstsavebox}

\begin{document}

% Method info
\func{fn:getage}{int GetAge()}

% Store listings link in box
\begin{lrbox}{\lstsavebox}
\begin{lstlisting}[language=c++,keywordstyle=\color{blue}]
int GetAge();
\end{lstlisting}
\end{lrbox}

% Class declaration
\begin{lstlisting}[language=c++,keywordstyle=\color{blue},escapeinside='']
class Employee
{
    % Would like to insert (clickable) link here, like
    '\hyperref[fn:getage]{\strut\smash{\usebox{\lstsavebox}}}'
    int GetAge();
}
\end{lstlisting}

% Reference to method (full declaration)
\ref{fn:getage}

\end{document}

原则上,我们在一个框中捕获要超链接的文本外部应该在哪里lstlisting使用它。我们使用相同的格式(当然,您可以全局设置)。然后,在列表内部,使用框式内容 - via \usebox- 设置\hyperref[<link>]{<stuff>}

由于该框可能包含其他垂直调整(因为它在“显示列表”中),我们将\smash它与\strut保留一些常规垂直间距一起。

相关内容