Неправильный порядок тегов в mathml, созданный с помощью htlatex

Неправильный порядок тегов в mathml, созданный с помощью htlatex

Я конвертирую большие математические документы из 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>&#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>

В этом выводе открывающие и закрывающие теги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}. Эта конфигурация используется внутри математических сред благодаря \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, поэтому не могу найти время на документацию.

Связанный контент