Haskell 铸造环境-括号问题

Haskell 铸造环境-括号问题

在互联网上做了一些研究后,我最终转向了 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 站点。目前,解决方案是不使用texcommentshaskell。

答案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)。

相关内容