LaTeX를 HTML로 변환하여 방정식을 LaTeX로 유지방정식을 동일하게 유지하면서 LaTeX를 HTML로 변환하기 위해 tex4ht에서 \VerbMath를 사용하는 방법을 설명합니다. 참고로 여러 줄에 대해 설명된 대로 정렬된 환경을 사용할 수 있다는 점을 추가하겠습니다.여기.
그러나 이러한 솔루션은 레이블에서는 작동하지 않습니다. 그래서 내가 원하는 것은 방향을 바꾸는 방법이다
\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)
crossref
이는 모든 HTML 파일이 모든 어려운 작업을 수행하는 라이브러리 로 처리되어야 함을 선언합니다 . 다음 코드를 다음과 같이 저장합니다 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
유일하게 흥미로운 점은 명령의 재정의입니다 . 이는 일시적으로 글꼴에 대한 HTML 태그 삽입을 비활성화하고 ASCII 코드로 문자를 삽입하는 데 \mjref
사용됩니다 .\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에서는 다음과 같이 렌더링합니다.