Skip to content

Parser API

katex-ui/parser 提供一个 LaTeX 子集到计算表达式的转换层。

它不是完整 LaTeX 引擎,也不是 KaTeX 计算器。它的职责是把常见公式输入转换成 katex-ui/core 可以计算的表达式。

latexToExpression(source)

ts
latexToExpression('\\frac{price \\times count}{discount}');
// '((price * count) / (discount))'

支持的第一批语法:

LaTeX输出表达式
a \times ba * b
a \cdot ba * b
a \div ba / b
\frac{a}{b}((a) / (b))
\dfrac{a}{b}((a) / (b))
\tfrac{a}{b}((a) / (b))
\sqrt{x}sqrt(x)
x^{2}x^(2)
price_{net}price_net
\left(a + b\right)(a + b)
\min(a, b)min(a, b)
\max(a, b)max(a, b)
\round(x)round(x)
\sin{x}sin(x)
\cos{x}cos(x)
\tan{x}tan(x)
\log{x}log(x)
\ln{x}log(x)
\exp{x}exp(x)
\abs{x}abs(x)
\operatorname{round}(x)round(x)
\operatorname{sqrt}(x)sqrt(x)

不支持的 LaTeX 命令会返回 INVALID_LATEX,不会被静默转换成变量名。这个策略可以避免用户误以为复杂排版语法已经进入计算链路。

parseLatexFormula(source)

返回原始输入、转换后的表达式、变量和解析错误。

ts
parseLatexFormula('\\sqrt{price + tax}');

calculateLatexFormula(source, values)

先转换 LaTeX,再复用 core 计算。

ts
calculateLatexFormula('\\frac{price \\times count}{discount}', {
  price: 100,
  count: 2,
  discount: 4,
});

createLatexFormulaSchema(options)

把 LaTeX 输入转换成 FormulaSchema,可以直接交给 React 适配器渲染。

ts
createLatexFormulaSchema({
  source: '\\frac{price \\times count}{discount}',
  fields: [
    { name: 'price', label: '单价', defaultValue: 100 },
    { name: 'count', label: '数量', defaultValue: 2 },
    { name: 'discount', label: '折扣因子', defaultValue: 4 },
  ],
  result: {
    label: '结果',
  },
});

createLatexFormulaCalculator(options)

返回解析结果、可序列化配置、schema 和可复用的 calculate(values)

ts
const calculator = createLatexFormulaCalculator({
  source: '\\frac{price \\times count}{discount}',
});

calculator.config;
calculator.expression;
// '((price * count) / (discount))'

calculator.calculate({ price: 100, count: 2, discount: 4 });
// { value: 50, errors: [] }

createLatexFormulaCalculatorConfig(options)

只生成可序列化配置,不绑定计算 runner。

ts
createLatexFormulaCalculatorConfig({
  source: '\\frac{price \\times count}{discount}',
  fields: [
    { name: 'price', label: '单价', defaultValue: 100 },
    { name: 'count', label: '数量', defaultValue: 2 },
  ],
});