是否可以使用yaml元数据块来扩展pandoc语法



首先介绍一点上下文:

我正在写一篇关于pandoc/yaml+LeoEditor的学术文章。有了这个组合,我可以用一种非常有机的方式写作。Leo Editor树用于以非线性的方式组织写作,因此我可以看到嵌套在其中的写作主题,选择下一次写作会议的重点,并将写作的某些部分放在holding上,等等。树中的Yaml节点存储bibligraphical引用,一个定制的脚本节点用于将Leo树转换为pandoc的markdown,该文件用于创建pdf。

今天我写了这样的东西:

See the image [#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块的外部,我使用并发明了简写("[#hs世界地图]")引用了一些别名,类似于[@cite]中的参考书目。

我从lua示例和pandoc脚本指南,可以编写修改pandoc输出的自定义编写器,但我不知道如何从yaml块中提取数据,也不知道使用我自己的交叉引用图形缩写([#alias])是否有效。所以我的问题是:

  • 有什么例子可以说明如何在markdown的pandoc中提取yaml块数据,并使用它将数据插入修改后的输出中(最好是LaTeX和HTML)?如果有必要的话,学习lua并不重要,但如果这个例子是关于python的,那就更好了,只是为了专注于写文章

(我认为这种自定义语法可以成为开发pandoc共享yaml块和自定义编写器的一种方式,至少是关于如何做到这一点的一个很好的实验)。

我发现不可能做你想做的事情。

文档中说,文档中可以有多个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块,但它们被视为单个元数据对象的一部分。

是,

  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-to-LaTex(pdf)转换器

提交一个特性请求以改进pandoc的yaml读取,同时接受具有相同名称的多个字段(例如author)并允许在它们之间循环,这可能是值得的。

最新更新