將 LaTeX 轉換為 HTML,將方程式保留為 LaTeX解釋如何在 tex4ht 中使用 \VerbMath 將 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}
可以找到帶有 LaTeX 巨集的 MathJax 程式碼的目前版本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 標籤,並使用它的 ASCII 程式碼\HChar{92}
插入字元。\
產生的 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 是這樣渲染的: