บทความ/จัดพิมพ์ โดย: นาย เจษฏา กานต์ประชา
เว็บเราใช้งาน MathJaX มาได้หลายปีแล้ว พบปัญหาและมีแนวทางแก้ไขดังนี้
เนื่องจากรูปแบบการแสดงผลแบบ HTML-CSS สามารถโดนรบกวนจากการจัดหน้าและรูปแบบของเว็บที่เป็น HTML เหมือนกัน จึงอาจดูผิดเพี้ยนไม่สวยงาม (เส้นแนวนอนไม่ตรง ตัวอักษรเกยกัน ฯลฯ) ดังเช่นตัวอย่างรูปด้านล่าง
วิธีแก้ไข เปลี่ยนไปใช้รูปแบบการแสดงผลแบบ SVG ซึ่งแสดงสมการคณิตศาสตร์ได้ไม่มีผิดเพี้ยนเลย และจากการทดสอบพบว่า สามารถแสดงผลได้เร็วกว่าแบบ HTML-CSS ประมาณ 18% - 34% อีกด้วย เหมาะแก่การใช้แสดงบนหน้าเว็บที่มีสมการคณิตศาสตร์เยอะๆ
เพิ่มการแสดงผลเป็น "output/SVG" ก่อนการแสดงผลเป็น "output/HTML-CSS"
MathJax.Hub.Config({ ... jax: ["input/TeX","output/SVG","output/HTML-CSS"], ... });
ปัญหานี้เกิดขึ้นกับการแสดงผลแบบ SVG เมื่อเราเปลี่ยนสีข้อความบนเว็บเป็นสีอื่นๆ และสมการคณิตศาสตร์ก็อยู่ในกลุ่มข้อความเหล่านั้นด้วย แต่สมการคณิตศาสตร์ยังคงแสดงผลด้วยสีดำเหมือนปกติ ไม่ถูกเน้นไปด้วย
วิธีแก้ไข ต้องตั้งค่าการแสดงผลสำหรับ SVG เพิ่มเติมให้แสดงผลด้วยสีเดียวกับข้อความรอบข้าง
MathJax.Hub.Config({ ... "SVG": { styles: { ".MathJax_SVG svg > g, .MathJax_SVG_Display svg > g": { fill: "currentColor", stroke: "currentColor" } } }, ... });
ในบางครั้ง เราอาจพิมพ์คำสั่ง LaTeX ไม่ถูกต้อง ทำให้ MathJaX ไม่แสดงคำสั่งนั้นเป็นสมการคณิตศาสตร์ และเราต้องเป็นผู้วิเคราะห์หาสาเหตุด้วยตนเอง ทำให้ค่อนข้างเสียเวลา เราสามารถตั้งค่าให้ MathJaX ช่วยแสดงข้อความบอกสาเหตุของปัญหาได้ แทนที่เราจะเห็นคำสั่ง LaTeX ที่ไม่ถูกต้องดังรูปแรก MathJaX จะบอกสาเหตุให้ดังรูปถัดไป
วิธีแก้ไข ลบ extensions "TeX/noErrors.js" และ "TeX/noUndefined.js" ออกจากส่วนที่กำหนด extensions (อย่ากำหนดตามตัวอย่างข้างล่าง)
MathJax.Hub.Config({ ... extensions: [ ... "TeX/noErrors.js","TeX/noUndefined.js" ... ], ... });
การแสดงผลแบบ SVG จะพบเจอปัญหานี้ไม่บ่อยครั้งนัก จะเกิดกับบางหน้า และบางบราวเซอร์เท่านั้น ไม่แน่ใจว่าปัญหาที่แท้จริงเกิดจากอะไร แต่คาดว่าเป็น Bug ของการแสดงผลบนบราวเซอร์ที่ลืมไปว่าต้องแสดงผล element ในรูปแบบ inline
วิธีแก้ไข เขียนชุดคำสั่งบังคับให้บราวเซอร์ต้องแสดงผล element ในรูปแบบ inline เท่านั้น เช่น
MathJax.Hub.Config({ ... "SVG": { styles: { ".MathJax_SVG": { display: "inline !important" } } }, ... });
สาเหตุของปัญหานี้เท่าที่พบ เกิดจาก 2 สาเหตุคือ
ดาวน์โหลดไฟล์ Javascript ไม่สำเร็จ
ปัญหานี้มักพบกับการใช้งานบนอินเตอร์เน็ตความเร็วต่ำ ทำให้ไฟล์ Javascript บางไฟล์ดาวน์โหลดไม่สำเร็จ
วิธีแก้ไข ต้องมีการปรับแต่งการตั้งค่า MathJaX เพื่อให้ดาวน์โหลด Javascript ไฟล์ได้สำเร็จมากที่สุด ผลจากการทดสอบเล่นบนอินเตอร์เน็ตมือถือ(GPRS/EDGE) พบว่า การดาวน์โหลด Javascript เล็กๆหลายไฟล์พร้อมกัน มีโอกาสที่จะดาวน์โหลดไฟล์สำเร็จมากกว่า การนำ Javascript หลายไฟล์มารวมเป็นไฟล์ใหญ่ไฟล์เดียว สูงมาก จึงควรหลีกเลี่ยงการใช้ไฟล์ตั้งค่าพื้นฐานที่ MathJaX ให้มา หากมีความจำเป็นต้องใช้ ก็ควรสร้างไฟล์ตั้งค่าพื้นฐานขนาดเล็กขึ้นใช้เอง นอกจากนี้ควรจะเพิ่มเวลา Timeout สำหรับการดาวน์โหลดไฟล์ Javascript ให้นานขึ้น (แก้ไขค่า MathJax.Ajax.timeout)
MathJax.Hub.Config({ ... }); MathJax.Ajax.timeout = 600000;
MahJaX เรียกใช้ชุดคำสั่ง Javascript ของไฟล์ที่ยังดาวน์โหลดไม่สำเร็จ
ปัญหานี้เป็นปัญหาที่แปลก พบเจอไม่บ่อยครั้งนัก และจะเกิดขึ้นกับบางระบบเท่านั้น พบได้กับการใช้งานบราวเซอร์ Safari บน iOS6 ทั้งบน iPhone และ iPad รวมถึงตัว Simulator ด้วย (ไม่พบปัญหานี้เมื่อใช้บราวเซอร์ Chrome/Dolphin บน iOS6) เมื่อลองตรวจสอบว่าไฟล์ไหนดาวน์โหลดไม่สำเร็จบ้าง ก็ตรวจไม่พบ
วิธีแก้ไข โมดูลสำคัญๆของ MathJaX ที่ทำให้เกิดปัญหานี้มี 3 โมดูลด้วยกัน คือ
ทั้ง 3 โมดูลนี้ทำงานประสานกันอย่างใกล้ชิด ควรรวมให้อยู่ใน Javascript เพียงไฟล์เดียว เพื่อให้เมื่อดาวน์โหลดไฟล์นี้สำเร็จ จะสามารถใช้งานทั้ง 3 โมดูลได้โดยไม่มีข้อผิดพลาด
โครงสร้างของไฟล์ Javascript ที่รวมทั้ง 3 โมดูลไว้ในไฟล์เดียว
MathJax.Ajax.Preloading( "[MathJax]/jax/input/TeX/config.js", "[MathJax]/jax/element/mml/jax.js", "[MathJax]/jax/input/TeX/jax.js" ); MathJax.Hub.Config({"v1.0-compatible":false}); /* บรรทัดข้างล่างนี้ใส่ Javascript จากไฟล์ [MathJax]/jax/input/TeX/config.js */ MathJax.InputJax.TeX=MathJax.InputJax( ... ); MathJax.InputJax.TeX.loadComplete("config.js"); /* บรรทัดข้างล่างนี้ใส่ Javascript จากไฟล์ [MathJax]/jax/element/mml/jax.js */ MathJax.ElementJax.mml=MathJax.ElementJax( ... ); MathJax.ElementJax.mml.loadComplete("jax.js"); /* บรรทัดข้างล่างนี้ใส่ Javascript จากไฟล์ [MathJax]/jax/input/TeX/jax.js */ ... MathJax.Ajax.loadComplete("[MathJax]/config/MyConfig.js");
ข้อนี้เป็นเรื่องของความไม่สะดวก ไม่เชิงเป็นปัญหาเพราะตัว MathJaX แสดงผลถูกต้องทุกอย่าง เพียงแต่เมื่อเราอ่านสมการคณิตศาสตร์ยาวๆ บนอุปกรณ์พกพาที่มีหน้าจอขนาดเล็ก เช่น iPhone สมการคณิตศาสตร์จะล้นจอภาพออกไป ทำให้การอ่านเป็นไปด้วยความไม่สะดวก เพราะนอกจากจะต้องปัดหน้าจอขึ้นลงแล้ว เราจะต้องปัดซ้ายขวาเพื่อดูสมการคณิตศาสตร์ที่ล้นจอด้านข้างด้วย
วิธีแก้ไข กำหนดค่าพารามิเตอร์ linebreaks ในทุกเทคนิคการแสดงผล เพื่อให้ MathJaX พยายามตัดสมการคณิตศาสตร์ที่ยาวล้นจอขึ้นบรรทัดใหม่ ตัวอย่างสำหรับ SVG เช่น
MathJax.Hub.Config({ ... "SVG": { ... linebreaks: { automatic: true, width: "90% container" }, ... }, ... });
ตัวเลขเปอร์เซ็นต์หมายถึง ความยาวของสมการคณิตศาสตร์ ให้มีความยาวไม่เกินกี่เปอร์เซ็นต์ของความกว้างของหน้าต่างที่สมการวางอยู่
อย่างไรก็ตามบางครั้ง MathJaX อาจตัดสมการขึ้นบรรทัดใหม่แล้วเกิดข้อผิดพลาด Math Processing Error ได้ด้วย
วิธีแก้ไข กำหนด Macros สำหรับชุดคำสั่งที่อาจโดนตัดขึ้นบรรทัดใหม่แล้วเกิดความผิดพลาดขึ้นมาใหม่ เช่น
MathJax.Hub.Config({ ... TeX: { ... Macros: { bmod: ['\\mathbin{\\rm mod}'], pmod: ['\\,\\,\\,(\\mathop{\\rm mod}\\,#1)',1], mod: ['\\,\\,\\,\\mathop{\\rm mod}\\,#1',1], pod: ['\\,\\,\\,(#1)',1] }, ... }, ... });