tex4ht không xử lý \ ifdefined \ HCode trong chế độ mathjax

Oct 02 2020

Đây là vấn đề chỉ với tex4ht.

Đây là lần đầu tiên tôi tìm thấy nơi mà tex4ht không xử lý \ifdefined\HCode.

Tôi đặt \ifdefined\HCodebên trong một phương trình, vì tôi cần mã khác cho chế độ HTML so với pdf.

tex4htkhông xử lý ifdefinedvà để nó ở đó. Khi mathjaxnhìn thấy nó, nó phàn nàn vì khóa học mathjax không biết bất cứ điều gì về ifdefined\HCode.

Khi mã được biên dịch không sử dụng mathjaxnó hoạt động OK. Nhưng tôi cần sử dụng mathjax.

Đây là 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}

Biên dịch ở trên OK bằng cách sử dụng lualatex foo3.texvà cho

Nhưng biên dịch bằng cách sử dụng make4ht -ulm default -a debug foo3.tex "mathjax,htm"nó mang lại

Đây là HTML thô. nó cho thấy cái \ifdefined\HCodechưa được xử lý và vẫn ở đó

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

Được biên dịch bằng cách sử dụng make4ht -ulm default -a debug foo3.tex "htm"các công trình không có vấn đề

Các vấn đề dường như tex4ht không nhìn vào bên trong phương trình để thấy rằng có điều gì đó phải làm, và chỉ chuyển toàn bộ sự việc cho mathjax.

CẬP NHẬT

Tôi đã tìm thấy cách giải quyết. Đó là đặt \ifdefined\HCodebên ngoài mọi thứ và sao chép toàn bộ mã hai lần, bao gồm cả arraymã. Tôi đã hy vọng để tránh điều này. Nhưng điều này làm việc cho bây giờ. Vì lý do nào đó, việc đưa \ifdefined\HCodevào bên trong bất kỳ phương trình nào không hoạt động với tex4ht khi ở mathjaxchế độ.

\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

Trả lời

3 michal.h21 Oct 02 2020 at 14:45

Tất nhiên TeX4ht không thể diễn giải mã của bạn bên trong môi trường toán học, vì chúng được chuyển sang mã HTML nguyên văn. Chúng được MathJax giải thích khi bạn hiển thị mã HTML và MathJax tất nhiên không biết gì về \ifdefined\HCodenó, vì vậy nó bỏ qua nó. Bạn cần sao chép mã của mình và để LaTeX diễn giải mã của bạn hoặc bạn có thể cố gắng sử dụng môi trường tùy chỉnh và chuyển một định nghĩa thay thế cho MathJax. Cái nào có thể hoạt động hoặc không.

Ví dụ, điều này dường như hoạt động:

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

Tôi đã định nghĩa \mathjaxaltmacro, có hai tham số, đầu tiên chứa mã cho MathJax, thứ hai chứa mã cho LaTeX thông thường. Bạn cần cung cấp định nghĩa về macro này cho MathJax trong tệp cấu hình:

\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

Đây là định nghĩa:

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

Nó sử dụng tham số đầu tiên, trái ngược với định nghĩa ban đầu, sử dụng tham số thứ hai.

Đây là cách nó được hiển thị trong HTML: