¿Cómo acelerar el proceso de generación de imágenes tex4ht?

¿Cómo acelerar el proceso de generación de imágenes tex4ht?

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

gráficos matemáticos

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 make4htinstalado, 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 dviun archivo especial, con extensión idv. De forma predeterminada, tex4htllama 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 idvarchivo 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 dvisvgmpara 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 make4htel 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, dvisvgmque extraerá todos los archivos svg del idvarchivo. ${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:htlatexllamadas si usa toc o referencias. El archivo idv se crea después de tex4htla 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. argEs una tabla con propiedades de la imagen, que es el idvnombre del archivo, el número de página y el archivo de salida. Para construir el archivo, necesitamos obtener el nombre base eliminando el .idvsufijo de arg.source. Intentamos encontrar el nombre del archivo svg con locate_filela función, cuando lo encontramos, se mueve a la ubicación correcta, que está en la arg.outputvariable.

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, dvisvgmnecesitamos localizarlo. La situación empeora con el hecho de que dvisvgmse 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:

ingrese la descripción de la imagen aquí

información relacionada