可以使用YAML元数据块来扩展Pandoc语法吗?

首先提供一些背景:

我正在撰写一篇有关 pandoc/yaml + Leo Editor 的学术文章。使用这种组合,我可以以一种非常有机的方式写作。Leo Editor 树被用于以非线性的方式组织写作,因此我可以看到写作的主要主题和随后的重点选择,把一些写作内容暂停等等。Leo 树中的 yaml 节点用于存储参考文献,并使用自定义脚本节点将该 Leo 树转换为 pandoc 的 markdown 文件,该文件用于创建 pdf。

今天我写了这样一段话:

看见图像 [#hs-world-map]

---
type: image

file: ../Imagenes/hackerspaces-mapa-2014-ene.png

scale: 50

alias: hs-world-map

caption: |

    Mapa mundial de los hackerspaces a enero 4 de 2014 registrados en
    http://hackerspaces.org. Las concentraciones de hackerspaces están denotadas
    por dos indicadores: el número y el color. Los colores rojos y números
    grandes indican mayor concentración de hackerspaces, seguidos por los
    naranja y números medianos y terminando en los azules, con números pequeños.
    Se puede ver cómo este es un fenómeno global con mayor preminencia
    anglo-europea (la costa este de Estados Unidos tiene 110 hackerspaces y
    Europa 175) y menor notoriedad en Sur América, India, China y Africa.
    Algunos de los contrastes respecto a la cultura hackers y como se
    contextualiza en el Norte Global y en el Sur Global que se han mencionado en
    este escrito, se hacen evidentes en este mapa。


这是 pandoc 的 markdown 文档中的一个 yaml 块(前缀 "---" 未被正确显示),定义了一些我想在 pandoc 中作为图片拥有的属性和语法,比如缩放、别名等等以及更好地支持长标题。在 yaml 块外部,我用了一些关于别名图片的参考,使用了一种类似于 [@cite] 用于参考文献的创造性简写符号 ("[#hs-world-map]")。

我从 lua examplepandoc scripting guide 中看到了可编写自定义 writer 的示例,以修改 pandoc 的输出,但我不知道如何从 yaml 块中提取数据,以及是否使用我的自定义简写符号进行交叉引用图像 ([#alias]) 的工作。所以我的问题是:

  • 有没有任何示例说明如何提取 markdown 的 pandoc 中的 yaml 块数据,并将它用于插入修改后的输出中的数据(最好是 LaTeX 和 HTML)?如果必要,我不介意学习 lua,但最好的情况是有 python 的例子,这样能够更专注于写作论文。

(我认为这种自定义语法可能是一种发展 pandoc 共享 yaml 块和自定义写入者的方式,至少是一个关于如何完成的好实验。)

点赞
用户13169
用户13169

我所发现的是,不能像你想的那样做。

文档中提到,文档中可以有多个 YAML 块,但它们会合并成一个单独的块,始终保留每个属性的第一个出现位置。

让我们考虑这个示例文档,我称之为 test.md

---
a: Hola
b: mundo
...

---
a: Lorem
c: ipsum
...

如果我将其转换为 Pandoc 的本地表示形式,你会注意到第二次使用 a 被丢失了,并且没有办法将两个块区分开来:

$ pandoc test.md -t native -s
Pandoc (Meta {unMeta = fromList [
    ("a",MetaInlines [Str "Hola"]),
    ("b",MetaInlines [Str "mundo"]),
    ("c",MetaInlines [Str "ipsum"])
]})

所以,虽然可以有多个 YAML 块,但它们被认为是单个元数据对象的一部分。

2014-01-07 20:04:44
用户5047857
用户5047857

好的,

  1. 使用 pandoc 提取 yaml 数据并用它生成 LaTeX 是一种简单的方法:编辑模板。但是有一个重要的限制。

  2. LaTeX 模板中有一个例子。

要获取完整的 LaTeX 模板,请使用

pandoc -D latex

相关的部分是从元数据中提取作者的代码。

$if(author)$
\author{$for(author)$$author$$sep$ \and $endfor$}
$endif$

它将从以下 yaml 元数据部分提取多个作者:

---
author:
    - Mr. Smart
    - Mr. Brilliant
...

您可以扩展模板

$if(author)$
  \author{
    $for(author)$
      $author.name$ \\
      $author.email$
      $sep$ \par
    $endfor$
  }
$endif$

并使用此 yaml 作为输入

---
author:
    - name: Mr. Smart
      email: smart@author.com
    - name: Mr. Brilliant
      email: brilliant@author.com
...

因此存在一个重要的限制:所有同类的 yaml 块都应该相继而行,没有(yaml)间断。每个块应以“-”开始。

我以这种方式“滥用” yaml 元数据,以非常简洁的 yaml 语法编写评估文档的完整内容,这样易于编写,将来可以简化自动处理。我使用 pandoc 作为一个容易使用的 yaml 到 LaTex(pdf)转换器

值得提出一个功能请求,以改善 pandoc 的 yaml 读取,也接受相同名称字段(如作者)的多个字段,并允许循环遍历它们。

2015-06-25 09:07:46