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.env
diese 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
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 make4ht
findet man inhttps://github.com/michal-h21/make4ht
Wenn Sie nicht make4ht
installiert 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 dvi
Datei mit der Erweiterung platziert idv
. Standardmäßig tex4ht
ruft 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 idv
Datei 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 dvisvgm
zum 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 make4ht
der 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“ dvisvgm
extrahiert alle SVG-Dateien aus der idv
Datei. ${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:htlatex
wenn Sie toc oder Referenzen verwenden. Die IDV-Datei wird nach tex4ht
dem 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. arg
ist eine Tabelle mit Bildeigenschaften, also dem idv
Dateinamen, der Seitenzahl und der Ausgabedatei. Um die Datei zu erstellen, müssen wir den Basisnamen abrufen, indem wir das .idv
Suffix löschen arg.source
. Wir versuchen, den Dateinamen der SVG-Datei mit locate_file
der Funktion zu finden. Wenn wir ihn gefunden haben, wird er an die richtige Stelle verschoben, nämlich in der arg.output
Variablen.
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, dvisvgm
müssen wir sie lokalisieren. Die Situation wird dadurch verschlimmert, dass dvisvgm
vor 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: