HarmonyOS 鸿蒙Next中MathLive实现数学公式编辑

HarmonyOS 鸿蒙Next中MathLive实现数学公式编辑 可以在HarmonyOS Next里使用js库吗?我想利用MathLive实现数学公式编辑,这条路可行吗?能不做修改或者不做大的修改在鸿蒙项目中使用MathLive吗?还是已经把Mathlive迁移过来了?如果可以的话,该怎么做呢?不可以的话有其他方案嘛?

4 回复

【背景知识】

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

【解决方案】

  • HarmonyOS目前没有提供专门的数学公式渲染组件,可以使用WebView组件来加载支持数学公式渲染的网页。

    Web代码示例代码如下:

import { webview } from '@kit.ArkWeb';

@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)
    }
  }
}

方案一:使用KaTeX渲染数学公式的html示例代码如下:

<!--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>

方案二:使用MathJax.js渲染公式,并将个别符号修改成特殊颜色的示例代码如下:

<!DOCTYPE html>
<html lang="zh">
<head>
  <meta charset="UTF-8" />
  <title >MathJax 颜色公式示例</title>
  <meta name="viewport" content="initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no">
  <!-- 加载 MathJax CDN -->
  <script src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
  <style>
      body {
        font-family: Arial, sans-serif;
        margin: 40px;
        line-height: 1.6;
      }
      .formula {
        background-color: #f4f4f4;
        padding: 10px;
        border-radius: 5px;
        margin: 10px 0;
        text-align: center;
      }
  </style>
</head>
<body>
<h3>MathJax 使用 \color 改变变量颜色</h3>
<p>用法:`\color{颜色名}{变量}`,例如:<code>\color{red}{x}</code></p>
<div class="formula">
  <!-- 某个符号变绿色 -->
  $$
  \color{black}{x}^2 \color{red}{+} \color{black}{y}^2 = r^2
  $$
</div>

<div class="formula">
  <!-- 混合颜色 + 文字 -->
  $$
  \text{当 } \color{purple}{a > 0} \text{ 时,方程有两个实根。}
  $$
</div>

<div class="formula">
  <!-- 更多颜色支持(CSS 颜色名或十六进制) -->
  $$
  \color{orange}{\sin \theta} + \color{#FF69B4}{\cos \theta} = \color{darkgreen}{1}
  $$
</div>

<div class="formula">
  <!-- 只改变一个符号的颜色 -->
  $$
  \sum_{i=1}^{n} \color{yellow}{a_i} = \frac{n(n+1)}{2}
  $$
</div>
</body>
</html>

三方库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()
  }
}

更多关于HarmonyOS 鸿蒙Next中MathLive实现数学公式编辑的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


MathLive不能直接使用,官方未提供MathLive迁移版本,原生ArkUI使用不了,可以试下使用ArkWeb,通过ArkWeb组件封装为鸿蒙应用模块,通过Web组件与原生应用进行数据通信,文档参考:https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-arkweb_rendering_framework

HarmonyOS Next中MathLive通过ArkTS实现数学公式编辑,支持LaTeX语法输入与实时渲染。组件提供虚拟键盘、符号面板和公式结构模板,可处理分式、根号、矩阵等复杂表达式。采用声明式UI开发,通过@State管理公式数据状态,结合Canvas进行矢量绘制。支持公式导出为SVG或MathML格式,适用于教育、科研类应用场景。

在HarmonyOS Next中,您可以通过ArkTS/JS前端开发能力集成MathLive等JavaScript库。由于HarmonyOS Next支持基于ArkCompiler的JS运行环境,MathLive这类基于Web技术的库可以适配使用,但需注意以下事项:

  1. 直接使用可行性:MathLive未针对鸿蒙做官方迁移,但因其基于标准JS/HTML/CSS,理论上可通过Web组件(如<Web>)或Native API封装调用,但可能需要调整兼容性(如DOM操作和样式适配)。

  2. 修改需求:若库依赖浏览器特定API(如document、window),需通过鸿蒙的Web视图或模拟环境处理,或使用鸿蒙的Native API替代部分功能。建议优先检查MathLive的依赖项,若仅依赖核心逻辑且无强浏览器耦合,可尝试直接引入。

  3. 替代方案:若适配成本较高,可考虑以下方向:

    • 使用鸿蒙原生组件开发公式编辑功能(需自主实现渲染逻辑)。
    • 探索开源或商业的跨平台公式库(如MathJax),并通过Web组件集成。
    • 若项目允许,结合C++库通过NAPI桥接调用。

建议先通过DevEco Studio创建JS项目或Web组件进行小范围测试,验证MathLive的核心功能是否正常运行。

回到顶部