为了为“应用程序编程接口”生成文档,我想要一个语法突出显示区域(带有类声明),其中包含指向文档的可点击链接(每个方法特定)。
可点击链接的原因有两个:
- 允许快速跳转到方法文档。
- 避免必须在文档的其他地方同步类声明和方法声明。
迄今已尝试:
lstlisting
与escapeinside
选项结合使用。链接有效;但是,链接文本不是语法高亮。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
保留一些常规垂直间距一起。