在线教育中公式的使用小结

2023年 10月 9日 50.2k 0

公式格式简述

  • Latex

    一种排版系统和标记语言,通常用于科学、技术、工程和数学(STEM)领域的文档,如学术论文、报告、书籍等。

    在学术界和专业领域中得到广泛应用。

    示例:sqrt[y]{x} 渲染为 xysqrt[y]{x}yx​

  • MML (MathML)

    全称为 Mathematical Markup Language(数学标记语言),一种用于在计算机中描述数学公式和数学内容的标记语言,它使用 XML 格式来在计算机系统中表示数学公式。

    示例:

    
    	
    		x
    		y
    	
    
    
  • OMML

    Office Math Markup Language(OMML)是由微软开发的一种标记语言,用于在Microsoft Office文档中表示和排版数学公式和数学内容。OMML 是一种基于XML的标记语言,旨在帮助用户在Microsoft Word、Microsoft PowerPoint 和 Microsoft Excel等Office应用程序中创建和编辑复杂的数学表达式。

    OMML 用于 Office Word 中渲染,这里不放示例了。

  总结一下这个三种公式格式:

  • Latex 在大型论文领域应用的最广泛,所以它对各种奇形怪状的化学/物理公式支持的都较好;
  • MML 主要是为了在网页上渲染数学公式;
  • OMML 主要是为了在 Office 中渲染数学公式。

成熟的教育产品是如何使用公式的?

  MML/OMML 都是侧重于 数学公式,而 Latex 对于理科公式都能良好的表达。

  但 MML 便于网页渲染,Latex 则无法直接在网页上渲染。

  目前的在线题库/教育资源等网站,一般都采用同时保存 MML/ Latex 公式,便于不同场景的使用。

  学科网开放平台推题返回试题信息示例:

  我们可以看到,仍在标签中保留了 latex 源码,主要可能用于后台试题编辑。

 
                xOy
            
            中,已知圆
            
                
                    C:5x2+5y2+10y−4=0
                
            

  学科网页面渲染,采用 将公式转为 SVG 的方式渲染

image-20231008145216-5w1u0cu.png

  21世纪教育网暂无开放平台,页面渲染则采用将 MML 公式转为 PNG 的方式来渲染

image-20231008151810-lf2yguf.png

