javascript - MathJax svg 输出然后将其转换为 png

标签 javascript mathjax

嘿伙计们,我试图将我的 mathjax 转换为 svg,然后将其转换为 png,但我遇到了问题,问题是我无法将我的 mathjax 转换为 svg 我尝试使用 this solution 但当我收到变量未定义错误(mjOut 未定义)时它正在工作:/。奇怪的是我能够完美地渲染 mathjax。详细说明一下,这是我的代码(几乎相同),还有一个屏幕截图:screenshot of the console

var mj2img = function(texstring, callback) {
    var input = texstring;
    var wrapper = document.createElement("div");
    wrapper.innerHTML = input;
    var output = { svg: "", img: ""};
    MathJax.Hub.Queue(["Typeset", MathJax.Hub, wrapper]);
    MathJax.Hub.Queue(function() {
        //This is where the error is (mjOut is undefined)
        var mjOut = wrapper.getElementsByTagName("svg")[0];
        console.log(wrapper.getElementsByTagName("svg"));
        mjOut.setAttribute("xmlns", "http://www.w3.org/2000/svg");
        // thanks, https://spin.atomicobject.com/2014/01/21/convert-svg-to-png/
        output.svg = mjOut.outerHTML;
        var image = new Image();
        image.src = 'data:image/svg+xml;base64,' + window.btoa(unescape(encodeURIComponent(output.svg)));
        image.onload = function() {
            var canvas = document.createElement('canvas');
            canvas.width = image.width;
            canvas.height = image.height;
            var context = canvas.getContext('2d');
            context.drawImage(image, 0, 0);
            output.img = canvas.toDataURL('image/png');
            callback(output);
        };
    });
}
$("#equation-write").click(function()
{
    //Let's assume its sin(30) = 0.5.
    var TeX = $("#MathInput").val();
    var jax = MathJax.Hub.getAllJax()[0];
    mj2img(TeX, function(output){
        // console.log(texstring);
        console.log(output.img);
    }

最佳答案

您显示的控制台输出表明 getElementsByTagName() 调用未返回任何元素(HTMLCollection 为空),因此 mjOut 应该为空。这意味着包装器中没有 svg 元素。

问题是:为什么包装器中没有 svg 元素?好吧,渲染器可能设置为其他渲染器之一而不是 SVG 渲染器(您尚未显示您使用的 MathJax 配置文件,尽管渲染器可以通过 MathJax 上下文菜单设置,因此可能无论如何都不是配置文件中的那个)。但更有可能的是,这意味着包装器的内容不包含任何正确分隔的数学。

请记住,TeX 数学包含在 \(...\)\[...\] 中(或其他可能的情况,具体取决于配置)。如果 $("#MathInput").val() 不包含此类分隔符,则 MathJax 将找不到任何要处理的数学,因此不会生成任何 svg 元素。 (同样,您还没有说明您正在使用的输入格式是什么,但由于代码使用 TeX 作为变量,我假设它是 TeX 代码,而不是 AsciiMath 或 MathML。)

请注意,您链接到的帖子中的示例确实包含分隔符:"\\[f: X\\to Y\\]"。这里,反斜杠是双倍的,因为它们在 javascript 字符串文字中具有特殊含义,因此您需要使用 \\ 来获取字符串本身中的单个 \ 。由于您是从输入或文本区域标记的内容中获取字符串(大概,您没有在帖子中包含该字符串),因此当您在此处键入值时,无需使用双反斜杠。如果您这样做了,那么这也可以解释为什么您没有获得任何数学 MathJax svg 输出。

无论如何,这里没有足够的信息来诊断问题。作为可运行代码的完整示例(如您链接到的帖子中)将有很大帮助。如果您在其他控制台消息后添加 console.log(wrapper.outerHTML);,您可能能够看到您正在搜索的 div 中实际包含的内容,并且将能够判断 MathJax 是否找到了数学。

关于javascript - MathJax svg 输出然后将其转换为 png,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49154170/

相关文章:

javascript - 带天、周、月和年的秒表/倒数计时器

javascript - 在 html 输入字段(文本框)中插入 javascript (jquery) 变量

html - 如何创建带有描述的方程表?

javascript - 如何使用 Mathjax 将 LaTeX 方程放入输入标签中

angularjs - 在 Angularjs 中加载新 View 后刷新 MathJax

javascript - 以现代方式获取 <select> 的值(value)?

javascript - 需要对带有选项卡导航(分页)的猫头鹰幻灯片进行 jquery 和 litte html css 改进

javascript - 如何在 javascript 中使用当前月份获取前 3 个月的数据?

html - Mathjax 模板不能在本地计算机上工作

latex - 我可以将LaTeX软件包添加到MathJax吗?