plurimath 0.8.16 → 0.8.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/gen_docs.yml +10 -8
  3. data/Gemfile +1 -1
  4. data/README.adoc +4 -0
  5. data/Rakefile +55 -8
  6. data/intent_supported_classes.adoc +82 -0
  7. data/lib/plurimath/asciimath/parse.rb +1 -0
  8. data/lib/plurimath/asciimath/transform.rb +12 -0
  9. data/lib/plurimath/formatter/number_formatter.rb +6 -6
  10. data/lib/plurimath/formatter/numeric_formatter.rb +5 -2
  11. data/lib/plurimath/formatter/standard.rb +2 -0
  12. data/lib/plurimath/math/core.rb +65 -6
  13. data/lib/plurimath/math/formula/mrow.rb +193 -0
  14. data/lib/plurimath/math/formula/mstyle.rb +17 -0
  15. data/lib/plurimath/math/formula.rb +317 -7
  16. data/lib/plurimath/math/function/abs.rb +5 -1
  17. data/lib/plurimath/math/function/base.rb +4 -0
  18. data/lib/plurimath/math/function/color.rb +17 -4
  19. data/lib/plurimath/math/function/fenced.rb +238 -7
  20. data/lib/plurimath/math/function/frac.rb +12 -1
  21. data/lib/plurimath/math/function/inf.rb +5 -1
  22. data/lib/plurimath/math/function/int.rb +5 -1
  23. data/lib/plurimath/math/function/intent.rb +6 -2
  24. data/lib/plurimath/math/function/lim.rb +5 -1
  25. data/lib/plurimath/math/function/linebreak.rb +2 -2
  26. data/lib/plurimath/math/function/longdiv.rb +3 -0
  27. data/lib/plurimath/math/function/menclose.rb +3 -0
  28. data/lib/plurimath/math/function/merror.rb +5 -2
  29. data/lib/plurimath/math/function/mglyph.rb +27 -0
  30. data/lib/plurimath/math/function/mlabeledtr.rb +19 -0
  31. data/lib/plurimath/math/function/mpadded.rb +28 -1
  32. data/lib/plurimath/math/function/ms.rb +80 -0
  33. data/lib/plurimath/math/function/msgroup.rb +15 -0
  34. data/lib/plurimath/math/function/msline.rb +5 -2
  35. data/lib/plurimath/math/function/multiscript.rb +14 -0
  36. data/lib/plurimath/math/function/nary.rb +13 -1
  37. data/lib/plurimath/math/function/oint.rb +5 -1
  38. data/lib/plurimath/math/function/over.rb +3 -0
  39. data/lib/plurimath/math/function/overset.rb +11 -0
  40. data/lib/plurimath/math/function/phantom.rb +3 -0
  41. data/lib/plurimath/math/function/power.rb +3 -0
  42. data/lib/plurimath/math/function/power_base.rb +3 -0
  43. data/lib/plurimath/math/function/prod.rb +5 -1
  44. data/lib/plurimath/math/function/root.rb +3 -0
  45. data/lib/plurimath/math/function/scarries.rb +3 -0
  46. data/lib/plurimath/math/function/semantics.rb +14 -0
  47. data/lib/plurimath/math/function/sqrt.rb +3 -0
  48. data/lib/plurimath/math/function/stackrel.rb +3 -0
  49. data/lib/plurimath/math/function/sum.rb +5 -1
  50. data/lib/plurimath/math/function/table/array.rb +1 -1
  51. data/lib/plurimath/math/function/table/bmatrix.rb +1 -1
  52. data/lib/plurimath/math/function/table/cases.rb +2 -2
  53. data/lib/plurimath/math/function/table/eqarray.rb +2 -2
  54. data/lib/plurimath/math/function/table/pmatrix.rb +1 -1
  55. data/lib/plurimath/math/function/table/vmatrix.rb +1 -1
  56. data/lib/plurimath/math/function/table.rb +65 -0
  57. data/lib/plurimath/math/function/td.rb +4 -1
  58. data/lib/plurimath/math/function/text.rb +22 -2
  59. data/lib/plurimath/math/function/tr.rb +13 -0
  60. data/lib/plurimath/math/function/unary_function.rb +5 -1
  61. data/lib/plurimath/math/function/underover.rb +3 -0
  62. data/lib/plurimath/math/function/underset.rb +44 -0
  63. data/lib/plurimath/math/number.rb +10 -1
  64. data/lib/plurimath/math/symbols/bigwedge.rb +4 -0
  65. data/lib/plurimath/math/symbols/cap.rb +0 -4
  66. data/lib/plurimath/math/symbols/clockoint.rb +1 -1
  67. data/lib/plurimath/math/symbols/cntclockoint.rb +1 -1
  68. data/lib/plurimath/math/symbols/coprod.rb +1 -1
  69. data/lib/plurimath/math/symbols/dd.rb +4 -0
  70. data/lib/plurimath/math/symbols/dint.rb +4 -0
  71. data/lib/plurimath/math/symbols/duni.rb +4 -0
  72. data/lib/plurimath/math/symbols/gg.rb +4 -4
  73. data/lib/plurimath/math/symbols/ii.rb +4 -0
  74. data/lib/plurimath/math/symbols/iiiint.rb +1 -1
  75. data/lib/plurimath/math/symbols/iiint.rb +4 -0
  76. data/lib/plurimath/math/symbols/iint.rb +1 -1
  77. data/lib/plurimath/math/symbols/intclockwise.rb +1 -1
  78. data/lib/plurimath/math/symbols/intercal.rb +4 -0
  79. data/lib/plurimath/math/symbols/jj.rb +4 -0
  80. data/lib/plurimath/math/symbols/ll.rb +4 -4
  81. data/lib/plurimath/math/symbols/minus.rb +1 -1
  82. data/lib/plurimath/math/symbols/oiiint.rb +1 -1
  83. data/lib/plurimath/math/symbols/oiint.rb +1 -1
  84. data/lib/plurimath/math/symbols/oint.rb +1 -1
  85. data/lib/plurimath/math/symbols/symbol.rb +12 -4
  86. data/lib/plurimath/math/symbols/upcase_dd.rb +4 -0
  87. data/lib/plurimath/math.rb +2 -0
  88. data/lib/plurimath/mathml/parser.rb +45 -86
  89. data/lib/plurimath/mathml/utility/empty_defined_methods.rb +477 -0
  90. data/lib/plurimath/mathml/utility/formula_transformation.rb +472 -0
  91. data/lib/plurimath/mathml/utility.rb +363 -0
  92. data/lib/plurimath/mathml.rb +1 -0
  93. data/lib/plurimath/unicode_math/transform.rb +2 -2
  94. data/lib/plurimath/utility/intent_encoding.rb +21 -21
  95. data/lib/plurimath/utility.rb +5 -23
  96. data/lib/plurimath/version.rb +1 -1
  97. data/lib/plurimath.rb +9 -0
  98. data/plurimath.gemspec +4 -2
  99. metadata +38 -5
  100. data/lib/plurimath/mathml/transform.rb +0 -411
