Альтернативное форматирование в пределах одной среды lstlisting

Альтернативное форматирование в пределах одной среды lstlisting

Я пишу документ, содержащий части сеанса интерпретатора компилятора (в данном случае GHCi, но это не имеет значения). У меня есть тщательно настроенный стиль для кода Haskell, который я хотел бы использовать там. Но приглашение и особенно вывод не являются кодом Haskell и должны быть напечатаны по-другому.

Вот пример:

\begin{lstlisting}
Prelude> let fibs = 0:1:zipWith (+) fibs (tail fibs) in fibs !! 10
55
\end{lstlisting}

Какой самый элегантный способ применить другой стиль к тому, что следует за «the» Prelude >и «the»?

решение1

Одним из подходов было бы использование moredelimвозможности применения другого форматирования (и отключения подсветки синтаксиса) к определенным частям:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xcolor}
\usepackage{listings}

\newcommand{\notCode}{\color[rgb]{0.0,0.35,0.6}}

\lstset{
  language=Haskell,
  basicstyle=\ttfamily,
  showstringspaces=false,
  breaklines=true,
  keywordstyle={\textit},
  moredelim=[is][\notCode]{@}{@},
}

\begin{document}

\begin{lstlisting}
@Prelude>@ let fibs = 0:1:zipWith (+) fibs (tail fibs) in fibs !! 10
@55@
\end{lstlisting}

\end{document}

введите описание изображения здесь

Возможным недостатком является то, что вам придется делать это "вручную". Для части Prelude>вы можете использовать morekeywordsопцию автоматического применения ее стиля, но для строк, не начинающихся с Prelude>этого, это будет сложнее.

решение2

Вот частичный ответ, который достаточен для моего варианта использования, например, форматирование только команд и оставление всего остального дословно:

\documentclass{article}

\usepackage{listings}
\usepackage{framed}

\lstset{language=Haskell,basicstyle=\small\sffamily,stringstyle=\itshape}

\begingroup
\catcode`\>=\active%
\catcode`\^^M=\active%
\gdef\foo{%
\catcode`\>=\active%
\catcode`^^M=\active%
\def > ##1^^M{\char`\>{} \lstinline!##1!\par}%
\def ^^M{\par}%
}%
\endgroup

\newenvironment{ghci}{%
\begin{framed}%
\begingroup%
\small\ttfamily%
\foo%
}{%
\endgroup%
\end{framed}%
}

\begin{document}
\pagestyle{empty}
\begin{ghci}
*Count> let s = "hello stackexchange"
*Count> let x = count 0 [0..100000000]
*Count> x
Just *** Exception: stack overflow
\end{ghci}
\end{document}

Это дает следующий результат

введите описание изображения здесь

Это все еще не совсем удовлетворительно, так как я не могу использовать параметры фрейма lstlistings, которые мне пришлось имитировать с помощью adjustboxпакета nice. Кроме того, это ломается, если где-то в выводе есть >, но с этим я могу жить.

Связанный контент