代码清单中的内联链接

代码清单中的内联链接

我想通过在列表源文本中提供 URL 来包含源代码列表中的链接。

也就是说,我希望能够生成如下所示的内容:

在此处输入图片描述

源代码如下:

\begin{lstlisting}
int main(){
int x;
\href{http://foo.com/MyFunctionDocs.html}{MyFunction}(x);
}
\end{lstlisting}

粉色文本是指向任意 URL 的超链接。理想情况下,这与软件包兼容listings,但任何支持良好的逐字格式环境都可以接受。我该如何实现这一点?

答案1

我能想到的最简单的方法就是直接使用listingsescapechar键。这需要选择一个代码中没有出现的字符。例如,我|在下面使用了管道字符,但如果代码片段包含逻辑或按位或运算,则需要将其更改为其他字符。

\documentclass{article}

\usepackage{listings}
\usepackage[colorlinks]{hyperref}

\begin{document}

\begin{lstlisting}[language=C,escapechar=|]
int main(){
int x;
|\href{http://foo.com/MyFunctionDocs.html}{MyFunction}|(x);
}
\end{lstlisting}

\end{document}

得出的结果为:

结果图像

答案2

下面使用moredelim一些装箱将列表的任何部分(语法格式)作为超链接:

int main(){
  @foo@(); // <-- identifier is hyperlink
}

链接目标 (URL) 使用宏 指定\btSetUrl{ theurl }。您可以设置一次,也可以使用 的任何listingsescape-to-latex 选项在列表内重新定义它。在示例中,我仅使用mathescape,以便$\btSetUrl{https://tex.stackexchange.com}$在列表内设置 URL。

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{listings,xcolor,beramono}
\usepackage{tikz}
\usepackage{hyperref}


\makeatletter
\gdef\bt@HR@url{https://tex.stackexchange.com}
\newcommand\btSetUrl[1]{\gdef\bt@HR@url{#1}}
\newenvironment{btHyperref}
{\begingroup\begin{lrbox}{\@tempboxa}}
{\end{lrbox}\bt@HR@box{\@tempboxa}\endgroup}

\newcommand\btHR{%
  \begin{btHyperref}\bgroup\aftergroup\bt@HR@endenv%
}
\def\bt@HR@endenv{%
  \end{btHyperref}%   
  \egroup
}
\newcommand{\bt@HR@box}[1]{%
  \href{\bt@HR@url}{\usebox{#1}}%
}
\makeatother

\lstdefinestyle{C}{
    language={C},basicstyle=\ttfamily, 
    mathescape,
    moredelim=**[is][\btHR]{@}{@},
}

\begin{document}

\begin{lstlisting}[style=C]
int main(){
  int x;
  $\btSetUrl{http://tex.stackexchange.com/questions/314903/inline-links-in-code-listings}$@MyFunction@( x ); // <-- links to cool question
  $\btSetUrl{http://stackoverflow.com/questions/204476/what-should-main-return-in-c-and-c}$@return 0@;        // <-- never forget!
}
\end{lstlisting}

\end{document}

在此处输入图片描述

相关内容