Я хочу добавить скобку к некоторому тексту в листинге кода 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}