可以使用 make4ht 或 htlatex 将 latex 转换为 html,其中数学内容被转换为 svg。是否可以在生成的 html 文件中将 latex 文件的数学内容预编译为 mathjax (html-css)?可以在 make4ht 或 htlatex 中使用 mathjax 节点来实现这一点吗?
答案1
编辑:
当前版本制作4小时现在包含一个扩展韓國. 可以使用以下方式请求
make4ht -f html5+mjcli filename.tex
这里是一个示例文档。
有一个命令行应用程序提供mathjax-节点页面,,mjpage
它可以处理 HTML 页面并将 LaTeX 或 MathML 代码替换为纯 HTML 或 SVG 代码,可以被大多数现代 Web 浏览器正确且快速地呈现。
您可以使用以下方式安装
npm install -g mathjax-node-page
命令。
不久前,我创建了一个实验性过滤器,添加了对旧版本的支持。幸运的是,mathjax-node
经过一些小的修复后,它甚至可以在当前版本上运行。make4ht
它比需要的更复杂,因为它mjpage
会生成大量CSS
样式信息并将其插入到它处理的每个 HTML 页面中。因为tex4ht
可以为每个部分创建单独的 HTML 文件,所以在我看来这似乎是不必要的空间浪费。因此,它会尝试将这些 CSS 信息提取到单独的 CSS 文件中,然后在 HTML 页面中引用该文件。
它尝试的另一件事是支持本地字体。生成的 CSS 默认引用在线字体,但支持本地字体可能很有用,例如当输出是 Epub 文件时,该文件应该是自包含的。
这是过滤器mathnode.lua
:
-- local mathnodepath = os.getenv "mathjaxnodepath"
--
-- print("mathnode", mathnodepath)
local mkutils = require "mkutils"
-- other possible value is page2svg
local mathnodepath = "mjpage"
-- options for MathJax command
local options = "--output CommonHTML"
-- math fonts position
-- don't alter fonts if not set
local fontdir = nil
-- if we copy fonts
local fontdest = nil
local fontformat = "otf"
local function compile(src)
local tmpfile = os.tmpname()
local filename = src
print("Compile using MathJax")
local command = mathnodepath .. " ".. options .. " < " .. filename .. " > " .. tmpfile
print(command)
local status = os.execute(command)
print("Result written to: ".. tmpfile)
mkutils.cp(tmpfile, src)
os.remove(tmpfile)
end
-- save the css code from the html page generated by MathJax
local function extract_css(file)
local f = io.open(file, "r")
local contents = f:read("*all")
f:close()
local css = ""
local filename = "mathjax-chtml.css"
contents = contents:gsub('<style [^>]+>(.+)</style>', function(style)
-- replace only the style for mathjax
if style:match "%.mjx%-math" then
css = style
return '<link rel="stylesheet" type="text/css" href="'..filename ..'" />'
end
end)
local x = assert(io.open(file, "w"))
x:write(contents)
x:close()
return filename, css
end
-- Update the paths to fonts to use the local versions
local function use_fonts(css)
local family_pattern = "font%-family:%s*(.-);.-%/([^%/]+)%.".. fontformat
local family_build = "@font-face {font-family: %s; src: url('%s/%s.%s') format('%s')}"
local fontdir = fontdir:gsub("/$","")
css = css:gsub("(@font%-face%s*{.-})", function(face)
if not face:match("url%(") then return face end
-- print(face)
local family, filename = face:match(family_pattern)
print(family, filename)
local newfile = string.format("%s/%s.%s", fontdir, filename, fontformat)
Make:add_file(newfile)
return family_build:format(family, fontdir, filename, fontformat, fontformat)
-- return face
end)
return css
end
local function save_css(filename, css)
local f = io.open(filename, "w")
f:write(css)
f:close()
end
return function(text, arguments)
-- if arguments.prg then mathnodepath = arguments.prg end
mathnodepath = arguments.prg or mathnodepath
options = arguments.options or options
fontdir = arguments.fontdir or fontdir
fontdest = arguments.fontdest or fontdest
fontformat = arguments.fontformat or fontformat
compile(text)
filename, css = extract_css(text)
-- use local font files if fontdir is present
if fontdir then
css = use_fonts(css)
end
save_css(filename, css)
Make:add_file(filename)
-- print(css)
print(filename)
end
mk4
可以通过以下方式从构建文件中请求它:
local mathjax_node = require "mathnode"
local format = "woff"
Make:match("html$", mathjax_node, {fontdir = format, fontformat = format})
使用Make:match
我们请求在每个 HTML 文件上运行此过滤器并将配置表传递给过滤器。如果您想使用本地字体,请使用fontdir
和选项。您的工作目录中fontformat
应该有一个子目录,其中包含woff
MathJax 字体woff
格式对于这个例子。
如果您想使用在线字体(如果您想在互联网上创建普通的 WWW 页面的话),则不需要这些选项。
另一个选项是options
,它可用于将命令行选项传递给mjpage
。例如,如果您想要SVG
输出,您可以使用:
local mathjax_node = require "mathnode"
Make:match("html$", mathjax_node, {options = "--output SVG"})
您也可以使用 MathJax 字体作为文档文本,使用以下.cfg
文件:
\Preamble{xhtml,mathml}
\begin{document}
\Css{body{font-family: MJXc-TeX-main-Rw, MJXc-TeX-main-Iw, MJXc-TeX-main-Bw, sans-serif;}}
\EndPreamble
以下文件:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[czech]{babel}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\begin{document}
hello world
Simple: $(\overline{x+y})=\overline{x}\overline{y}$
\begin{equation}
\label{eq:hello}
a = \sqrt{b^2 + c^2}
\end{equation}
See equation~\ref{eq:hello}
Now some multiline
\begin{multline*}
p(x) = 3x^6 + 14x^5y + 590x^4y^2 + 19x^3y^3\\
- 12x^2y^4 - 12xy^5 + 2y^6 - a^3b^3
\end{multline*}
Align:
\begin{align*}
2x - 5y &= 8 \\
3x + 9y &= -12
\end{align*}
Align*:
\begin{align*}
x&=y & w &=z & a&=b+c\\
2x&=-y & 3w&=\frac{1}{2}z & a&=b\\
-4 + 5x&=2+y & w+2&=-1+w & ab&=cb
\end{align*}
\end{document}
可以使用以下命令进行编译:
make4ht -uc mycfg.cfg -e mybuild.mk4 filename.tex html5
将按以下方式呈现:
和这是在线版本。