Scala コードの lstlisting におけるオーバーブレース

Scala コードの lstlisting におけるオーバーブレース

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 (構文の強調表示との組み合わせを示すために Scala ではなく Java を使用):

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

ここに画像の説明を入力してください

関連情報