tex4ht tidak menangani \ ifdefined \ HCode dalam mode mathjax

Oct 02 2020

Ini hanya masalah dengan tex4ht.

Ini adalah pertama kalinya saya menemukan di mana tex4ht tidak diproses \ifdefined\HCode.

Saya memasukkan \ifdefined\HCodepersamaan, karena saya membutuhkan kode yang berbeda untuk mode HTML vs. pdf.

tex4httidak memproses ifdefineddan membiarkannya di sana. Saat mathjaxmelihatnya, ia mengeluh karena mathjax offcourse tidak tahu apa-apa ifdefined\HCode.

Ketika kode dikompilasi tidak menggunakannya mathjaxberfungsi dengan baik. Tapi saya perlu menggunakan mathjax.

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

Di atas dikompilasi OK menggunakan lualatex foo3.texdan memberi

Tapi kompilasi menggunakannya make4ht -ulm default -a debug foo3.tex "mathjax,htm"memberi

Ini adalah HTML mentah. itu menunjukkan \ifdefined\HCodetidak diproses dan ditinggalkan di sana

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

Disusun menggunakan make4ht -ulm default -a debug foo3.tex "htm"karya tanpa masalah dan memberi

Masalahnya tampaknya tex4ht tidak melihat ke dalam persamaan untuk melihat bahwa ada sesuatu yang harus dilakukan, dan hanya meneruskan semuanya ke mathjax.

MEMPERBARUI

Saya menemukan solusi. Yaitu meletakkan di \ifdefined\HCodeluar segalanya, dan menggandakan keseluruhan kode dua kali, termasuk arraykode. Saya berharap untuk menghindari ini. Tapi ini berhasil untuk saat ini. Untuk beberapa alasan, memasukkan \ifdefined\HCodepersamaan apa pun tidak berfungsi dengan tex4ht saat dalam mathjaxmode.

\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

Jawaban

3 michal.h21 Oct 02 2020 at 14:45

TeX4ht tentu saja tidak dapat menafsirkan kode Anda di dalam lingkungan matematika, karena diteruskan ke kode HTML kata demi kata. Mereka diinterpretasikan oleh MathJax ketika Anda menampilkan kode HTML dan MathJax tentu saja tidak tahu apa-apa \ifdefined\HCode, jadi itu mengabaikannya. Anda juga perlu menggandakan kode Anda dan membiarkan LaTeX menafsirkan kode Anda, atau Anda dapat mencoba menggunakan lingkungan khusus dan meneruskan definisi alternatif ke MathJax. Yang mungkin berhasil atau tidak.

Misalnya, ini sepertinya berhasil:

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

Saya telah mendefinisikan \mathjaxaltmakro, yang mengambil dua parameter, pertama berisi kode untuk MathJax, kedua berisi kode untuk LaTeX biasa. Anda perlu memberikan definisi makro ini untuk MathJax dalam file konfigurasi:

\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

Inilah definisinya:

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

Ini menggunakan parameter pertama, sebagai lawan dari definisi asli, yang menggunakan parameter kedua.

Beginilah cara merendernya dalam HTML: