5. 转换流程¶
本章将对转换流程进行讲解。鉴于使用到之软件,转换成PNG的流程与转换成SVG之流程相近,而转换成EPS之流程则于转换成EMF之流程同理。
本教程中转换的流程将利用到数份Windows的批处理脚本(在本教程的 util
文件夹中),本教程将在 脚本详解 中对它们进行详细讲解。
本章中之方法一律需要使用 -shell-escape
参数来进行编译。一个使用 xelatex
对 mew_to_svg.tex
进行编译的命令如下(用 xelatex
是因为需要处理中文)。
1 | xelatex -synctex=1 -interaction=nonstopmode -shell-escape mwe_to_svg.tex
|
请把 mwe_to_svg
替换为你的TEX文件文件名。
5.1. 转换为SVG之流程¶
转换为SVG之流程可用如下之流程图表示:
如上图所示,转换流程将在所在之目录创建一个名为 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
里面直接把系统命令写全的话,很难保证其正确性。
故此,作者选择把命令封装到多个批处理脚本中,这样就可以避免以上提及的符号问题同时方便排错。
本方法用到以下两份脚本:
mk_folder
- 创建文件夹。
pdf_to_svg
- 将多页的PDF转换为分页的SVG。
它们的详细讲解在 脚本详解 中。
5.2. 转换为PNG之流程¶
转换为PNG之流程可用如下之流程图表示:
如上图所示,转换流程将在所在之目录创建一个名为 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
)。
本方法用到以下两份脚本:
mk_folder
- 创建文件夹。
pdf_to_png
- 将多页的PDF转换为分页的PNG。
它们的详细讲解在 脚本详解 中。
5.3. 转换为EMF之流程¶
转换为EMF之流程可用如下之流程图表示:
如上图所示,转换流程将在所在之目录创建一个名为 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进行转换。
本方法用到以下三份脚本:
mk_folder
- 创建文件夹。
gs_split_pdf
- 将多页的PDF分割为单页的PDF。
pdf_to_emf
- 将PDF转换为EMF(仅一页)。
它们的详细讲解在 脚本详解 中。
5.4. 转换为EPS之流程¶
转换为EPS之流程可用如下之流程图表示:
如上图所示,转换流程将在所在之目录创建一个名为 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
进行处理。
本方法用到以下三份脚本:
mk_folder
- 创建文件夹。
gs_split_pdf
- 将多页的PDF分割为单页的PDF。
pdf_to_eps
- 将PDF转换为EPS(仅一页)。
它们的详细讲解在 脚本详解 中。