@@ -2,13 +2,20 @@
2
2
 
3
3
  require "htmlentities"
4
4
  require_relative "unary_function"
5
+ require_relative "../../mathml/utility"
5
6
 
6
7
  module Plurimath
7
8
  module Math
8
9
  module Function
9
10
  class Text < UnaryFunction
11
+ include Mathml::Utility
12
+
10
13
  PARSER_REGEX = %r{unicode\[:(?<unicode>\w{1,})\]}.freeze
11
14
 
15
+ def initialize(parameter_one = "")
16
+ super(parameter_one)
17
+ end
18
+
12
19
  def to_asciimath(**)
13
20
  "\"#{parse_text('asciimath') || parameter_one}\""
14
21
  end
@@ -67,12 +74,25 @@ module Plurimath
67
74
  "#{spacing}\"#{dump_omml(self, display_style, options: options)}\" text\n"
68
75
  end
69
76
 
77
+ def to_unicodemath_math_zone(spacing, _, _, options:)
78
+ "#{spacing}#{to_unicodemath(options: options)} text\n"
79
+ end
80
+
70
81
  def value
71
82
  parameter_one
72
83
  end
73
84
 
74
- def to_unicodemath_math_zone(spacing, _, _, options:)
75
- "#{spacing}#{to_unicodemath(options: options)} text\n"
85
+ def element_order=(*); end
86
+
87
+ def value=(text)
88
+ text = text.join if text.is_a?(Array)
89
+ entities = HTMLEntities.new
90
+ symbols = Mathml::Constants::UNICODE_SYMBOLS.transform_keys(&:to_s)
91
+ text = entities.encode(text, :hexadecimal)
92
+ symbols.each do |code, string|
93
+ text = text.gsub(code.downcase, "unicode[:#{string}]")
94
+ end
95
+ self.parameter_one = text
76
96
  end
