как ускорить процесс генерации изображений tex4ht?

как ускорить процесс генерации изображений tex4ht?

В настоящее время я говорю 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

как показано на этом изображении

Графика Mathematica

Далее отредактировал мой файл 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

и результат:

введите описание изображения здесь

Связанный контент