Ordem errada de tags em mathml produzida usando htlatex

Ordem errada de tags em mathml produzida usando htlatex

Estou convertendo grandes documentos matemáticos de látex para html + mathml. Em algumas situações, formatou o arquivo incorretamente como saída. Um exemplo é o seguinte.

O arquivo principalteste.texé:

\documentclass{article}

\begin{document}
\[
  X \mbox{ is \emph{dense in $Y$}}
\]
\end{document}

A configuração minimalistameuconfig.cfgarquivo é:

\Preamble{mathml}

\Configure{emph}{\ifvmode\ShowPar\fi\HCode{<em>}}{\HCode{</em>}}

\begin{document}
\EndPreamble

Agora, executando o comandohtlatex test.tex meuconfig.cfgRecebo (depois de remover o preâmbulo e reorganizar o código):

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

Nesta saída, as tags de abertura e fechamento detexto meelesque destaquei são intercalados em vez de aninhados.

Deixe-me acrescentar que modificar o código látex não é uma opção (devido a grandes pedaços de código). No entanto, o que é possível seria redefinir \emph (no entanto, as várias redefinições que tentei não alteraram a saída).

Responder1

Editar:

Aqui está a configuração atualizada que realmente produz <mtext>o elemento quando o comando de formatação é usado:

\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

O \providemtextclasscomando é um pouco complicado. Ele define atributos que devem ser usados ​​nos seguintes <mtext>elementos. Ele precisa fechar o arquivo <mtext>. Os \ht:specialcomandos fornecem instruções especiais para tex4ht. O \ht:special{t4ht@,&\#x00A0;}é usado para substituir espaços por espaços inquebráveis. É necessário em texto MathML, porque de outra forma as palavras entrariam em colapso. Mas deve ser desativado quando as tags forem impressas, pois produziria uma estrutura XML inválida. Ele pode ser desativado usando \ht:special{t4ht@,}.

O resultado renderizado:

insira a descrição da imagem aqui

e 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>

Resposta original:

A configuração do \emphcomando precisa levar em consideração a situação quando ele é usado dentro da matemática, caso contrário, será inválido MathML.

Aqui está a versão modificada da configuração fornecida em 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

Os comandos básicos de texto produzem <mtext>elementos em MathML, é possível definir seus atributos usando \Configure{@mtext}. Esta configuração é usada em ambientes matemáticos graças ao \ifmathmlswich. No texto normal, <em>é usado.

Isso produz o seguinte resultado:

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

Você pode ver que há um espúrio <mtext class='emph' mathvariant='italic'></mtext>. É causado pela inclusão $Y$no \emphcomando. Esta versão funciona melhor:

 X \mbox{ is \emph{dense in }$Y$}

Em relação à sua última pergunta. Temos um rastreador de bugs e um repositório de código-fonte emPuszcza. Os erros são corrigidos diretamente nas fontes e as atualizações vão diretamente para as distribuições TeX.

Grande parte das perguntas no TeX.sx não são realmente bugs, mas mais perguntas sobre como modificar a saída para necessidades específicas do usuário, então não faz sentido fornecê-las como um pacote. Seria bom se fornecêssemos uma lista de problemas e configurações comuns, o fato é que também precisamos atualizar a documentação. Eu comecei atrabalhe nisso, mas o progresso é lento. É muito mais fácil escrever código do que prosa para mim, especialmente porque não sou falante nativo de inglês. Também estou ocupado com as novas versões do make4ht e do tex4ebooks, então não consigo encontrar tempo para a documentação.

informação relacionada