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

Can I automatically embed pandoc's default templates in my application?

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的模板文件吗?

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

hsb2hs 及其主要依赖项 processing-tools 都不是 stack 的 LTS 的一部分,它们仅在 nightly stackage 版本中。 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 的一部分,因此它确实包含在二进制文件中。