Wie kann der Tex4HT-Bildgenerierungsprozess beschleunigt werden?

Wie kann der Tex4HT-Bildgenerierungsprozess beschleunigt werden?

Derzeit weise ich tex4ht an, für mathematische Bilder SVG statt PNG zu verwenden. Dies führt zu einer besseren Bildqualität. Die Bildgenerierung ist jedoch langsam, da die Generierung jedes Bilds etwa 1-2 Sekunden dauert, da die IDV-Datei jedes Mal geladen werden muss, um jedes Bild für jeden mathematischen Ausdruck zu erstellen.

Gibt es eine Möglichkeit, diesen Prozess zu beschleunigen? Ich beschreibe den aktuellen Prozess, den ich als Referenz verwende.

Ich habe sudo vi /usr/local/texlive/2014/texmf-dist/tex4ht/base/unix/tex4ht.envdiese beiden Zeilen bearbeitet und hinzugefügt

G.svg
Gdvisvgm -n -p %%2 -c 1.2,1.2 -s %%1 > %%3

wie in diesem Bild gezeigt

Mathematica-Grafiken

Als nächstes habe ich meine tex4ht cfg-Datei (genannt nma.cfg) bearbeitet und den svg-Eintrag hinzugefügt

 \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

Als nächstes rufe ich tex4ht für die Latex-Datei wie folgt auf

  make4ht -u foo.tex "nma,htm,pic-align,notoc*"

wo make4htfindet man inhttps://github.com/michal-h21/make4ht

Wenn Sie nicht make4htinstalliert haben, dann der Befehl

  htlatex foo.tex "nma,htm,pic-align,charset=utf-8,notoc*" " -cunihtf -utf8"

wird auch funktionieren. Hier ist foo.tex mit 2 Gleichungen, die 2 Bilder erzeugen werden

\documentclass[11pt]{article}
\usepackage{graphicx} %must be included
\begin{document}    
\[
  x = \sin(y)
\]
and
\[
  x2 = \sin(y)
\]    
\end{document}

Jetzt sehen wir, dass tex4ht jedes Mal für jedes Bild die IDV lädt:

......
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

Gibt es eine Möglichkeit, dies zu beschleunigen, um zu vermeiden, dass der IDV jedes Mal für jede Gleichung geladen werden muss, und um sie alle auf einmal auszuführen? Derzeit dauert es 4 Tage, um meine große Latex-Datei zu erstellen, und ich brauche eine Möglichkeit, dies zu beschleunigen.

Antwort1

Jedes generierte Bild wird auf einer eigenen Seite in einer speziellen dviDatei mit der Erweiterung platziert idv. Standardmäßig tex4htruft Konvertierungsbefehle für jede Seite einzeln auf, was normalerweise kein Problem darstellt, es sei denn, Sie haben wie in Ihrem Fall viele Seiten. In diesem Fall ist es möglicherweise schneller, alle Seiten in der idvDatei mit einem Befehl zu konvertieren. Der Haken besteht darin, dass wir die Ausgabedateien nicht so benennen können, wie wir es benötigen, also müssen wir sie nach der Konvertierung umbenennen.

Wenn Sie dvisvgmzum Konvertieren aller Seiten aufrufen:

dvisvgm -n -p 1- Dateiname.idv

Dateien werden wie folgt benannt filename-01.svg, aber wir brauchen sie wie folgt benanntfilename0x.svg

Dies kann mithilfe make4htder Build-Datei behoben werden:

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
)

wir sollten diese Datei ein wenig verbreiten:

Make:add("dvisvgm","dvisvgm -n -c 1.2,1.2 -p 1- ${input}.idv")

Dieser neue Befehl „Registrieren“ dvisvgmextrahiert alle SVG-Dateien aus der idvDatei. ${input}Ist eine spezielle Anweisung, die durch einen Eingabedateinamen ersetzt wird.

Make:htlatex{}
Make:tex4ht{}
Make:t4ht{}
Make:dvisvgm{}

Dies ist die Build-Sequenz. LaTeX wird nur einmal aufgerufen. Sie können weitere Aufrufe hinzufügen, Make:htlatexwenn Sie toc oder Referenzen verwenden. Die IDV-Datei wird nach tex4htdem Ausführen erstellt, daher müssen wir Make:tex4ht{}und Make:t4ht{}explizit aufrufen und danach 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
)

Diese Funktion wird für jedes Bild aufgerufen. argist eine Tabelle mit Bildeigenschaften, also dem idvDateinamen, der Seitenzahl und der Ausgabedatei. Um die Datei zu erstellen, müssen wir den Basisnamen abrufen, indem wir das .idvSuffix löschen arg.source. Wir versuchen, den Dateinamen der SVG-Datei mit locate_fileder Funktion zu finden. Wenn wir ihn gefunden haben, wird er an die richtige Stelle verschoben, nämlich in der arg.outputVariablen.

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

Da wir den genauen Namen der erzeugten Datei nicht kennen, dvisvgmmüssen wir sie lokalisieren. Die Situation wird dadurch verschlimmert, dass dvisvgmvor der Seitenzahl möglicherweise Nullen hinzugefügt werden, sodass wir mehrere Möglichkeiten ausprobieren müssen, wenn wir die Datei nicht beim ersten Versuch finden können.

Speichern Sie die Make-Datei als foo.mk4. Aus der Befehlszeilenausgabe:

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

Und:

mv foo-01.svg foo0x.svg
mv foo-02.svg foo1x.svg

und das Ergebnis:

Bildbeschreibung hier eingeben

verwandte Informationen