Überklammern Sie in der Listenauflistung des Scala-Codes

Überklammern Sie in der Listenauflistung des Scala-Codes

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.

Bildbeschreibung hier eingeben

(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 moredelimdie 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. \bfseriesoder \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}

Bildbeschreibung hier eingeben

verwandte Informationen