5. 转换流程

本章将对转换流程进行讲解。鉴于使用到之软件,转换成PNG的流程与转换成SVG之流程相近,而转换成EPS之流程则于转换成EMF之流程同理。

本教程中转换的流程将利用到数份Windows的批处理脚本(在本教程的 util 文件夹中),本教程将在 脚本详解 中对它们进行详细讲解。

本章中之方法一律需要使用 -shell-escape 参数来进行编译。一个使用 xelatexmew_to_svg.tex 进行编译的命令如下(用 xelatex 是因为需要处理中文)。

1
xelatex -synctex=1 -interaction=nonstopmode -shell-escape mwe_to_svg.tex

请把 mwe_to_svg 替换为你的TEX文件文件名。

5.1. 转换为SVG之流程

转换为SVG之流程可用如下之流程图表示:

SVG flowchart

如上图所示,转换流程将在所在之目录创建一个名为 out_svg 的文件夹单独存放生成的SVG文件。之后将会调用 util 文件夹中的 pdf_to_svg 脚本来实现转换。

此流程需要用户对需要转换之TEX文件的 documentclass 进行如下配置:

1
2
3
4
5
6
7
8
\documentclass[tikz, convert, convert={outext=.svg, command=\unexpanded{
% 'out_svg'是用来存放SVG的文件夹
% 'out_svg'是用來存放SVG的文件夾
% 'out_svg' is the destination folder for SVG files
call ./util/mk_folder out_svg
&& cd /d out_svg
&& call ../util/pdf_to_svg ../\infile\space \outfile\space
}}]{standalone}

注解

设置 outext

outext 有设置时, standalone 会自动地在输出文件(即是 outfile)的文件名(不含后缀名)后加上计数关键字(一般是 %d)。

这小节的方法正是利用 standalone 之此特性,结合 pdf2svg 的语法来进行PDF转换为分页的SVG。

警告

关于“%”和“\”符号

在LaTex中,“%”是一个保留字,用来表示注释。如果直接使用在 documentclass 之中,则会把其后面的同行代码全部注释掉。这样的话,编译时会出问题。

然而,若用 “\” 进行转义(即“escape”)的话 standalone 是会把“\”符号作为明文加入到命令中的。这样一来,命令通常都不对,因为“\”在LaTex中是表示的是后面跟的是参数或者命令。而在Windows命令中“%”通常用来指代参数,在Windows中使用for循环时绝对会用到它,无法避免。

综上所述,如果在 documentclass 里面直接把系统命令写全的话,很难保证其正确性。

故此,作者选择把命令封装到多个批处理脚本中,这样就可以避免以上提及的符号问题同时方便排错。

本方法用到以下两份脚本:

  1. mk_folder
    创建文件夹。
  2. pdf_to_svg
    将多页的PDF转换为分页的SVG。

它们的详细讲解在 脚本详解 中。

5.2. 转换为PNG之流程

转换为PNG之流程可用如下之流程图表示:

PNG flowchart

如上图所示,转换流程将在所在之目录创建一个名为 out_png 的文件夹单独存放生成的PNG文件。之后将会调用 util 文件夹中的 pdf_to_png 脚本来实现转换。

此流程需要用户对需要转换之TEX文件的 documentclass 进行如下配置:

1
2
3
4
5
6
7
8
\documentclass[tikz, convert, convert={command=\unexpanded{
% 'out_png'是用来存放PNG的文件夹
% 'out_png'是用來存放PNG的文件夾
% 'out_png' is the destination folder for PNG files
call ./util/mk_folder out_png
&& cd /d out_png
&& call ../util/pdf_to_png.bat 600 ../\infile\space
}}]{standalone}

注解

pdftocairo

pdftocairo 会自动地把一多页的PDF自动分割为多张PNG。故此只需要把输入文件给它即可(即 infile),而不需要设置输出文件(即 outfile)。

本方法用到以下两份脚本:

  1. mk_folder
    创建文件夹。
  2. pdf_to_png
    将多页的PDF转换为分页的PNG。

它们的详细讲解在 脚本详解 中。

5.3. 转换为EMF之流程

转换为EMF之流程可用如下之流程图表示:

EMF flowchart

如上图所示,转换流程将在所在之目录创建一个名为 out_emf 的文件夹单独存放生成的EMF文件。之后将会调用 util 文件夹中的 gs_split_pdf 来对生成的PDF进行分页,pdf_to_emf 脚本来实现转换。 转换完毕后会删除所有单页之PDF,只保留EMF。

此流程需要用户对需要转换之TEX文件的 documentclass 进行如下配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
\documentclass[tikz, convert, convert={outext=.pdf, command=\unexpanded{
% 'out_emf'是用来存放EMF的文件夹
% 'out_emf'是用來存放EMF的文件夾
% 'out_emf' is the destination folder for EMF files
call ./util/mk_folder out_emf
&& call ./util/gs_split_pdf.bat out_emf \outfile\space \infile\space
&& cd /d out_emf
&& call ../util/pdf_to_emf.bat
&& del /F *.pdf \sapce
}}]{standalone}
% inkscape只能实现单张的PDF转换EMF,所以要先用ghostscript把LaTex生成的
% PDF分页,然后调用inkscape做循环,把所有单页的PDF转换为EMF,最后删除所
% 有单页的PDF,只保留EMF。
% inkscape只能實現單張的PDF轉換EMF,所以要先用ghostscript把LaTex生成的
% PDF分頁,然後調用inkscape做循環,把所有單頁的PDF轉換爲EMF,最後刪除所
% 有單頁的PDF,只保留EMF。
% inkscape can only convert single page PDF to EMF. Therefore, the whole
% PDF generated by LaTex needs to be split into single pages first, by
% ghostscript. Then use inkscape in a loop to convert all single page
% PDFs into EMFs. Finally, delete all single page PDFs and keep only the
% EMFs.

注解

inkscape

inkscape 在转换时不会自动对PDF进行分页。若直接使用 inkscape 对多页PDF进行转换,只有第一页会被转换。

故此,本方法会先调用 ghostscript 对PDF进行分页,然后在调用 inkscape 对所有的单页PDF进行转换。

本方法用到以下三份脚本:

  1. mk_folder
    创建文件夹。
  2. gs_split_pdf
    将多页的PDF分割为单页的PDF。
  3. pdf_to_emf
    将PDF转换为EMF(仅一页)。

它们的详细讲解在 脚本详解 中。

5.4. 转换为EPS之流程

转换为EPS之流程可用如下之流程图表示:

EPS flowchart

如上图所示,转换流程将在所在之目录创建一个名为 out_eps 的文件夹单独存放生成的EMF文件。之后将会调用 util 文件夹中的 gs_split_pdf 来对生成的PDF进行分页,pdf_to_eps 脚本来实现转换。 转换完毕后会删除所有单页之PDF,只保留EMF。

此流程需要用户对需要转换之TEX文件的 documentclass 进行如下配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
\documentclass[tikz, convert, convert={outext=.pdf,
command=\unexpanded{{
% 'out_eps'是用来存放EPS的文件夹
% 'out_eps'是用來存放EPS的文件夾
% 'out_eps' is the destination folder for EPS files
call ./util/mk_folder out_eps
&& call ./util/gs_split_pdf.bat out_eps \outfile\space \infile\space
&& cd /d out_eps
&& call ../util/pdf_to_eps.bat
&& del /F *.pdf \sapce
}}}]{standalone}
% inkscape只能实现单张的PDF转换EPS,所以要先用ghostscript把LaTex生成的
% PDF分页,然后调用inkscape做循环,把所有单页的PDF转换为EPS,最后删除所
% 有单页的PDF,只保留EPS。
% inkscape只能實現單張的PDF轉換EPS,所以要先用ghostscript把LaTex生成的
% PDF分頁,然後調用inkscape做循環,把所有單頁的PDF轉換爲EPS,最後刪除所
% 有單頁的PDF,只保留EPS。
% inkscape can only convert single page PDF to EPS. Therefore, the whole
% PDF generated by LaTex needs to be split into single pages first, by
% ghostscript. Then use inkscape in a loop to convert all single page
% PDFs into EPSs. Finally, delete all single page PDFs and keep only the
% EPSs.

本方法之原理于转换为EMF的流程完全一样。都是先对生成的PDF进行分页,再调用 inkscape 进行处理。

本方法用到以下三份脚本:

  1. mk_folder
    创建文件夹。
  2. gs_split_pdf
    将多页的PDF分割为单页的PDF。
  3. pdf_to_eps
    将PDF转换为EPS(仅一页)。

它们的详细讲解在 脚本详解 中。