我可以自动在我的应用程序中嵌入pandoc的默认模板吗?

时间:2016-02-18 20:20:51

标签: haskell pandoc

Pandoc附带了几个default templates,它们与pandoc包一起发布。但是,如果我编写一个使用pandoc作为库的应用程序,那么这些默认模板不会包含在二进制文件中。我仍然可以在我的机器上使用它们:

module Main where
import Text.Pandoc (getDefaultTemplate)

main = getDefaultTemplate Nothing "latex" >>= print

这将打印default.latex模板。但是,它不可移植,因为它实际上是指我系统中的某个文件:

$ cd path/to/example/project
$ stack build
$ scp path/to/binary remote:remote/path
$ ssh remote:remote/path/binary
example: Could not find data file /home/Zeta/.stack/snapshots/.../pandoc-1.16.0.2/data/templates/default.latex

由于pandoc's debian package不包含这些文件,因此它可以以某种方式嵌入它们。事实上,有一面旗帜-f embed_data_files。我尝试在本地stack.yaml中启用它:

extra-deps: [pandoc-1.16]
flags: 
  pandoc:
    embed_data_files: true

但是这没有改变任何东西,编译的二进制文件仍然抱怨缺少数据文件。

那么,有没有办法自动包含pandoc的模板文件?

1 个答案:

答案 0 :(得分:3)

事实证明pandoc在构建期间通过hsb2hs注入了数据文件。不知何故,stack build期间该步骤失败,我错过了错误消息。

hsb2hs及其主要依赖项processing-tools都不是堆栈LTS的一部分,它们只在夜间堆栈版本中。 stack.yaml的以下添加修复了问题:

# part of stack.yaml:
extra-deps:
- preprocessor-tools-1.0.1
- hsb2hs-0.3.1
- pandoc-1.16

flags:
  pandoc:
    embed_data_files: true

对于那些使用Cabal的人来说,这有点等于

cabal sandbox init
cabal update
cabal install hsb2hs-0.3.1 && cabal install pandoc-1.16 -f embed_data_files
cabal install --dependencies-only
cabal build

以下是我验证模板实际包含的方式:

$ stack build
$ grep "usepackage\{hyperref\}" .stack-work/install/*/bin/example -a
\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry}
$endif$
\usepackage{hyperref}
$if(colorlinks)$
\PassOptionsToPackage{usenames,dvipsnames}{color} % color is loaded by hyperref

该代码段是default.latex的一部分,因此它实际上包含在二进制文件中。