在 Unity WebView 节点信息面板中,LaTeX 公式无法正确渲染,主要表现为:
\
)被显示为特殊符号(如 ♦
)Unity 向 WebView 传递数据时,存在字符编码和转义问题:
\\frac
在传递过程中变成了 \frac
,导致 LaTeX 引擎无法识别\
被错误编码为特殊字符(如 ♦
)\sum
需要正确设置上下限将 KaTeX 替换为功能更强大的 MathJax:
<script>
window.MathJax = {
tex: {
inlineMath: [['$', '$'], ['\\(', '\\)']],
displayMath: [['$$', '$$'], ['\\[', '\\]']],
processEscapes: true,
packages: ['base', 'ams', 'noerrors', 'noundefined']
},
svg: {
fontCache: 'global'
},
options: {
ignoreHtmlClass: 'tex2jax_ignore',
processHtmlClass: 'tex2jax_process'
}
};
script>
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js">script>
添加特殊字符处理和语法修复:
// 预处理LaTeX公式,修复常见错误
preprocessLatex(content) {
if (!content) return '';
console.log('预处理LaTeX公式');
// 修复常见的LaTeX语法错误
let processed = content;
// 处理特殊字符编码问题
// 将特殊字符替换回正确的LaTeX命令
processed = processed.replace(/♦rac/g, '\\frac');
processed = processed.replace(/♦/g, '\\');
processed = processed.replace(/■/g, '\\');
// 更多特殊字符替换...
// 1. 修复\frac命令
processed = processed.replace(/\\frac([^{])/g, '\\frac{$1}');
// 2. 修复\left和\right命令
processed = processed.replace(/\\left([^\\{\\[])/g, '\\left($1');
processed = processed.replace(/\\right([^\\}\\]])/g, '\\right)$1');
// 更多语法修复...
return processed;
}
\sum\limits
替代 \sum
\left(
和 \right)
确保括号大小正确\ldots
替代 ...
在 Unity 端使用标准 JSON 序列化:
[System.Serializable]
public class PanelMessage {
public string type = "OPEN_PANEL_RESPONSE";
public string name;
public string title;
public string content;
}
// 使用JsonUtility序列化对象
var message = new PanelMessage {
name = "mathNode",
title = "数学公式",
content = "这是一个公式: $\\frac{1}{2}$" // 注意这里的反斜杠需要双写
};
string json = JsonUtility.ToJson(message);
string jsCode = $"simulateUnityMessage({json})";
\\
表示 LaTeX 中的单反斜杠 \
Unity WebView 中 LaTeX 渲染问题主要源于字符编码、转义处理和渲染引擎选择。通过更换为 MathJax 渲染引擎,增强预处理函数,修复公式语法,以及在 Unity 端使用标准 JSON 序列化,可以有效解决这些问题,实现复杂 LaTeX 公式的正确渲染。