HarmonyOS鸿蒙Next中ArkTS如何渲染LaTex数学公式?

HarmonyOS鸿蒙Next中ArkTS如何渲染LaTex数学公式? 如题,如果不借助WebView,有没有什么方案可以渲染LaTex公式?

在Android和iOS端可以通过Math库将LaTex公式文本转成SVG矢量图或字体进行渲染,但鸿蒙NEXT目前还有没有类似的库。

然后通过如下的链接动态生成网络图片体验又很差,会影响行距和UI布局

https://latex.codecogs.com/png.latex?${this.laTex}

目前试过各种方案都不行,望大神指点~

5 回复

【背景知识】

  • formula 主要用来显示用LaTeX编写的数学公式。

【解决方案】

  • 三方库formula中的latexStringToImage接口可将LaTeX转换为ArrayBuffer,在经过image转换成PixelMap后进行展示。 示例代码(示例中三方库版本为1.0.0,使用其他版本注意接口传参不同):
import { LatexMathColorFormat, latexStringToImage } from '[@cangjie-tpc](/user/cangjie-tpc)/formula';
import { image } from '@kit.ImageKit';

@Entry
@Component
struct Index {
  str: string = "(a \\pm b)^2 = a^2 \\pm 2ab + b^2"
  @State pixelMap: image.PixelMap = undefined!;

  build() {
    Scroll() {
      Column() {
        Button("展示公式")
          .margin({left:5, top:10})
          .onClick(() => {
            this.getLatexImage()
          })
        Image(this.pixelMap)
          .objectFit(ImageFit.Contain)
          .width("80%")
          .margin({ left: 10, top: 10, bottom: 10 })
      }
      .width('100%')
      .alignItems(HorizontalAlign.Start)
    }
    .scrollBar(BarState.Off)
  }

  async getLatexImage(): Promise<void> {
    // 通过接口解析数学公式获取数学公式图片数组数据
    let buf: ArrayBuffer = await latexStringToImage(this.str, this.str.length, 200, 0xFF0000FF, 0xFFFFFFFF,
      LatexMathColorFormat.COLOR_FORMAT_BGRA_8888)
    let imageSource = image.createImageSource(buf)
    // 图片pixelMap
    this.pixelMap = imageSource.createPixelMapSync()
  }
}

【总结】

目前可以使用三方库或者WebView组件加载支持数学公式渲染的网页的方式实现,在使用三方库时注意三方库版本与DevEco Studio及SDK版本对应。

更多关于HarmonyOS鸿蒙Next中ArkTS如何渲染LaTex数学公式?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


【背景知识】

  • formula 主要用来显示用LaTeX编写的数学公式。
  • WebView 能力:支持加载本地HTML文件,可执行JavaScript并渲染复杂内容。

【解决方案】

  • 三方库formula中的latexStringToImage接口可将LaTeX转换为ArrayBuffer,在经过image转换成PixelMap后进行展示。

    示例代码(示例中三方库版本为1.0.0,使用其他版本注意接口传参不同):

    import { LatexMathColorFormat, latexStringToImage } from '[@cangjie-tpc](/user/cangjie-tpc)/formula';
    import { image } from '[@kit](/user/kit).ImageKit';
    
    [@Entry](/user/Entry)
    [@Component](/user/Component)
    struct Index {
      str: string = "(a \\pm b)^2 = a^2 \\pm 2ab + b^2"
      @State pixelMap: image.PixelMap = undefined!;
    
      build() {
        Scroll() {
          Column() {
            Button("展示公式")
              .margin({left:5, top:10})
              .onClick(() => {
                this.getLatexImage()
              })
            Image(this.pixelMap)
              .objectFit(ImageFit.Contain)
              .width("80%")
              .margin({ left: 10, top: 10, bottom: 10 })
          }
          .width('100%')
          .alignItems(HorizontalAlign.Start)
        }
        .scrollBar(BarState.Off)
      }
    
      async getLatexImage(): Promise<void> {
        // 通过接口解析数学公式获取数学公式图片数组数据
        let buf: ArrayBuffer = await latexStringToImage(this.str, this.str.length, 200, 0xFF0000FF, 0xFFFFFFFF,
          LatexMathColorFormat.COLOR_FORMAT_BGRA_8888)
        let imageSource = image.createImageSource(buf)
        // 图片pixelMap
        this.pixelMap = imageSource.createPixelMapSync()
      }
    }
    
  • 可以使用WebView组件来加载支持数学公式渲染的网页。

    示例代码如下:

    import { webview } from '[@kit](/user/kit).ArkWeb';
    
    [@Component](/user/Component)
    export struct CourseLearning {
      private webviewController: webview.WebviewController = new webview.WebviewController();
    
      build() {
        Column() {
          Web({ src: $rawfile('course_learning/index.html'), controller: this.webviewController })
            .domStorageAccess(true)
            .javaScriptAccess(true)
        }
      }
    }
    
    <!--index.html-->
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>数学公式</title>
        <!-- 使用 KaTeX 渲染数学公式 -->
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css">
        <script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js"></script>
        <script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js"></script>
        <style>
            body { padding: 20px; font-size: 18px; }
            .math { margin: 15px 0; }
        </style>
    </head>
    <body>
    <h2>数学公式示例</h2>
    
    <div class="math">勾股定理: \( a^2 + b^2 = c^2 \)</div>
    <div class="math">二次方程: \[ x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a} \]</div>
    
    <script>
      document.addEventListener("DOMContentLoaded", function() {
          renderMathInElement(document.body, {
              delimiters: [
                  {left: "\\(", right: "\\)", display: false},
                  {left: "\\[", right: "\\]", display: true}
              ]
          });
      });
    </script>
    </body>
    </html>
    

【总结】
目前可以使用WebView组件加载支持数学公式渲染的网页或者三方库的方式实现,在使用三方库时注意三方库版本与DevEco Studio及SDK版本对应。

使用web吧,目前没有很好的库,刚做这一方便的,用的webview

在HarmonyOS Next中,ArkTS可通过以下方式渲染LaTeX数学公式:

  1. 使用Web组件加载MathJax或KaTeX库
Web({
  src: 'https://example.com/mathjax-page.html'
})
  1. 通过原生扩展能力:
  • 实现C++层解析库(需封装成NAPI)
  • 在ArkTS中调用该扩展
  1. 第三方库方案:
  • 使用已适配鸿蒙的JS数学公式渲染库
  • 通过Canvas或自定义组件绘制

当前鸿蒙Next版本暂未内置LaTeX解析器,需依赖外部方案实现。

在HarmonyOS Next中渲染LaTeX公式确实是一个有挑战的需求。目前推荐以下几种可行方案:

  1. 使用第三方库转换: 可以考虑将LaTeX公式转换为SVG或PNG格式后渲染。虽然鸿蒙原生不支持LaTeX解析,但可以通过Node.js服务或云函数将LaTeX转换为矢量图,然后在ArkUI中通过Image组件显示。

  2. 自定义组件方案: 可以基于Canvas开发自定义组件,通过解析LaTeX语法实现基础公式渲染。这种方式需要实现LaTeX语法解析和绘图逻辑,开发成本较高但性能较好。

  3. 混合方案: 对于复杂公式,建议预生成SVG资源打包到应用中;对于简单公式,可以使用Text组件结合Unicode数学符号实现基础显示。

目前HarmonyOS生态还在完善中,期待未来会有官方的数学公式支持库。建议关注华为开发者联盟的更新动态。

回到顶部