
Ich konvertiere große mathematische Dokumente von Latex nach HTML + MathML. In manchen Situationen erhalte ich als Ausgabe eine Datei mit falscher Form. Ein Beispiel ist wie folgt.
Die Hauptdateitest.texIst:
\documentclass{article}
\begin{document}
\[
X \mbox{ is \emph{dense in $Y$}}
\]
\end{document}
Die minimalistische Konfigurationmeineconfig.cfgDatei ist:
\Preamble{mathml}
\Configure{emph}{\ifvmode\ShowPar\fi\HCode{<em>}}{\HCode{</em>}}
\begin{document}
\EndPreamble
Führen Sie nun den Befehl aushtlatex test.tex myconfig.cfgIch erhalte (nachdem ich die Präambel entfernt und den Code neu organisiert habe):
<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>
In dieser Ausgabe werden die öffnenden und schließenden Tags vonmtextUndemdie ich hervorgehoben habe, sind verschachtelt und nicht verschachtelt.
Ich möchte hinzufügen, dass eine Änderung des Latex-Codes keine Option ist (aufgrund der großen Codeteile). Was dennoch möglich ist, wäre eine Neudefinition von \emph (die verschiedenen Neudefinitionen, die ich versucht habe, haben die Ausgabe jedoch nicht geändert).
Antwort1
Bearbeiten:
Hier ist die aktualisierte Konfiguration, die tatsächlich <mtext>
ein Element erzeugt, wenn der Formatierungsbefehl verwendet wird:
\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
Der \providemtextclass
Befehl ist etwas kompliziert. Er definiert Attribute, die in den folgenden <mtext>
Elementen verwendet werden sollen. Er muss das tatsächlich geöffnete schließen <mtext>
. Die \ht:special
Befehle enthalten spezielle Anweisungen für tex4ht
. Das \ht:special{t4ht@,&\#x00A0;}
wird verwendet, um Leerzeichen durch untrennbare Leerzeichen zu ersetzen. Es ist in MathML-Text erforderlich, da Wörter sonst zusammenfallen würden. Es muss jedoch deaktiviert werden, wenn Tags gedruckt werden, da dies eine ungültige XML-Struktur erzeugen würde. Es kann mit deaktiviert werden \ht:special{t4ht@,}
.
Das gerenderte Ergebnis:
und 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>
Ursprüngliche Antwort:
Bei der Konfiguration des \emph
Befehls muss die Situation berücksichtigt werden, wenn er in der Mathematik verwendet wird, MathML
andernfalls ist das Ergebnis ungültig.
Hier ist die geänderte Version der Konfiguration, die in bereitgestellt wird 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
Die grundlegenden Textbefehle erzeugen <mtext>
Elemente in MathML, deren Attribute mithilfe von festgelegt werden können \Configure{@mtext}
. Diese Konfiguration wird in mathematischen Umgebungen dank \ifmathml
swich verwendet. In normalem Text <em>
wird verwendet.
Dies führt zu folgendem Ergebnis:
<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>
Sie können sehen, dass es ein falsches gibt <mtext class='emph' mathvariant='italic'></mtext>
. Es wird durch das Einschließen $Y$
in \emph
den Befehl verursacht. Diese Version funktioniert besser:
X \mbox{ is \emph{dense in }$Y$}
Zu Ihrer letzten Frage. Wir haben einen Bugtracker und ein Quellcode-Repository unterPuszcza. Die Fehler werden direkt in den Quellen behoben und die Updates gehen direkt an die TeX-Distributionen.
Ein großer Teil der Fragen zu TeX.sx sind eigentlich keine Bugs, sondern eher Fragen zur Anpassung der Ausgabe an bestimmte Benutzeranforderungen. Daher ergibt es keinen Sinn, sie als Paket bereitzustellen. Es wäre schön, wenn wir eine Liste mit häufigen Problemen und Konfigurationen bereitstellen würden. Tatsache ist, dass wir auch die Dokumentation aktualisieren müssen. Ich habe angefangen,arbeite daran, aber der Fortschritt ist langsam. Für mich ist es viel einfacher, Code als Prosa zu schreiben, vor allem, weil Englisch nicht meine Muttersprache ist. Ich bin auch mit neuen Versionen von make4ht und tex4ebooks beschäftigt, sodass ich kaum Zeit für die Dokumentation finde.