我正在编写一个包含编译器解释器会话(在本例中为 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
包来模仿。此外,如果输出中某处有>
,它就会中断,但我可以忍受。