tex4ht ไม่จัดการ \ ifdefined \ HCode ในโหมด mathjax
นี่เป็นปัญหากับ tex4ht เท่านั้น
นี่เป็นครั้งแรกที่ฉันพบว่า tex4ht ไม่ประมวล\ifdefined\HCodeผล
ฉันใส่ไว้\ifdefined\HCodeในสมการเนื่องจากฉันต้องการรหัสที่แตกต่างกันสำหรับโหมด HTML กับ pdf
tex4htไม่ประมวลผลifdefinedและปล่อยไว้ที่นั่น mathjaxเห็นเมื่อไหร่ก็บ่นตั้งแต่ mathjax offcourse ไม่รู้เรื่องifdefined\HCodeเลย
เมื่อคอมไพล์โค้ดไม่ได้ใช้mathjaxงานได้ OK แต่จำเป็นต้องใช้mathjax.
นี่คือ 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}
การคอมไพล์ข้างต้นตกลงโดยใช้lualatex foo3.texและให้
แต่การรวบรวมโดยใช้make4ht -ulm default -a debug foo3.tex "mathjax,htm"มันให้
นี่คือ HTML ดิบ มันแสดงว่ายัง\ifdefined\HCodeไม่ได้ประมวลผลและทิ้งไว้ที่นั่น
<!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&-3 &0\\ 3 &3 i &0 \end{array} \right ] \]
</p><!--l. 25--><p class="indent" > test
</p>
</body>
</html>
รวบรวมโดยใช้make4ht -ulm default -a debug foo3.tex "htm"ผลงานที่ไม่มีปัญหาและให้
ปัญหาที่เกิดขึ้นดูเหมือนว่า tex4ht mathjaxไม่ได้ดูภายในสมการจะเห็นว่ามีบางสิ่งบางอย่างที่จะทำและเพียงแค่ผ่านไปสิ่งที่ทั้งเพื่อ
อัปเดต
ฉันพบวิธีแก้ปัญหาชั่วคราว ซึ่งก็คือการใส่\ifdefined\HCodeทุกอย่างออกไปข้างนอกและทำซ้ำรหัสทั้งหมดสองครั้งรวมทั้งarrayรหัสด้วย ฉันหวังว่าจะหลีกเลี่ยงสิ่งนี้ แต่ตอนนี้ใช้ได้ผล ด้วยเหตุผลบางประการการใส่\ifdefined\HCodeในสมการใด ๆ จะไม่ทำงานกับ tex4ht เมื่ออยู่ในmathjaxโหมด
\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
คำตอบ
แน่นอนว่า TeX4ht ไม่สามารถตีความรหัสของคุณในสภาพแวดล้อมทางคณิตศาสตร์ได้เนื่องจากรหัสเหล่านี้ถูกส่งไปยังรหัส HTML แบบคำต่อคำ MathJax ถูกตีความเมื่อคุณแสดงโค้ด HTML และแน่นอนว่า MathJax ไม่รู้อะไรเลย\ifdefined\HCodeดังนั้นจึงไม่สนใจมัน คุณจำเป็นต้องทำซ้ำรหัสของคุณและปล่อยให้ LaTeX ตีความโค้ดของคุณหรือคุณอาจลองใช้สภาพแวดล้อมที่กำหนดเองและส่งคำจำกัดความอื่นไปยัง MathJax ซึ่งอาจได้ผลหรือไม่ก็ได้
ตัวอย่างเช่นดูเหมือนว่าจะได้ผล:
\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}
ฉันได้กำหนด\mathjaxaltมาโครซึ่งใช้พารามิเตอร์สองตัวตัวแรกมีโค้ดสำหรับ MathJax ตัวที่สองมีโค้ดสำหรับ LaTeX ปกติ คุณต้องระบุคำจำกัดความของมาโครนี้สำหรับ MathJax ในไฟล์ config:
\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
นี่คือคำจำกัดความ:
macros: {
mathjaxalt: ["\#1",2],
}
ใช้พารามิเตอร์ตัวแรกซึ่งตรงข้ามกับนิยามดั้งเดิมซึ่งใช้พารามิเตอร์ตัวที่สอง
นี่คือวิธีการแสดงผลใน HTML: