使用 make4ht 或 htlatex 中的 mathjax 节点预编译 mathjax 输出

使用 make4ht 或 htlatex 中的 mathjax 节点预编译 mathjax 输出

可以使用 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应该有一个子目录,其中包含woffMathJax 字体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

将按以下方式呈现:

在此处输入图片描述

这是在线版本

相关内容