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(구문 강조 기능과의 조합을 보여주기 위해 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}

여기에 이미지 설명을 입력하세요

관련 정보