![如何加速 tex4ht 影像生成過程?](https://rvso.com/image/305879/%E5%A6%82%E4%BD%95%E5%8A%A0%E9%80%9F%20tex4ht%20%E5%BD%B1%E5%83%8F%E7%94%9F%E6%88%90%E9%81%8E%E7%A8%8B%EF%BC%9F.png)
目前,我告訴 tex4ht 對於數學圖像使用 svg 而不是 png。這會帶來更好的圖像品質。然而,它的圖像生成速度很慢,因為每次都必須載入 idv 檔案來為每個數學表達式生成每個圖像,因此生成每個圖像大約需要 1-2 秒。
有沒有辦法加快這個過程?我將描述目前的流程以供參考。
我編輯 sudo vi /usr/local/texlive/2014/texmf-dist/tex4ht/base/unix/tex4ht.env
並添加了這兩行
G.svg
Gdvisvgm -n -p %%2 -c 1.2,1.2 -s %%1 > %%3
如圖所示
接下來,編輯我的 tex4ht cfg 檔案(稱為 nma.cfg)並新增 svg 條目
\Preamble{ext=htm,charset="utf-8",p-width,pic-align}
\Configure{Picture}{.svg}
\makeatletter
\Configure{graphics*}
{svg}
{
{\Configure{Needs}{File: \[email protected]}\Needs{}}
\Picture[\csname a:GraphicsAlt\endcsname]{\csname Gin@base\endcsname.svg
\csname a:Gin-dim\endcsname}
}
\begin{document}
\EndPreamble
接下來,我對乳膠檔案呼叫 tex4ht,如下所示
make4ht -u foo.tex "nma,htm,pic-align,notoc*"
哪裡make4ht
可以找到https://github.com/michal-h21/make4ht
如果還沒有make4ht
安裝,則命令
htlatex foo.tex "nma,htm,pic-align,charset=utf-8,notoc*" " -cunihtf -utf8"
也會起作用。這是帶有 2 個方程式的 foo.tex,這將導致生成 2 個圖像
\documentclass[11pt]{article}
\usepackage{graphicx} %must be included
\begin{document}
\[
x = \sin(y)
\]
and
\[
x2 = \sin(y)
\]
\end{document}
現在我們看到 tex4ht 每次為每個圖像加載 idv:
......
t4ht.c (2012-07-25-19:28 kpathsea)
t4ht -f/foo.tex
(/usr/local/texlive/2014/texmf-dist/tex4ht/base/unix/tex4ht.env)
Entering foo.lg
System call: dvisvgm -n -p 1 -c 1.2,1.2 -s foo.idv > fo0x.svg
processing page 1
page size: 58.1681pt x 13.0909pt (20.4437mm x 4.60093mm)
page written to <stdout>
1 of 2 pages converted in 0.244021 seconds
System return: 0
System call: dvisvgm -n -p 2 -c 1.2,1.2 -s foo.idv > fo1x.svg
processing page 2
page size: 64.7136pt x 13.0909pt (22.7442mm x 4.60093mm)
page written to <stdout>
1 of 2 pages converted in 0.243742 seconds
System return: 0
有沒有辦法加快速度,以避免每次為每個方程式加載 idv 並一次完成所有這些?目前,建造我的大型乳膠文件需要 4 天,我需要一種方法來加快速度。
答案1
每張生成的圖片都放置在其自己的頁面上的特殊dvi
文件中,擴展名為idv
.預設情況下,tex4ht
單獨調用每個頁面上的轉換命令,這通常不會出現問題,除非您有很多頁面(如您的情況)。在這種情況下,使用一個命令轉換檔案中的所有頁面可能會更快idv
。問題是我們無法按照我們需要的方式命名輸出文件,因此我們必須在轉換後重命名它們。
如果呼叫dvisvgm
轉換所有頁面:
dvisvgm -n -p 1- 檔名.idv
文件將被命名為filename-01.svg
,但我們需要將它們命名為filename0x.svg
這可以使用make4ht
建置檔案來修復:
Make:add("dvisvgm","dvisvgm -n -TS1.25,1.25 -c 1.2,1.2 -p 1- ${input}.idv")
local max_count = 5
local image_format = "${input}-${zeroes}${page}.${ext}"
local oneimage_format = "${input}.${ext}"
local function file_exists(fn)
local f = io.open(fn,"r")
if f == nil then return false else f:close() return true end
end
local function locate_file(par,ext, count)
local count = count or 0
par.ext = ext
local zeroes = string.rep("0",count)
par.zeroes = zeroes
if count > max_count then
local one = oneimage_format % par
if file_exists(one) then
return one
else
return false, "max_count exceeded"
end
end
local fn = image_format % par
if file_exists(fn) then
return fn
else
return locate_file(par, ext, count+1)
end
end
Make:htlatex{}
Make:htlatex{}
Make:htlatex{}
Make:tex4ht{}
Make:t4ht{}
Make:dvisvgm{}
Make:image("svg$",function(arg)
arg.input = arg.source:gsub(".idv$","")
local fn,msg = locate_file(arg, "svg")
if not fn then
print("Image processing error: "..msg)
else
arg.filename = fn
local cmd = "mv ${filename} ${output}" % arg
print(cmd)
os.execute(cmd)
end
end
)
我們應該稍微傳播這個文件:
Make:add("dvisvgm","dvisvgm -n -c 1.2,1.2 -p 1- ${input}.idv")
這個註冊新指令,dvisvgm
它將從idv
檔案中提取所有 svg 檔案。${input}
是用輸入檔名替換的特殊指令。
Make:htlatex{}
Make:tex4ht{}
Make:t4ht{}
Make:dvisvgm{}
這是建置順序,LaTeX 僅被呼叫一次,Make:htlatex
如果您使用 toc 或引用,您可能需要新增更多呼叫。 idv 檔案是在tex4ht
運行後創建的,因此我們需要明確調用Make:tex4ht{}
and Make:t4ht{}
,然後再調用Make:dvisvgm{}
.
Make:image("svg$",function(arg)
arg.input = arg.source:gsub(".idv$","")
local fn,msg = locate_file(arg, "svg")
if not fn then
print("Image processing error: "..msg)
else
arg.filename = fn
local cmd = "mv ${filename} ${output}" % arg
print(cmd)
os.execute(cmd)
end
end
)
每個圖像都會呼叫此函數。arg
是包含圖像屬性的表,即idv
檔案名稱、頁碼和輸出檔案。要建立文件,我們需要刪除後綴.idv
來取得基本名稱arg.source
。我們嘗試使用函數來尋找 svg 檔案的檔案名locate_file
,當我們找到它時,它會被移到變數中的正確位置arg.output
。
local function locate_file(par,ext, count)
local count = count or 0
par.ext = ext
local zeroes = string.rep("0",count)
par.zeroes = zeroes
if count > max_count then
local one = oneimage_format % par
if file_exists(one) then
return one
else
return false, "max_count exceeded"
end
end
local fn = image_format % par
if file_exists(fn) then
return fn
else
return locate_file(par, ext, count+1)
end
end
因為我們不知道dvisvgm
我們需要找到它產生的確切檔案名稱。由於dvisvgm
可能會在頁碼前面加上前導零,情況會變得更糟,因此當我們第一次嘗試找不到該檔案時,我們需要嘗試幾種可能性。
將 make 檔案另存為foo.mk4
.從命令列輸出:
Make4ht: dvisvgm -n -c 1.2,1.2 -p 1- foo.idv
processing page 1
page size: 58.1681pt x 13.0909pt (20.4437mm x 4.60093mm)
page written to foo-01.svg
processing page 2
page size: 64.7136pt x 13.0909pt (22.7442mm x 4.60093mm)
page written to foo-02.svg
2 of 2 pages converted in 0.193865 seconds
和:
mv foo-01.svg foo0x.svg
mv foo-02.svg foo1x.svg
結果: