如何使用 \boldsymbol 和 tex4ht 通过 MathML 输出获得粗体符号?

如何使用 \boldsymbol 和 tex4ht 通过 MathML 输出获得粗体符号?

这是我想要转换为 HTML 的 LaTeX 文档的示例。

\documentclass[11pt]{book}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{amscd}

\begin{document}

 Some math...\newline
 Scalars: regular math font $a, x, X, \alpha, \beta, \Theta, \ldots$ \newline
 Vectors: bold math font $\boldsymbol{a}, \boldsymbol{x}, \boldsymbol{X}, \boldsymbol{\alpha}, \boldsymbol{\beta}, \boldsymbol{\Theta}, \ldots$ \newline

\end{document}

这是 PDF 输出。 enter image description here

这是.cfg我用来转换的文件。

% bold-math.cfg

\usepackage[T1]{fontenc}

% We are generating HTML + MathML code
\Preamble{xhtml,mathml,3,charset=utf-8,notoc*,nominitoc,fonts}

% Don't output xml version tag
\Configure{VERSION}{}

% Output HTML5 doctype instead of the default for HTML4
\Configure{DOCTYPE}{\HCode{<!doctype html>\Hnewline}}

% Custom page opening
\Configure{HTML}{\HCode{<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\Hnewline}}{\HCode{\Hnewline</html>}}

% Reset <head>, aka delete all default boilerplate
\Configure{@HEAD}{}

% Setup custom <head> content
\Configure{@HEAD}{\HCode{<meta charset="utf-8" />\Hnewline}}
\Configure{@HEAD}{\HCode{<meta name="generator" content="TeX4ht (http://www.cse.ohio-state.edu/\string~gurari/TeX4ht/)" />\Hnewline}}

% Add css files
\Configure{@HEAD}{\HCode{<link rel="stylesheet" type="text/css" href="\expandafter\csname aa:CssFile\endcsname" />\Hnewline}}
\Configure{@HEAD}{\HCode{<link rel="stylesheet" href="../Serif/cmun-serif.css" type="text/css" />\Hnewline}}
\Configure{@HEAD}{\HCode{<link rel="stylesheet" href="bold-math-mi.css" type="text/css" />\Hnewline}}

