asciimath 1.0.9 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/AST.adoc +457 -0
- data/CHANGELOG.adoc +12 -0
- data/Gemfile.lock +39 -0
- data/README.adoc +27 -3
- data/asciimath.gemspec +9 -5
- data/lib/asciimath.rb +5 -4
- data/lib/asciimath/ast.rb +456 -0
- data/lib/asciimath/cli.rb +4 -1
- data/lib/asciimath/color_table.rb +21 -0
- data/lib/asciimath/html.rb +126 -111
- data/lib/asciimath/latex.rb +386 -0
- data/lib/asciimath/markup.rb +478 -0
- data/lib/asciimath/mathml.rb +189 -87
- data/lib/asciimath/parser.rb +498 -343
- data/lib/asciimath/symbol_table.rb +25 -0
- data/lib/asciimath/version.rb +1 -1
- data/spec/ast.rb +144 -0
- data/spec/parser_spec.rb +592 -165
- data/spec/schema/mathml2/common/common-attribs.xsd +41 -0
- data/spec/schema/mathml2/common/math.xsd +126 -0
- data/spec/schema/mathml2/common/xlink-href.xsd +20 -0
- data/spec/schema/mathml2/content/arith.xsd +90 -0
- data/spec/schema/mathml2/content/calculus.xsd +146 -0
- data/spec/schema/mathml2/content/common-attrib.xsd +30 -0
- data/spec/schema/mathml2/content/constants.xsd +83 -0
- data/spec/schema/mathml2/content/constructs.xsd +260 -0
- data/spec/schema/mathml2/content/elementary-functions.xsd +117 -0
- data/spec/schema/mathml2/content/functions.xsd +73 -0
- data/spec/schema/mathml2/content/linear-algebra.xsd +173 -0
- data/spec/schema/mathml2/content/logic.xsd +53 -0
- data/spec/schema/mathml2/content/relations.xsd +55 -0
- data/spec/schema/mathml2/content/semantics.xsd +85 -0
- data/spec/schema/mathml2/content/sets.xsd +236 -0
- data/spec/schema/mathml2/content/statistics.xsd +136 -0
- data/spec/schema/mathml2/content/tokens.xsd +120 -0
- data/spec/schema/mathml2/content/vector-calculus.xsd +88 -0
- data/spec/schema/mathml2/mathml2.xsd +59 -0
- data/spec/schema/mathml2/presentation/action.xsd +44 -0
- data/spec/schema/mathml2/presentation/characters.xsd +37 -0
- data/spec/schema/mathml2/presentation/common-attribs.xsd +113 -0
- data/spec/schema/mathml2/presentation/common-types.xsd +103 -0
- data/spec/schema/mathml2/presentation/error.xsd +40 -0
- data/spec/schema/mathml2/presentation/layout.xsd +195 -0
- data/spec/schema/mathml2/presentation/scripts.xsd +186 -0
- data/spec/schema/mathml2/presentation/space.xsd +52 -0
- data/spec/schema/mathml2/presentation/style.xsd +69 -0
- data/spec/schema/mathml2/presentation/table.xsd +216 -0
- data/spec/schema/mathml2/presentation/tokens.xsd +124 -0
- data/spec/schema/mathml3/mathml3-common.xsd +99 -0
- data/spec/schema/mathml3/mathml3-content.xsd +684 -0
- data/spec/schema/mathml3/mathml3-presentation.xsd +2151 -0
- data/spec/schema/mathml3/mathml3-strict-content.xsd +186 -0
- data/spec/schema/mathml3/mathml3.xsd +9 -0
- metadata +102 -10
- data/.gitignore +0 -16
- data/.travis.yml +0 -18
@@ -0,0 +1,25 @@
|
|
1
|
+
module AsciiMath
|
2
|
+
class SymbolTableBuilder
|
3
|
+
def initialize()
|
4
|
+
@table = {}
|
5
|
+
end
|
6
|
+
|
7
|
+
def add(*args)
|
8
|
+
raise 'Insufficient arguments' if args.length < 3
|
9
|
+
|
10
|
+
entry = {}
|
11
|
+
if args.last.is_a?(Hash)
|
12
|
+
entry.merge!(args.pop)
|
13
|
+
end
|
14
|
+
entry[:type] = args.pop
|
15
|
+
entry[:value] = args.pop
|
16
|
+
|
17
|
+
entry.freeze
|
18
|
+
args.each { |name| @table[name.freeze] = entry }
|
19
|
+
end
|
20
|
+
|
21
|
+
def build
|
22
|
+
@table.dup.freeze
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/asciimath/version.rb
CHANGED
data/spec/ast.rb
ADDED
@@ -0,0 +1,144 @@
|
|
1
|
+
require_relative '../lib/asciimath/ast'
|
2
|
+
|
3
|
+
module AsciiMath
|
4
|
+
module ASTHelper
|
5
|
+
ACTUAL_AST = Class.new do
|
6
|
+
include ::AsciiMath::AST
|
7
|
+
end.new
|
8
|
+
|
9
|
+
def grseq(*expressions)
|
10
|
+
group(seq(*expressions))
|
11
|
+
end
|
12
|
+
|
13
|
+
def seq(*expressions)
|
14
|
+
mapped = expressions.map { |e| to_ast(e) }
|
15
|
+
ACTUAL_AST.expression(*mapped)
|
16
|
+
end
|
17
|
+
|
18
|
+
def paren(*args)
|
19
|
+
case args.length
|
20
|
+
when 1
|
21
|
+
lparen = symbol('(')
|
22
|
+
e = to_ast(args[0])
|
23
|
+
rparen = symbol(')')
|
24
|
+
when 3
|
25
|
+
lparen = args[0]
|
26
|
+
e = to_ast(args[1])
|
27
|
+
rparen = args[2]
|
28
|
+
else
|
29
|
+
raise "Incorrect argument count #{args.length}"
|
30
|
+
end
|
31
|
+
ACTUAL_AST.paren(lparen, e, rparen)
|
32
|
+
end
|
33
|
+
|
34
|
+
def group(*args)
|
35
|
+
case args.length
|
36
|
+
when 1
|
37
|
+
lparen = symbol('(')
|
38
|
+
e = to_ast(args[0])
|
39
|
+
rparen = symbol(')')
|
40
|
+
when 3
|
41
|
+
lparen = args[0]
|
42
|
+
e = to_ast(args[1])
|
43
|
+
rparen = args[2]
|
44
|
+
else
|
45
|
+
raise "Incorrect argument count #{args.length}"
|
46
|
+
end
|
47
|
+
ACTUAL_AST.group(lparen, e, rparen)
|
48
|
+
end
|
49
|
+
|
50
|
+
def subsup(e, sub, sup)
|
51
|
+
ACTUAL_AST.subsup(to_ast(e), to_ast(sub), to_ast(sup))
|
52
|
+
end
|
53
|
+
|
54
|
+
def sub(e, sub)
|
55
|
+
ACTUAL_AST.sub(to_ast(e), to_ast(sub))
|
56
|
+
end
|
57
|
+
|
58
|
+
def sup(e, sup)
|
59
|
+
ACTUAL_AST.sup(to_ast(e), to_ast(sup))
|
60
|
+
end
|
61
|
+
|
62
|
+
def unary(operator, e)
|
63
|
+
ACTUAL_AST.unary(to_ast(operator), to_ast(e))
|
64
|
+
end
|
65
|
+
|
66
|
+
def binary(operator, e1, e2)
|
67
|
+
ACTUAL_AST.binary(to_ast(operator), to_ast(e1), to_ast(e2))
|
68
|
+
end
|
69
|
+
|
70
|
+
def infix(e1, operator, e2)
|
71
|
+
ACTUAL_AST.infix(to_ast(e1), to_ast(operator), to_ast(e2))
|
72
|
+
end
|
73
|
+
|
74
|
+
def text(value)
|
75
|
+
ACTUAL_AST.text(value)
|
76
|
+
end
|
77
|
+
|
78
|
+
def identifier(value)
|
79
|
+
ACTUAL_AST.identifier(value)
|
80
|
+
end
|
81
|
+
|
82
|
+
def number(value)
|
83
|
+
ACTUAL_AST.number(value)
|
84
|
+
end
|
85
|
+
|
86
|
+
def color(r, g, b, value)
|
87
|
+
ACTUAL_AST.color(r, g, b, value)
|
88
|
+
end
|
89
|
+
|
90
|
+
def symbol(text)
|
91
|
+
symbol = ::AsciiMath::Parser::DEFAULT_PARSER_SYMBOL_TABLE[text]
|
92
|
+
if symbol
|
93
|
+
ACTUAL_AST.symbol(symbol[:value], text)
|
94
|
+
else
|
95
|
+
nil
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def matrix(*args)
|
100
|
+
case args.length
|
101
|
+
when 1
|
102
|
+
lparen = symbol('(')
|
103
|
+
rows = args[0]
|
104
|
+
rparen = symbol(')')
|
105
|
+
when 3
|
106
|
+
lparen = args[0]
|
107
|
+
rows = args[1]
|
108
|
+
rparen = args[2]
|
109
|
+
else
|
110
|
+
raise "Incorrect argument count #{args.length}"
|
111
|
+
end
|
112
|
+
|
113
|
+
rows = rows.map do |row|
|
114
|
+
row.map do |col|
|
115
|
+
to_ast(col)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
ACTUAL_AST.matrix(lparen, rows, rparen)
|
120
|
+
end
|
121
|
+
|
122
|
+
def to_ast(e)
|
123
|
+
case e
|
124
|
+
when String
|
125
|
+
s = symbol(e)
|
126
|
+
if s
|
127
|
+
s
|
128
|
+
elsif e =~ /[0-9]+(.[0-9]+)?/
|
129
|
+
number(e)
|
130
|
+
elsif e.length > 1
|
131
|
+
text(e)
|
132
|
+
else
|
133
|
+
identifier(e)
|
134
|
+
end
|
135
|
+
when Symbol
|
136
|
+
raise "Not supported"
|
137
|
+
when Array
|
138
|
+
seq(*e)
|
139
|
+
else
|
140
|
+
e
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
data/spec/parser_spec.rb
CHANGED
@@ -1,179 +1,606 @@
|
|
1
1
|
#encoding: utf-8
|
2
2
|
require 'rspec'
|
3
3
|
require 'asciimath'
|
4
|
+
require 'ast'
|
5
|
+
require 'nokogiri'
|
4
6
|
|
5
|
-
TEST_CASES = {
|
6
|
-
'x+b/(2a)<+-sqrt((b^2)/(4a^2)-c/a)' =>
|
7
|
-
{
|
8
|
-
:mathml => '<math><mi>x</mi><mo>+</mo><mfrac><mi>b</mi><mrow><mn>2</mn><mi>a</mi></mrow></mfrac><mo><</mo><mo>±</mo><msqrt><mrow><mfrac><msup><mi>b</mi><mn>2</mn></msup><mrow><mn>4</mn><msup><mi>a</mi><mn>2</mn></msup></mrow></mfrac><mo>−</mo><mfrac><mi>c</mi><mi>a</mi></mfrac></mrow></msqrt></math>',
|
9
|
-
:html => nil,
|
10
|
-
},
|
11
|
-
'a^2 + b^2 = c^2' =>
|
12
|
-
{
|
13
|
-
:mathml => '<math><msup><mi>a</mi><mn>2</mn></msup><mo>+</mo><msup><mi>b</mi><mn>2</mn></msup><mo>=</mo><msup><mi>c</mi><mn>2</mn></msup></math>',
|
14
|
-
:html => '<span class="math-inline"><span class="math-row"><span class="math-identifier">a</span><span class="math-subsup"><span class="math-smaller"><span class="math-number">2</span></span><span class="math-smaller">‍</span></span><span class="math-operator">+</span><span class="math-identifier">b</span><span class="math-subsup"><span class="math-smaller"><span class="math-number">2</span></span><span class="math-smaller">‍</span></span><span class="math-operator">=</span><span class="math-identifier">c</span><span class="math-subsup"><span class="math-smaller"><span class="math-number">2</span></span><span class="math-smaller">‍</span></span></span></span>',
|
15
|
-
},
|
16
|
-
'x = (-b+-sqrt(b^2-4ac))/(2a)' =>
|
17
|
-
{
|
18
|
-
:mathml => '<math><mi>x</mi><mo>=</mo><mfrac><mrow><mo>−</mo><mi>b</mi><mo>±</mo><msqrt><mrow><msup><mi>b</mi><mn>2</mn></msup><mn>-4</mn><mi>a</mi><mi>c</mi></mrow></msqrt></mrow><mrow><mn>2</mn><mi>a</mi></mrow></mfrac></math>',
|
19
|
-
:html => nil
|
20
|
-
},
|
21
|
-
'm = (y_2 - y_1)/(x_2 - x_1) = (Deltay)/(Deltax)' =>
|
22
|
-
{
|
23
|
-
:mathml => '<math><mi>m</mi><mo>=</mo><mfrac><mrow><msub><mi>y</mi><mn>2</mn></msub><mo>−</mo><msub><mi>y</mi><mn>1</mn></msub></mrow><mrow><msub><mi>x</mi><mn>2</mn></msub><mo>−</mo><msub><mi>x</mi><mn>1</mn></msub></mrow></mfrac><mo>=</mo><mfrac><mrow><mo>Δ</mo><mi>y</mi></mrow><mrow><mo>Δ</mo><mi>x</mi></mrow></mfrac></math>',
|
24
|
-
:html => '<span class="math-inline"><span class="math-row"><span class="math-identifier">m</span><span class="math-operator">=</span><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-identifier">y</span><span class="math-subsup"><span class="math-smaller">‍</span><span class="math-smaller"><span class="math-number">2</span></span></span><span class="math-operator">−</span><span class="math-identifier">y</span><span class="math-subsup"><span class="math-smaller">‍</span><span class="math-smaller"><span class="math-number">1</span></span></span></span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-identifier">x</span><span class="math-subsup"><span class="math-smaller">‍</span><span class="math-smaller"><span class="math-number">2</span></span></span><span class="math-operator">−</span><span class="math-identifier">x</span><span class="math-subsup"><span class="math-smaller">‍</span><span class="math-smaller"><span class="math-number">1</span></span></span></span></span></span></span></span></span><span class="math-operator">=</span><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-operator">Δ</span><span class="math-identifier">y</span></span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-operator">Δ</span><span class="math-identifier">x</span></span></span></span></span></span></span></span></span>'
|
25
|
-
},
|
26
|
-
'f\'(x) = lim_(Deltax->0)(f(x+Deltax)-f(x))/(Deltax)' =>
|
27
|
-
{
|
28
|
-
:mathml => '<math><mi>f</mi><mi>\'</mi><mfenced open="(" close=")"><mi>x</mi></mfenced><mo>=</mo><munder><mo>lim</mo><mrow><mo>Δ</mo><mi>x</mi><mo>→</mo><mn>0</mn></mrow></munder><mfrac><mrow><mi>f</mi><mfenced open="(" close=")"><mrow><mi>x</mi><mo>+</mo><mo>Δ</mo><mi>x</mi></mrow></mfenced><mo>−</mo><mi>f</mi><mfenced open="(" close=")"><mi>x</mi></mfenced></mrow><mrow><mo>Δ</mo><mi>x</mi></mrow></mfrac></math>',
|
29
|
-
:html => '<span class="math-inline"><span class="math-row"><span class="math-identifier">f</span><span class="math-identifier">\'</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">x</span></span><span class="math-brace">)</span></span><span class="math-operator">=</span><span class="math-blank">‍</span><span class="math-underover"><span class="math-smaller"><span class="math-blank">‍</span></span><span class="math-operator">lim</span><span class="math-smaller"><span class="math-row"><span class="math-operator">Δ</span><span class="math-identifier">x</span><span class="math-operator">→</span><span class="math-number">0</span></span></span></span><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">x</span><span class="math-operator">+</span><span class="math-operator">Δ</span><span class="math-identifier">x</span></span><span class="math-brace">)</span></span><span class="math-operator">−</span><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">x</span></span><span class="math-brace">)</span></span></span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-operator">Δ</span><span class="math-identifier">x</span></span></span></span></span></span></span></span></span>'
|
30
|
-
},
|
31
|
-
'd/dx [x^n] = nx^(n - 1)' =>
|
32
|
-
{
|
33
|
-
:mathml => '<math><mfrac><mi>d</mi><mi>dx</mi></mfrac><mfenced open="[" close="]"><msup><mi>x</mi><mi>n</mi></msup></mfenced><mo>=</mo><mi>n</mi><msup><mi>x</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msup></math>',
|
34
|
-
:html => '<span class="math-inline"><span class="math-row"><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-identifier">d</span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-identifier">dx</span></span></span></span></span></span><span class="math-row"><span class="math-brace">[</span><span class="math-row"><span class="math-identifier">x</span><span class="math-subsup"><span class="math-smaller"><span class="math-identifier">n</span></span><span class="math-smaller">‍</span></span></span><span class="math-brace">]</span></span><span class="math-operator">=</span><span class="math-identifier">n</span><span class="math-identifier">x</span><span class="math-subsup"><span class="math-smaller"><span class="math-row"><span class="math-identifier">n</span><span class="math-operator">−</span><span class="math-number">1</span></span></span><span class="math-smaller">‍</span></span></span></span>'
|
35
|
-
},
|
36
|
-
'int_a^b f(x) dx = [F(x)]_a^b = F(b) - F(a)' =>
|
37
|
-
{
|
38
|
-
:mathml => '<math><msubsup><mo>∫</mo><mi>a</mi><mi>b</mi></msubsup><mi>f</mi><mfenced open="(" close=")"><mi>x</mi></mfenced><mi>dx</mi><mo>=</mo><msubsup><mfenced open="[" close="]"><mrow><mi>F</mi><mfenced open="(" close=")"><mi>x</mi></mfenced></mrow></mfenced><mi>a</mi><mi>b</mi></msubsup><mo>=</mo><mi>F</mi><mfenced open="(" close=")"><mi>b</mi></mfenced><mo>−</mo><mi>F</mi><mfenced open="(" close=")"><mi>a</mi></mfenced></math>',
|
39
|
-
:html => '<span class="math-inline"><span class="math-row"><span class="math-operator">∫</span><span class="math-subsup"><span class="math-smaller"><span class="math-identifier">b</span></span><span class="math-smaller"><span class="math-identifier">a</span></span></span><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">x</span></span><span class="math-brace">)</span></span><span class="math-identifier">dx</span><span class="math-operator">=</span><span class="math-row"><span class="math-brace">[</span><span class="math-row"><span class="math-identifier">F</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">x</span></span><span class="math-brace">)</span></span></span><span class="math-brace">]</span></span><span class="math-subsup"><span class="math-smaller"><span class="math-identifier">b</span></span><span class="math-smaller"><span class="math-identifier">a</span></span></span><span class="math-operator">=</span><span class="math-identifier">F</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">b</span></span><span class="math-brace">)</span></span><span class="math-operator">−</span><span class="math-identifier">F</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">a</span></span><span class="math-brace">)</span></span></span></span>'
|
40
|
-
},
|
41
|
-
'int_a^b f(x) dx = f(c)(b - a)' =>
|
42
|
-
{
|
43
|
-
:mathml => '<math><msubsup><mo>∫</mo><mi>a</mi><mi>b</mi></msubsup><mi>f</mi><mfenced open="(" close=")"><mi>x</mi></mfenced><mi>dx</mi><mo>=</mo><mi>f</mi><mfenced open="(" close=")"><mi>c</mi></mfenced><mfenced open="(" close=")"><mrow><mi>b</mi><mo>−</mo><mi>a</mi></mrow></mfenced></math>',
|
44
|
-
:html => '<span class="math-inline"><span class="math-row"><span class="math-operator">∫</span><span class="math-subsup"><span class="math-smaller"><span class="math-identifier">b</span></span><span class="math-smaller"><span class="math-identifier">a</span></span></span><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">x</span></span><span class="math-brace">)</span></span><span class="math-identifier">dx</span><span class="math-operator">=</span><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">c</span></span><span class="math-brace">)</span></span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">b</span><span class="math-operator">−</span><span class="math-identifier">a</span></span><span class="math-brace">)</span></span></span></span>'
|
45
|
-
},
|
46
|
-
'ax^2 + bx + c = 0' =>
|
47
|
-
{
|
48
|
-
:mathml => '<math><mi>a</mi><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><mi>b</mi><mi>x</mi><mo>+</mo><mi>c</mi><mo>=</mo><mn>0</mn></math>',
|
49
|
-
:html => '<span class="math-inline"><span class="math-row"><span class="math-identifier">a</span><span class="math-identifier">x</span><span class="math-subsup"><span class="math-smaller"><span class="math-number">2</span></span><span class="math-smaller">‍</span></span><span class="math-operator">+</span><span class="math-identifier">b</span><span class="math-identifier">x</span><span class="math-operator">+</span><span class="math-identifier">c</span><span class="math-operator">=</span><span class="math-number">0</span></span></span>'
|
50
|
-
},
|
51
|
-
'"average value"=1/(b-a) int_a^b f(x) dx' =>
|
52
|
-
{
|
53
|
-
:mathml => '<math><mtext>average value</mtext><mo>=</mo><mfrac><mn>1</mn><mrow><mi>b</mi><mo>−</mo><mi>a</mi></mrow></mfrac><msubsup><mo>∫</mo><mi>a</mi><mi>b</mi></msubsup><mi>f</mi><mfenced open="(" close=")"><mi>x</mi></mfenced><mi>dx</mi></math>',
|
54
|
-
:html => '<span class="math-inline"><span class="math-row"><span class="math-text">average value</span><span class="math-operator">=</span><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-number">1</span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-identifier">b</span><span class="math-operator">−</span><span class="math-identifier">a</span></span></span></span></span></span></span><span class="math-operator">∫</span><span class="math-subsup"><span class="math-smaller"><span class="math-identifier">b</span></span><span class="math-smaller"><span class="math-identifier">a</span></span></span><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">x</span></span><span class="math-brace">)</span></span><span class="math-identifier">dx</span></span></span>'
|
55
|
-
},
|
56
|
-
'd/dx[int_a^x f(t) dt] = f(x)' =>
|
57
|
-
{
|
58
|
-
:mathml => '<math><mfrac><mi>d</mi><mi>dx</mi></mfrac><mfenced open="[" close="]"><mrow><msubsup><mo>∫</mo><mi>a</mi><mi>x</mi></msubsup><mi>f</mi><mfenced open="(" close=")"><mi>t</mi></mfenced><mi>dt</mi></mrow></mfenced><mo>=</mo><mi>f</mi><mfenced open="(" close=")"><mi>x</mi></mfenced></math>',
|
59
|
-
:html => '<span class="math-inline"><span class="math-row"><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-identifier">d</span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-identifier">dx</span></span></span></span></span></span><span class="math-row"><span class="math-brace">[</span><span class="math-row"><span class="math-operator">∫</span><span class="math-subsup"><span class="math-smaller"><span class="math-identifier">x</span></span><span class="math-smaller"><span class="math-identifier">a</span></span></span><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">t</span></span><span class="math-brace">)</span></span><span class="math-identifier">dt</span></span><span class="math-brace">]</span></span><span class="math-operator">=</span><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">x</span></span><span class="math-brace">)</span></span></span></span>'
|
60
|
-
},
|
61
|
-
'hat(ab) bar(xy) ul(A) vec(v)' =>
|
62
|
-
{
|
63
|
-
:mathml => '<math><mover><mrow><mi>a</mi><mi>b</mi></mrow><mo>^</mo></mover><mover><mrow><mi>x</mi><mi>y</mi></mrow><mo>¯</mo></mover><munder><mi>A</mi><mo>_</mo></munder><mover><mi>v</mi><mo>→</mo></mover></math>',
|
64
|
-
:html => '<span class="math-inline"><span class="math-row"><span class="math-blank">‍</span><span class="math-underover"><span class="math-smaller"><span class="math-operator">^</span></span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">a</span><span class="math-identifier">b</span></span><span class="math-brace">)</span></span><span class="math-smaller"><span class="math-blank">‍</span></span></span><span class="math-blank">‍</span><span class="math-underover"><span class="math-smaller"><span class="math-operator">¯</span></span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">x</span><span class="math-identifier">y</span></span><span class="math-brace">)</span></span><span class="math-smaller"><span class="math-blank">‍</span></span></span><span class="math-blank">‍</span><span class="math-underover"><span class="math-smaller"><span class="math-blank">‍</span></span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">A</span></span><span class="math-brace">)</span></span><span class="math-smaller"><span class="math-operator">_</span></span></span><span class="math-blank">‍</span><span class="math-underover"><span class="math-smaller"><span class="math-operator">→</span></span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">v</span></span><span class="math-brace">)</span></span><span class="math-smaller"><span class="math-blank">‍</span></span></span></span></span>'
|
65
|
-
},
|
66
|
-
'z_12^34' =>
|
67
|
-
{
|
68
|
-
:mathml => '<math><msubsup><mi>z</mi><mn>12</mn><mn>34</mn></msubsup></math>',
|
69
|
-
:html => '<span class="math-inline"><span class="math-row"><span class="math-identifier">z</span><span class="math-subsup"><span class="math-smaller"><span class="math-number">34</span></span><span class="math-smaller"><span class="math-number">12</span></span></span></span></span>'
|
70
|
-
},
|
71
|
-
'lim_(x->c)(f(x)-f(c))/(x-c)' =>
|
72
|
-
{
|
73
|
-
:mathml => '<math><munder><mo>lim</mo><mrow><mi>x</mi><mo>→</mo><mi>c</mi></mrow></munder><mfrac><mrow><mi>f</mi><mfenced open="(" close=")"><mi>x</mi></mfenced><mo>−</mo><mi>f</mi><mfenced open="(" close=")"><mi>c</mi></mfenced></mrow><mrow><mi>x</mi><mo>−</mo><mi>c</mi></mrow></mfrac></math>',
|
74
|
-
:html => '<span class="math-inline"><span class="math-row"><span class="math-blank">‍</span><span class="math-underover"><span class="math-smaller"><span class="math-blank">‍</span></span><span class="math-operator">lim</span><span class="math-smaller"><span class="math-row"><span class="math-identifier">x</span><span class="math-operator">→</span><span class="math-identifier">c</span></span></span></span><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">x</span></span><span class="math-brace">)</span></span><span class="math-operator">−</span><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">c</span></span><span class="math-brace">)</span></span></span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-identifier">x</span><span class="math-operator">−</span><span class="math-identifier">c</span></span></span></span></span></span></span></span></span>'
|
75
|
-
},
|
76
|
-
'int_0^(pi/2) g(x) dx' =>
|
77
|
-
{
|
78
|
-
:mathml => '<math><msubsup><mo>∫</mo><mn>0</mn><mfrac><mi>π</mi><mn>2</mn></mfrac></msubsup><mi>g</mi><mfenced open="(" close=")"><mi>x</mi></mfenced><mi>dx</mi></math>',
|
79
|
-
:html => '<span class="math-inline"><span class="math-row"><span class="math-operator">∫</span><span class="math-subsup"><span class="math-smaller"><span class="math-row"><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-identifier">π</span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-number">2</span></span></span></span></span></span></span></span><span class="math-smaller"><span class="math-number">0</span></span></span><span class="math-identifier">g</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">x</span></span><span class="math-brace">)</span></span><span class="math-identifier">dx</span></span></span>'
|
80
|
-
},
|
81
|
-
'sum_(n=0)^oo a_n' =>
|
82
|
-
{
|
83
|
-
:mathml => '<math><munderover><mo>∑</mo><mrow><mi>n</mi><mo>=</mo><mn>0</mn></mrow><mo>∞</mo></munderover><msub><mi>a</mi><mi>n</mi></msub></math>',
|
84
|
-
:html => '<span class="math-inline"><span class="math-row"><span class="math-blank">‍</span><span class="math-underover"><span class="math-smaller"><span class="math-operator">∞</span></span><span class="math-operator">∑</span><span class="math-smaller"><span class="math-row"><span class="math-identifier">n</span><span class="math-operator">=</span><span class="math-number">0</span></span></span></span><span class="math-identifier">a</span><span class="math-subsup"><span class="math-smaller">‍</span><span class="math-smaller"><span class="math-identifier">n</span></span></span></span></span>'
|
85
|
-
},
|
86
|
-
'((1,2,3),(4,5,6),(7,8,9))' =>
|
87
|
-
{
|
88
|
-
:mathml => '<math><mfenced open="(" close=")"><mtable><mtr><mtd><mn>1</mn></mtd><mtd><mn>2</mn></mtd><mtd><mn>3</mn></mtd></mtr><mtr><mtd><mn>4</mn></mtd><mtd><mn>5</mn></mtd><mtd><mn>6</mn></mtd></mtr><mtr><mtd><mn>7</mn></mtd><mtd><mn>8</mn></mtd><mtd><mn>9</mn></mtd></mtr></mtable></mfenced></math>',
|
89
|
-
:html => '<span class="math-inline"><span class="math-row"><span class="math-row"><span class="math-brace" style="font-size: 300%;">(</span><span class="math-matrix" style="grid-template-columns:repeat(3,1fr);grid-template-rows:repeat(3,1fr);"><span class="math-row"><span class="math-number">1</span></span><span class="math-row"><span class="math-number">2</span></span><span class="math-row"><span class="math-number">3</span></span><span class="math-row"><span class="math-number">4</span></span><span class="math-row"><span class="math-number">5</span></span><span class="math-row"><span class="math-number">6</span></span><span class="math-row"><span class="math-number">7</span></span><span class="math-row"><span class="math-number">8</span></span><span class="math-row"><span class="math-number">9</span></span></span><span class="math-brace" style="font-size: 300%;">)</span></span></span></span>'
|
90
|
-
},
|
91
|
-
'|(a,b),(c,d)|=ad-bc' =>
|
92
|
-
{
|
93
|
-
:mathml => '<math><mfenced open="|" close="|"><mtable><mtr><mtd><mi>a</mi></mtd><mtd><mi>b</mi></mtd></mtr><mtr><mtd><mi>c</mi></mtd><mtd><mi>d</mi></mtd></mtr></mtable></mfenced><mo>=</mo><mi>a</mi><mi>d</mi><mo>−</mo><mi>b</mi><mi>c</mi></math>',
|
94
|
-
:html => '<span class="math-inline"><span class="math-row"><span class="math-row"><span class="math-brace" style="font-size: 200%;">|</span><span class="math-matrix" style="grid-template-columns:repeat(2,1fr);grid-template-rows:repeat(2,1fr);"><span class="math-row"><span class="math-identifier">a</span></span><span class="math-row"><span class="math-identifier">b</span></span><span class="math-row"><span class="math-identifier">c</span></span><span class="math-row"><span class="math-identifier">d</span></span></span><span class="math-brace" style="font-size: 200%;">|</span></span><span class="math-operator">=</span><span class="math-identifier">a</span><span class="math-identifier">d</span><span class="math-operator">−</span><span class="math-identifier">b</span><span class="math-identifier">c</span></span></span>'
|
95
|
-
},
|
96
|
-
'((a_(11), cdots , a_(1n)),(vdots, ddots, vdots),(a_(m1), cdots , a_(mn)))' =>
|
97
|
-
{
|
98
|
-
:mathml => '<math><mfenced open="(" close=")"><mtable><mtr><mtd><msub><mi>a</mi><mn>11</mn></msub></mtd><mtd><mo>⋯</mo></mtd><mtd><msub><mi>a</mi><mrow><mn>1</mn><mi>n</mi></mrow></msub></mtd></mtr><mtr><mtd><mo>⋮</mo></mtd><mtd><mo>⋱</mo></mtd><mtd><mo>⋮</mo></mtd></mtr><mtr><mtd><msub><mi>a</mi><mrow><mi>m</mi><mn>1</mn></mrow></msub></mtd><mtd><mo>⋯</mo></mtd><mtd><msub><mi>a</mi><mrow><mi>m</mi><mi>n</mi></mrow></msub></mtd></mtr></mtable></mfenced></math>',
|
99
|
-
:html => '<span class="math-inline"><span class="math-row"><span class="math-row"><span class="math-brace" style="font-size: 300%;">(</span><span class="math-matrix" style="grid-template-columns:repeat(3,1fr);grid-template-rows:repeat(3,1fr);"><span class="math-row"><span class="math-identifier">a</span><span class="math-subsup"><span class="math-smaller">‍</span><span class="math-smaller"><span class="math-row"><span class="math-number">11</span></span></span></span></span><span class="math-row"><span class="math-operator">⋯</span></span><span class="math-row"><span class="math-identifier">a</span><span class="math-subsup"><span class="math-smaller">‍</span><span class="math-smaller"><span class="math-row"><span class="math-number">1</span><span class="math-identifier">n</span></span></span></span></span><span class="math-row"><span class="math-operator">⋮</span></span><span class="math-row"><span class="math-operator">⋱</span></span><span class="math-row"><span class="math-operator">⋮</span></span><span class="math-row"><span class="math-identifier">a</span><span class="math-subsup"><span class="math-smaller">‍</span><span class="math-smaller"><span class="math-row"><span class="math-identifier">m</span><span class="math-number">1</span></span></span></span></span><span class="math-row"><span class="math-operator">⋯</span></span><span class="math-row"><span class="math-identifier">a</span><span class="math-subsup"><span class="math-smaller">‍</span><span class="math-smaller"><span class="math-row"><span class="math-identifier">m</span><span class="math-identifier">n</span></span></span></span></span></span><span class="math-brace" style="font-size: 300%;">)</span></span></span></span>'
|
100
|
-
},
|
101
|
-
'sum_(k=1)^n k = 1+2+ cdots +n=(n(n+1))/2' =>
|
102
|
-
{
|
103
|
-
:mathml => '<math><munderover><mo>∑</mo><mrow><mi>k</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mi>k</mi><mo>=</mo><mn>1</mn><mo>+</mo><mn>2</mn><mo>+</mo><mo>⋯</mo><mo>+</mo><mi>n</mi><mo>=</mo><mfrac><mrow><mi>n</mi><mfenced open="(" close=")"><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></mfenced></mrow><mn>2</mn></mfrac></math>',
|
104
|
-
:html => '<span class="math-inline"><span class="math-row"><span class="math-blank">‍</span><span class="math-underover"><span class="math-smaller"><span class="math-identifier">n</span></span><span class="math-operator">∑</span><span class="math-smaller"><span class="math-row"><span class="math-identifier">k</span><span class="math-operator">=</span><span class="math-number">1</span></span></span></span><span class="math-identifier">k</span><span class="math-operator">=</span><span class="math-number">1</span><span class="math-operator">+</span><span class="math-number">2</span><span class="math-operator">+</span><span class="math-operator">⋯</span><span class="math-operator">+</span><span class="math-identifier">n</span><span class="math-operator">=</span><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-identifier">n</span><span class="math-row"><span class="math-brace">(</span><span class="math-row"><span class="math-identifier">n</span><span class="math-operator">+</span><span class="math-number">1</span></span><span class="math-brace">)</span></span></span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-number">2</span></span></span></span></span></span></span></span>'
|
105
|
-
},
|
106
|
-
'"Скорость"=("Расстояние")/("Время")' =>
|
107
|
-
{
|
108
|
-
:mathml => '<math><mtext>Скорость</mtext><mo>=</mo><mfrac><mtext>Расстояние</mtext><mtext>Время</mtext></mfrac></math>',
|
109
|
-
:html => '<span class="math-inline"><span class="math-row"><span class="math-text">Скорость</span><span class="math-operator">=</span><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-text">Расстояние</span></span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-text">Время</span></span></span></span></span></span></span></span></span>'
|
110
|
-
},
|
111
|
-
'bb (a + b) + cc c = fr (d^n)' =>
|
112
|
-
{
|
113
|
-
:mathml => '<math><mstyle mathvariant="bold"><mrow><mi>a</mi><mo>+</mo><mi>b</mi></mrow></mstyle><mo>+</mo><mstyle mathvariant="script"><mi>c</mi></mstyle><mo>=</mo><mstyle mathvariant="fraktur"><msup><mi>d</mi><mi>n</mi></msup></mstyle></math>',
|
114
|
-
:html => nil
|
115
|
-
},
|
116
|
-
'max()' =>
|
117
|
-
{
|
118
|
-
:mathml => '<math><mi>max</mi><mfenced open="(" close=")"></mfenced></math>',
|
119
|
-
:html => '<span class="math-inline"><span class="math-row"><span class="math-identifier">max</span><span class="math-row"><span class="math-brace">(</span><span class="math-brace">)</span></span></span></span>'
|
120
|
-
},
|
121
|
-
'text("foo")' => {
|
122
|
-
:mathml => '<math><mtext>"foo"</mtext></math>',
|
123
|
-
:html => '<span class="math-inline"><span class="math-row"><span class="math-text">"foo"</span></span></span>'
|
124
|
-
},
|
125
|
-
'ubrace(1 + 2) obrace(3 + 4' => {
|
126
|
-
:mathml => '<math><munder><mrow><mn>1</mn><mo>+</mo><mn>2</mn></mrow><mo>⏟</mo></munder><mover><mrow><mn>3</mn><mo>+</mo><mn>4</mn></mrow><mo>⏞</mo></mover></math>'
|
127
|
-
},
|
128
|
-
"s'_i = {(- 1, if s_i > s_(i + 1)),( + 1, if s_i <= s_(i + 1)):}" => {
|
129
|
-
:mathml => '<math><mi>s</mi><msub><mi>\'</mi><mi>i</mi></msub><mo>=</mo><mfenced open="{" close=""><mtable><mtr><mtd><mrow><mo>−</mo><mn>1</mn></mrow></mtd><mtd><mrow><mo>if</mo><msub><mi>s</mi><mi>i</mi></msub><mo>></mo><msub><mi>s</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow></msub></mrow></mtd></mtr><mtr><mtd><mrow><mo>+</mo><mn>1</mn></mrow></mtd><mtd><mrow><mo>if</mo><msub><mi>s</mi><mi>i</mi></msub><mo>≤</mo><msub><mi>s</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow></msub></mrow></mtd></mtr></mtable></mfenced></math>'
|
130
|
-
},
|
131
|
-
"s'_i = {(, if s_i > s_(i + 1)),( + 1,):}" => {
|
132
|
-
:mathml => '<math><mi>s</mi><msub><mi>\'</mi><mi>i</mi></msub><mo>=</mo><mfenced open="{" close=""><mtable><mtr><mtd></mtd><mtd><mrow><mo>if</mo><msub><mi>s</mi><mi>i</mi></msub><mo>></mo><msub><mi>s</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow></msub></mrow></mtd></mtr><mtr><mtd><mrow><mo>+</mo><mn>1</mn></mrow></mtd><mtd></mtd></mtr></mtable></mfenced></math>'
|
133
|
-
},
|
134
|
-
'{:(a,b),(c,d):}' => {
|
135
|
-
:mathml => '<math><mtable><mtr><mtd><mi>a</mi></mtd><mtd><mi>b</mi></mtd></mtr><mtr><mtd><mi>c</mi></mtd><mtd><mi>d</mi></mtd></mtr></mtable></math>'
|
136
|
-
},
|
137
|
-
}
|
138
|
-
|
139
|
-
version = RUBY_VERSION.split('.').map { |s| s.to_i }
|
140
|
-
|
141
|
-
if version[0] > 1 || version[1] > 8
|
142
|
-
TEST_CASES['Скорость=(Расстояние)/(Время)'] =
|
143
|
-
{
|
144
|
-
:mathml => '<math><mi>С</mi><mi>к</mi><mi>о</mi><mi>р</mi><mi>о</mi><mi>с</mi><mi>т</mi><mi>ь</mi><mo>=</mo><mfrac><mrow><mi>Р</mi><mi>а</mi><mi>с</mi><mi>с</mi><mi>т</mi><mi>о</mi><mi>я</mi><mi>н</mi><mi>и</mi><mi>е</mi></mrow><mrow><mi>В</mi><mi>р</mi><mi>е</mi><mi>м</mi><mi>я</mi></mrow></mfrac></math>',
|
145
|
-
:html => '<span class="math-inline"><span class="math-row"><span class="math-identifier">С</span><span class="math-identifier">к</span><span class="math-identifier">о</span><span class="math-identifier">р</span><span class="math-identifier">о</span><span class="math-identifier">с</span><span class="math-identifier">т</span><span class="math-identifier">ь</span><span class="math-operator">=</span><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-identifier">Р</span><span class="math-identifier">а</span><span class="math-identifier">с</span><span class="math-identifier">с</span><span class="math-identifier">т</span><span class="math-identifier">о</span><span class="math-identifier">я</span><span class="math-identifier">н</span><span class="math-identifier">и</span><span class="math-identifier">е</span></span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-identifier">В</span><span class="math-identifier">р</span><span class="math-identifier">е</span><span class="math-identifier">м</span><span class="math-identifier">я</span></span></span></span></span></span></span></span></span>'
|
146
|
-
}
|
147
|
-
end
|
148
7
|
|
149
|
-
module
|
150
|
-
def
|
151
|
-
|
152
|
-
end
|
153
|
-
|
154
|
-
def expect_html(asciimath, html)
|
155
|
-
expect(AsciiMath.parse(asciimath).to_html).to eq(html)
|
8
|
+
module Xml
|
9
|
+
def self.mathml2_xsd
|
10
|
+
@schema ||= File.open(File.expand_path('../schema/mathml2/mathml2.xsd', __FILE__)) { |io| Nokogiri::XML::Schema(io) }
|
156
11
|
end
|
157
|
-
end
|
158
12
|
|
159
|
-
|
160
|
-
|
161
|
-
end
|
13
|
+
def self.mathml3_xsd
|
14
|
+
@schema ||= File.open(File.expand_path('../schema/mathml3/mathml3.xsd', __FILE__)) { |io| Nokogiri::XML::Schema(io) }
|
15
|
+
end
|
162
16
|
|
163
|
-
|
164
|
-
|
165
|
-
it "'#{asciimath}' to MathML" do
|
166
|
-
expect_mathml(asciimath, output[:mathml])
|
167
|
-
end
|
17
|
+
def self.parse(content)
|
18
|
+
Nokogiri::XML(content)
|
168
19
|
end
|
169
20
|
end
|
170
21
|
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
22
|
+
def should_generate(expected_output)
|
23
|
+
Proc.new { |example|
|
24
|
+
parsed = AsciiMath.parse(example.description)
|
25
|
+
variant = example.metadata[:variant]
|
26
|
+
if variant
|
27
|
+
if expected_output.key?(variant)
|
28
|
+
expected = expected_output[variant]
|
29
|
+
case variant
|
30
|
+
when :ast
|
31
|
+
expect(parsed.ast).to eq(expected)
|
32
|
+
when :mathml
|
33
|
+
expect(parsed.to_mathml).to eq(expected)
|
34
|
+
xml_dom = Xml.parse(parsed.to_mathml(:xmlns => 'http://www.w3.org/1998/Math/MathML'))
|
35
|
+
Xml.mathml2_xsd.validate(xml_dom).each do |error|
|
36
|
+
fail(error.message)
|
37
|
+
end
|
38
|
+
Xml.mathml3_xsd.validate(xml_dom).each do |error|
|
39
|
+
fail(error.message)
|
40
|
+
end
|
41
|
+
when :mathml_word
|
42
|
+
expect(::AsciiMath::MathMLBuilder.new(:msword => true).append_expression(parsed.ast).to_s).to eq(expected)
|
43
|
+
when :html
|
44
|
+
expect(parsed.to_html).to eq(expected)
|
45
|
+
when :latex
|
46
|
+
expect(parsed.to_latex).to eq(expected)
|
47
|
+
else
|
48
|
+
skip("Unsupported output variant '#{variant}'")
|
49
|
+
end
|
50
|
+
else
|
51
|
+
skip("No example output provided for '#{variant}'")
|
176
52
|
end
|
53
|
+
else
|
54
|
+
skip('No known output variant found')
|
177
55
|
end
|
56
|
+
}
|
57
|
+
end
|
58
|
+
|
59
|
+
RSpec.shared_examples 'AsciiMath Examples' do
|
60
|
+
class << self
|
61
|
+
include ::AsciiMath::ASTHelper
|
62
|
+
end
|
63
|
+
|
64
|
+
example('underset(_)(hat A) = hat A exp j vartheta_0', &should_generate(
|
65
|
+
:ast => seq(
|
66
|
+
binary(
|
67
|
+
symbol('underset'),
|
68
|
+
group(symbol('_')),
|
69
|
+
group(unary(symbol('hat'), 'A'))
|
70
|
+
),
|
71
|
+
symbol('='),
|
72
|
+
unary(symbol('hat'), 'A'),
|
73
|
+
symbol('exp'),
|
74
|
+
'j',
|
75
|
+
sub(symbol('vartheta'), '0')
|
76
|
+
),
|
77
|
+
:mathml => '<math><munder><mover><mi>A</mi><mo>^</mo></mover><mo>_</mo></munder><mo>=</mo><mover><mi>A</mi><mo>^</mo></mover><mi>exp</mi><mi>j</mi><msub><mi>ϑ</mi><mn>0</mn></msub></math>',
|
78
|
+
:mathml_word => '<math><munder><mrow><mover><mrow><mi>A</mi></mrow><mrow><mo>^</mo></mrow></mover></mrow><mrow><mo>_</mo></mrow></munder><mo>=</mo><mover><mrow><mi>A</mi></mrow><mrow><mo>^</mo></mrow></mover><mi>exp</mi><mi>j</mi><msub><mrow><mi>ϑ</mi></mrow><mrow><mn>0</mn></mrow></msub></math>',
|
79
|
+
:latex => '\\underset{\\text{–}}{\\hat{A}} = \\hat{A} \\exp j \\vartheta_0'
|
80
|
+
))
|
81
|
+
|
82
|
+
example('x+b/(2a)<+-sqrt((b^2)/(4a^2)-c/a)', &should_generate(
|
83
|
+
:ast => seq(
|
84
|
+
'x',
|
85
|
+
symbol('+'),
|
86
|
+
infix('b', symbol('/'), grseq('2', 'a')),
|
87
|
+
symbol('<'),
|
88
|
+
symbol('+-'),
|
89
|
+
unary(
|
90
|
+
symbol('sqrt'),
|
91
|
+
grseq(
|
92
|
+
infix(
|
93
|
+
group(sup('b', '2')),
|
94
|
+
symbol('/'),
|
95
|
+
grseq('4', sup('a', '2'))
|
96
|
+
),
|
97
|
+
symbol('-'),
|
98
|
+
infix('c', symbol('/'), 'a')
|
99
|
+
)
|
100
|
+
)
|
101
|
+
),
|
102
|
+
:mathml => '<math><mi>x</mi><mo>+</mo><mfrac><mi>b</mi><mrow><mn>2</mn><mi>a</mi></mrow></mfrac><mo><</mo><mo>±</mo><msqrt><mrow><mfrac><msup><mi>b</mi><mn>2</mn></msup><mrow><mn>4</mn><msup><mi>a</mi><mn>2</mn></msup></mrow></mfrac><mo>−</mo><mfrac><mi>c</mi><mi>a</mi></mfrac></mrow></msqrt></math>',
|
103
|
+
:latex => 'x + \\frac{b}{2 a} < \\pm \\sqrt{\\frac{b^2}{4 a^2} - \\frac{c}{a}}',
|
104
|
+
))
|
105
|
+
|
106
|
+
example('a^2 + b^2 = c^2', &should_generate(
|
107
|
+
:ast => seq(
|
108
|
+
sup('a', '2'),
|
109
|
+
symbol('+'),
|
110
|
+
sup('b', '2'),
|
111
|
+
symbol('='),
|
112
|
+
sup('c', '2')
|
113
|
+
),
|
114
|
+
:mathml => '<math><msup><mi>a</mi><mn>2</mn></msup><mo>+</mo><msup><mi>b</mi><mn>2</mn></msup><mo>=</mo><msup><mi>c</mi><mn>2</mn></msup></math>',
|
115
|
+
:html => '<span class="math-inline"><span class="math-identifier">a</span><span class="math-subsup"><span class="math-smaller"><span class="math-number">2</span></span><span class="math-smaller">‍</span></span><span class="math-operator">+</span><span class="math-identifier">b</span><span class="math-subsup"><span class="math-smaller"><span class="math-number">2</span></span><span class="math-smaller">‍</span></span><span class="math-operator">=</span><span class="math-identifier">c</span><span class="math-subsup"><span class="math-smaller"><span class="math-number">2</span></span><span class="math-smaller">‍</span></span></span>',
|
116
|
+
:latex => 'a^2 + b^2 = c^2',
|
117
|
+
|
118
|
+
))
|
119
|
+
|
120
|
+
example('x = (-b+-sqrt(b^2-4ac))/(2a)', &should_generate(
|
121
|
+
:ast => seq(
|
122
|
+
'x',
|
123
|
+
symbol('='),
|
124
|
+
infix(
|
125
|
+
grseq(
|
126
|
+
symbol('-'), 'b',
|
127
|
+
symbol('+-'),
|
128
|
+
unary(symbol('sqrt'), grseq(sup('b', '2'), symbol('-'), '4', 'a', 'c'))
|
129
|
+
),
|
130
|
+
symbol('/'),
|
131
|
+
grseq('2', 'a'),
|
132
|
+
)
|
133
|
+
),
|
134
|
+
:mathml => '<math><mi>x</mi><mo>=</mo><mfrac><mrow><mo>−</mo><mi>b</mi><mo>±</mo><msqrt><mrow><msup><mi>b</mi><mn>2</mn></msup><mo>−</mo><mn>4</mn><mi>a</mi><mi>c</mi></mrow></msqrt></mrow><mrow><mn>2</mn><mi>a</mi></mrow></mfrac></math>',
|
135
|
+
:latex => 'x = \\frac{- b \\pm \\sqrt{b^2 - 4 a c}}{2 a}',
|
136
|
+
))
|
137
|
+
|
138
|
+
example('m = (y_2 - y_1)/(x_2 - x_1) = (Deltay)/(Deltax)', &should_generate(
|
139
|
+
:ast => seq(
|
140
|
+
'm',
|
141
|
+
symbol('='),
|
142
|
+
infix(grseq(sub('y', '2'), symbol('-'), sub('y', '1')), symbol('/'), grseq(sub('x', '2'), symbol('-'), sub('x', '1'))),
|
143
|
+
symbol('='),
|
144
|
+
infix(grseq(symbol('Delta'), 'y'), symbol('/'), grseq(symbol('Delta'), 'x')),
|
145
|
+
),
|
146
|
+
:mathml => '<math><mi>m</mi><mo>=</mo><mfrac><mrow><msub><mi>y</mi><mn>2</mn></msub><mo>−</mo><msub><mi>y</mi><mn>1</mn></msub></mrow><mrow><msub><mi>x</mi><mn>2</mn></msub><mo>−</mo><msub><mi>x</mi><mn>1</mn></msub></mrow></mfrac><mo>=</mo><mfrac><mrow><mo>Δ</mo><mi>y</mi></mrow><mrow><mo>Δ</mo><mi>x</mi></mrow></mfrac></math>',
|
147
|
+
:html => '<span class="math-inline"><span class="math-identifier">m</span><span class="math-operator">=</span><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-identifier">y</span><span class="math-subsup"><span class="math-smaller">‍</span><span class="math-smaller"><span class="math-number">2</span></span></span><span class="math-operator">−</span><span class="math-identifier">y</span><span class="math-subsup"><span class="math-smaller">‍</span><span class="math-smaller"><span class="math-number">1</span></span></span></span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-identifier">x</span><span class="math-subsup"><span class="math-smaller">‍</span><span class="math-smaller"><span class="math-number">2</span></span></span><span class="math-operator">−</span><span class="math-identifier">x</span><span class="math-subsup"><span class="math-smaller">‍</span><span class="math-smaller"><span class="math-number">1</span></span></span></span></span></span></span></span></span><span class="math-operator">=</span><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-operator">Δ</span><span class="math-identifier">y</span></span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-operator">Δ</span><span class="math-identifier">x</span></span></span></span></span></span></span></span>',
|
148
|
+
:latex => 'm = \\frac{y_2 - y_1}{x_2 - x_1} = \\frac{\\Delta y}{\\Delta x}',
|
149
|
+
))
|
150
|
+
|
151
|
+
example('f\'(x) = lim_(Deltax->0)(f(x+Deltax)-f(x))/(Deltax)', &should_generate(
|
152
|
+
:ast => seq(
|
153
|
+
symbol('f'),
|
154
|
+
symbol('\''),
|
155
|
+
paren('x'),
|
156
|
+
symbol('='),
|
157
|
+
sub(
|
158
|
+
symbol('lim'),
|
159
|
+
grseq(symbol('Delta'), 'x', symbol('->'), '0')
|
160
|
+
),
|
161
|
+
infix(
|
162
|
+
grseq(symbol('f'), paren(seq('x', symbol('+'), symbol('Delta'), 'x')), symbol('-'), symbol('f'), paren('x')),
|
163
|
+
symbol('/'),
|
164
|
+
grseq(symbol('Delta'), 'x')
|
165
|
+
)
|
166
|
+
),
|
167
|
+
:mathml => '<math><mi>f</mi><mo>′</mo><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mo>=</mo><munder><mo>lim</mo><mrow><mo>Δ</mo><mi>x</mi><mo>→</mo><mn>0</mn></mrow></munder><mfrac><mrow><mi>f</mi><mrow><mo>(</mo><mrow><mi>x</mi><mo>+</mo><mo>Δ</mo><mi>x</mi></mrow><mo>)</mo></mrow><mo>−</mo><mi>f</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow><mrow><mo>Δ</mo><mi>x</mi></mrow></mfrac></math>',
|
168
|
+
:html => '<span class="math-inline"><span class="math-identifier">f</span><span class="math-operator">′</span><span class="math-row"><span class="math-brace">(</span><span class="math-identifier">x</span><span class="math-brace">)</span></span><span class="math-operator">=</span><span class="math-blank">‍</span><span class="math-underover"><span class="math-smaller"><span class="math-blank">‍</span></span><span class="math-operator">lim</span><span class="math-smaller"><span class="math-row"><span class="math-operator">Δ</span><span class="math-identifier">x</span><span class="math-operator">→</span><span class="math-number">0</span></span></span></span><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-identifier">x</span><span class="math-operator">+</span><span class="math-operator">Δ</span><span class="math-identifier">x</span><span class="math-brace">)</span></span><span class="math-operator">−</span><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-identifier">x</span><span class="math-brace">)</span></span></span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-operator">Δ</span><span class="math-identifier">x</span></span></span></span></span></span></span></span>',
|
169
|
+
:latex => 'f \' ( x ) = \\lim_{\\Delta x \\rightarrow 0} \\frac{f \\left ( x + \\Delta x \\right ) - f ( x )}{\\Delta x}',
|
170
|
+
))
|
171
|
+
|
172
|
+
example('d/dx [x^n] = nx^(n - 1)', &should_generate(
|
173
|
+
:ast => seq(
|
174
|
+
infix('d', symbol('/'), symbol('dx')),
|
175
|
+
paren(symbol('['), sup('x', 'n'), symbol(']')),
|
176
|
+
symbol('='),
|
177
|
+
'n',
|
178
|
+
sup('x', grseq('n', symbol('-'), '1'))
|
179
|
+
),
|
180
|
+
:mathml => '<math><mfrac><mi>d</mi><mi>dx</mi></mfrac><mrow><mo>[</mo><msup><mi>x</mi><mi>n</mi></msup><mo>]</mo></mrow><mo>=</mo><mi>n</mi><msup><mi>x</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msup></math>',
|
181
|
+
:html => '<span class="math-inline"><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-identifier">d</span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-identifier">dx</span></span></span></span></span></span><span class="math-row"><span class="math-brace">[</span><span class="math-identifier">x</span><span class="math-subsup"><span class="math-smaller"><span class="math-identifier">n</span></span><span class="math-smaller">‍</span></span><span class="math-brace">]</span></span><span class="math-operator">=</span><span class="math-identifier">n</span><span class="math-identifier">x</span><span class="math-subsup"><span class="math-smaller"><span class="math-row"><span class="math-identifier">n</span><span class="math-operator">−</span><span class="math-number">1</span></span></span><span class="math-smaller">‍</span></span></span>',
|
182
|
+
:latex => '\\frac{d}{dx} [ x^n ] = n x^{n - 1}',
|
183
|
+
))
|
184
|
+
|
185
|
+
example('int_a^b f(x) dx = [F(x)]_a^b = F(b) - F(a)', &should_generate(
|
186
|
+
:ast => seq(
|
187
|
+
subsup(symbol('int'), 'a', 'b'),
|
188
|
+
symbol('f'),
|
189
|
+
paren('x'),
|
190
|
+
symbol('dx'),
|
191
|
+
symbol('='),
|
192
|
+
subsup(paren(symbol('['), seq('F', paren('x')), symbol(']')), 'a', 'b'),
|
193
|
+
symbol('='),
|
194
|
+
'F', paren('b'),
|
195
|
+
symbol('-'),
|
196
|
+
'F', paren('a')
|
197
|
+
),
|
198
|
+
:mathml => '<math><msubsup><mo>∫</mo><mi>a</mi><mi>b</mi></msubsup><mi>f</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mi>dx</mi><mo>=</mo><msubsup><mrow><mo>[</mo><mrow><mi>F</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow><mo>]</mo></mrow><mi>a</mi><mi>b</mi></msubsup><mo>=</mo><mi>F</mi><mrow><mo>(</mo><mi>b</mi><mo>)</mo></mrow><mo>−</mo><mi>F</mi><mrow><mo>(</mo><mi>a</mi><mo>)</mo></mrow></math>',
|
199
|
+
:html => '<span class="math-inline"><span class="math-operator">∫</span><span class="math-subsup"><span class="math-smaller"><span class="math-identifier">b</span></span><span class="math-smaller"><span class="math-identifier">a</span></span></span><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-identifier">x</span><span class="math-brace">)</span></span><span class="math-identifier">dx</span><span class="math-operator">=</span><span class="math-row"><span class="math-brace">[</span><span class="math-identifier">F</span><span class="math-row"><span class="math-brace">(</span><span class="math-identifier">x</span><span class="math-brace">)</span></span><span class="math-brace">]</span></span><span class="math-subsup"><span class="math-smaller"><span class="math-identifier">b</span></span><span class="math-smaller"><span class="math-identifier">a</span></span></span><span class="math-operator">=</span><span class="math-identifier">F</span><span class="math-row"><span class="math-brace">(</span><span class="math-identifier">b</span><span class="math-brace">)</span></span><span class="math-operator">−</span><span class="math-identifier">F</span><span class="math-row"><span class="math-brace">(</span><span class="math-identifier">a</span><span class="math-brace">)</span></span></span>',
|
200
|
+
:latex => '\\int_a^b f ( x ) dx = {\\left [ F ( x ) \\right ]}_a^b = F ( b ) - F ( a )',
|
201
|
+
))
|
202
|
+
|
203
|
+
example('int_a^b f(x) dx = f(c)(b - a)', &should_generate(
|
204
|
+
:ast => seq(
|
205
|
+
subsup(symbol('int'), 'a', 'b'),
|
206
|
+
symbol('f'),
|
207
|
+
paren('x'),
|
208
|
+
symbol('dx'),
|
209
|
+
symbol('='),
|
210
|
+
symbol('f'),
|
211
|
+
paren('c'),
|
212
|
+
paren(seq('b', symbol('-'), 'a')),
|
213
|
+
),
|
214
|
+
:mathml => '<math><msubsup><mo>∫</mo><mi>a</mi><mi>b</mi></msubsup><mi>f</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mi>dx</mi><mo>=</mo><mi>f</mi><mrow><mo>(</mo><mi>c</mi><mo>)</mo></mrow><mrow><mo>(</mo><mrow><mi>b</mi><mo>−</mo><mi>a</mi></mrow><mo>)</mo></mrow></math>',
|
215
|
+
:html => '<span class="math-inline"><span class="math-operator">∫</span><span class="math-subsup"><span class="math-smaller"><span class="math-identifier">b</span></span><span class="math-smaller"><span class="math-identifier">a</span></span></span><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-identifier">x</span><span class="math-brace">)</span></span><span class="math-identifier">dx</span><span class="math-operator">=</span><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-identifier">c</span><span class="math-brace">)</span></span><span class="math-row"><span class="math-brace">(</span><span class="math-identifier">b</span><span class="math-operator">−</span><span class="math-identifier">a</span><span class="math-brace">)</span></span></span>',
|
216
|
+
:latex => '\\int_a^b f ( x ) dx = f ( c ) ( b - a )',
|
217
|
+
))
|
218
|
+
|
219
|
+
example('ax^2 + bx + c = 0', &should_generate(
|
220
|
+
:ast => seq(
|
221
|
+
'a',
|
222
|
+
sup('x', '2'),
|
223
|
+
symbol('+'),
|
224
|
+
'b',
|
225
|
+
'x',
|
226
|
+
symbol('+'),
|
227
|
+
'c',
|
228
|
+
symbol('='),
|
229
|
+
'0'
|
230
|
+
),
|
231
|
+
:mathml => '<math><mi>a</mi><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><mi>b</mi><mi>x</mi><mo>+</mo><mi>c</mi><mo>=</mo><mn>0</mn></math>',
|
232
|
+
:html => '<span class="math-inline"><span class="math-identifier">a</span><span class="math-identifier">x</span><span class="math-subsup"><span class="math-smaller"><span class="math-number">2</span></span><span class="math-smaller">‍</span></span><span class="math-operator">+</span><span class="math-identifier">b</span><span class="math-identifier">x</span><span class="math-operator">+</span><span class="math-identifier">c</span><span class="math-operator">=</span><span class="math-number">0</span></span>',
|
233
|
+
:latex => 'a x^2 + b x + c = 0',
|
234
|
+
))
|
235
|
+
|
236
|
+
example('"average value"=1/(b-a) int_a^b f(x) dx', &should_generate(
|
237
|
+
:ast => seq(
|
238
|
+
'average value',
|
239
|
+
symbol('='),
|
240
|
+
infix('1', symbol('/'), grseq('b', symbol('-'), 'a')),
|
241
|
+
subsup(symbol('int'), 'a', 'b'),
|
242
|
+
symbol('f'),
|
243
|
+
paren('x'),
|
244
|
+
symbol('dx')
|
245
|
+
),
|
246
|
+
:mathml => '<math><mtext>average value</mtext><mo>=</mo><mfrac><mn>1</mn><mrow><mi>b</mi><mo>−</mo><mi>a</mi></mrow></mfrac><msubsup><mo>∫</mo><mi>a</mi><mi>b</mi></msubsup><mi>f</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mi>dx</mi></math>',
|
247
|
+
:html => '<span class="math-inline"><span class="math-text">average value</span><span class="math-operator">=</span><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-number">1</span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-identifier">b</span><span class="math-operator">−</span><span class="math-identifier">a</span></span></span></span></span></span></span><span class="math-operator">∫</span><span class="math-subsup"><span class="math-smaller"><span class="math-identifier">b</span></span><span class="math-smaller"><span class="math-identifier">a</span></span></span><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-identifier">x</span><span class="math-brace">)</span></span><span class="math-identifier">dx</span></span>',
|
248
|
+
:latex => '\\text{average value} = \\frac{1}{b - a} \\int_a^b f ( x ) dx',
|
249
|
+
))
|
250
|
+
|
251
|
+
example('d/dx[int_a^x f(t) dt] = f(x)', &should_generate(
|
252
|
+
:ast => seq(
|
253
|
+
infix('d', symbol('/'), symbol('dx')),
|
254
|
+
paren(
|
255
|
+
symbol('['),
|
256
|
+
seq(subsup(symbol('int'), 'a', 'x'), symbol('f'), paren('t'), symbol('dt')),
|
257
|
+
symbol(']')
|
258
|
+
),
|
259
|
+
symbol('='),
|
260
|
+
symbol('f'),
|
261
|
+
paren('x'),
|
262
|
+
),
|
263
|
+
:mathml => '<math><mfrac><mi>d</mi><mi>dx</mi></mfrac><mrow><mo>[</mo><mrow><msubsup><mo>∫</mo><mi>a</mi><mi>x</mi></msubsup><mi>f</mi><mrow><mo>(</mo><mi>t</mi><mo>)</mo></mrow><mi>dt</mi></mrow><mo>]</mo></mrow><mo>=</mo><mi>f</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></math>',
|
264
|
+
:html => '<span class="math-inline"><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-identifier">d</span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-identifier">dx</span></span></span></span></span></span><span class="math-row"><span class="math-brace">[</span><span class="math-operator">∫</span><span class="math-subsup"><span class="math-smaller"><span class="math-identifier">x</span></span><span class="math-smaller"><span class="math-identifier">a</span></span></span><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-identifier">t</span><span class="math-brace">)</span></span><span class="math-identifier">dt</span><span class="math-brace">]</span></span><span class="math-operator">=</span><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-identifier">x</span><span class="math-brace">)</span></span></span>',
|
265
|
+
:latex => '\\frac{d}{dx} \\left [ \\int_a^x f ( t ) dt \\right ] = f ( x )',
|
266
|
+
))
|
267
|
+
|
268
|
+
example('hat(ab) bar(xy) ul(A) vec(v)', &should_generate(
|
269
|
+
:ast => seq(
|
270
|
+
unary(symbol('hat'), grseq('a', 'b')),
|
271
|
+
unary(symbol('bar'), grseq('x', 'y')),
|
272
|
+
unary(symbol('ul'), group('A')),
|
273
|
+
unary(symbol('vec'), group('v')),
|
274
|
+
),
|
275
|
+
:mathml => '<math><mover><mrow><mi>a</mi><mi>b</mi></mrow><mo>^</mo></mover><mover><mrow><mi>x</mi><mi>y</mi></mrow><mo>¯</mo></mover><munder><mi>A</mi><mo>_</mo></munder><mover><mi>v</mi><mo>→</mo></mover></math>',
|
276
|
+
:html => '<span class="math-inline"><span class="math-blank">‍</span><span class="math-underover"><span class="math-smaller"><span class="math-operator">^</span></span><span class="math-row"><span class="math-identifier">a</span><span class="math-identifier">b</span></span><span class="math-smaller"><span class="math-blank">‍</span></span></span><span class="math-blank">‍</span><span class="math-underover"><span class="math-smaller"><span class="math-operator">¯</span></span><span class="math-row"><span class="math-identifier">x</span><span class="math-identifier">y</span></span><span class="math-smaller"><span class="math-blank">‍</span></span></span><span class="math-blank">‍</span><span class="math-underover"><span class="math-smaller"><span class="math-blank">‍</span></span><span class="math-identifier">A</span><span class="math-smaller"><span class="math-operator">_</span></span></span><span class="math-blank">‍</span><span class="math-underover"><span class="math-smaller"><span class="math-operator">→</span></span><span class="math-identifier">v</span><span class="math-smaller"><span class="math-blank">‍</span></span></span></span>',
|
277
|
+
:latex => '\\hat{a b} \\overline{x y} \\underline{A} \\vec{v}',
|
278
|
+
))
|
279
|
+
|
280
|
+
example('z_12^34', &should_generate(
|
281
|
+
:ast => subsup('z', '12', '34'),
|
282
|
+
:mathml => '<math><msubsup><mi>z</mi><mn>12</mn><mn>34</mn></msubsup></math>',
|
283
|
+
:html => '<span class="math-inline"><span class="math-identifier">z</span><span class="math-subsup"><span class="math-smaller"><span class="math-number">34</span></span><span class="math-smaller"><span class="math-number">12</span></span></span></span>',
|
284
|
+
:latex => 'z_{12}^{34}',
|
285
|
+
))
|
286
|
+
|
287
|
+
example('lim_(x->c)(f(x)-f(c))/(x-c)', &should_generate(
|
288
|
+
:ast => seq(
|
289
|
+
sub(symbol('lim'), grseq('x', symbol('->'), 'c')),
|
290
|
+
infix(
|
291
|
+
grseq(symbol('f'), paren('x'), symbol('-'), symbol('f'), paren('c')),
|
292
|
+
symbol('/'),
|
293
|
+
grseq('x', symbol('-'), 'c')
|
294
|
+
)
|
295
|
+
),
|
296
|
+
:mathml => '<math><munder><mo>lim</mo><mrow><mi>x</mi><mo>→</mo><mi>c</mi></mrow></munder><mfrac><mrow><mi>f</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mo>−</mo><mi>f</mi><mrow><mo>(</mo><mi>c</mi><mo>)</mo></mrow></mrow><mrow><mi>x</mi><mo>−</mo><mi>c</mi></mrow></mfrac></math>',
|
297
|
+
:html => '<span class="math-inline"><span class="math-blank">‍</span><span class="math-underover"><span class="math-smaller"><span class="math-blank">‍</span></span><span class="math-operator">lim</span><span class="math-smaller"><span class="math-row"><span class="math-identifier">x</span><span class="math-operator">→</span><span class="math-identifier">c</span></span></span></span><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-identifier">x</span><span class="math-brace">)</span></span><span class="math-operator">−</span><span class="math-identifier">f</span><span class="math-row"><span class="math-brace">(</span><span class="math-identifier">c</span><span class="math-brace">)</span></span></span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-identifier">x</span><span class="math-operator">−</span><span class="math-identifier">c</span></span></span></span></span></span></span></span>',
|
298
|
+
:latex => '\\lim_{x \\rightarrow c} \\frac{f ( x ) - f ( c )}{x - c}',
|
299
|
+
))
|
300
|
+
|
301
|
+
example('int_0^(pi/2) g(x) dx', &should_generate(
|
302
|
+
:ast => seq(
|
303
|
+
subsup(symbol('int'), '0', group(infix(symbol('pi'), symbol('/'), '2'))),
|
304
|
+
symbol('g'), paren('x'),
|
305
|
+
symbol('dx')
|
306
|
+
),
|
307
|
+
:mathml => '<math><msubsup><mo>∫</mo><mn>0</mn><mfrac><mi>π</mi><mn>2</mn></mfrac></msubsup><mi>g</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mi>dx</mi></math>',
|
308
|
+
:html => '<span class="math-inline"><span class="math-operator">∫</span><span class="math-subsup"><span class="math-smaller"><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-identifier">π</span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-number">2</span></span></span></span></span></span></span><span class="math-smaller"><span class="math-number">0</span></span></span><span class="math-identifier">g</span><span class="math-row"><span class="math-brace">(</span><span class="math-identifier">x</span><span class="math-brace">)</span></span><span class="math-identifier">dx</span></span>',
|
309
|
+
:latex => '\\int_0^{\\frac{\\pi}{2}} g ( x ) dx',
|
310
|
+
))
|
311
|
+
|
312
|
+
example('sum_(n=0)^oo a_n', &should_generate(
|
313
|
+
:ast => seq(
|
314
|
+
subsup(symbol('sum'), grseq('n', symbol('='), '0'), symbol('oo'),),
|
315
|
+
sub('a', 'n')
|
316
|
+
),
|
317
|
+
:mathml => '<math><munderover><mo>∑</mo><mrow><mi>n</mi><mo>=</mo><mn>0</mn></mrow><mo>∞</mo></munderover><msub><mi>a</mi><mi>n</mi></msub></math>',
|
318
|
+
:html => '<span class="math-inline"><span class="math-blank">‍</span><span class="math-underover"><span class="math-smaller"><span class="math-operator">∞</span></span><span class="math-operator">∑</span><span class="math-smaller"><span class="math-row"><span class="math-identifier">n</span><span class="math-operator">=</span><span class="math-number">0</span></span></span></span><span class="math-identifier">a</span><span class="math-subsup"><span class="math-smaller">‍</span><span class="math-smaller"><span class="math-identifier">n</span></span></span></span>',
|
319
|
+
:latex => '\\sum_{n = 0}^\\infty a_n',
|
320
|
+
))
|
321
|
+
|
322
|
+
example('((1,2,3),(4,5,6),(7,8,9))', &should_generate(
|
323
|
+
:ast => matrix([%w[1 2 3], %w[4 5 6], %w[7 8 9]]),
|
324
|
+
:mathml => '<math><mrow><mo>(</mo><mtable><mtr><mtd><mn>1</mn></mtd><mtd><mn>2</mn></mtd><mtd><mn>3</mn></mtd></mtr><mtr><mtd><mn>4</mn></mtd><mtd><mn>5</mn></mtd><mtd><mn>6</mn></mtd></mtr><mtr><mtd><mn>7</mn></mtd><mtd><mn>8</mn></mtd><mtd><mn>9</mn></mtd></mtr></mtable><mo>)</mo></mrow></math>',
|
325
|
+
:html => '<span class="math-inline"><span class="math-row"><span class="math-brace" style="font-size: 300%;">(</span><span class="math-matrix" style="grid-template-columns:repeat(3,1fr);grid-template-rows:repeat(3,1fr);"><span class="math-row"><span class="math-number">1</span></span><span class="math-row"><span class="math-number">2</span></span><span class="math-row"><span class="math-number">3</span></span><span class="math-row"><span class="math-number">4</span></span><span class="math-row"><span class="math-number">5</span></span><span class="math-row"><span class="math-number">6</span></span><span class="math-row"><span class="math-number">7</span></span><span class="math-row"><span class="math-number">8</span></span><span class="math-row"><span class="math-number">9</span></span></span><span class="math-brace" style="font-size: 300%;">)</span></span></span>',
|
326
|
+
:latex => '\\left ( \\begin{matrix} 1 & 2 & 3 \\\\ 4 & 5 & 6 \\\\ 7 & 8 & 9 \\end{matrix} \\right )',
|
327
|
+
))
|
328
|
+
|
329
|
+
example('|(a,b),(c,d)|=ad-bc', &should_generate(
|
330
|
+
:ast => seq(
|
331
|
+
matrix(symbol('|'), [%w(a b), %w(c d)], symbol('|'),),
|
332
|
+
symbol('='),
|
333
|
+
'a', 'd',
|
334
|
+
symbol('-'),
|
335
|
+
'b', 'c'
|
336
|
+
),
|
337
|
+
:mathml => '<math><mrow><mo>|</mo><mtable><mtr><mtd><mi>a</mi></mtd><mtd><mi>b</mi></mtd></mtr><mtr><mtd><mi>c</mi></mtd><mtd><mi>d</mi></mtd></mtr></mtable><mo>|</mo></mrow><mo>=</mo><mi>a</mi><mi>d</mi><mo>−</mo><mi>b</mi><mi>c</mi></math>',
|
338
|
+
:mathml_word => '<math><mfenced open="|" close="|"><mtable><mtr><mtd><mi>a</mi></mtd><mtd><mi>b</mi></mtd></mtr><mtr><mtd><mi>c</mi></mtd><mtd><mi>d</mi></mtd></mtr></mtable></mfenced><mo>=</mo><mi>a</mi><mi>d</mi><mo>−</mo><mi>b</mi><mi>c</mi></math>',
|
339
|
+
:html => '<span class="math-inline"><span class="math-row"><span class="math-brace" style="font-size: 200%;">|</span><span class="math-matrix" style="grid-template-columns:repeat(2,1fr);grid-template-rows:repeat(2,1fr);"><span class="math-row"><span class="math-identifier">a</span></span><span class="math-row"><span class="math-identifier">b</span></span><span class="math-row"><span class="math-identifier">c</span></span><span class="math-row"><span class="math-identifier">d</span></span></span><span class="math-brace" style="font-size: 200%;">|</span></span><span class="math-operator">=</span><span class="math-identifier">a</span><span class="math-identifier">d</span><span class="math-operator">−</span><span class="math-identifier">b</span><span class="math-identifier">c</span></span>',
|
340
|
+
:latex => '\\left | \\begin{matrix} a & b \\\\ c & d \\end{matrix} \\right | = a d - b c',
|
341
|
+
))
|
342
|
+
|
343
|
+
example('((a_(11), cdots , a_(1n)),(vdots, ddots, vdots),(a_(m1), cdots , a_(mn)))', &should_generate(
|
344
|
+
:ast => matrix([
|
345
|
+
[sub('a', group('11')), symbol('cdots'), sub('a', grseq('1', 'n'))],
|
346
|
+
[symbol('vdots'), symbol('ddots'), symbol('vdots')],
|
347
|
+
[sub('a', grseq('m', '1')), symbol('cdots'), sub('a', grseq('m', 'n'))]
|
348
|
+
]),
|
349
|
+
:mathml => '<math><mrow><mo>(</mo><mtable><mtr><mtd><msub><mi>a</mi><mn>11</mn></msub></mtd><mtd><mo>⋯</mo></mtd><mtd><msub><mi>a</mi><mrow><mn>1</mn><mi>n</mi></mrow></msub></mtd></mtr><mtr><mtd><mo>⋮</mo></mtd><mtd><mo>⋱</mo></mtd><mtd><mo>⋮</mo></mtd></mtr><mtr><mtd><msub><mi>a</mi><mrow><mi>m</mi><mn>1</mn></mrow></msub></mtd><mtd><mo>⋯</mo></mtd><mtd><msub><mi>a</mi><mrow><mi>m</mi><mi>n</mi></mrow></msub></mtd></mtr></mtable><mo>)</mo></mrow></math>',
|
350
|
+
:html => '<span class="math-inline"><span class="math-row"><span class="math-brace" style="font-size: 300%;">(</span><span class="math-matrix" style="grid-template-columns:repeat(3,1fr);grid-template-rows:repeat(3,1fr);"><span class="math-row"><span class="math-identifier">a</span><span class="math-subsup"><span class="math-smaller">‍</span><span class="math-smaller"><span class="math-number">11</span></span></span></span><span class="math-row"><span class="math-operator">⋯</span></span><span class="math-row"><span class="math-identifier">a</span><span class="math-subsup"><span class="math-smaller">‍</span><span class="math-smaller"><span class="math-row"><span class="math-number">1</span><span class="math-identifier">n</span></span></span></span></span><span class="math-row"><span class="math-operator">⋮</span></span><span class="math-row"><span class="math-operator">⋱</span></span><span class="math-row"><span class="math-operator">⋮</span></span><span class="math-row"><span class="math-identifier">a</span><span class="math-subsup"><span class="math-smaller">‍</span><span class="math-smaller"><span class="math-row"><span class="math-identifier">m</span><span class="math-number">1</span></span></span></span></span><span class="math-row"><span class="math-operator">⋯</span></span><span class="math-row"><span class="math-identifier">a</span><span class="math-subsup"><span class="math-smaller">‍</span><span class="math-smaller"><span class="math-row"><span class="math-identifier">m</span><span class="math-identifier">n</span></span></span></span></span></span><span class="math-brace" style="font-size: 300%;">)</span></span></span>',
|
351
|
+
:latex => '\\left ( \\begin{matrix} a_{11} & \\cdots & a_{1 n} \\\\ \\vdots & \\ddots & \\vdots \\\\ a_{m 1} & \\cdots & a_{m n} \\end{matrix} \\right )',
|
352
|
+
))
|
353
|
+
|
354
|
+
example('sum_(k=1)^n k = 1+2+ cdots +n=(n(n+1))/2', &should_generate(
|
355
|
+
:ast => seq(
|
356
|
+
subsup(symbol('sum'), grseq('k', symbol('='), '1'), 'n'),
|
357
|
+
'k',
|
358
|
+
symbol('='),
|
359
|
+
'1', symbol('+'), '2', symbol('+'), symbol('cdots'), symbol('+'), 'n',
|
360
|
+
symbol('='),
|
361
|
+
infix(
|
362
|
+
grseq('n', paren(seq('n', symbol('+'), '1'))),
|
363
|
+
symbol('/'),
|
364
|
+
'2'
|
365
|
+
)
|
366
|
+
),
|
367
|
+
:mathml => '<math><munderover><mo>∑</mo><mrow><mi>k</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mi>k</mi><mo>=</mo><mn>1</mn><mo>+</mo><mn>2</mn><mo>+</mo><mo>⋯</mo><mo>+</mo><mi>n</mi><mo>=</mo><mfrac><mrow><mi>n</mi><mrow><mo>(</mo><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow><mo>)</mo></mrow></mrow><mn>2</mn></mfrac></math>',
|
368
|
+
:html => '<span class="math-inline"><span class="math-blank">‍</span><span class="math-underover"><span class="math-smaller"><span class="math-identifier">n</span></span><span class="math-operator">∑</span><span class="math-smaller"><span class="math-row"><span class="math-identifier">k</span><span class="math-operator">=</span><span class="math-number">1</span></span></span></span><span class="math-identifier">k</span><span class="math-operator">=</span><span class="math-number">1</span><span class="math-operator">+</span><span class="math-number">2</span><span class="math-operator">+</span><span class="math-operator">⋯</span><span class="math-operator">+</span><span class="math-identifier">n</span><span class="math-operator">=</span><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-identifier">n</span><span class="math-row"><span class="math-brace">(</span><span class="math-identifier">n</span><span class="math-operator">+</span><span class="math-number">1</span><span class="math-brace">)</span></span></span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-number">2</span></span></span></span></span></span></span>',
|
369
|
+
:latex => '\\sum_{k = 1}^n k = 1 + 2 + \\cdots + n = \\frac{n ( n + 1 )}{2}',
|
370
|
+
))
|
371
|
+
|
372
|
+
example('"Скорость"=("Расстояние")/("Время")', &should_generate(
|
373
|
+
:ast => seq(
|
374
|
+
'Скорость',
|
375
|
+
symbol('='),
|
376
|
+
infix(group('Расстояние'), symbol('/'), group('Время'))
|
377
|
+
),
|
378
|
+
:mathml => '<math><mtext>Скорость</mtext><mo>=</mo><mfrac><mtext>Расстояние</mtext><mtext>Время</mtext></mfrac></math>',
|
379
|
+
:html => '<span class="math-inline"><span class="math-text">Скорость</span><span class="math-operator">=</span><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-text">Расстояние</span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-text">Время</span></span></span></span></span></span></span>',
|
380
|
+
:latex => '\\text{Скорость} = \\frac{\\text{Расстояние}}{\\text{Время}}',
|
381
|
+
))
|
382
|
+
|
383
|
+
example('bb (a + b) + cc c = fr (d^n)', &should_generate(
|
384
|
+
:ast => seq(
|
385
|
+
unary(symbol('bb'), grseq('a', symbol('+'), 'b')),
|
386
|
+
symbol('+'),
|
387
|
+
unary(symbol('cc'), 'c'),
|
388
|
+
symbol('='),
|
389
|
+
unary(symbol('fr'), group(sup('d', 'n')))
|
390
|
+
),
|
391
|
+
:mathml => '<math><mstyle mathvariant="bold"><mrow><mi>a</mi><mo>+</mo><mi>b</mi></mrow></mstyle><mo>+</mo><mstyle mathvariant="script"><mi>c</mi></mstyle><mo>=</mo><mstyle mathvariant="fraktur"><msup><mi>d</mi><mi>n</mi></msup></mstyle></math>',
|
392
|
+
:latex => '\\mathbf{a + b} + \\mathscr{c} = \\mathfrak{d^n}',
|
393
|
+
))
|
394
|
+
|
395
|
+
example('max()', &should_generate(
|
396
|
+
:ast => seq(symbol('max'), paren(nil)),
|
397
|
+
:mathml => '<math><mo>max</mo><mrow><mo>(</mo><mo>)</mo></mrow></math>',
|
398
|
+
:html => '<span class="math-inline"><span class="math-operator">max</span><span class="math-row"><span class="math-brace">(</span><span class="math-brace">)</span></span></span>',
|
399
|
+
:latex => '\\max ( )',
|
400
|
+
))
|
401
|
+
|
402
|
+
example('text("foo")', &should_generate(
|
403
|
+
:ast => text('"foo"'),
|
404
|
+
:mathml => '<math><mtext>"foo"</mtext></math>',
|
405
|
+
:html => '<span class="math-inline"><span class="math-text">"foo"</span></span>',
|
406
|
+
:latex => '\\text{"foo"}',
|
407
|
+
))
|
408
|
+
|
409
|
+
example('ubrace(1 + 2) obrace(3 + 4', &should_generate(
|
410
|
+
:ast => seq(
|
411
|
+
unary(symbol('ubrace'), grseq('1', symbol('+'), '2')),
|
412
|
+
unary(symbol('obrace'), group(symbol('('), seq('3', symbol('+'), '4'), nil))
|
413
|
+
),
|
414
|
+
:mathml => '<math><munder><mrow><mn>1</mn><mo>+</mo><mn>2</mn></mrow><mo>⏟</mo></munder><mover><mrow><mn>3</mn><mo>+</mo><mn>4</mn></mrow><mo>⏞</mo></mover></math>',
|
415
|
+
:latex => '\\underbrace{1 + 2} \\overbrace{3 + 4}',
|
416
|
+
))
|
417
|
+
|
418
|
+
example('s\'_i = {(- 1, if s_i > s_(i + 1)),( + 1, if s_i <= s_(i + 1)):}', &should_generate(
|
419
|
+
:ast => seq(
|
420
|
+
's',
|
421
|
+
sub(symbol('\''), 'i'),
|
422
|
+
symbol('='),
|
423
|
+
matrix(
|
424
|
+
symbol('{'),
|
425
|
+
[
|
426
|
+
[seq(symbol('-'), '1'), seq(symbol('if'), sub('s', 'i'), symbol('>'), sub('s', grseq('i', symbol('+'), '1')))],
|
427
|
+
[seq(symbol('+'), '1'), seq(symbol('if'), sub('s', 'i'), symbol('<='), sub('s', grseq('i', symbol('+'), '1')))]
|
428
|
+
],
|
429
|
+
symbol(':}'),
|
430
|
+
)
|
431
|
+
),
|
432
|
+
:mathml => '<math><mi>s</mi><msub><mo>′</mo><mi>i</mi></msub><mo>=</mo><mrow><mo>{</mo><mtable><mtr><mtd><mrow><mo>−</mo><mn>1</mn></mrow></mtd><mtd><mrow><mo>if</mo><msub><mi>s</mi><mi>i</mi></msub><mo>></mo><msub><mi>s</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow></msub></mrow></mtd></mtr><mtr><mtd><mrow><mo>+</mo><mn>1</mn></mrow></mtd><mtd><mrow><mo>if</mo><msub><mi>s</mi><mi>i</mi></msub><mo>≤</mo><msub><mi>s</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow></msub></mrow></mtd></mtr></mtable></mrow></math>',
|
433
|
+
:latex => 's \'_i = \\left \\{ \\begin{matrix} - 1 & \\operatorname{if} s_i > s_{i + 1} \\\\ + 1 & \\operatorname{if} s_i \\le s_{i + 1} \\end{matrix} \\right .',
|
434
|
+
))
|
435
|
+
|
436
|
+
example('s\'_i = {(, if s_i > s_(i + 1)),( + 1,):}', &should_generate(
|
437
|
+
:ast => seq(
|
438
|
+
's',
|
439
|
+
sub(symbol('\''), 'i'),
|
440
|
+
symbol('='),
|
441
|
+
matrix(
|
442
|
+
symbol('{'),
|
443
|
+
[
|
444
|
+
[[], [symbol('if'), sub('s', 'i'), symbol('>'), sub('s', grseq('i', symbol('+'), '1'))]],
|
445
|
+
[[symbol('+'), '1'], []]
|
446
|
+
],
|
447
|
+
symbol(':}')
|
448
|
+
)
|
449
|
+
),
|
450
|
+
:mathml => '<math><mi>s</mi><msub><mo>′</mo><mi>i</mi></msub><mo>=</mo><mrow><mo>{</mo><mtable><mtr><mtd></mtd><mtd><mrow><mo>if</mo><msub><mi>s</mi><mi>i</mi></msub><mo>></mo><msub><mi>s</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow></msub></mrow></mtd></mtr><mtr><mtd><mrow><mo>+</mo><mn>1</mn></mrow></mtd><mtd></mtd></mtr></mtable></mrow></math>',
|
451
|
+
:latex => 's \'_i = \\left \\{ \\begin{matrix} & \\operatorname{if} s_i > s_{i + 1} \\\\ + 1 & \\end{matrix} \\right .',
|
452
|
+
))
|
453
|
+
|
454
|
+
example('{:(a,b),(c,d):}', &should_generate(
|
455
|
+
:ast => matrix(
|
456
|
+
symbol('{:'),
|
457
|
+
[%w(a b), %w(c d)],
|
458
|
+
symbol(':}')
|
459
|
+
),
|
460
|
+
:mathml => '<math><mtable><mtr><mtd><mi>a</mi></mtd><mtd><mi>b</mi></mtd></mtr><mtr><mtd><mi>c</mi></mtd><mtd><mi>d</mi></mtd></mtr></mtable></math>',
|
461
|
+
:latex => '\\begin{matrix} a & b \\\\ c & d \\end{matrix}',
|
462
|
+
))
|
463
|
+
|
464
|
+
example('overset (a + b) (c + d)', &should_generate(
|
465
|
+
:ast => binary(
|
466
|
+
symbol('overset'),
|
467
|
+
grseq('a', symbol('+'), 'b'),
|
468
|
+
grseq('c', symbol('+'), 'd')
|
469
|
+
),
|
470
|
+
:mathml => '<math><mover><mrow><mi>c</mi><mo>+</mo><mi>d</mi></mrow><mrow><mi>a</mi><mo>+</mo><mi>b</mi></mrow></mover></math>',
|
471
|
+
:html => '<span class="math-inline"><span class="math-blank">‍</span><span class="math-underover"><span class="math-smaller"><span class="math-row"><span class="math-identifier">a</span><span class="math-operator">+</span><span class="math-identifier">b</span></span></span><span class="math-row"><span class="math-identifier">c</span><span class="math-operator">+</span><span class="math-identifier">d</span></span><span class="math-smaller"><span class="math-blank">‍</span></span></span></span>',
|
472
|
+
:latex => '\\overset{a + b}{c + d}',
|
473
|
+
))
|
474
|
+
|
475
|
+
example('underset a b', &should_generate(
|
476
|
+
:ast => binary(
|
477
|
+
symbol('underset'),
|
478
|
+
'a',
|
479
|
+
'b'
|
480
|
+
),
|
481
|
+
:mathml => '<math><munder><mi>b</mi><mi>a</mi></munder></math>',
|
482
|
+
:html => '<span class="math-inline"><span class="math-blank">‍</span><span class="math-underover"><span class="math-smaller"><span class="math-blank">‍</span></span><span class="math-identifier">b</span><span class="math-smaller"><span class="math-identifier">a</span></span></span></span>',
|
483
|
+
:latex => '\\underset{a}{b}',
|
484
|
+
))
|
485
|
+
|
486
|
+
example('sin a_c^b', &should_generate(
|
487
|
+
:ast => seq(
|
488
|
+
symbol('sin'),
|
489
|
+
subsup('a', 'c', 'b')
|
490
|
+
),
|
491
|
+
:mathml => '<math><mi>sin</mi><msubsup><mi>a</mi><mi>c</mi><mi>b</mi></msubsup></math>',
|
492
|
+
:html => '<span class="math-inline"><span class="math-identifier">sin</span><span class="math-identifier">a</span><span class="math-subsup"><span class="math-smaller"><span class="math-identifier">b</span></span><span class="math-smaller"><span class="math-identifier">c</span></span></span></span>',
|
493
|
+
:latex => '\\sin a_c^b',
|
494
|
+
))
|
495
|
+
|
496
|
+
example('max a_c^b', &should_generate(
|
497
|
+
:ast => seq(
|
498
|
+
symbol('max'),
|
499
|
+
subsup('a', 'c', 'b')
|
500
|
+
),
|
501
|
+
:mathml => '<math><mo>max</mo><msubsup><mi>a</mi><mi>c</mi><mi>b</mi></msubsup></math>',
|
502
|
+
:html => '<span class="math-inline"><span class="math-operator">max</span><span class="math-identifier">a</span><span class="math-subsup"><span class="math-smaller"><span class="math-identifier">b</span></span><span class="math-smaller"><span class="math-identifier">c</span></span></span></span>',
|
503
|
+
:latex => '\\max a_c^b',
|
504
|
+
))
|
505
|
+
|
506
|
+
example('norm a_c^b', &should_generate(
|
507
|
+
:ast => subsup(unary(symbol('norm'), 'a'), 'c', 'b'),
|
508
|
+
:mathml => '<math><msubsup><mrow><mo>∥</mo><mi>a</mi><mo>∥</mo></mrow><mi>c</mi><mi>b</mi></msubsup></math>',
|
509
|
+
:html => '<span class="math-inline"><span class="math-row"><span class="math-brace">∥</span><span class="math-identifier">a</span><span class="math-brace">∥</span></span><span class="math-subsup"><span class="math-smaller"><span class="math-identifier">b</span></span><span class="math-smaller"><span class="math-identifier">c</span></span></span></span>',
|
510
|
+
:latex => '{\\lVert a \\rVert}_c^b',
|
511
|
+
))
|
512
|
+
|
513
|
+
example('overarc a_b^c', &should_generate(
|
514
|
+
:ast => subsup(unary(symbol('overarc'), 'a'), 'b', 'c'),
|
515
|
+
:mathml => '<math><msubsup><mover><mi>a</mi><mo>⏜</mo></mover><mi>b</mi><mi>c</mi></msubsup></math>',
|
516
|
+
:latex => '{\\overset{\\frown}{a}}_b^c'
|
517
|
+
))
|
518
|
+
|
519
|
+
example('frown a_b^c', &should_generate(
|
520
|
+
:ast => seq(symbol('frown'), subsup('a', 'b', 'c')),
|
521
|
+
:mathml => '<math><mo>⌢</mo><msubsup><mi>a</mi><mi>b</mi><mi>c</mi></msubsup></math>',
|
522
|
+
:latex => '\\frown a_b^c',
|
523
|
+
))
|
524
|
+
|
525
|
+
example('sin(a_c^b)', &should_generate(
|
526
|
+
:ast => seq(symbol('sin'), paren(subsup('a', 'c', 'b'))),
|
527
|
+
:mathml => '<math><mi>sin</mi><mrow><mo>(</mo><msubsup><mi>a</mi><mi>c</mi><mi>b</mi></msubsup><mo>)</mo></mrow></math>',
|
528
|
+
:latex => '\\sin ( a_c^b )',
|
529
|
+
))
|
530
|
+
|
531
|
+
example('text(a)a2)', &should_generate(
|
532
|
+
:ast => seq(text('a'), identifier('a'), number('2'), symbol(')')),
|
533
|
+
:mathml => '<math><mtext>a</mtext><mi>a</mi><mn>2</mn><mo>)</mo></math>',
|
534
|
+
:html => '<span class="math-inline"><span class="math-text">a</span><span class="math-identifier">a</span><span class="math-number">2</span><span class="math-operator">)</span></span>',
|
535
|
+
:latex => '\\text{a} a 2 )',
|
536
|
+
))
|
537
|
+
|
538
|
+
example('cancel(a_b^c) cancel a_b^c', &should_generate(
|
539
|
+
:ast => seq(
|
540
|
+
unary(symbol('cancel'), group(subsup('a', 'b', 'c'))),
|
541
|
+
subsup(unary(symbol('cancel'), 'a'), 'b', 'c')
|
542
|
+
),
|
543
|
+
:mathml => '<math><menclose notation="updiagonalstrike"><msubsup><mi>a</mi><mi>b</mi><mi>c</mi></msubsup></menclose><msubsup><menclose notation="updiagonalstrike"><mi>a</mi></menclose><mi>b</mi><mi>c</mi></msubsup></math>',
|
544
|
+
:latex => '\\cancel{a_b^c} {\\cancel{a}}_b^c',
|
545
|
+
))
|
546
|
+
|
547
|
+
example('color(red)(x) color(#123)(y) color(#1234ab)(z) colortext(blue)(a_b^c)', &should_generate(
|
548
|
+
:ast => seq(
|
549
|
+
binary(symbol('color'), color(255, 0, 0, 'red'), group('x')),
|
550
|
+
binary(symbol('color'), color(17, 34, 51, '#123'), group('y')),
|
551
|
+
binary(symbol('color'), color(18, 52, 171, '#1234ab'), group('z')),
|
552
|
+
binary(symbol('color'), color(0, 0, 255, 'blue'), group(subsup('a', 'b', 'c')))
|
553
|
+
),
|
554
|
+
:mathml => '<math><mstyle mathcolor="#ff0000"><mi>x</mi></mstyle><mstyle mathcolor="#112233"><mi>y</mi></mstyle><mstyle mathcolor="#1234ab"><mi>z</mi></mstyle><mstyle mathcolor="#0000ff"><msubsup><mi>a</mi><mi>b</mi><mi>c</mi></msubsup></mstyle></math>',
|
555
|
+
:latex => '{\\color{red} x} {\\color[RGB]{17,34,51} y} {\\color[RGB]{18,52,171} z} {\\color{blue} a_b^c}',
|
556
|
+
))
|
557
|
+
|
558
|
+
example('{ x\ : \ x in A ^^ x in B }', &should_generate(
|
559
|
+
:ast => paren(
|
560
|
+
symbol('{'),
|
561
|
+
seq('x', symbol('\ '), ':', symbol('\ '), 'x', symbol('in'), 'A', symbol('^^'), 'x', symbol('in'), 'B'),
|
562
|
+
symbol('}')
|
563
|
+
),
|
564
|
+
:mathml => '<math><mrow><mo>{</mo><mrow><mi>x</mi><mo> </mo><mi>:</mi><mo> </mo><mi>x</mi><mo>∈</mo><mi>A</mi><mo>∧</mo><mi>x</mi><mo>∈</mo><mi>B</mi></mrow><mo>}</mo></mrow></math>',
|
565
|
+
:latex => '\\left \\{ x \\; : \\; x \\in A \\wedge x \\in B \\right \\}',
|
566
|
+
))
|
567
|
+
|
568
|
+
version = RUBY_VERSION.split('.').map { |s| s.to_i }
|
569
|
+
|
570
|
+
if version[0] > 1 || version[1] > 8
|
571
|
+
example('Скорость=(Расстояние)/(Время)', &should_generate(
|
572
|
+
:ast => seq(
|
573
|
+
'С', 'к', 'о', 'р', 'о', 'с', 'т', 'ь',
|
574
|
+
symbol('='),
|
575
|
+
infix(
|
576
|
+
grseq('Р', 'а', 'с', 'с', 'т', 'о', 'я', 'н', 'и', 'е'),
|
577
|
+
symbol('/'),
|
578
|
+
grseq('В', 'р', 'е', 'м', 'я')
|
579
|
+
)
|
580
|
+
),
|
581
|
+
:mathml => '<math><mi>С</mi><mi>к</mi><mi>о</mi><mi>р</mi><mi>о</mi><mi>с</mi><mi>т</mi><mi>ь</mi><mo>=</mo><mfrac><mrow><mi>Р</mi><mi>а</mi><mi>с</mi><mi>с</mi><mi>т</mi><mi>о</mi><mi>я</mi><mi>н</mi><mi>и</mi><mi>е</mi></mrow><mrow><mi>В</mi><mi>р</mi><mi>е</mi><mi>м</mi><mi>я</mi></mrow></mfrac></math>',
|
582
|
+
:html => '<span class="math-inline"><span class="math-identifier">С</span><span class="math-identifier">к</span><span class="math-identifier">о</span><span class="math-identifier">р</span><span class="math-identifier">о</span><span class="math-identifier">с</span><span class="math-identifier">т</span><span class="math-identifier">ь</span><span class="math-operator">=</span><span class="math-blank">‍</span><span class="math-fraction"><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-identifier">Р</span><span class="math-identifier">а</span><span class="math-identifier">с</span><span class="math-identifier">с</span><span class="math-identifier">т</span><span class="math-identifier">о</span><span class="math-identifier">я</span><span class="math-identifier">н</span><span class="math-identifier">и</span><span class="math-identifier">е</span></span></span></span></span></span><span class="math-fraction_row"><span class="math-fraction_cell"><span class="math-smaller"><span class="math-row"><span class="math-row"><span class="math-identifier">В</span><span class="math-identifier">р</span><span class="math-identifier">е</span><span class="math-identifier">м</span><span class="math-identifier">я</span></span></span></span></span></span></span></span>',
|
583
|
+
:latex => 'С к о р о с т ь = \\frac{Р а с с т о я н и е}{В р е м я}'
|
584
|
+
))
|
178
585
|
end
|
179
|
-
end
|
586
|
+
end
|
587
|
+
|
588
|
+
describe 'AsciiMath::Parser', :variant => :ast do
|
589
|
+
include_examples 'AsciiMath Examples'
|
590
|
+
end
|
591
|
+
|
592
|
+
describe 'AsciiMath::MathMLBuilder', :variant => :mathml do
|
593
|
+
include_examples 'AsciiMath Examples'
|
594
|
+
end
|
595
|
+
|
596
|
+
describe 'AsciiMath::MathMLBuilder Microsoft Office', :variant => :mathml_word do
|
597
|
+
include_examples 'AsciiMath Examples'
|
598
|
+
end
|
599
|
+
|
600
|
+
describe 'AsciiMath::HTMLBuilder', :variant => :html do
|
601
|
+
include_examples 'AsciiMath Examples', :html
|
602
|
+
end
|
603
|
+
|
604
|
+
describe 'AsciiMath::LatexBuilder', :variant => :latex do
|
605
|
+
include_examples 'AsciiMath Examples'
|
606
|
+
end
|