我想在 Scala 代码列表中的某些文本中添加过度支撑(使用 lstlisting)。
\begin{lstlisting}
object TypeClass extends FooParMain {
def newApp(args: Array[String]) = new FooParApp {
def run {
val x = new Matrix(Seq(Seq(1, 2), Seq(3, 4)))
val dSeq = Array.fill(worldSize)(x).toDistSeq
for (res <- dSeq.sumD) {
pprintln(res, " worldSize = " + worldSize, res == x * worldSize)
}
}
}
}
\end{lstlisting}
有没有合理的方法可以做到这一点而不破坏语法高亮?(我试过[mathescape],但看起来不太好)
答案1
这需要一点“用眼睛”测量,很难自动测量,而不知道列表将对文本做什么。
(如有其他问题请发帖完全的显示所用软件包的文档如下)
\documentclass{article}
\usepackage{listings}
\begin{document}
\small
\begin{lstlisting}[mathescape]
object TypeClass extends FooParMain {
def newApp(args: Array[String]) = new FooParApp {
def run {
val x = new Matrix(Seq(Seq(1, 2), Seq(3, 4)))
val dSeq = $\rlap{\(\overbrace{\strut\hspace{4.5cm}}\)}$Array.fill(worldSize)(x).toDistSeq
for (res <- dSeq.sumD) {
pprintln(res, " worldSize = " + worldSize, res == x * worldSize)
}
}
}
}
\end{lstlisting}
\end{document}
答案2
以下是对突出显示代码列表中的文本,同时保持语法突出显示. 基本思想是使用listings
moredelim
选项来标记需要过度支撑的部分。
使用moredelim=**
语法,您可以定义适用样式的分隔符在上面所有其他格式。下面我使用反引号作为分隔符,但你可以选择任何字符:
\lstdefinestyle{...}{
moredelim=**[is][\btHL]{`}{`},
}
唯一的问题是要应用的格式化命令 ( \btHL
) 不会将要突出显示的文本作为宏参数。相反,它们必须像 LaTeX 字体命令(例如\bfseries
或\color
)一样工作,这些命令直到当前组结束才生效。因此,我们必须在 中捕获内容lrbox
。
完整的 MWE(使用 Java 而不是 Scala 来演示与语法高亮的结合):
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{listings,xcolor,beramono,amsmath}
\makeatletter
\newenvironment{btHighlight}[1][]
{\begingroup\def\bt@Highlight@par{#1}\begin{lrbox}{\@tempboxa}}
{\end{lrbox}\bt@HL@box[\bt@Highlight@par]{\@tempboxa}\endgroup}
\newcommand\btHL[1][]{%
\begin{btHighlight}[#1]\bgroup\aftergroup\bt@HL@endenv%
}
\def\bt@HL@endenv{%
\end{btHighlight}%
\egroup
}
\newcommand{\bt@HL@box}[2][]{%
$\overset{\text{#1}}{\overbrace{\strut\usebox{#2}}}$%
}
\makeatother
\lstdefinestyle{Java}{
language={Java},basicstyle=\ttfamily,
moredelim=**[is][{\btHL[class name]}]{`}{`},
moredelim=**[is][{\btHL[important]}]{@}{@},
escapechar={§},
}
\begin{document}
A listing with {\btHL[overbrace text] highlighting of all \textbf{important} elements} looks as follows:
\begin{lstlisting}[style=Java]
public class `HelloWorld` {
public @static void@ main(String[] args) {
System.out.println("Hello, World");
}
}
\end{lstlisting}
\end{document}