Android判断LaTeX是否为空方程

Android判断LaTeX是否为空方程

在《Android实现方程编辑器》一文中遗留了2个问题,中文及空方程判断。

在《Android完美解决LaTeX中文显示问题》一文中,解决了中文显示问题。

这篇文章继续探索判断空方程的实现方案。

一、目标

判断LaTeX是否为空方程。

二、方案分析

处理LaTeX分为2个过程。

序号 过程 说明
1 解析 String解析为TeXFormula
2 渲染 TeXFormula渲染为TeXIcon

因此,可以从TeXFormulaTeXIcon分别入手来判断方程是否为空。

  • Atom

TeXFormula的内容包含在Atom中,Atom66个直接子类。

  • Box

TeXIcon的内容包含在Box中,Box14个直接子类。

同时AtomBox都没有提供判断是否为空的方法。因此,需要自己实现判空功能。

比较AtomBox的子类数量,选择从Box入手来实现判空功能。

三、功能实现

  • Box添加判空方法
1
2
3
4
5
6
7
8
9
10
11
12
13
public boolean isEmpty() {
if (children.isEmpty()) {
return false;
} else {
for (Box x : children) {
if (!x.isEmpty()) {
return false;
}
}

return true;
}
}
  • 子类中实现isEmpty()接口

isEmpty()的接口实现依据是draw()方法是否绘制了内容。

如果draw()方法有绘制内容,则为false

如果draw()方法没有绘制内容,则为true

四、方案调整

在《Android实现方程编辑器》一文中,解析和渲染是分为2个过程实现的。

首先通过解析判断方程的有效性,然后在进行渲染。

因为现在必须在渲染阶段才能判断方程是否为空,因此前置的解析已经没有意义,直接进行渲染,并根据渲染结果进行判断。

同时,TeXFormula提供了partial解析接口。

1
public static TeXFormula getPartialTeXFormula(String formula);

我们使用该接口,以避免频繁出现的无效方程提示。用户也可以得到及时反馈以修正方程。

以下是最终代码。

依次判断

  1. 字符串内容是否为空
  2. 采用partial方式解析字符串
  3. 判断解析是否异常,是否为无效方程(采用partial方式,理论上不会出现)
  4. 判断方程是否为空
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
void requestFormula(String text) {

this.formulaWidth = 0;
this.formulaHeight = 0;

if (TextUtils.isEmpty(text)) {
titleBar.setPositiveEnable(false);

mathView.setVisibility(View.INVISIBLE);

resultLayout.setVisibility(View.VISIBLE);
resultIcon.setVisibility(View.INVISIBLE);
resultView.setHint("方程预览");

return;
}

Exception exception = null;
try {
mathView.setLatex(text, true);
} catch (Exception e) {
exception = e;
}

if (exception != null) {
titleBar.setPositiveEnable(false);

mathView.setVisibility(View.INVISIBLE);

resultLayout.setVisibility(View.VISIBLE);
resultIcon.setVisibility(View.VISIBLE);
resultView.setHint("无效方程");

return;
}

boolean isEmpty = true;
JLatexMathDrawable drawable = mathView.getDrawable();
if (drawable != null) {
TeXIcon icon = drawable.getIcon();
if (icon != null) {
Box box = icon.getBox();
if (box != null) {
isEmpty = box.isEmpty();
}
}
}

if (isEmpty) {
titleBar.setPositiveEnable(false);

mathView.setVisibility(View.INVISIBLE);

resultLayout.setVisibility(View.VISIBLE);
resultIcon.setVisibility(View.VISIBLE);
resultView.setHint("空方程");

return;
}

{
titleBar.setPositiveEnable(!formulaText.equals(text));

mathView.setVisibility(View.VISIBLE);

resultLayout.setVisibility(View.INVISIBLE);
}

{
this.formulaWidth = drawable.getIntrinsicWidth();
this.formulaHeight = drawable.getIntrinsicHeight();
}

}

五、Next

历经了以下几个开发过程。

  1. iOS Pages插入方程功能分析
  2. Android插入方程技术方案分析
  3. Android实现方程编辑器
  4. Android完美解决LaTeX中文显示问题

以及本文处理的判断空方程。一个基础功能的方程编辑器至此完成。

接下来有2件事情可做。

  1. 将方程编辑器整合到『神马笔记』,实现『神马笔记』插入方程功能;
  2. 尝试支持MathML;

六、Finally

~杯再拜~道麾之即去~招则须来~