在互联网上做了一些研究后,我最终转向了 minted。由于我需要使用 Latex 记录 Haskell,因此我根据此页面上的示例创建了以下列表。(顺便说一句,谢谢!)
\documentclass[a4paper]{report}
\usepackage[left=2.5cm,right=2.5cm]{geometry}
\usepackage{listings}
\usepackage{tcolorbox}
\usepackage{minted}
\tcbuselibrary{minted,skins}
\newtcblisting{haskellcode}[1][]{
listing engine=minted,
colback=bg,
colframe=black!70,
listing only,
minted style=colorful,
minted language=haskell,
minted options={linenos=true,numbersep=3mm,texcl=true,#1},
left=5mm,enhanced,
overlay={\begin{tcbclipinterior}\fill[black!25] (frame.south west)
rectangle ([xshift=5mm]frame.north west);\end{tcbclipinterior}}
}
\definecolor{bg}{rgb}{0.9,0.9,0.9}
\begin{document}
\begin{haskellcode}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
import Yesod
data HelloWorld = HelloWorld
mkYesod "HelloWorld" [parseRoutes|
/ HomeR GET
|]
instance Yesod HelloWorld
getHomeR :: Handler Html
getHomeR = defaultLayout [whamlet|Hello World!|]
main :: IO ()
main = warp 3000 HelloWorld
\end{haskellcode}
\end{document}
不幸的是我很难让它工作。
\begin{haskellcode}
%{-# LANGUAGE OverloadedStrings #-}
%{-# LANGUAGE QuasiQuotes #-}
%{-# LANGUAGE TemplateHaskell #-}
%{-# LANGUAGE TypeFamilies #-}
import Yesod
data HelloWorld = HelloWorld
\end{haskellcode}
这个例子运行得很好,但是一旦我删除注释 % 操作符,就会出现大量错误。我认为存在一个问题,即 pdftex 试图解析“{}”括号。
非常感谢您的帮助 :)。
马丁
答案1
这是由于两个问题造成的。
首先,使用可选参数的方式\newtcblisting
是不可能的。新环境会提前读取,寻找[
表示可选参数的,但如果没有找到,则会读取行尾并开始读取实际代码[
。它在这种情况下可以捕获可选参数但这需要特殊的技术tcolorbox
不是使用。因此,如果你想让你的环境任何参数,则它们必须是强制性的(并且您始终可以将它们留空,例如,\begin{haskellcode}{}
)。
其次,Pygments 中有一个错误。texcomments
( texcl
) 选项导致%{-#
行首 a 之后的所有内容都被视为文字 LaTeX 代码,直到行尾。这意味着结束#-}
无法正确检测到结尾。您可以在Pygments 站点。目前,解决方案是不使用texcomments
haskell。
答案2
G. Poole 的回答列出了两个问题:仅可选参数\newtcblisting
和 Pygments 错误。
因为\newtcblisting
有两种可能。G. Poole 已经解释了第一种,即始终使用至少一个强制参数。这是包tcolorbox
处理tcblisting
环境的方式。与 相比tcolorbox
,此逐字环境采用强制参数。
但还有第二种可能性,使用xparse
,即使用仅可选参数,您可以使用以下内容:
\tcbuselibrary{minted,skins,xparse}
%\newtcblisting{haskellcode}[1][]{
\NewTCBListing{haskellcode}{O{}}{% <------ xparse
listing engine=minted,
colback=bg,
colframe=black!70,
listing only,
minted style=colorful,
minted language=haskell,
minted options={linenos=true,numbersep=3mm,texcl=true,#1},
left=5mm,enhanced,
overlay={\begin{tcbclipinterior}\fill[black!25] (frame.south west)
rectangle ([xshift=5mm]frame.north west);\end{tcbclipinterior}}
}
当然,Pygments 问题仍然存在,但现在haskellcode
环境更加稳定了(感谢xparse
)。