除了使用firstline=
和 之外lastline=
,是否可以将代码包含在某个用户定义的键中?这样,如果我只想包含一个长文件的定义,我就不必担心在定义上方键入内容,因为这会更改第一行。
答案1
listings
提供了一个实验性的功能,可以根据特定的开始和结束标记来包含部分代码(请参阅listings
指导)。
选择
rangeprefix = <prefix>,
rangesuffix = <suffix>,
linerange = <startmarker>-<endmarker>
将在包含的代码中查找行
... some boring code ...
<prefix><startmarker><suffix>
... interesting code ...
<prefix><endmarker><suffix>
... more boring code ...
并仅包含列表中代码的有趣部分(包括开始/结束标记,除非includerangemarker=false
)。可以使用 来使用多个标记对linerange
,所有标记对都用逗号分隔。前缀、后缀或标记中的特殊字符需要用 进行转义\
。
这种方法的缺点是您需要用开始和结束标记来注释输入的代码。
使用示例:
\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}
\begin{filecontents*}{\jobname.hs}
{- begin map -}
map :: (a -> b) -> [a] -> [b]
map f [] = []
map f (x:xs) = f x : map f xs
{- end map -}
{- begin head -}
head :: [a] -> a
head (x:_) = x
head [] = error "Prelude.head: empty list"
{- end head -}
{- begin tail -}
tail :: [a] -> [a]
tail (_:xs) = xs
tail [] = error "Prelude.tail: empty list"
{- end tail -}
\end{filecontents*}
\lstset{
language=Haskell,
basicstyle=\ttfamily,
backgroundcolor=\color{black!5}
}
\begin{document}
\lstinputlisting[
linerange=8-10
]{\jobname.hs}
\lstinputlisting[
rangeprefix=\{-\ ,
rangesuffix=\ -\},
includerangemarker=false,
linerange=begin\ head-end\ head
]{\jobname.hs}
\end{document}
输出