使用 htlatex 生成的 mathml 中的标签排序错误

使用 htlatex 生成的 mathml 中的标签排序错误

我正在将大型数学文档从 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>&#x00A0;is&#x00A0;
<!--error-->   <em>dense&#x00A0;in&#x00A0;
<!--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}。此配置在数学环境中使用,这要归功于\ifmathmlswich。在普通文本中,<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,所以我真的找不到时间写文档。

相关内容