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(僅一頁)。

它們的詳細講解在 腳本詳解 中。