레이블을 제외하고 방정식을 LaTeX로 유지하면서 LaTex를 HTML로 변환

레이블을 제외하고 방정식을 LaTeX로 유지하면서 LaTex를 HTML로 변환

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에서는 다음과 같이 렌더링합니다.

여기에 이미지 설명을 입력하세요

관련 정보