mathml2latex 0.1.1

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 (79) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +47 -0
  3. data/Rakefile +19 -0
  4. data/lib/mathml2latex.rb +27 -0
  5. data/lib/mathml2latex/mathml_latex_service.rb +42 -0
  6. data/lib/mathml2latex/symbols.rb +1561 -0
  7. data/lib/mathml2latex/version.rb +3 -0
  8. data/lib/mathml2latex/xslt/elements/menclose.xsl +39 -0
  9. data/lib/mathml2latex/xslt/elements/merror.xsl +8 -0
  10. data/lib/mathml2latex/xslt/elements/mfenced.xsl +64 -0
  11. data/lib/mathml2latex/xslt/elements/mfrac.xsl +56 -0
  12. data/lib/mathml2latex/xslt/elements/mi_mn_mo_mtext_ms.xsl +199 -0
  13. data/lib/mathml2latex/xslt/elements/mmultiscripts.xsl +61 -0
  14. data/lib/mathml2latex/xslt/elements/mover.xsl +66 -0
  15. data/lib/mathml2latex/xslt/elements/mphantom.xsl +10 -0
  16. data/lib/mathml2latex/xslt/elements/mroot.xsl +21 -0
  17. data/lib/mathml2latex/xslt/elements/mrow.xsl +8 -0
  18. data/lib/mathml2latex/xslt/elements/mspace.xsl +24 -0
  19. data/lib/mathml2latex/xslt/elements/msqrt.xsl +10 -0
  20. data/lib/mathml2latex/xslt/elements/mstyle.xsl +39 -0
  21. data/lib/mathml2latex/xslt/elements/msub.xsl +12 -0
  22. data/lib/mathml2latex/xslt/elements/msubsup.xsl +14 -0
  23. data/lib/mathml2latex/xslt/elements/msup.xsl +12 -0
  24. data/lib/mathml2latex/xslt/elements/mtable.xsl +86 -0
  25. data/lib/mathml2latex/xslt/elements/mtd.xsl +30 -0
  26. data/lib/mathml2latex/xslt/elements/mtr.xsl +11 -0
  27. data/lib/mathml2latex/xslt/elements/munder.xsl +73 -0
  28. data/lib/mathml2latex/xslt/elements/munderover.xsl +92 -0
  29. data/lib/mathml2latex/xslt/includes.xsl +30 -0
  30. data/lib/mathml2latex/xslt/mml2latex.xsl +30 -0
  31. data/lib/mathml2latex/xslt/shared/color.xsl +117 -0
  32. data/lib/mathml2latex/xslt_functions.rb +29 -0
  33. data/spec/fixtures/basic/aligned_equations.xml +37 -0
  34. data/spec/fixtures/basic/arrow_accent.xml +11 -0
  35. data/spec/fixtures/basic/backspace.xml +6 -0
  36. data/spec/fixtures/basic/bottom_parenthesis.xml +12 -0
  37. data/spec/fixtures/basic/definite_integral_with_differential.xml +17 -0
  38. data/spec/fixtures/basic/digit_space.xml +6 -0
  39. data/spec/fixtures/basic/double_vertical_bars.xml +10 -0
  40. data/spec/fixtures/basic/element_over.xml +15 -0
  41. data/spec/fixtures/basic/element_under.xml +17 -0
  42. data/spec/fixtures/basic/element_under_over.xml +23 -0
  43. data/spec/fixtures/basic/enclose_box_matrix.xml +28 -0
  44. data/spec/fixtures/basic/enclose_left.xml +9 -0
  45. data/spec/fixtures/basic/enclose_right.xml +8 -0
  46. data/spec/fixtures/basic/fraction.xml +6 -0
  47. data/spec/fixtures/basic/greek.xml +30 -0
  48. data/spec/fixtures/basic/left_right_arrow_accent.xml +12 -0
  49. data/spec/fixtures/basic/left_subscript.xml +15 -0
  50. data/spec/fixtures/basic/left_super_sub_script.xml +21 -0
  51. data/spec/fixtures/basic/left_superscript.xml +15 -0
  52. data/spec/fixtures/basic/matrix.xml +26 -0
  53. data/spec/fixtures/basic/matrix_bottom_curly_bracket.xml +32 -0
  54. data/spec/fixtures/basic/matrix_curly_brackets.xml +30 -0
  55. data/spec/fixtures/basic/matrix_parenthesis.xml +28 -0
  56. data/spec/fixtures/basic/matrix_square_brackets.xml +30 -0
  57. data/spec/fixtures/basic/matrix_top_curly_bracket.xml +32 -0
  58. data/spec/fixtures/basic/matrix_with_vertical_bar.xml +30 -0
  59. data/spec/fixtures/basic/n_root.xml +6 -0
  60. data/spec/fixtures/basic/over_script_with_brace.xml +18 -0
  61. data/spec/fixtures/basic/parenthesis.xml +9 -0
  62. data/spec/fixtures/basic/piecewise_function.xml +22 -0
  63. data/spec/fixtures/basic/square_root.xml +5 -0
  64. data/spec/fixtures/basic/subscript.xml +13 -0
  65. data/spec/fixtures/basic/subscript_with_big_operator.xml +10 -0
  66. data/spec/fixtures/basic/sum_over_under.xml +13 -0
  67. data/spec/fixtures/basic/sum_super_sub.xml +9 -0
  68. data/spec/fixtures/basic/super_sub_script.xml +18 -0
  69. data/spec/fixtures/basic/super_sub_script_big_operator.xml +18 -0
  70. data/spec/fixtures/basic/superscript.xml +9 -0
  71. data/spec/fixtures/basic/top_parenthesis.xml +6 -0
  72. data/spec/fixtures/basic/under_script_with_brace.xml +18 -0
  73. data/spec/fixtures/basic/vector_accent.xml +13 -0
  74. data/spec/fixtures/complex/sum_with_nested_matrix.xml +79 -0
  75. data/spec/lib/mathml2latex/mathml_latex_service_spec.rb +383 -0
  76. data/spec/lib/mathml2latex/xslt_functions_spec.rb +39 -0
  77. data/spec/mathml2latex_spec.rb +52 -0
  78. data/spec/spec_helper.rb +15 -0
  79. metadata +257 -0
@@ -0,0 +1,10 @@
1
+ <?xml version='1.0' encoding="UTF-8"?>
2
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3
+ xmlns:m="http://www.w3.org/1998/Math/MathML"
4
+ version='1.0'>
5
+ <xsl:template match="m:mphantom">
6
+ <xsl:text>\phantom{</xsl:text>
7
+ <xsl:apply-templates/>
8
+ <xsl:text>}</xsl:text>
9
+ </xsl:template>
10
+ </xsl:stylesheet>
@@ -0,0 +1,21 @@
1
+ <?xml version='1.0' encoding="UTF-8"?>
2
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3
+ xmlns:m="http://www.w3.org/1998/Math/MathML"
4
+ version='1.0'>
5
+ <xsl:template match="m:mroot">
6
+ <xsl:choose>
7
+ <xsl:when test="count(./*)=2">
8
+ <xsl:text>\sqrt[</xsl:text>
9
+ <xsl:apply-templates select="./*[2]"/>
10
+ <xsl:text>]{</xsl:text>
11
+ <xsl:apply-templates select="./*[1]"/>
12
+ <xsl:text>}</xsl:text>
13
+ </xsl:when>
14
+ <xsl:otherwise>
15
+ <!-- number of argumnets is not 2 - code 25 -->
16
+ <xsl:message>exception 25:</xsl:message>
17
+ <xsl:text>\text{exception 25:}</xsl:text>
18
+ </xsl:otherwise>
19
+ </xsl:choose>
20
+ </xsl:template>
21
+ </xsl:stylesheet>
@@ -0,0 +1,8 @@
1
+ <?xml version='1.0' encoding="UTF-8"?>
2
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3
+ xmlns:m="http://www.w3.org/1998/Math/MathML"
4
+ version='1.0'>
5
+ <xsl:template match="m:mrow">
6
+ <xsl:apply-templates/>
7
+ </xsl:template>
8
+ </xsl:stylesheet>
@@ -0,0 +1,24 @@
1
+ <?xml version='1.0' encoding="UTF-8"?>
2
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3
+ xmlns:m="http://www.w3.org/1998/Math/MathML"
4
+ version='1.0'>
5
+ <xsl:template match="m:mspace">
6
+ <xsl:text>\phantom{\rule</xsl:text>
7
+ <xsl:if test="@depth">
8
+ <xsl:text>[-</xsl:text>
9
+ <xsl:value-of select="@depth"/>
10
+ <xsl:text>]</xsl:text>
11
+ </xsl:if>
12
+ <xsl:text>{</xsl:text>
13
+ <xsl:if test="not(@width)">
14
+ <xsl:text>0ex</xsl:text>
15
+ </xsl:if>
16
+ <xsl:value-of select="@width"/>
17
+ <xsl:text>}{</xsl:text>
18
+ <xsl:if test="not(@height)">
19
+ <xsl:text>0ex</xsl:text>
20
+ </xsl:if>
21
+ <xsl:value-of select="@height"/>
22
+ <xsl:text>}}</xsl:text>
23
+ </xsl:template>
24
+ </xsl:stylesheet>
@@ -0,0 +1,10 @@
1
+ <?xml version='1.0' encoding="UTF-8"?>
2
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3
+ xmlns:m="http://www.w3.org/1998/Math/MathML"
4
+ version='1.0'>
5
+ <xsl:template match="m:msqrt">
6
+ <xsl:text>\sqrt{</xsl:text>
7
+ <xsl:apply-templates/>
8
+ <xsl:text>}</xsl:text>
9
+ </xsl:template>
10
+ </xsl:stylesheet>
@@ -0,0 +1,39 @@
1
+ <?xml version='1.0' encoding="UTF-8"?>
2
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3
+ xmlns:m="http://www.w3.org/1998/Math/MathML"
4
+ version='1.0'>
5
+ <xsl:template match="m:mstyle">
6
+ <xsl:if test="@background">
7
+ <xsl:text>\colorbox[rgb]{</xsl:text>
8
+ <xsl:call-template name="color">
9
+ <xsl:with-param name="color" select="@background"/>
10
+ </xsl:call-template>
11
+ <xsl:text>}{$</xsl:text>
12
+ </xsl:if>
13
+ <xsl:if test="@color">
14
+ <xsl:text>\textcolor[rgb]{</xsl:text>
15
+ <xsl:call-template name="color">
16
+ <xsl:with-param name="color" select="@color"/>
17
+ </xsl:call-template>
18
+ <xsl:text>}{</xsl:text>
19
+ </xsl:if>
20
+ <xsl:choose>
21
+ <xsl:when test="@displaystyle='true'">
22
+ <xsl:text>{\displaystyle</xsl:text>
23
+ </xsl:when>
24
+ <xsl:when test="@displaystyle='false'">
25
+ <xsl:text>{\textstyle</xsl:text>
26
+ </xsl:when>
27
+ </xsl:choose>
28
+ <xsl:apply-templates/>
29
+ <xsl:if test="@displaystyle = 'true' or @displaystyle = 'false'">
30
+ <xsl:text>}</xsl:text>
31
+ </xsl:if>
32
+ <xsl:if test="@color">
33
+ <xsl:text>}</xsl:text>
34
+ </xsl:if>
35
+ <xsl:if test="@background">
36
+ <xsl:text>$}</xsl:text>
37
+ </xsl:if>
38
+ </xsl:template>
39
+ </xsl:stylesheet>
@@ -0,0 +1,12 @@
1
+ <?xml version='1.0' encoding="UTF-8"?>
2
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3
+ xmlns:m="http://www.w3.org/1998/Math/MathML"
4
+ version='1.0'>
5
+ <xsl:template match="m:msub">
6
+ <xsl:text>{</xsl:text>
7
+ <xsl:apply-templates select="./*[1]"/>
8
+ <xsl:text>}_{</xsl:text>
9
+ <xsl:apply-templates select="./*[2]"/>
10
+ <xsl:text>}</xsl:text>
11
+ </xsl:template>
12
+ </xsl:stylesheet>
@@ -0,0 +1,14 @@
1
+ <?xml version='1.0' encoding="UTF-8"?>
2
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3
+ xmlns:m="http://www.w3.org/1998/Math/MathML"
4
+ version='1.0'>
5
+ <xsl:template match="m:msubsup">
6
+ <xsl:text>{</xsl:text>
7
+ <xsl:apply-templates select="./*[1]"/>
8
+ <xsl:text>}_{</xsl:text>
9
+ <xsl:apply-templates select="./*[2]"/>
10
+ <xsl:text>}^{</xsl:text>
11
+ <xsl:apply-templates select="./*[3]"/>
12
+ <xsl:text>}</xsl:text>
13
+ </xsl:template>
14
+ </xsl:stylesheet>
@@ -0,0 +1,12 @@
1
+ <?xml version='1.0' encoding="UTF-8"?>
2
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3
+ xmlns:m="http://www.w3.org/1998/Math/MathML"
4
+ version='1.0'>
5
+ <xsl:template match="m:msup">
6
+ <xsl:text>{</xsl:text>
7
+ <xsl:apply-templates select="./*[1]"/>
8
+ <xsl:text>}^{</xsl:text>
9
+ <xsl:apply-templates select="./*[2]"/>
10
+ <xsl:text>}</xsl:text>
11
+ </xsl:template>
12
+ </xsl:stylesheet>
@@ -0,0 +1,86 @@
1
+ <?xml version='1.0' encoding="UTF-8"?>
2
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3
+ xmlns:m="http://www.w3.org/1998/Math/MathML"
4
+ version='1.0'>
5
+ <xsl:template match="m:mtable">
6
+ <xsl:text>\begin{array}{</xsl:text>
7
+ <xsl:if test="@frame='solid'">
8
+ <xsl:text>|</xsl:text>
9
+ </xsl:if>
10
+ <xsl:variable name="numbercols" select="count(./m:mtr[1]/m:mtd[not(@columnspan)])+sum(./m:mtr[1]/m:mtd/@columnspan)"/>
11
+ <xsl:choose>
12
+ <xsl:when test="@columnalign">
13
+ <xsl:variable name="colalign">
14
+ <xsl:call-template name="colalign">
15
+ <xsl:with-param name="colalign" select="@columnalign"/>
16
+ </xsl:call-template>
17
+ </xsl:variable>
18
+ <xsl:choose>
19
+ <xsl:when test="string-length($colalign) > $numbercols">
20
+ <xsl:value-of select="substring($colalign,1,$numbercols)"/>
21
+ </xsl:when>
22
+ <xsl:when test="string-length($colalign) &lt; $numbercols">
23
+ <xsl:value-of select="$colalign"/>
24
+ <xsl:call-template name="generate-string">
25
+ <xsl:with-param name="text" select="substring($colalign,string-length($colalign))"/>
26
+ <xsl:with-param name="count" select="$numbercols - string-length($colalign)"/>
27
+ </xsl:call-template>
28
+ </xsl:when>
29
+ <xsl:otherwise>
30
+ <xsl:value-of select="$colalign"/>
31
+ </xsl:otherwise>
32
+ </xsl:choose>
33
+ </xsl:when>
34
+ <xsl:otherwise>
35
+ <xsl:call-template name="generate-string">
36
+ <xsl:with-param name="text" select="'c'"/>
37
+ <xsl:with-param name="count" select="$numbercols"/>
38
+ </xsl:call-template>
39
+ </xsl:otherwise>
40
+ </xsl:choose>
41
+ <xsl:if test="@frame='solid'">
42
+ <xsl:text>|</xsl:text>
43
+ </xsl:if>
44
+ <xsl:text>}</xsl:text>
45
+ <xsl:if test="@frame='solid'">
46
+ <xsl:text>\hline </xsl:text>
47
+ </xsl:if>
48
+ <xsl:apply-templates/>
49
+ <xsl:if test="@frame='solid'">
50
+ <xsl:text>\\ \hline</xsl:text>
51
+ </xsl:if>
52
+ <xsl:text>\end{array}</xsl:text>
53
+ </xsl:template>
54
+
55
+ <xsl:template name="colalign">
56
+ <xsl:param name="colalign"/>
57
+ <xsl:choose>
58
+ <xsl:when test="contains($colalign,' ')">
59
+ <xsl:value-of select="substring($colalign,1,1)"/>
60
+ <xsl:call-template name="colalign">
61
+ <xsl:with-param name="colalign" select="substring-after($colalign,' ')"/>
62
+ </xsl:call-template>
63
+ </xsl:when>
64
+ <xsl:otherwise>
65
+ <xsl:value-of select="substring($colalign,1,1)"/>
66
+ </xsl:otherwise>
67
+ </xsl:choose>
68
+ </xsl:template>
69
+
70
+ <xsl:template name="generate-string">
71
+ <!-- template from XSLT Standard Library v1.1 -->
72
+ <xsl:param name="text"/>
73
+ <xsl:param name="count"/>
74
+
75
+ <xsl:choose>
76
+ <xsl:when test="string-length($text) = 0 or $count &lt;= 0"/>
77
+ <xsl:otherwise>
78
+ <xsl:value-of select="$text"/>
79
+ <xsl:call-template name="generate-string">
80
+ <xsl:with-param name="text" select="$text"/>
81
+ <xsl:with-param name="count" select="$count - 1"/>
82
+ </xsl:call-template>
83
+ </xsl:otherwise>
84
+ </xsl:choose>
85
+ </xsl:template>
86
+ </xsl:stylesheet>
@@ -0,0 +1,30 @@
1
+ <?xml version='1.0' encoding="UTF-8"?>
2
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3
+ xmlns:m="http://www.w3.org/1998/Math/MathML"
4
+ version='1.0'>
5
+ <xsl:template match="m:mtd[@columnspan]">
6
+ <xsl:text>\multicolumn{</xsl:text>
7
+ <xsl:value-of select="@columnspan"/>
8
+ <xsl:text>}{c}{</xsl:text>
9
+ <xsl:apply-templates/>
10
+ <xsl:text>}</xsl:text>
11
+ <xsl:if test="count(following-sibling::*)>0">
12
+ <xsl:text>&amp; </xsl:text>
13
+ </xsl:if>
14
+ </xsl:template>
15
+
16
+ <xsl:template match="m:mtd">
17
+ <xsl:if test="@columnalign='right' or @columnalign='center'">
18
+ <xsl:text>\hfill </xsl:text>
19
+ </xsl:if>
20
+ <xsl:apply-templates/>
21
+ <xsl:if test="@columnalign='left' or @columnalign='center'">
22
+ <xsl:text>\hfill </xsl:text>
23
+ </xsl:if>
24
+ <xsl:if test="count(following-sibling::*)>0">
25
+ <!-- this test valid for Sablotron, another form - test="not(position()=last())".
26
+ Also for m:mtd[@columnspan] and m:mtr -->
27
+ <xsl:text>&amp; </xsl:text>
28
+ </xsl:if>
29
+ </xsl:template>
30
+ </xsl:stylesheet>
@@ -0,0 +1,11 @@
1
+ <?xml version='1.0' encoding="UTF-8"?>
2
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3
+ xmlns:m="http://www.w3.org/1998/Math/MathML"
4
+ version='1.0'>
5
+ <xsl:template match="m:mtr">
6
+ <xsl:apply-templates/>
7
+ <xsl:if test="count(following-sibling::*)>0">
8
+ <xsl:text>\\ </xsl:text>
9
+ </xsl:if>
10
+ </xsl:template>
11
+ </xsl:stylesheet>
@@ -0,0 +1,73 @@
1
+ <?xml version='1.0' encoding="UTF-8"?>
2
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3
+ xmlns:m="http://www.w3.org/1998/Math/MathML"
4
+ xmlns:inst="http://instructure.com/functions"
5
+ extension-element-prefixes="inst"
6
+ version='1.0'>
7
+ <xsl:template match="m:munder">
8
+ <xsl:call-template name="munder">
9
+ <xsl:with-param name="base">
10
+ <xsl:call-template name="startspace">
11
+ <xsl:with-param name="symbol" select="./*[1]"/>
12
+ </xsl:call-template>
13
+ </xsl:with-param>
14
+ <xsl:with-param name="under">
15
+ <xsl:call-template name="startspace">
16
+ <xsl:with-param name="symbol" select="./*[2]"/>
17
+ </xsl:call-template>
18
+ </xsl:with-param>
19
+ </xsl:call-template>
20
+ </xsl:template>
21
+
22
+ <xsl:template name="munder">
23
+ <xsl:param name="base"/>
24
+ <xsl:param name="under"/>
25
+
26
+ <xsl:variable name="diacritics-regex" select="'^[&#x300;-&#x338;&#x20d0;-&#x20ef;]$'" />
27
+ <xsl:variable name="is-diacritical-mark" select="inst:matches($under, $diacritics-regex)" />
28
+
29
+ <!-- original: scripts.xsl line 128 -->
30
+ <!-- modified based on: mml2tex.xsl line 312 -->
31
+ <xsl:choose>
32
+ <xsl:when test="translate($base,'&#x0220F;&#x02210;&#x022c2;&#x022c3;&#x02294;',
33
+ '&#x02211;&#x02211;&#x02211;&#x02211;&#x02211;')='&#x02211;'">
34
+ <!-- if $base is operator, such as
35
+ &#x02211; /sum L: summation operator
36
+ &#x0220F; /prod L: product operator
37
+ &#x02210; /coprod L: coproduct operator
38
+ &#x022c2; /bigcap
39
+ &#x022c3; /bigcup
40
+ &#x02294; /bigsqcup
41
+ -->
42
+ <xsl:apply-templates select="./*[1]"/>
43
+ <xsl:text>_{</xsl:text>
44
+ <xsl:apply-templates select="./*[2]"/>
45
+ <xsl:text>}</xsl:text>
46
+ </xsl:when>
47
+ <xsl:otherwise>
48
+ <xsl:choose>
49
+ <xsl:when test="$under = '&#x23de;' or $under = '&#x23df;'">
50
+ <xsl:text>\underbrace</xsl:text>
51
+ </xsl:when>
52
+ <xsl:when test="$under = '&#x23b4;' or $under = '&#x23b5;'">
53
+ <xsl:text>\underbracket</xsl:text>
54
+ </xsl:when>
55
+ <xsl:when test="inst:matches($under, '^[&#xaf;&#x5f;&#x304;&#x305;&#x203e;]$')"><!-- macron, combining macron, combining overline -->
56
+ <xsl:text>\underline</xsl:text>
57
+ </xsl:when>
58
+ <xsl:when test="$is-diacritical-mark">
59
+ <xsl:apply-templates select="./*[2]"/>
60
+ </xsl:when>
61
+ <xsl:otherwise>
62
+ <xsl:text>\underset{</xsl:text>
63
+ <xsl:apply-templates select="./*[2]"/>
64
+ <xsl:text>}</xsl:text>
65
+ </xsl:otherwise>
66
+ </xsl:choose>
67
+ <xsl:text>{</xsl:text>
68
+ <xsl:apply-templates select="./*[1]"/>
69
+ <xsl:text>}</xsl:text>
70
+ </xsl:otherwise>
71
+ </xsl:choose>
72
+ </xsl:template>
73
+ </xsl:stylesheet>
@@ -0,0 +1,92 @@
1
+ <?xml version='1.0' encoding="UTF-8"?>
2
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3
+ xmlns:m="http://www.w3.org/1998/Math/MathML"
4
+ version='1.0'>
5
+ <xsl:template match="m:munderover">
6
+ <xsl:call-template name="munderover">
7
+ <xsl:with-param name="base">
8
+ <xsl:call-template name="startspace">
9
+ <xsl:with-param name="symbol" select="./*[1]"/>
10
+ </xsl:call-template>
11
+ </xsl:with-param>
12
+ <xsl:with-param name="under">
13
+ <xsl:call-template name="startspace">
14
+ <xsl:with-param name="symbol" select="./*[2]"/>
15
+ </xsl:call-template>
16
+ </xsl:with-param>
17
+ <xsl:with-param name="over">
18
+ <xsl:call-template name="startspace">
19
+ <xsl:with-param name="symbol" select="./*[3]"/>
20
+ </xsl:call-template>
21
+ </xsl:with-param>
22
+ </xsl:call-template>
23
+ </xsl:template>
24
+
25
+ <xsl:template name="munderover">
26
+ <xsl:param name="base"/>
27
+ <xsl:param name="under"/>
28
+ <xsl:param name="over"/>
29
+ <xsl:choose>
30
+ <xsl:when test="$over='&#x000AF;'"> <!-- OverBar - over bar -->
31
+ <xsl:text>\overline{</xsl:text>
32
+ <xsl:call-template name="munder">
33
+ <xsl:with-param name="base" select="$base"/>
34
+ <xsl:with-param name="under" select="$under"/>
35
+ </xsl:call-template>
36
+ <xsl:text>}</xsl:text>
37
+ </xsl:when>
38
+ <xsl:when test="$over='&#x0FE37;'"> <!-- OverBrace - over brace -->
39
+ <xsl:text>\overbrace{</xsl:text>
40
+ <xsl:call-template name="munder">
41
+ <xsl:with-param name="base" select="$base"/>
42
+ <xsl:with-param name="under" select="$under"/>
43
+ </xsl:call-template>
44
+ <xsl:text>}</xsl:text>
45
+ </xsl:when>
46
+ <xsl:when test="$under='&#x00332;'"> <!-- UnderBar - combining low line -->
47
+ <xsl:text>\underline{</xsl:text>
48
+ <xsl:call-template name="mover">
49
+ <xsl:with-param name="base" select="$base"/>
50
+ <xsl:with-param name="over" select="$over"/>
51
+ <xsl:with-param name="pos_over" select="3"/>
52
+ </xsl:call-template>
53
+ <xsl:text>}</xsl:text>
54
+ </xsl:when>
55
+ <xsl:when test="$under='&#x0FE38;'"> <!-- UnderBrace - under brace -->
56
+ <xsl:text>\underbrace{</xsl:text>
57
+ <xsl:call-template name="mover">
58
+ <xsl:with-param name="base" select="$base"/>
59
+ <xsl:with-param name="over" select="$over"/>
60
+ <xsl:with-param name="pos_over" select="3"/>
61
+ </xsl:call-template>
62
+ <xsl:text>}</xsl:text>
63
+ </xsl:when>
64
+ <xsl:when test="translate($base,'&#x0220F;&#x02210;&#x022c2;&#x022c3;&#x02294;',
65
+ '&#x02211;&#x02211;&#x02211;&#x02211;&#x02211;')='&#x02211;'">
66
+ <!-- if $base is operator, such as
67
+ &#x02211; /sum L: summation operator
68
+ &#x0220F; /prod L: product operator
69
+ &#x02210; /coprod L: coproduct operator
70
+ &#x022c2; /bigcap
71
+ &#x022c3; /bigcup
72
+ &#x02294; /bigsqcup
73
+ -->
74
+ <xsl:apply-templates select="./*[1]"/>
75
+ <xsl:text>_{</xsl:text>
76
+ <xsl:apply-templates select="./*[2]"/>
77
+ <xsl:text>}^{</xsl:text>
78
+ <xsl:apply-templates select="./*[3]"/>
79
+ <xsl:text>}</xsl:text>
80
+ </xsl:when>
81
+ <xsl:otherwise>
82
+ <xsl:text>\underset{</xsl:text>
83
+ <xsl:apply-templates select="./*[2]"/>
84
+ <xsl:text>}{\overset{</xsl:text>
85
+ <xsl:apply-templates select="./*[3]"/>
86
+ <xsl:text>}{</xsl:text>
87
+ <xsl:apply-templates select="./*[1]"/>
88
+ <xsl:text>}}</xsl:text>
89
+ </xsl:otherwise>
90
+ </xsl:choose>
91
+ </xsl:template>
92
+ </xsl:stylesheet>