公式格式转换

  在线题库的题量需求很大,达到百万级也只是毛毛雨。

  试题大部分都来源于批量导入,而不是教研老师一道题一道题在页面上编辑。

  使用到最多的就是 Word 导入,而上面我们讲过,Word 中公式的格式为 OMML 格式,所以此时就涉及到 OMML --> Latex / MML 格式的转换。

  公式之间的相互转换,不是一件简单的事。因为他们各自都有自己的标准。

  有一件尴尬的事,目前并没有很好的直接转换 OMML 为 Latex 的方法,所以公式转换的路径一般为 OMML --> MML --> Latex。

  比较幸运的,Office 中携带了一些映射文件,我们可以借助映射文件,比较方便的实现上述的路径。

  使用方法具体如下:

  • 将映射文件放入项目中

    image-20231008160254-xvd7qjl.png

  • 构建转换方法

    
        //设置xls依赖文件的路径
        public static URIResolver r = (href, base) -> {
            InputStream inputStream = FormulaConvertUtil.class.getResourceAsStream("/formula/xsl/" + href);
            return new StreamSource(inputStream);
        };
    
        /**
         * 

    Description: office mathml转为mml

    * * @param xml * @return */ public static String convertOMMLToMML(String xml) { String result = xslConvert(xml, "/formula/xsl/omml2mml.xsl", null); return result; } /** * mathml to latex * * @param mml mathml 公式源码 * @return java.lang.String */ public static String convertMMLToLatex(String mml) { String latex = xslConvert(mml, "/formula/xsl/mmltex.xsl", r); //latex = latex.replaceAll("△"," \\triangle "); return latex; } /** * xsl Convert * * @param formula 公式 * @param uriResolver 转换器 * @return java.lang.String * @author YangXinFu */ public static String xslConvert(String formula, String xslPath, URIResolver uriResolver) { TransformerFactory tFac = TransformerFactory.newInstance(); if (uriResolver != null) tFac.setURIResolver(uriResolver); // InputStream inputStream = FormulaConvertUtil.class.getResourceAsStream("/formula/xsl/mmltex.xsl"); InputStream inputStream = FormulaConvertUtil.class.getResourceAsStream(xslPath); StreamSource xslSource = new StreamSource(inputStream); StringWriter writer = new StringWriter(); try { Transformer t = tFac.newTransformer(xslSource); Source source = new StreamSource(new StringReader(formula)); Result result = new StreamResult(writer); t.transform(source, result); } catch (TransformerException e) { log.warn("公式转换失败。",e); return ""; } return writer.getBuffer().toString(); }
  •   到这里基本可以使用了,但还需要注意转换并不是 100% 映射,不常用的符号有可能失败。

    Latex转图

      在 Java 中 Latex 公式转图片,一般使用 jlatexmath 。

      但是在 Maven 仓库中 1.0.8 版本,不支持 ce 命令,使用时需要注意。

      ce 命令被包含在 Latex 的 Mhchem 扩展中,所以需要额外功能支持。例如:ce{SO4^2- + Ba^2+ -> BaSO4 v} 应渲染为 :

    image.png
      

    但,其实早在 2018 年,已经有人提过 issue:

    image-20231008163131-imifwdy.png

      对于 mhchem 的支持,已经被合并到 github.com/opencollab/… 实验分支上,并未推送正式版 jar 包到 Maven Resp 中。

      所以想要使用该特性,我们只需要将 experimental 分支代码拉到本地,进行简单的修改,打包推送到自己的 Maven 私服中便可使用。

      在此分支中,包含一些 GWT 的代码

    GWT 是 Google Web Toolkit 的缩写,它是一个用于构建富客户端 Web 应用程序的开源开发工具集。GWT 最初由 Google 开发并发布,旨在帮助开发人员使用 Java 编程语言来构建现代的、高性能的、交互式的 Web 应用程序。

    开发人员可以使用熟悉的 Java 编程语言来构建客户端代码,然后使用 GWT 编译器将 Java 代码转换为高效的 JavaScript 代码。

      但是,对在服务转换的情况,基本没什么用。我们只需要“酌情”把 GWT 相关的代码,全部干掉就行了。

      打完包,使用方法如下:

        // 这里需要初始化一个 Provider。
        static {
            FactoryProvider.setInstance(new FactoryProviderDesktop());
        }
    
        public static Image latexToImg(String latex, Float size) {
    
            int style = TeXConstants.STYLE_DISPLAY; // 样式 符号以最大的尺寸呈现
            float fontSize = Objects.isNull(size) ? 16 : size ; // 生成公式图片的字体大小
            // 字体颜色,黑色
            ColorD fg = new ColorD(Color.BLACK);
    
            TeXFormula.setDPITarget(72);
    
            return (BufferedImage) TeXFormula.createBufferedImage(latex, style, fontSize * 3, fg, null);
        }
    

      另外,还有 Aspose.TeX 工具可以转图,但是暂不支持中文,即公式中包含中文时,会乱码。

    小结

      在线题库项目中,公式可存储为 Latex/MML 两种格式,MML 进一步可转为 SVG/PNG 等格式在线渲染,Latex 格式可用于在线编辑。

      MML目前没有友好的可视化编辑器,而 Latex 公式有 LatexLive 等很优秀的可视化编辑器。

    image.png

      另外,公式转换想一劳永逸是不可能的事,因为总会有一些奇奇怪怪的符号没发转换,这时只能手动的进行符号对应。

    举个例子:

    Latex 中有长等号 $xlongequal[b]{a}$ 表现为 =baxlongequal[b]{a}ab​
    但是 OMML 并没有对应的符号可以表示,只能通过其他形式处理。

      

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论