Scala 程式碼清單中的大括號

Scala 程式碼清單中的大括號

我想為 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(使用Java而不是Scala來示範與語法高亮的結合):

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

在此輸入影像描述

相關內容