77
97
 
78
98
  protected
@@ -1,11 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "unary_function"
4
+ require_relative "../../mathml/utility"
4
5
 
5
6
  module Plurimath
6
7
  module Math
7
8
  module Function
8
9
  class Tr < UnaryFunction
10
+ include Mathml::Utility
11
+
9
12
  def initialize(parameter_one = [])
10
13
  parameter_one.map!.with_index { |_, index| Td.new([]) } if parameter_one&.all?("@")
11
14
  super(parameter_one)
@@ -93,6 +96,16 @@ module Plurimath
93
96
  row_lines.shift if row_lines.first.is_a?(Math::Symbols::Hline)
94
97
  first_value
95
98
  end
99
+
100
+ def mtd_value=(value)
101
+ return if value.nil? || value.empty?
102
+
103
+ self.parameter_one = replace_order_with_value(
104
+ clear_temp_order,
105
+ update_temp_mathml_values(value),
106
+ "mtd"
107
+ )
108
+ end
96
109
  end
97
110
  end
98
111
  end
@@ -35,7 +35,7 @@ module Plurimath
35
35
  new_arr += mathml_value(intent, options: options)
36
36
  mrow = ox_element("mrow")
37
37
  Utility.update_nodes(mrow, new_arr)
38
- intentify(mrow, intent, func_name: :function, intent_name: :function)
38
+ intentify(mrow, intent, func_name: :function, intent_name: intent_names[:name])
39
39
  else
40
40
  new_arr.first
41
41
  end
@@ -153,6 +153,10 @@ module Plurimath
153
153
  !parameter_one
154
154
  end
155
155
 
156
+ def intent_names
157
+ { name: ":function" }
158
+ end
159
+
156
160
  protected
157
161
 
158
162
  def asciimath_value(options:)
@@ -1,11 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "../../mathml/utility"
3
4
  require_relative "ternary_function"
4
5
 
5
6
  module Plurimath
6
7
  module Math
7
8
  module Function
8
9
  class Underover < TernaryFunction
