我正在尝试将一个降价文件编译成不同的输出(HTML,EPUB和LaTeX,以便通过PDF打印)。该文档需要一些非Markdown本机格式,这意味着原始格式不可移植。但是,我需要的功能可以采用三种输出格式。
我正在考虑的解决方案是在原始文件中使用一些自定义标记,并使用sed(或您建议我使用的任何其他预处理器)处理它,以创建不同的输出来为Pandoc提供信息。
例如:
<sig>Placename, 2016</sig>
会变成
<div class="signature">Placename, 2016</div>
,但
\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。
答案 0 :(得分:0)
您可以使用sed:
进行模式替换sed -i -e 's/pattern1\(pattern_to_keep\)pattern2/text1\1text2/g' filename
此命令将在文件名中更改行pattern1pattern_to_keeppattern2
并将其更改为text1pattern_to_keeptext2
。 sed
命令(或其他带有正则表达式和替换的工具)将每个\(...\)
部分放入编号缓冲区,如\1
,\2
因此,要将sig
和quote
转换为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是有意义的)