我正在处理的项目的一部分涉及使用Pandoc创建PDF。我有程序的一部分制作PDF。要弄清楚如何执行此操作,我尝试从JGM BayHack 2014修改fuel.hs
。
然而,我遇到了困难。我有以下功能:
export :: (MonadIO m) => Pandoc -> m (Either BL.ByteString BL.ByteString)
export = liftIO . makePDF "xelatex" writeLaTeX def { writerStandalone = True }
在我修改过的fuel.hs的主体中,
pdfbytes <- export letter
print pdfbytes
我得到以下输出:
$ stack runghc fuel.hs
Run from outside a project, using implicit global project config
Using resolver: lts-3.7 from implicit global project's config file: /home/stevejb/.stack/global/stack.yaml
Left "! Emergency stop.\n<*> /tmp/tex2pdf.8283/input.tex\n \nNo pages of output.\nTranscript written on /tmp/tex2pdf.8283/input.log.\n"
"Fail"
但是,正在引用的日志文件不存在。我不知道如何调试这个。我安装了xelatex。
答案 0 :(得分:9)
在#haskell IRC的帮助下,我能够让它运转起来。关键是添加我自己的LaTeX模板。因此,可以使用以下内容:
export :: (MonadIO m) => String -> Pandoc -> m (Either BL.ByteString BL.ByteString)
export tmpl pdoc = liftIO $ makePDF "xelatex" writeLaTeX (def { writerStandalone = True, writerTemplate = tmpl}) pdoc
getLetter = do
json <- BL.readFile "cng_fuel_chicago.json"
let letter = case decode json of
Just stations -> createLetter [s | s <- stations,
"Voyager" `elem` cardsAccepted s]
Nothing -> error "Could not decode JSON"
return $ letter
main :: IO ()
main = do
letter <- getLetter
temp <- readFile "template.tex"
let str_should_have_something = writeLaTeX (def {writerStandalone = True, writerTemplate = temp}) letter
print str_should_have_something
mybytes <- export temp letter
case mybytes of Right b -> BL.writeFile "mypdf.pdf" b
Left _ -> putStrLn "Export error"
要获取模板,您可以在shell中以独立模式使用Pandoc:
pandoc -D latex > template.tex
此外,在查找默认模板方面,使用堆栈,使用cabal和使用系统包管理器安装Pandoc可能存在问题。我不确定所有这些是如何相互作用的。
完全包含的要点here。