В настоящее время я говорю tex4ht использовать svg вместо png для математических изображений. Это приводит к лучшему качеству изображения. Однако он медленно генерирует изображения, так как для генерации каждого изображения требуется около 1-2 секунд, так как ему приходится каждый раз загружать файл idv, чтобы создать каждое изображение для каждого математического выражения.
Есть ли способ ускорить этот процесс? Я опишу текущий процесс, который я использую для справки.
Я отредактировал sudo vi /usr/local/texlive/2014/texmf-dist/tex4ht/base/unix/tex4ht.env
и добавил эти 2 строки
G.svg
Gdvisvgm -n -p %%2 -c 1.2,1.2 -s %%1 > %%3
как показано на этом изображении
Далее отредактировал мой файл tex4ht cfg (называемый nma.cfg) и добавил запись 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
Далее я вызываю tex4ht для файла latex следующим образом:
make4ht -u foo.tex "nma,htm,pic-align,notoc*"
где make4ht
находится вhttps://github.com/michal-h21/make4ht
Если у вас не make4ht
установлен, то команда
htlatex foo.tex "nma,htm,pic-align,charset=utf-8,notoc*" " -cunihtf -utf8"
тоже будет работать. Вот foo.tex с 2 уравнениями, которые приведут к генерации 2 изображений
\documentclass[11pt]{article}
\usepackage{graphicx} %must be included
\begin{document}
\[
x = \sin(y)
\]
and
\[
x2 = \sin(y)
\]
\end{document}
Теперь мы видим, как tex4ht загружает idv каждый раз для каждого изображения:
......
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
Есть ли способ ускорить это, чтобы не загружать idv каждый раз для каждого уравнения и сделать их все сразу? В настоящее время создание моего большого файла latex занимает 4 дня, и мне нужен способ ускорить это.
решение1
Каждая сгенерированная картинка размещается на своей странице в специальном dvi
файле с расширением idv
. По умолчанию tex4ht
вызывает команды конвертации на каждой странице отдельно, что обычно не является проблемой, если только у вас нет большого количества страниц, как в вашем случае. В этом случае может быть быстрее конвертировать все страницы в файле idv
одной командой. Загвоздка в том, что мы не можем назвать выходные файлы так, как нам нужно, поэтому нам приходится переименовывать их после конвертации.
Если вы звоните, dvisvgm
чтобы конвертировать все страницы:
dvisvgm -n -p 1- имя_файла.idv
Файлы будут названы как filename-01.svg
, но нам нужно, чтобы они были названы какfilename0x.svg
Это можно исправить с помощью make4ht
файла сборки:
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
)
нам следует немного распространить этот файл:
Make:add("dvisvgm","dvisvgm -n -c 1.2,1.2 -p 1- ${input}.idv")
эта команда регистрирует новую команду dvisvgm
, которая извлечет все файлы SVG из idv
файла. ${input}
Это специальная инструкция, которая заменяется именем входного файла.
Make:htlatex{}
Make:tex4ht{}
Make:t4ht{}
Make:dvisvgm{}
это последовательность сборки, LaTeX вызывается только один раз, вы можете захотеть добавить больше Make:htlatex
вызовов, если используете toc или ссылки. Файл idv создается после tex4ht
запуска, поэтому нам нужно явно вызвать 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
)
эта функция вызывается для каждого изображения. arg
это таблица со свойствами изображения, которая представляет собой idv
имя файла, номер страницы и выходной файл. чтобы построить файл, нам нужно получить базовое имя, удалив суффикс .idv
из arg.source
. мы пытаемся найти файл svg filename с помощью locate_file
функции, когда мы его находим, он перемещается в правильное место, которое находится в arg.output
переменной.
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
поскольку мы не знаем точное имя файла, созданного нами, dvisvgm
нам необходимо найти его. Ситуация ухудшается тем фактом, что dvisvgm
перед номером страницы могут быть добавлены начальные нули, поэтому нам нужно попробовать несколько вариантов, когда мы не можем найти файл с первой попытки.
Сохраните make-файл как foo.mk4
. Из вывода командной строки:
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
и:
mv foo-01.svg foo0x.svg
mv foo-02.svg foo1x.svg
и результат: