Overbrace na lstlisting do código Scala

Overbrace na lstlisting do código Scala

Quero adicionar um overbrace a algum texto em uma listagem 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 alguma maneira sensata de fazer isso sem quebrar o realce de sintaxe? (Eu tentei [mathescape], mas não parece bom)

Responder1

Isso usa um pouco de medição "a olho nu" para medi-lo automaticamente, sem saber exatamente o que as listagens farão com o texto.

insira a descrição da imagem aqui

(Por favor, para perguntas futuras postecompletodocumentos mostrando pacotes usados ​​conforme abaixo)

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

Responder2

O que se segue é uma adaptação da abordagem sugerida emDestaque o texto na listagem de código enquanto mantém o realce da sintaxe. A ideia básica é usar listings moredelima opção para marcar a peça a ser sobreapoiada.

Com a moredelim=**sintaxe você pode definir delimitadores quais estilos se aplicamem cimade todas as outras formatações. A seguir, uso crases como delimitadores, mas você pode escolher qualquer caractere:

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

O único problema é que os comandos de formatação a serem aplicados ( \btHL) não fazem com que o texto seja destacado como parâmetro macro. Em vez disso, eles têm que funcionar como os comandos de fonte do LaTeX (por exemplo, \bfseriesou \color) que têm efeito até o final do grupo atual. Portanto, temos que capturar o conteúdo em um arquivo lrbox.

MWE completo (usando Java em vez de Scala para demonstrar a combinação com realce de sintaxe):

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

insira a descrição da imagem aqui

informação relacionada