Ich möchte einem Text in einer Scala-Codeliste eine Überklammerung hinzufügen (mithilfe von 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}
Gibt es eine vernünftige Möglichkeit, dies zu tun, ohne die Syntaxhervorhebung zu beschädigen? (Ich habe es mit [mathescape] versucht, aber es sieht nicht gut aus.)
Antwort1
Dabei kommt ein wenig Augenmaß zum Einsatz, um eine automatische Messung zu erschweren, ohne genau zu wissen, was die Auflistungen mit dem Text machen.
(Bei zukünftigen Fragen bitte postenvollständigDokumente mit Angaben zu den verwendeten Paketen (siehe unten)
\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}
Antwort2
Das Folgende ist eine Anpassung des Ansatzes, der inMarkieren Sie Text in der Codeliste, während Sie gleichzeitig die Syntaxhervorhebung beibehaltenDie Grundidee besteht darin, listings
moredelim
die Option zu verwenden, um den zu überspannenden Teil zu markieren.
Mit der moredelim=**
Syntax können Sie Trennzeichen definieren, welche Stile geltenoben draufaller anderen Formatierungen. Im Folgenden verwende ich Backticks als Trennzeichen, Sie können aber jedes beliebige Zeichen verwenden:
\lstdefinestyle{...}{
moredelim=**[is][\btHL]{`}{`},
}
Das einzige Problem ist, dass die anzuwendenden Formatierungsbefehle ( \btHL
) den hervorzuhebenden Text nicht als Makroparameter erhalten. Stattdessen müssen sie wie die LaTeX-Schriftbefehle (z. B. \bfseries
oder \color
) funktionieren, die bis zum Ende der aktuellen Gruppe wirksam bleiben. Daher müssen wir den Inhalt in einem abfangen lrbox
.
Vollständiges MWE (unter Verwendung von Java statt Scala, um die Kombination mit Syntaxhervorhebung zu demonstrieren):
\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}