pandoc 定制与编程技巧笔记集
关于中文的转换
pandoc
可以将markdown
或者docx
文件转换为pdf
,这个可能不是太常用,但也足够有用了。
反直觉的一点是,docx
转pdf
的过程,似乎是需要markdown
或者起码latex
做为媒介的,因为这个过程必须要到latex
(但没有显示细节)。
因此,要使用这个功能,机器上必须要有配好的pdflatex
或者xelatex
,如果是中文则必须是xelatex
,并且还需要额外配置。
直接默认命令转换的话,会报padlatex
中文未知字符错误,按提示换xelatex
,会报找不到字体错误(起码Linux)并且是每个字报一行错。
然后搜了一下,有人说要加-V mainfont=Noto Sans CJK SC
,这话倒是不能算错,但是转出来的文字全是每段一行,长长的文字超出页面消失在右端,惊不惊喜意不意外?
继续搜不换行的问题,搜到的是把下面的加入导言区:
\XeTeXlinebreaklocale "zh"
\XeTeXlinebreakskip = 0pt plus 1pt
但问题是源文件是docx
,没地方加啊。最后没办法了,pandoc -D latex > latex_template.tex
输出了一份完整模板,想定制模板来试试,结果第一眼就看到了关键词:
% Options for packages loaded elsewhere
\PassOptionsToPackage{unicode$for(hyperrefoptions)$,$hyperrefoptions$$endfor$}{hyperref}
\PassOptionsToPackage{hyphens}{url}
$if(colorlinks)$
\PassOptionsToPackage{dvipsnames,svgnames,x11names}{xcolor}
$endif$
$if(CJKmainfont)$
\PassOptionsToPackage{space}{xeCJK}
$endif$
拿CJKmainfont
做为关键字一搜,发现不应该传递-V mainfont=Noto Sans CJK SC
,而应该-V CJKmainfont=Noto Sans CJK SC
,然后就会自动调用ctexhook.sty
模板来编译——为了适应这个,还得安装texlive-lang-chinese
包,不然没有ctexhook.sty
文件。
注
如果是通过pypandoc
编程的时候,传递给extra_args
参数的字符串数组,直接"-V", "CJKmainfont=Noto Sans CJK SC"
就挺好的。字体名称两边有单引号和双引号都报错找不到字体。
命令行调用是是啥情况就不清楚了。
关于中文的换行
如果要配合git
,一般建议是行不要太长,以便看更改历史,写markdown
的时候也就建议每一句换行。markdown
也像latex
一样是两个连续回车(一个空行)才在输出中产生换行。
但是,一个回车的情况下,虽然不实际换行,默认是按鸟语的规则加一个空格的,这个不够完美。
解决方法是启用一个名叫east_asian_line_breaks
的扩展,具体方法是在传递--from markdown
命令行的时候,后缀一个+east_asian_line_breaks
,也就是为markdown
启用(+
)east_asian_line_breaks
这个扩展。注意加号前面没有空格:--from markdown+east_asian_line_breaks
这样的。
一开始是搜到了ignore_line_breaks
,但参考了这里的资料之后,发现east_asian_line_breaks
明显更合适。
注
顺便在上面少数派的文章里面发现了一个名叫AutoCorrect的工具,看起来很有用。