我正在将大型数学文档从 latex 转换为 html + mathml。在某些情况下,我将文件错误地格式化为输出。示例如下。
主文件测试.tex是:
\documentclass{article}
\begin{document}
\[
X \mbox{ is \emph{dense in $Y$}}
\]
\end{document}
简约的配置我的配置文件文件是:
\Preamble{mathml}
\Configure{emph}{\ifvmode\ShowPar\fi\HCode{<em>}}{\HCode{</em>}}
\begin{document}
\EndPreamble
现在,运行命令htlatex 测试.tex myconfig.cfg我得到(删除序言并重新组织代码后):
<body>
<div class="par-math-display"><!--l. 5--><math
xmlns="http://www.w3.org/1998/Math/MathML"
display="block" >
<mrow>
<mi>X</mi>
<mstyle class="mbox">
<!--error--> <mtext> is 
<!--error--> <em>dense in 
<!--error--> </mtext>
<mstyle class="math">
<mi>Y</mi>
</mstyle>
<mtext>
<!--error--> </em>
</mtext></mstyle>
</mrow></math></div>
<!--l. 7--><p class="nopar" >
</body>
在此输出中,开始和结束标记多行文字和埃姆我所强调的是交错的而不是嵌套的。
让我补充一下,修改 latex 代码不是一个选项(因为代码量很大)。不过,可以重新定义 \emph(不过我尝试过的各种重新定义都没有改变输出)。
答案1
编辑:
以下是<mtext>
使用格式化命令时实际生成元素的更新配置:
\Preamble{xhtml,mathml,fonts}
\catcode`\:=11
\makeatletter
\newcommand\providemtextclass[1]{%
\Configure{@mtext}{#1}%
\HCode{</mtext>}\ht:special{t4ht@,}\HCode{<mtext \a:@mtext>}\ht:special{t4ht@,&\#x00A0;}%
}
\catcode`\:=12
\makeatother
\begin{document}
\Configure{emph} {\ifmathml\providemtextclass{class="emph" mathvariant="italic" }\else \HCode{<em>}\NoFonts\fi}{\ifmathml\else\EndNoFonts \HCode{</em>}\fi}
\EndPreamble
该\providemtextclass
命令有点复杂。它定义了应在以下<mtext>
元素中使用的属性。它需要关闭实际打开的<mtext>
。该\ht:special
命令为提供了特殊说明tex4ht
。\ht:special{t4ht@,&\#x00A0;}
用于将空格替换为不可中断的空格。它在 MathML 文本中是必需的,因为否则单词会折叠在一起。但在打印标签时必须禁用它,因为它会产生无效的 XML 结构。可以使用禁用它\ht:special{t4ht@,}
。
渲染结果:
和 MathML:
<math display='block' xmlns='http://www.w3.org/1998/Math/MathML'><mrow>
<mi>X</mi><mstyle class='mbox'><mtext> is </mtext><mtext class='emph' mathvariant='italic'>dense in </mtext><mstyle class='math'><mi>Y</mi> </mstyle><mtext class='emph' mathvariant='italic'></mtext></mstyle>
</mrow></math>
原始答案:
命令的配置\emph
需要考虑在数学内部使用的情况,MathML
否则会无效。
以下是提供的配置的修改版本mathml.4ht
:
\Preamble{xhtml,mathml,fonts}
\Configure{emph}
{\ifmathml \Configure{@mtext}{ class="emph"
mathvariant="italic" }%
\else \HCode{<em>}\NoFonts\fi}
{\ifmathml\else\EndNoFonts \HCode{</em>}\fi}
\begin{document}
\EndPreamble
基本文本命令<mtext>
在 MathML 中生成元素,可以使用 设置其属性\Configure{@mtext}
。此配置在数学环境中使用,这要归功于\ifmathml
swich。在普通文本中,<em>
使用。
其结果如下:
<div class='par-math-display'><!-- l. 4 --><math xmlns='http://www.w3.org/1998/Math/MathML' display='block'><mrow>
<mi>X</mi><mstyle class='mbox'><mtext> is dense in </mtext><mstyle class='math'><mi>Y</mi> </mstyle><mtext class='emph' mathvariant='italic'></mtext></mstyle>
</mrow></math></div>
您可以看到有一个虚假的<mtext class='emph' mathvariant='italic'></mtext>
。这是由于$Y$
在\emph
命令中包含 造成的。此版本效果更好:
X \mbox{ is \emph{dense in }$Y$}
关于你的最后一个问题。我们有一个错误跟踪器和源代码存储库,网址为普斯恰。错误直接在源中修复,更新直接进入 TeX 发行版。
TeX.sx 上的大部分问题实际上不是错误,而是关于修改输出以满足特定用户需求的问题,因此将它们作为包提供确实没有意义。如果我们提供一些常见问题和配置列表就好了,事实上我们还需要更新文档。我开始在...上下功夫,但进展缓慢。对我来说,写代码比写散文容易得多,尤其是因为我不是以英语为母语的人。我还忙于新版 make4ht 和 tex4ebooks,所以我真的找不到时间写文档。