在同一 lstlisting 環境中交替格式化

在同一 lstlisting 環境中交替格式化

我正在編寫一個包含編譯器解釋器會話部分的文件(在本例中為 GHCi,但這不相關)。我有一個仔細設定的 Haskell 程式碼風格,我想在那裡使用。但提示符,尤其是輸出不是 Haskell 程式碼,應該以不同的方式列印。

這是一個例子:

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

Prelude >將不同風格應用於接下來的內容和其餘內容的最優雅的方式是什麼?

答案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 的框架選項,我必須使用 Niceadjustbox套件來模仿。另外,如果>輸出中有 a ,它就會中斷,但這是我可以忍受的。

相關內容