是否可以根据所选的输出编辑markdown文件?

时间:2016-10-12 02:29:34

标签: sed makefile latex markdown pandoc

我正在尝试将一个降价文件编译成不同的输出(HTML,EPUB和LaTeX,以便通过PDF打印)。该文档需要一些非Markdown本机格式,这意味着原始格式不可移植。但是,我需要的功能可以采用三种输出格式。

我正在考虑的解决方案是在原始文件中使用一些自定义标记,并使用sed(或您建议我使用的任何其他预处理器)处理它,以创建不同的输出来为Pandoc提供信息。

例如:

<sig>Placename, 2016</sig>

会变成

<div class="signature">Placename, 2016</div>

HTML和EPUB中的

,但

\signature{Placename, 2016}

在LaTeX。

<quote>To be or not to be</quote><qaut>Shakespeare</qaut>

将是HTML和EPUB

<div class="epigraph"><quote>To be or not to be</quote>Shakespeare</div>

简单地

\epigraph{To be or not to be}{Shakespeare}

在LaTeX。

虽然替换看起来并不十分困难,但我想在调用Pandoc(当然是在Makefile中)之前就如何处理这些替换的多个实例提出一些建议。

我更喜欢使用RAM磁盘将编辑后的文件传输到Pandoc,但在/ tmp上保存tempfile对我来说是一样的,因为我的RAM上有/ tmp。

1 个答案:

答案 0 :(得分:0)

您可以使用sed:

进行模式替换
sed -i -e 's/pattern1\(pattern_to_keep\)pattern2/text1\1text2/g' filename

此命令将在文件名中更改行pattern1pattern_to_keeppattern2并将其更改为text1pattern_to_keeptext2sed命令(或其他带有正则表达式和替换的工具)将每个\(...\)部分放入编号缓冲区,如\1\2

因此,要将sigquote转换为LaTex格式,您的makefile将如下所示:

file.latex: file
        sed -e 's/<sig>\(.*\)<\/sig>/\\signature{\1}/g' \
            -e 's/<quote>\(.*\)<\/quote>.*<qaut>\(.*\)<\/qaut>/\\epigraph{\1}{\2}/g' $< > $@

您也可以将所有sed规则放在单独的脚本中。在这种情况下,makefile看起来像

file.latex: file script
        sed -f script $< > $@


script:
        @echo 's/<sig>\(.*\)<\/sig>/\\signature{\1}/g' > $@
        @echo 's/<quote>\(.*\)<\/quote>.*<qaut>\(.*\)<\/qaut>/\\epigraph{\1}{\2}/g' >> $@

(注意,这里我们只是从Makefile创建脚本文件。对于大脚本,分别创建/存储脚本以不重载Makefile是有意义的)