Convertendo LaTex para HTML mantendo equações como LaTeX, exceto rótulos

Convertendo LaTex para HTML mantendo equações como LaTeX, exceto rótulos

Convertendo LaTeX para HTML mantendo equações como LaTeXexplica como usar \VerbMath em tex4ht para converter LaTeX em HTML enquanto mantém as equações iguais. Para referência acrescentarei que para múltiplas linhas pode-se usar o ambiente alinhado conforme explicadoaqui.

No entanto, estas soluções não funcionam com etiquetas. Então, o que eu gostaria é de uma maneira de virar

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

Equation \ref{eq}

em

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

Equation (7)

onde (7) é a numeração correta da equação. Isso pode ser feito com tex4ht ou existe algum outro script que faça isso?

Nota: Mathjax pode resolver rótulos/referências, mas não quero usar Mathjax.

Responder1

Editar:

Como não deseja usar o MathJax, você precisa pós-processar seu texto para substituir rótulos e referências cruzadas e inserir números de equações. Felizmente, podemos usar make4htarquivos de construção para isso.

Arquivo de amostra:

\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}

Detalhes sobre \mjrefestão na resposta original, esses detalhes ainda se aplicam. Usaremos o pacote modificado para manter a matemática do LaTeX inalterada 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*}
  }

.cfgArquivo ligeiramente modificado :

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

E agora o interessante:

O arquivo de compilação, denominado youfilename.mk4:

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

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

Isto declara que todos os arquivos html devem ser processados ​​com crossrefa biblioteca, que fará todo o trabalho pesado. Salve o seguinte código como 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

Os detalhes estão nos comentários no código-fonte.

Compilar usando:

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

Este é o resultado:

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

Resposta original:

O MathJax suporta rótulos e referências cruzadas, então talvez seja mais realista deixá-lo lidar não apenas com \label, mas também com \ref. Eu definiria uma macro personalizada para fazer referência a ambientes matemáticos, que podem ser redefinidos para serem inseridos \ref{labelname}quando o documento for compilado com tex4ht. Eu não \refme redefiniria, porque provavelmente você não quer perder a capacidade de fazer referências a seções ou figuras.

Algo assim:

\documentclass{article}
\usepackage{amsmath}

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

Equation \mjref{eq} 
\end{document}

A versão atual do código para MathJax com macros LaTeX pode ser encontradapacote helpers4ht. Não está no CTAN, você pode usar apenasmathjax-latex4ht.stypacote.

O arquivo de configuração pode ser um pouco simplificado:

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

A única coisa interessante é a redefinição do \mjrefcomando, que desabilita temporariamente a inserção de tags HTML para fontes e serve \HChar{92}para inserir o \caractere pelo seu código ASCII.

O código HTML resultante é o seguinte:

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

É renderizado desta forma pelo MathJax:

insira a descrição da imagem aqui

informação relacionada