10
+ include Mathml::Utility
11
+
9
12
  FUNCTION = {
10
13
  name: "UnderOver",
11
14
  first_value: "base",
@@ -1,12 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "binary_function"
4
+ require_relative "../../mathml/utility"
4
5
 
5
6
  module Plurimath
6
7
  module Math
7
8
  module Function
8
9
  class Underset < BinaryFunction
10
+ include Mathml::Utility
11
+
9
12
  attr_accessor :options
13
+
10
14
  FUNCTION = {
11
15
  name: "underscript",
12
16
  first_value: "underscript value",
@@ -21,6 +25,13 @@ module Plurimath
21
25
  @options = options unless options.empty?
22
26
  end
23
27
 
28
+ def element_order=(value)
29
+ @temp_mathml_order = validated_order(
30
+ value,
31
+ rejectable_array: ["comment"]
32
+ )
33
+ end
34
+
24
35
  def to_mathml_without_math_tag(intent, options:)
25
36
  value_array = [
26
37
  validate_mathml_fields(parameter_two, intent, options: options),
@@ -79,8 +90,41 @@ module Plurimath
79
90
  parameter_two.is_nary_function? || parameter_two.is_nary_symbol?
80
91
  end
81
92
 
93
+ def content=(value)
94
+ if no_content_in?(Array(value))
95
+ delete_all_text
96
+ else
97
+ new_val = Array(value).map do |val|
98
+ validate_symbols(val) unless val.strip.empty?
99
+ end
100
+ validate_text_order(new_val)
101
+ end
102
+ update_temp_mathml_values(@temp_mathml_order)
103
+ end
104
+
82
105
  protected
83
106
 
107
+ def validate_text_order(value)
108
+ @temp_mathml_order.each_with_index do |item, index|
109
+ next unless item == "text"
110
+
111
+ shifted_value = value.shift
112
+ next @temp_mathml_order[index] = shifted_value if shifted_value
113
+
114
+ @temp_mathml_order.delete_at(index)
115
+ end
116
+ end
117
+
118
+ def delete_all_text
119
+ @temp_mathml_order.delete("text")
120
+ end
121
+
122
+ def no_content_in?(value)
123
+ value.nil? ||
124
+ value.empty? ||
125
+ value&.all? { |val| val.strip.empty? }
126
+ end
127
+
84
128
  def unicode_accent?(field)
85
129
  return unless field.is_a?(Math::Symbols::Symbol)
86
130
 
@@ -1,11 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "../mathml/utility"
4
+
3
5
  module Plurimath
4
6
  module Math
5
7
  class Number < Core
6
8
  attr_accessor :value, :mini_sub_sized, :mini_sup_sized
9
+ include Mathml::Utility
7
10
 
8
- def initialize(value, mini_sub_sized: false, mini_sup_sized: false)
11
+ def initialize(value = nil, mini_sub_sized: false, mini_sup_sized: false)
9
12
  @value = value.is_a?(Parslet::Slice) ? value.to_s : value
10
13
  @mini_sub_sized = mini_sub_sized if mini_sub_sized
11
14
  @mini_sup_sized = mini_sup_sized if mini_sup_sized
@@ -18,6 +21,8 @@ module Plurimath
18
21
  object.mini_sup_sized == mini_sup_sized
19
22
  end
20
23
 
24
+ def element_order=(*); end
25
+
21
26
  def to_asciimath(options:)
22
27
  format_value_with_options(options)
23
28
  end
@@ -71,6 +76,10 @@ module Plurimath
71
76
  mini_sub_sized || mini_sup_sized
72
77
  end
73
78
 
79
+ def value=(value)
80
+ @value = value.is_a?(Array) ? value.join : value
81
+ end
82
+
74
83
  protected
75
84
 
76
85
  def mini_sub
@@ -36,6 +36,10 @@ module Plurimath
36
36
  "&#x22c0;"
37
37
  end
38
38
 
39
+ def nary_intent_name
40
+ ":n-ary"
41
+ end
42
+
39
43
  def is_nary_symbol?
40
44
  true
41
45
  end
@@ -35,10 +35,6 @@ module Plurimath
35
35
  def to_html(**)
36
36
  "&#x2229;"
37
37
  end
38
-
39
- def is_nary_symbol?
40
- true
41
- end
42
38
  end
43
39
  end
44
40
  end
@@ -41,7 +41,7 @@ module Plurimath
41
41
  end
42
42
 
43
43
  def nary_intent_name
44
- "n-ary"
44
+ ":n-ary"
45
45
  end
46
46
 
47
47
  def tag_name
@@ -41,7 +41,7 @@ module Plurimath
41
41
  end
42
42
 
43
43
  def nary_intent_name
44
- "anticlockwise contour integral"
44
+ ":anticlockwise contour integral"
45
45
  end
46
46
 
47
47
  def tag_name
@@ -41,7 +41,7 @@ module Plurimath
41
41
  end
42
42
 
43
43
  def nary_intent_name
44
- "coproduct"
44
+ ":coproduct"
45
45
  end
46
46
  end
47
47
  end
@@ -37,6 +37,10 @@ module Plurimath
37
37
  "&#x2146;"
38
38
  end
39
39
 
40
+ def intent_names
41
+ { name: encoded }
42
+ end
43
+
40
44
  private
41
45
 
42
46
  def encoded
@@ -36,6 +36,10 @@ module Plurimath
36
36
  "&#x22c2;"
37
37
  end
38
38
 
39
+ def nary_intent_name
40
+ ":n-ary"
41
+ end
42
+
39
43
  def is_nary_symbol?
40
44
  true
41
45
  end
@@ -36,6 +36,10 @@ module Plurimath
36
36
  "&#x22c3;"
37
37
  end
38
38
 
39
+ def nary_intent_name
40
+ ":n-ary"
41
+ end
42
+
39
43
  def is_nary_symbol?
40
44
  true
41
45
  end
@@ -3,10 +3,10 @@ module Plurimath
3
3
  module Symbols
4
4
  class Gg < Symbol
5
5
  INPUT = {
6
- unicodemath: [["gg", "&#x226b;"]],
7
- asciimath: [["&#x226b;"], parsing_wrapper(["gg"], lang: :asciimath)],
6
+ unicodemath: ["gg", "&#x226b;", parsing_wrapper(["mgt"], lang: :unicode)],
7
+ asciimath: ["&#x226b;", "gg", "mgt"],
8
8
  mathml: ["&#x226b;"],
9
- latex: [["gg", "&#x226b;"]],
9
+ latex: ["gg", "&#x226b;", parsing_wrapper(["mgt"], lang: :latex)],
10
10
  omml: ["&#x226b;"],
11
11
  html: ["&#x226b;"],
12
12
  }.freeze
@@ -17,7 +17,7 @@ module Plurimath
17
17
  end
18
18
 
19
19
  def to_asciimath(**)
20
- parsing_wrapper("gg", lang: :asciimath)
20
+ "gg"
21
21
  end
22
22
 
23
23
  def to_unicodemath(**)
@@ -37,6 +37,10 @@ module Plurimath
37
37
  "&#x2148;"
38
38
  end
39
39
 
40
+ def intent_names
41
+ { name: encoded }
42
+ end
43
+
40
44
  private
41
45
 
42
46
  def encoded
@@ -41,7 +41,7 @@ module Plurimath
41
41
  end
42
42
 
43
43
  def nary_intent_name
44
- "quadruple integral"
44
+ ":quadruple integral"
45
45
  end
46
46
  end
47
47
  end
@@ -36,6 +36,10 @@ module Plurimath
36
36
  "&#x222d;"
37
37
  end
38
38
 
39
+ def nary_intent_name
40
+ ":triple integral"
41
+ end
42
+
39
43
  def is_nary_symbol?
40
44
  true
41
45
  end
@@ -41,7 +41,7 @@ module Plurimath
41
41
  end
42
42
 
43
43
  def nary_intent_name
44
- "double integral"
44
+ ":double integral"
45
45
  end
46
46
  end
47
47
  end
@@ -41,7 +41,7 @@ module Plurimath
41
41
  end
42
42
 
43
43
  def nary_intent_name
44
- "clockwise contour integral"
44
+ ":clockwise contour integral"
45
45
  end
46
46
 
47
47
  def tag_name
@@ -36,6 +36,10 @@ module Plurimath
36
36
  def to_html(**)
37
37
  "&#x22ba;"
38
38
  end
39
+
40
+ def intent_names
41
+ { name: "transpose" }
42
+ end
39
43
  end
40
44
  end
41
45
  end
@@ -37,6 +37,10 @@ module Plurimath
37
37
  "&#x2149;"
38
38
  end
39
39
 
40
+ def intent_names
41
+ { name: encoded }
42
+ end
43
+
40
44
  private
41
45
 
42
46
  def encoded
@@ -3,10 +3,10 @@ module Plurimath
3
3
  module Symbols
4
4
  class Ll < Symbol
5
5
  INPUT = {
6
- unicodemath: [["ll", "&#x226a;"]],
7
- asciimath: [["&#x226a;"], parsing_wrapper(["ll"], lang: :asciimath)],
6
+ unicodemath: ["ll", "&#x226a;", parsing_wrapper(["mlt"], lang: :unicode)],
7
+ asciimath: ["&#x226a;", "ll", "mlt"],
8
8
  mathml: ["&#x226a;"],
9
- latex: [["ll", "&#x226a;"]],
9
+ latex: ["ll", "&#x226a;", parsing_wrapper(["mlt"], lang: :latex)],
10
10
  omml: ["&#x226a;"],
11
11
  html: ["&#x226a;"],
12
12
  }.freeze
@@ -17,7 +17,7 @@ module Plurimath
17
17
  end
18
18
 
19
19
  def to_asciimath(**)
20
- parsing_wrapper("ll", lang: :asciimath)
20
+ "ll"
21
21
  end
22
22
 
23
23
  def to_unicodemath(**)
@@ -5,7 +5,7 @@ module Plurimath
5
5
  INPUT = {
6
6
  unicodemath: [["&#x2212;", "-"], parsing_wrapper(["minus"], lang: :unicode)],
7
7
  asciimath: [["-", "&#x2212;"], parsing_wrapper(["minus"], lang: :asciimath)],
8
- mathml: ["&#x2212;"],
8
+ mathml: ["&#x2212;", "-"],
9
9
  latex: [["minus", "-", "&#x2212;"]],
10
10
  omml: ["&#x2212;"],
11
11
  html: ["&#x2212;"],
@@ -41,7 +41,7 @@ module Plurimath
41
41
  end
42
42
 
43
43
  def nary_intent_name
44
- "volume integral"
44
+ ":volume integral"
45
45
  end
46
46
 
47
47
  def tag_name
@@ -41,7 +41,7 @@ module Plurimath
41
41
  end
42
42
 
43
43
  def nary_intent_name
44
- "surface integral"
44
+ ":surface integral"
45
45
  end
46
46
 
47
47
  def tag_name
@@ -41,7 +41,7 @@ module Plurimath
41
41
  end
42
42
 
43
43
  def nary_intent_name
44
- "contour integral"
44
+ ":contour integral"
45
45
  end
46
46
 
47
47
  def tag_name
@@ -1,9 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "../../mathml/utility"
4
+
3
5
  module Plurimath
4
6
  module Math
5
7
  module Symbols
6
8
  class Symbol < Core
9
+ include Mathml::Utility
10
+
7
11
  attr_accessor :value, :slashed, :mini_sub_sized, :mini_sup_sized, :options
8
12
 
9
13
  INPUT = {}.freeze
@@ -13,7 +17,7 @@ module Plurimath
13
17
  mini_sub_sized: false,
14
18
  mini_sup_sized: false,
15
19
  options: {})
16
- @value = sym.is_a?(Parslet::Slice) ? sym.to_s : sym
20
+ @value = sym.is_a?(Array) ? sym.join : sym&.to_s
17
21
  @slashed = slashed if slashed
18
22
  @mini_sub_sized = mini_sub_sized if mini_sub_sized
19
23
  @mini_sup_sized = mini_sup_sized if mini_sup_sized
@@ -22,7 +26,7 @@ module Plurimath
22
26
 
23
27
  def ==(object)
24
28
  object.respond_to?(:value) &&
25
- object.class == object.class &&
29
+ object.class == self.class &&
26
30
  object.value == value &&
27
31
  object.slashed == slashed &&
28
32
  object.mini_sub_sized == mini_sub_sized &&
@@ -36,6 +40,10 @@ module Plurimath
36
40
  value
37
41
  end
38
42
 
43
+ def value=(value)
44
+ @value = value.is_a?(Array) ? value.join : value.to_s
45
+ end
46
+
39
47
  def to_mathml_without_math_tag(intent, **)
40
48
  if value&.include?("&#x2147;")
41
49
  attributes = {
@@ -45,7 +53,7 @@ module Plurimath
45
53
  mi_tag = ox_element("mi", attributes: attributes)
46
54
  return mi_tag if ["{:", ":}"].include?(value)
47
55
 
48
- mi_tag << value
56
+ value ? mi_tag << value : mi_tag
49
57
  end
50
58
 
51
59
  def to_latex(**)
@@ -108,7 +116,7 @@ module Plurimath
108
116
  self.is_a?(Math::Symbols::Ampersand)
109
117
  end
110
118
 
111
- def linebreak
119
+ def linebreak?
112
120
  value == "\\\\"
113
121
  end
114
122
 
@@ -37,6 +37,10 @@ module Plurimath
37
37
  "&#x2145;"
38
38
  end
39
39
 
40
+ def intent_names
41
+ { name: encoded }
42
+ end
43
+
40
44
  private
41
45
 
42
46
  def encoded
@@ -13,6 +13,8 @@ require_relative "math/core"
13
13
  require_relative "math/number"
14
14
  require_relative "math/symbols"
15
15
  require_relative "math/formula"
16
+ require_relative "math/formula/mrow"
17
+ require_relative "math/formula/mstyle"
16
18
  require_relative "math/function"
17
19
  require_relative "asciimath/parser"
18
20
  require_relative "unicode_math/parser"