% Setup MathJax
\Configure{@HEAD}{\HCode{<script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=MML_CHTML"></script>\Hnewline}}
%\Configure{@HEAD}{\HCode{<script type="text/javascript" src="../MathJax/MathJax.js?config=MML_CHTML"></script>\Hnewline}}

% Translate \textbf, \textit and \texttt directives into <b>, <em> and <code>
\Configure{emph}{\ifvmode\ShowPar\fi\HCode{<em>}}{\HCode{</em>}}
\Configure{textbf}{\ifvmode\ShowPar\fi\HCode{<b>}}{\HCode{</b>}}
\Configure{textit}{\ifvmode\ShowPar\fi\HCode{<i>}}{\HCode{</i>}}
\Configure{texttt}{\ifvmode\ShowPar\fi\HCode{<code>}}{\HCode{</code>}}

% Translate verbatim and lstlisting blocks into <pre> elements
\ConfigureEnv{verbatim}{\HCode{<pre>}}{\HCode{</pre>}}{}{}
\ConfigureEnv{lstlisting}{\HCode{<pre>}}{\HCode{</pre>}}{}{}

% Do not set `indent`/`noindent` classes on paragraphs
\Configure{HtmlPar}
{\EndP\Tg<p>}
{\EndP\Tg<p>}
{\HCode{</p>\Hnewline}}
{\HCode{</p>\Hnewline}}

\begin{document}

\EndPreamble

这是我用来生成 HTML 文件的命令。

htlatex bold-math.tex "bold-math" " -cunihtf -utf8" " -cvalidate"

这是我得到的 HTML。 enter image description here

如您所见,问题在于\boldsymbol输出中忽略了,大写字母\Theta为斜体,而 为正常字体。在对 HTML 输出中的 MathML 代码进行一些调整后,我得到了以下内容。 enter image description here

这是我做的几处调整,供参考。
来自:

<mi>a</mi>
<mi>Θ</mi>

到:

<mi mathvariant="bold-italic">a</mi>
<mi mathvariant="bold">Θ</mi>

这表明 MathJax 和 MathML 能够显示我想要的内容。我猜问题出在 tex4ht 上。

有人知道如何解决这些问题吗?

答案1

获取粗体符号的最直接方法是重新定义\boldsymbols命令以包含您想要的标签。将此命令放入您的 .cfg 文件中:

\renewcommand\boldsymbol[1]{\HCode{<mi mathvariant="bold-italic">}\PauseMathClass #1\EndPauseMathClass\HCode{</mi>}}

\PauseMathClass将阻止tex4ht包含基于字体的标签,你会得到

<mi mathvariant="bold-italic"><mi 
>x</mi></mi>

否则。结果 mathml:

<mi mathvariant="bold-italic">a</mi><mo 
class="MathClass-punc">,</mo><mi mathvariant="bold-italic">x</mi><mo 
class="MathClass-punc">,</mo><mi mathvariant="bold-italic">X</mi><mo 
class="MathClass-punc">,</mo><mi mathvariant="bold-italic">α</mi><mo 
class="MathClass-punc">,</mo><mi mathvariant="bold-italic">β</mi><mo 
class="MathClass-punc">,</mo><mi mathvariant="bold-italic">Θ</mi><mo 
class="MathClass-punc">,</mo><mo 
class="MathClass-op">…</mo>

另一种方法是使用bm包,正如 Barbara 所建议的那样。它似乎也重新定义了\boldsymbol,并且得到了支持tex4ht,但有一个警告:

enter image description here

<mstyle mathvariant="bold"><mi 
>a</mi></mstyle><mo 
class="MathClass-punc">,</mo><mstyle mathvariant="bold"><mi 
>x</mi></mstyle><mo 
class="MathClass-punc">,</mo><mstyle mathvariant="bold"><mi 
>X</mi></mstyle><mo 
class="MathClass-punc">,</mo><mstyle mathvariant="bold"><mi 
>α</mi></mstyle><mo 
class="MathClass-punc">,</mo><mstyle mathvariant="bold"><mi 
>β</mi></mstyle><mo 
class="MathClass-punc">,</mo><mstyle mathvariant="bold"><mi 
>Θ</mi></mstyle><mo 
class="MathClass-punc">,</mo><mo 
class="MathClass-op">…</mo></math>

<mi>问题是,虽然有一个元素作为子元素,但似乎只选择了粗体,而不是斜体样式<mstyle>。我不确定这是否只是 Firefox 渲染中的错误,但您可以使用构建文件中的一些简单正则表达式轻松地将这些元素替换为所需的输出make4ht

-- sample.mk4
local filter = require "make4ht-filter"

local htmlmatch = filter {
  function(text)
    return text:gsub('<mstyle mathvariant="bold">%s*<mi%s*>([^%<]+)</mi></mstyle>', function(symbol)
      return string.format('<mi mathvariant="bold-italic">%s</mi>', symbol)
    end)
  end
}
if mode=="draft" then
  Make:htlatex {}
else
  Make:htlatex {}
  Make:htlatex {}
  Make:htlatex {}
end
Make:match("html$", htmlmatch)

正则表达式包含在htmlmatch函数中。使用以下命令进行编译:

make4ht -uc bold-math.cfg -e sample.mk4 bold-math.tex

得到的数学结果:

<mi mathvariant="bold-italic">a</mi><mo 
class="MathClass-punc">,</mo><mi mathvariant="bold-italic">x</mi><mo 
class="MathClass-punc">,</mo><mi mathvariant="bold-italic">X</mi><mo 
class="MathClass-punc">,</mo><mi mathvariant="bold-italic">α</mi><mo 
class="MathClass-punc">,</mo><mi mathvariant="bold-italic">β</mi><mo 
class="MathClass-punc">,</mo><mi mathvariant="bold-italic">Θ</mi><mo 
class="MathClass-punc">,</mo><mo 
class="MathClass-op">…</mo>

Firefox 渲染:

enter image description here

答案2

@Matteo Ipri 要解决 tex4ht 在对粗体符号进行上标或下标时生成的不平衡标签问题,请用\boldsymbol{\sigma}括号括起来。这将生成正确平衡的标签。

而不是$\boldsymbol{\sigma}_{a}^{2}$使用${\boldsymbol{\sigma}}_{a}^{2}$

相关内容