![¿Cómo acelerar el proceso de generación de imágenes tex4ht?](https://rvso.com/image/305879/%C2%BFC%C3%B3mo%20acelerar%20el%20proceso%20de%20generaci%C3%B3n%20de%20im%C3%A1genes%20tex4ht%3F.png)
Actualmente, le digo a tex4ht que use svg en lugar de png para imágenes matemáticas. Esto da como resultado una mejor calidad de imagen. Sin embargo, es lento en la generación de imágenes, ya que cada imagen tarda entre 1 y 2 segundos en generarse, ya que tiene que cargar el archivo idv cada vez para crear cada imagen para cada expresión matemática.
¿Hay alguna manera de acelerar este proceso? Describiré el proceso actual que utilizo como referencia.
Edité sudo vi /usr/local/texlive/2014/texmf-dist/tex4ht/base/unix/tex4ht.env
y agregué estas 2 líneas.
G.svg
Gdvisvgm -n -p %%2 -c 1.2,1.2 -s %%1 > %%3
como se muestra en esta imagen
A continuación, edité mi archivo tex4ht cfg (llamado nma.cfg) y agregué la entrada 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
A continuación, llamo a tex4ht en el archivo de látex de la siguiente manera
make4ht -u foo.tex "nma,htm,pic-align,notoc*"
dóndemake4ht
se encuentra enhttps://github.com/michal-h21/make4ht
Si no lo tiene make4ht
instalado, entonces el comando
htlatex foo.tex "nma,htm,pic-align,charset=utf-8,notoc*" " -cunihtf -utf8"
funcionará también. Aquí está foo.tex con 2 ecuaciones que generarán 2 imágenes
\documentclass[11pt]{article}
\usepackage{graphicx} %must be included
\begin{document}
\[
x = \sin(y)
\]
and
\[
x2 = \sin(y)
\]
\end{document}
Ahora vemos que tex4ht carga el idv cada vez para cada imagen:
......
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
¿Hay alguna manera de acelerar esto para evitar cargar el idv cada vez para cada ecuación y hacerlo todo a la vez? Actualmente, se necesitan 4 días para crear mi archivo de látex grande y necesito una forma de acelerarlo.
Respuesta1
Cada imagen generada se coloca en su propia página en dvi
un archivo especial, con extensión idv
. De forma predeterminada, tex4ht
llama a los comandos de conversión en cada página por separado, lo que normalmente no es un problema, a menos que tenga muchas páginas como en su caso. En este caso, puede ser más rápido convertir todas las páginas del idv
archivo con un solo comando. El problema es que no podemos nombrar los archivos de salida de la manera que necesitamos, por lo que tenemos que cambiarles el nombre después de la conversión.
Si llama dvisvgm
para convertir todas las páginas:
dvisvgm -n -p 1- nombre de archivo.idv
Los archivos se llamarán así filename-01.svg
, pero necesitamos que se llamen así.filename0x.svg
Esto se puede solucionar usando make4ht
el archivo de compilación:
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
)
deberíamos difundir un poco este archivo:
Make:add("dvisvgm","dvisvgm -n -c 1.2,1.2 -p 1- ${input}.idv")
este nuevo comando de registro, dvisvgm
que extraerá todos los archivos svg del idv
archivo. ${input}
es una instrucción especial que se reemplaza con un nombre de archivo de entrada.
Make:htlatex{}
Make:tex4ht{}
Make:t4ht{}
Make:dvisvgm{}
esta es la secuencia de compilación, LaTeX se llama solo una vez, es posible que desee agregar más Make:htlatex
llamadas si usa toc o referencias. El archivo idv se crea después de tex4ht
la ejecución, por lo que debemos llamar a Make:tex4ht{}
y Make:t4ht{}
explícitamente y luego a 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
)
esta función se llama para cada imagen. arg
Es una tabla con propiedades de la imagen, que es el idv
nombre del archivo, el número de página y el archivo de salida. Para construir el archivo, necesitamos obtener el nombre base eliminando el .idv
sufijo de arg.source
. Intentamos encontrar el nombre del archivo svg con locate_file
la función, cuando lo encontramos, se mueve a la ubicación correcta, que está en la arg.output
variable.
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
Como no sabemos el nombre exacto del archivo producido, dvisvgm
necesitamos localizarlo. La situación empeora con el hecho de que dvisvgm
se pueden agregar ceros a la izquierda antes del número de página, por lo que debemos probar varias posibilidades cuando no podemos encontrar el archivo en el primer intento.
Guarde el archivo de creación como foo.mk4
. Desde la salida de la línea de comando:
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
y:
mv foo-01.svg foo0x.svg
mv foo-02.svg foo1x.svg
y el resultado: