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.env
e adicionei essas 2 linhas
G.svg
Gdvisvgm -n -p %%2 -c 1.2,1.2 -s %%1 > %%3
como mostrado nesta imagem
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 make4ht
instalado, 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 dvi
um arquivo especial, com extensão idv
. Por padrão, tex4ht
chama 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 idv
arquivo 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 dvisvgm
para 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 make4ht
o 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, dvisvgm
que extrairá todos os arquivos SVG do idv
arquivo. ${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:htlatex
chamadas se usar toc ou referências. O arquivo idv é criado após tex4ht
a 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 idv
nome 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 .idv
sufixo de arg.source
. tentamos encontrar o arquivo svg filename com locate_file
função, quando o encontramos, ele é movido para o local correto, que está na arg.output
variá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, dvisvgm
precisamos localizá-lo. a situação piora com o fato de dvisvgm
podermos 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: