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

时间:2014-01-05 01:09:07

标签: python lua latex yaml pandoc

首先介绍一下背景:

我正在写一篇关于pandoc / yaml + Leo Editor的学术文章。通过这种组合,我可以用非常有机的方式写作。 Leo Editor树用于以非线性的方式组织写作,所以我可以看到写作的主要内容深层嵌套,在下一个写作会话中选择要关注的内容并将写入的某些部分放在上面等等。树中的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-world-map]”)对别名数字进行了一些引用,类似于书目引用的[@cite]。

我从中看到过 lua examplepandoc scripting guide可以编写修改pandoc输出的自定义编写器,但我不知道如何从yaml块中提取数据,如果使用我自己的简写来交叉引用数字( [#alias])会奏效。所以我的问题是:

  • 如何在markdown的pandoc中提取yaml块数据并使用它将数据插入修改后的输出(最好是LaTeX和HTML)?如果有必要的话,我会学习lua并不重要,但如果这个例子是在python上会更好,只是专注于撰写文章。

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

2 个答案:

答案 0 :(得分:3)

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

The documentation says文档中可能有多个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 :(得分:2)

是,

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

  2. 示例在LaTeX模板中。

  3. 要获取完整的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)convertor

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