如何加速 tex4ht 影像生成過程?

如何加速 tex4ht 影像生成過程?

目前,我告訴 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

結果:

在此輸入影像描述

相關內容