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 make4ht
arquivos 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 \mjref
estã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*}
}
.cfg
Arquivo 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 crossref
a 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 \ref
me 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 \mjref
comando, 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: