Ich schreibe ein Dokument, das Teile einer Compiler-Interpreter-Sitzung enthält (in diesem Fall GHCi, aber das ist nicht relevant). Ich habe einen sorgfältig eingerichteten Stil für Haskell-Code, den ich dort verwenden möchte. Aber die Eingabeaufforderung und insbesondere die Ausgabe sind kein Haskell-Code und sollten anders gedruckt werden.
Hier ist ein Beispiel:
\begin{lstlisting}
Prelude> let fibs = 0:1:zipWith (+) fibs (tail fibs) in fibs !! 10
55
\end{lstlisting}
Was ist die eleganteste Art, dem Folgenden Prelude >
und dem Rest einen anderen Stil zu verleihen?
Antwort1
Ein Ansatz wäre, die moredelim
Option zu nutzen, um auf bestimmte Teile eine andere Formatierung anzuwenden (und die Syntaxhervorhebung zu deaktivieren):
\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}
Ein möglicher Nachteil ist, dass Sie dies „von Hand“ tun müssen. Für den Prelude>
Teil können Sie die morekeywords
Option verwenden, seinen Stil automatisch anzuwenden, aber für die Zeilen, die nicht damit beginnen, Prelude>
wird dies schwieriger.
Antwort2
Hier ist eine Teilantwort, die für meinen Anwendungsfall ausreichend ist, z. B. indem nur die Befehle formatiert werden und der Rest wörtlich belassen wird:
\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}
Dies erzeugt die folgende Ausgabe
Es ist immer noch nicht ganz zufriedenstellend, da ich die Rahmenoptionen von lstlistings nicht verwenden kann, die ich mit dem Nice- adjustbox
Paket nachahmen musste. Außerdem bricht es ab, wenn irgendwo in der Ausgabe ein steht >
, aber damit kann ich leben.