Конвертация LaTeX в HTML с сохранением уравнений в формате LaTeX, за исключением меток

Конвертация LaTeX в HTML с сохранением уравнений в формате LaTeX, за исключением меток

Конвертация LaTeX в HTML с сохранением уравнений в формате LaTeXобъясняет, как использовать \VerbMath в tex4ht для преобразования LaTeX в HTML, сохраняя уравнения теми же. Для справки добавлю, что для нескольких строк можно использовать выровненную среду, как объясненоздесь.

Однако эти решения не работают с этикетками. Поэтому я хотел бы найти способ превратить

\begin{equation}
1=1 \label{eq}
\end{equation}

Equation \ref{eq}

в

\begin{equation}
1=1~~~(7)
\end{equation}

Equation (7)

где (7) — правильная нумерация уравнения. Можно ли это сделать с помощью tex4ht или есть какой-то другой скрипт, который это делает?

Примечание: Mathjax может разрешать метки/ссылки, но я не хочу использовать Mathjax.

решение1

Редактировать:

Поскольку вы не хотите использовать MathJax, вам нужно выполнить постобработку текста, чтобы заменить метки и перекрестные ссылки, а также вставить номера уравнений. К счастью, make4htдля этого мы можем использовать файлы сборки.

Пример файла:

\documentclass{article}
% \usepackage[T1]{fontenc}
\usepackage{amsmath}

\newcommand\mjref[1]{\ref{#1}}
\begin{document}
\begin{equation}
1=1 \label{eq}
\end{equation}

\begin{align}
  1 + a = 2\\
  2 - a = 1
\end{align}

Equation \mjref{eq} 
\end{document}

Подробности \mjrefв оригинальном ответе, эти подробности все еще применимы. Мы будем использовать модифицированный пакет для сохранения математики LaTeX без изменений, latex-unchanged.sty:

\RequirePackage{verbatim,etoolbox}
\AtBeginDocument{%
  \def\AltMathOne#1${\HCode{\detokenize{\(#1\)}}$}
  \Configure{$}{}{}{\expandafter\AltMathOne} 
  \def\AltlMath#1\){\HCode{\detokenize{\(#1\)}}\)}
  \Configure{()}{\AltlMath}{}
  \def\AltlDisplay#1\]{\HCode{\detokenize{\[#1\]}}\]}
  \Configure{[]}{\AltlDisplay}{}
% 
\newcommand\VerbMath[1]{%
\ifcsdef{#1}{%
  \renewenvironment{#1}{%
    \NoFonts%
    \Configure{verbatim}{}{}
    \HChar{92}begin\{#1\}%
    \verbatim}{\endverbatim\HChar{92}end\{#1\}\EndNoFonts}%
}{}%
}

\VerbMath{align}
\VerbMath{equation}
\VerbMath{equation*}
  }

Немного измененный .cfgфайл:

\RequirePackage{latex-unchanged} 
\Preamble{xhtml,html5}
\begin{document}
\renewcommand\mjref[1]{\NoFonts\HChar{92}eqref\{#1\}\EndNoFonts}
\EndPreamble

А теперь самое интересное:

Файл сборки, названный youfilename.mk4:

local filter = require "make4ht-filter"
local crossref = require "crossref"
local process = filter { crossref }

Make:match(".html$", process)

Это объявляет, что все файлы html должны обрабатываться crossrefбиблиотекой, которая выполнит всю тяжелую работу. Сохраните следующий код как crossref.lua:

-- counter values for particular counters will be saved here
local eqcounter = 0
-- pattern which will be inserted as equation number
local counter_pattern = "~~~(%i)"

-- list of environments to insert counters
local processed = {"equation", "align"}
local labels = {}


-- this function takes pattern for ending text (it is end environment or
-- \\ as line breaks in aligns) and insert counter numbers before the matched text
-- it also removes \labels and store them for future use
local function insert_counter(text, pattern, counter)
  local counter_pat = string.format(counter_pattern, counter)
  -- remove labels
  local removed_labels = text:gsub('%s*\\label{(.-)}', function(name)
    -- save counter under label name
    print("save label", name, counter)
    labels[name] = counter
    return ''
  end)
  local inserted = removed_labels:gsub(pattern, counter_pat .. '%0')
  print("inserted", inserted)
  return inserted
end

local function handle_counter(env, name)
  eqcounter = eqcounter + 1
  -- we need to support align environments, which will have multiple counters
  if env:match('\\\\') then
    local parts = {}
    local ending = env:gsub('(.-)\\\\', function(part)
      table.insert(parts, part)
      return ''
    end)
    local results = {}
    -- we first process lines ending with \\, the last line without this will be processd
    -- with usual code for end environment
    for _, part in ipairs(parts) do
      print("part", part)
      table.insert(results, insert_counter(part, '(%s*)$',eqcounter))
      eqcounter = eqcounter + 1
    end
    env  = table.concat(results, '\\\\') .. '\\\\' ..ending
  end
  -- now insert counter for the whole environment
  return insert_counter(env, '(%s*\\end{'.. name ..'}', eqcounter)
end

local function handle_refs(text)
  -- modify the pattern to match the referencing macro you use
  return text:gsub('\\eqref{(.-)}', function(label)
    local counter = labels[label]
    if not counter then return '??' end
    return string.format("(%i)", counter)
  end)
end

return function(s)
  -- process math environments defined in processed table
  for _, name in ipairs(processed) do
    -- match the whole environments and replace them with modified version
    s = s:gsub('(\\begin{' ..name .. '}.-\\end{'.. name ..'})', function(environment)
      return handle_counter(environment, name)
    end)
  end
  -- handle ref commands in text
  s = handle_refs(s)
  return s
end

Подробности — в комментариях в исходном коде.

Компиляция с использованием:

make4ht -uc myconfig4.cfg -e youfilename.mk4 sample.tex

Вот результат:

<!--l. 7--><p class="noindent" >\begin{equation}
1=1~~~(1)
\end{equation}

</p><!--l. 11--><p class="noindent" >\begin{align}
1+a=2~~~(2)\\
2-a=1~~~(3)
\end{align}
</p><!--l. 16--><p class="noindent" >Equation (1)</p> 

Оригинальный ответ:

MathJax поддерживает метки и перекрестные ссылки сам по себе, так что, возможно, более реалистично позволить ему обрабатывать не только \label, но и \ref. Я бы определил пользовательский макрос для ссылки на математические среды, который можно переопределить для вставки \ref{labelname}при компиляции документа с помощью tex4ht. Я бы не переопределял \refсам себя, потому что вы, вероятно, не хотите терять возможность делать ссылки на разделы или рисунки.

Что-то вроде этого:

\documentclass{article}
\usepackage{amsmath}

\newcommand\mjref[1]{\ref{#1}}
\begin{document}
\begin{equation}
1=1 \label{eq}
\end{equation}

Equation \mjref{eq} 
\end{document}

Текущую версию кода для MathJax с макросами LaTeX можно найти здесь.пакет helpers4ht. Его нет на CTAN, вы можете использовать простоmathjax-latex4ht.styупаковка.

Файл конфигурации можно немного упростить:

\RequirePackage{mathjax-latex-4ht} 
\Preamble{xhtml}
\begin{document}
\renewcommand\mjref[1]{\NoFonts\HChar{92}eqref\{#1\}\EndNoFonts}
\EndPreamble

Единственное интересное — это переопределение \mjrefкоманды, которая временно отключает вставку HTML-тегов для шрифтов и использует \HChar{92}для вставки \символ по его ASCII-коду.

Получившийся HTML-код выглядит следующим образом:

<!--l. 7--><p class="noindent" >\begin{equation}
1=1\label{eq}
\end{equation}
</p><!--l. 11--><p class="noindent" >Equation \eqref{eq}</p> 

MathJax отображает это следующим образом:

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

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