
Я конвертирую большие математические документы из latex в html + mathml. В некоторых ситуациях я получаю файл неправильной формы на выходе. Пример следующий.
Основной файлтест.тексявляется:
\documentclass{article}
\begin{document}
\[
X \mbox{ is \emph{dense in $Y$}}
\]
\end{document}
Минималистичная конфигурациямойconfig.cfgфайл:
\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> 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>
В этом выводе открывающие и закрывающие тегиmtextиЭмкоторые я выделил, являются чередующимися, а не вложенными.
Позвольте мне добавить, что модификация кода 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, поэтому не могу найти время на документацию.