Overbrace en el listado del código Scala

Overbrace en el listado del código Scala

Quiero agregar una llave extra a algún texto en una lista de código Scala (usando 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}

¿Existe alguna forma sensata de hacer esto sin romper el resaltado de sintaxis? (Probé [mathescape], pero no se ve bien)

Respuesta1

Esto utiliza un poco de medición "a ojo" para medirlo automáticamente sin saber exactamente qué harán los listados con el texto.

ingrese la descripción de la imagen aquí

(Por favor, para futuras preguntas, publiquecompletodocumentos que muestran los paquetes utilizados como se muestra a continuación)

\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}

Respuesta2

La siguiente es una adaptación del enfoque sugerido enResalte el texto en la lista de códigos y al mismo tiempo mantenga el resaltado de sintaxis. La idea básica es utilizar listings moredelimla opción para marcar la pieza que se va a reforzar.

Con elmoredelim=** sintaxis puedes definir delimitadores que estilos se aplican.en la parte superiorde todos los demás formatos. A continuación utilizo comillas invertidas como delimitadores, pero puedes elegir cualquier carácter:

\lstdefinestyle{...}{
    moredelim=**[is][\btHL]{`}{`},
}

El único problema es que los comandos de formato que se aplicarán ( \btHL) no resaltan el texto como parámetro de macro. En cambio, tienen que funcionar como los comandos de fuentes LaTeX (por ejemplo, \bfserieso \color) que surten efecto hasta el final del grupo actual. Por lo tanto, tenemos que capturar el contenido en un archivo lrbox.

Complete MWE (usando Java en lugar de Scala para demostrar la combinación con resaltado de sintaxis):

\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}

ingrese la descripción de la imagen aquí

información relacionada