我有一个非常宽的表,我将其转换为pandoc表格格式,并使用pandoc命令行工具将纸张宽度设置为20英寸,如下所示(用于pdf输出)--只是一个使用pandoc命令行工具的原型:
<processed input piped to pandoc here> | pandoc -V geometry:margin=.1in
-V geometry:paperwidth=20in <other options>有没有任何方法可以使用来设置这些变量?我想解析CSV到pandoc (使用来自Bayhac 2014的Fuel.hs,其中还包括pandoc生成的默认乳胶模板),然后在设置纸张宽度(根据pdf中行的最大长度计算)和边距后导出到pdf。
发布于 2016-08-11 08:47:02
使用pandoc作为库
有关详细信息,请参阅这个答案,但基本上您使用的是writeLaTeX函数和正确的WriterOptions。
makePDF "xelatex" $ writeLaTeX opts document
where
opts = def {
writerVariables = [("geometry","paperwidth=20in"), ("geometry", "margin=.1in")]
}它是如何在引擎盖下工作的
首先,geometry是一个模板变量,而不是文档元数据的一部分(参见这个答案)。正如您在LaTeX撰稿人中所看到的,最终输出是通过以下方式生成的:
renderTemplate' template context这使用了来自renderTemplate'的pandoc自己的模板系统函数。在该文件的开头,有一个广泛的示例和文档,说明如何编程使用它。
但基本上是这样的:
import Text.Pandoc.Writers.Shared (defField)
import Text.Pandoc.Templates (renderTemplate')
import Data.Aeson (Value(Object))
import GHC.Exts (fromList)
let context = defField "geometry:paperwidth" "20in"
$ defField "geometry:margin" ".1in"
$ Object $ fromList []
renderTemplate' template context有必要吗?
我仍然不知道为什么要在haskell代码中完成所有这些,因为pandoc滤波器的明确设计是为了让您在文档中轻松地包含数据(比如CSV和pandoc-可定位过滤器),而不必在本质上重新实现pandoc及其模板系统等等。
发布于 2016-08-29 16:02:00
现在修好了。关键是以如下格式传递变量:
makePDF "xelatex" $ writeLaTeX opts document
where
opts = def {
writerVariables = [("geometry","paperwidth=30in"), ("geometry", "margin=.1in")]
}对于Fuel.hs,export代码变成:
export :: (MonadIO m) => String -> Pandoc -> m (Either BL.ByteString BL.ByteString)
export tmpl pdoc = liftIO $ makePDF "xelatex"
writeLaTeX (def { writerStandalone = True, writerTemplate = tmpl,
writerVariables = [("geometry","paperwidth=30in"), ("geometry",
"margin=.1in")]}) pdoc我已经修正了@mb21的答案,以反映这一修正。
https://stackoverflow.com/questions/38878260
复制相似问题