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 test.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>

元の回答:

コマンドの設定では、\emphmath 内で使用される場合の状況を考慮する必要があります。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。通常のテキストでは、<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 のバージョンにも忙しいので、ドキュメントに時間を割くことができません。

関連情報