tex4ht non gestisce \ ifdefined \ HCode in modalità mathjax

Oct 02 2020

Questo è un problema solo con tex4ht.

Questa è la prima volta che ho trovato dove tex4ht non elabora \ifdefined\HCode.

Ho inserito \ifdefined\HCodeun'equazione, poiché ho bisogno di codice diverso per HTML rispetto alla modalità pdf.

tex4htnon elabora il ifdefinede lo lascia lì. Quando lo mathjaxvede, si lamenta perché mathjax offcourse non sa nulla ifdefined\HCode.

Quando il codice viene compilato senza utilizzarlo mathjax, funziona correttamente. Ma ho bisogno di usare mathjax.

Ecco MWE

\documentclass[12pt]{article}
\usepackage{array}
\begin{document}
\[
\ifdefined\HCode 
     \left[
     \begin{array}{ccc}
\else 
     \left[
     \begin{array}{@{}cc|c@{}}
\fi 
       3 i&-3 &0\\ 
       3 &3 i &0
    \end{array}
    \right]               
\]
test
\end{document}

Quanto sopra compilato OK usando lualatex foo3.texe dà

Ma compilare usandolo make4ht -ulm default -a debug foo3.tex "mathjax,htm"dà

Questo è l'HTML grezzo. mostra che \ifdefined\HCodenon è stato elaborato e lasciato lì

<!DOCTYPE html> 
<html lang="en-US" xml:lang="en-US" > 
<head><title></title> 
<meta  charset="utf-8" /> 
<meta name="generator" content="TeX4ht (https://tug.org/tex4ht/)" /> 
<meta name="viewport" content="width=device-width,initial-scale=1" /> 
<link rel="stylesheet" type="text/css" href="foo3.css" /> 
<meta name="src" content="foo3.tex" /> 
<script>window.MathJax = { tex: { tags: "ams", inlineMath: [ ["\\\(","\\\)"] ], displayMath: [ ['$$','$$'], ["\\[","\\]"] ], processEscapes: true, processEnvironments: true, packages: ['base', 'color', 'ams'] }, loader: { load: ['[tex]/color', '[tex]/ams'] } }; </script> 
 <script type="text/javascript" async="async" id="MathJax-script" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml-full.js"></script>  
</head><body 
>
<!--l. 23--><p class="noindent" >\[ \ifdefined \HCode \left [ \begin{array}{ccc} \else \left [ \begin{array}{@{}cc|c@{}} \fi 3 i&amp;-3 &amp;0\\ 3 &amp;3 i &amp;0 \end{array} \right ] \]
</p><!--l. 25--><p class="indent" >   test
</p>   
 
</body> 
</html>

Compilato usando make4ht -ulm default -a debug foo3.tex "htm"funziona senza problemi e dà

Il problema sembra che tex4ht non guardi all'interno dell'equazione per vedere che c'è qualcosa da fare e passa semplicemente l'intera cosa a mathjax.

AGGIORNARE

Ho trovato una soluzione alternativa. Ovvero mettere \ifdefined\HCodefuori tutto e duplicare due volte l'intero codice, compreso il arraycodice. Speravo di evitarlo. Ma per ora funziona. Per qualche ragione, inserire \ifdefined\HCodequalsiasi equazione non funziona con tex4ht quando è in mathjaxmodalità.

\documentclass[12pt]{article}
\usepackage{array}
\begin{document}
\ifdefined\HCode %tex4ht version
 \[
 \left[
     \begin{array}{ccc}
    3 i&-3&0\\ 
    0  &0 &0
     \end{array}
  \right]               
\]
\else %PDF version
\[
 \left[
     \begin{array}{@{}cc|c@{}}
    3 i&-3&0\\ 
    0  &0 &0
     \end{array}
  \right]               
\]
\fi 

\end{document}

TL 2020

Risposte

3 michal.h21 Oct 02 2020 at 14:45

TeX4ht ovviamente non può interpretare il tuo codice all'interno di ambienti matematici, perché viene passato al codice HTML alla lettera. Vengono interpretati da MathJax quando si visualizza il codice HTML e MathJax ovviamente non ne sa nulla \ifdefined\HCode, quindi lo ignora. O devi duplicare il tuo codice e lasciare che LaTeX interpreti il ​​tuo codice, oppure puoi provare a usare un ambiente personalizzato e passare una definizione alternativa a MathJax. Che può o non può funzionare.

Ad esempio, questo sembra funzionare:

\documentclass[12pt]{article}
\usepackage{array}
\newcommand\mathjaxalt[2]{#2}
\begin{document}
\[
 \mathjaxalt{%
     \left[
     \begin{array}{ccc}
     }{%
     \left[
     \begin{array}{@{}cc|c@{}}
     }%
       3 i&-3 &0\\ 
       3 &3 i &0
    \end{array}
    \right]               
\]
test
\end{document}

Ho definito la \mathjaxaltmacro, che accetta due parametri, il primo contiene il codice per MathJax, il secondo contiene il codice per il LaTeX normale. È necessario fornire una definizione di questa macro per MathJax in un file di configurazione:

\Preamble{xhtml}
\Configure{MathJaxConfig}{{
    tex: {
      tags: "ams",
      \detokenize{%
      inlineMath: [ ["\\\(","\\\)"] ],
      displayMath: [ ['$$','$$'], ["\\[","\\]"] ]},
      processEscapes: true,
      processEnvironments: true,
      macros: {
        mathjaxalt: ["\#1",2],
      }
  },
  loader: {
    load: ['[tex]/color', '[tex]/ams']
  }
};
}
\begin{document}
\EndPreamble

Questa è la definizione:

macros: {
   mathjaxalt: ["\#1",2],
}

Utilizza il primo parametro, al contrario della definizione originale, che utilizza il secondo parametro.

Ecco come viene visualizzato in HTML: