como acelerar o processo de geração de imagens tex4ht?

como acelerar o processo de geração de imagens tex4ht?

Atualmente, digo ao tex4ht para usar svg em vez de png para imagens matemáticas. Isso resulta em melhor qualidade de imagem. No entanto, é lento na geração de imagens, pois leva cerca de 1 a 2 segundos para cada imagem ser gerada, pois é necessário carregar o arquivo idv a cada vez para criar cada imagem para cada expressão matemática.

Existe uma maneira de acelerar esse processo? Descreverei o processo atual que uso como referência.

Eu editei sudo vi /usr/local/texlive/2014/texmf-dist/tex4ht/base/unix/tex4ht.enve adicionei essas 2 linhas

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

como mostrado nesta imagem

Gráficos matemáticos

Em seguida, editei meu arquivo tex4ht cfg (chamado nma.cfg) e adicionei a 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

Em seguida, chamo tex4ht no arquivo latex da seguinte maneira

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

onde make4hté encontrado emhttps://github.com/michal-h21/make4ht

Se você não tiver make4htinstalado, então o comando

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

também funcionará. Aqui está foo.tex com 2 equações que farão com que 2 imagens sejam geradas

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

Agora vemos o tex4ht carregando o idv todas as vezes para cada imagem:

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

Existe uma maneira de acelerar isso para evitar carregar o idv todas as vezes para cada equação e fazê-las todas de uma vez? Atualmente leva 4 dias para construir meu grande arquivo de látex e preciso de uma maneira de acelerar isso.

Responder1

Cada imagem gerada é colocada em sua própria página em dvium arquivo especial, com extensão idv. Por padrão, tex4htchama comandos de conversão em cada página separadamente, o que normalmente não é problema, a menos que você tenha muitas páginas como no seu caso. Nesse caso, pode ser mais rápido converter todas as páginas do idvarquivo com um comando. O problema é que não podemos nomear os arquivos de saída da maneira que precisamos, então temos que renomeá-los após a conversão.

Se você ligar dvisvgmpara converter todas as páginas:

dvisvgm -n -p 1- nome do arquivo.idv

os arquivos serão nomeados como filename-01.svg, mas precisamos que eles sejam nomeados comofilename0x.svg

Isso é possível corrigir usando make4hto arquivo de construção:

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
)

devemos divulgar um pouco esse arquivo:

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

este novo comando de registro, dvisvgmque extrairá todos os arquivos SVG do idvarquivo. ${input}é uma instrução especial que é substituída por um nome de arquivo de entrada.

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

esta é a sequência de construção, o LaTeX é chamado apenas uma vez, você pode querer adicionar mais Make:htlatexchamadas se usar toc ou referências. O arquivo idv é criado após tex4hta execução, então precisamos chamar Make:tex4ht{}e Make:t4ht{}explicitamente e depois disso para 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 função é chamada para cada imagem. argé uma tabela com propriedades da imagem, que é o idvnome do arquivo, o número da página e o arquivo de saída. para construir o arquivo, precisamos obter o nome base excluindo o .idvsufixo de arg.source. tentamos encontrar o arquivo svg filename com locate_filefunção, quando o encontramos, ele é movido para o local correto, que está na arg.outputvariável.

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 não sabemos o nome exato do arquivo produzido, dvisvgmprecisamos localizá-lo. a situação piora com o fato de dvisvgmpodermos adicionar zeros à esquerda antes do número da página, então precisamos tentar diversas possibilidades quando não conseguirmos encontrar o arquivo na primeira tentativa.

Salve o arquivo make como foo.mk4. Na saída da linha 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

e:

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

e o resultado:

insira a descrição da imagem aqui

informação relacionada