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.
- checksums.yaml +7 -0
- data/README.md +47 -0
- data/Rakefile +19 -0
- data/lib/mathml2latex.rb +27 -0
- data/lib/mathml2latex/mathml_latex_service.rb +42 -0
- data/lib/mathml2latex/symbols.rb +1561 -0
- data/lib/mathml2latex/version.rb +3 -0
- data/lib/mathml2latex/xslt/elements/menclose.xsl +39 -0
- data/lib/mathml2latex/xslt/elements/merror.xsl +8 -0
- data/lib/mathml2latex/xslt/elements/mfenced.xsl +64 -0
- data/lib/mathml2latex/xslt/elements/mfrac.xsl +56 -0
- data/lib/mathml2latex/xslt/elements/mi_mn_mo_mtext_ms.xsl +199 -0
- data/lib/mathml2latex/xslt/elements/mmultiscripts.xsl +61 -0
- data/lib/mathml2latex/xslt/elements/mover.xsl +66 -0
- data/lib/mathml2latex/xslt/elements/mphantom.xsl +10 -0
- data/lib/mathml2latex/xslt/elements/mroot.xsl +21 -0
- data/lib/mathml2latex/xslt/elements/mrow.xsl +8 -0
- data/lib/mathml2latex/xslt/elements/mspace.xsl +24 -0
- data/lib/mathml2latex/xslt/elements/msqrt.xsl +10 -0
- data/lib/mathml2latex/xslt/elements/mstyle.xsl +39 -0
- data/lib/mathml2latex/xslt/elements/msub.xsl +12 -0
- data/lib/mathml2latex/xslt/elements/msubsup.xsl +14 -0
- data/lib/mathml2latex/xslt/elements/msup.xsl +12 -0
- data/lib/mathml2latex/xslt/elements/mtable.xsl +86 -0
- data/lib/mathml2latex/xslt/elements/mtd.xsl +30 -0
- data/lib/mathml2latex/xslt/elements/mtr.xsl +11 -0
- data/lib/mathml2latex/xslt/elements/munder.xsl +73 -0
- data/lib/mathml2latex/xslt/elements/munderover.xsl +92 -0
- data/lib/mathml2latex/xslt/includes.xsl +30 -0
- data/lib/mathml2latex/xslt/mml2latex.xsl +30 -0
- data/lib/mathml2latex/xslt/shared/color.xsl +117 -0
- data/lib/mathml2latex/xslt_functions.rb +29 -0
- data/spec/fixtures/basic/aligned_equations.xml +37 -0
- data/spec/fixtures/basic/arrow_accent.xml +11 -0
- data/spec/fixtures/basic/backspace.xml +6 -0
- data/spec/fixtures/basic/bottom_parenthesis.xml +12 -0
- data/spec/fixtures/basic/definite_integral_with_differential.xml +17 -0
- data/spec/fixtures/basic/digit_space.xml +6 -0
- data/spec/fixtures/basic/double_vertical_bars.xml +10 -0
- data/spec/fixtures/basic/element_over.xml +15 -0
- data/spec/fixtures/basic/element_under.xml +17 -0
- data/spec/fixtures/basic/element_under_over.xml +23 -0
- data/spec/fixtures/basic/enclose_box_matrix.xml +28 -0
- data/spec/fixtures/basic/enclose_left.xml +9 -0
- data/spec/fixtures/basic/enclose_right.xml +8 -0
- data/spec/fixtures/basic/fraction.xml +6 -0
- data/spec/fixtures/basic/greek.xml +30 -0
- data/spec/fixtures/basic/left_right_arrow_accent.xml +12 -0
- data/spec/fixtures/basic/left_subscript.xml +15 -0
- data/spec/fixtures/basic/left_super_sub_script.xml +21 -0
- data/spec/fixtures/basic/left_superscript.xml +15 -0
- data/spec/fixtures/basic/matrix.xml +26 -0
- data/spec/fixtures/basic/matrix_bottom_curly_bracket.xml +32 -0
- data/spec/fixtures/basic/matrix_curly_brackets.xml +30 -0
- data/spec/fixtures/basic/matrix_parenthesis.xml +28 -0
- data/spec/fixtures/basic/matrix_square_brackets.xml +30 -0
- data/spec/fixtures/basic/matrix_top_curly_bracket.xml +32 -0
- data/spec/fixtures/basic/matrix_with_vertical_bar.xml +30 -0
- data/spec/fixtures/basic/n_root.xml +6 -0
- data/spec/fixtures/basic/over_script_with_brace.xml +18 -0
- data/spec/fixtures/basic/parenthesis.xml +9 -0
- data/spec/fixtures/basic/piecewise_function.xml +22 -0
- data/spec/fixtures/basic/square_root.xml +5 -0
- data/spec/fixtures/basic/subscript.xml +13 -0
- data/spec/fixtures/basic/subscript_with_big_operator.xml +10 -0
- data/spec/fixtures/basic/sum_over_under.xml +13 -0
- data/spec/fixtures/basic/sum_super_sub.xml +9 -0
- data/spec/fixtures/basic/super_sub_script.xml +18 -0
- data/spec/fixtures/basic/super_sub_script_big_operator.xml +18 -0
- data/spec/fixtures/basic/superscript.xml +9 -0
- data/spec/fixtures/basic/top_parenthesis.xml +6 -0
- data/spec/fixtures/basic/under_script_with_brace.xml +18 -0
- data/spec/fixtures/basic/vector_accent.xml +13 -0
- data/spec/fixtures/complex/sum_with_nested_matrix.xml +79 -0
- data/spec/lib/mathml2latex/mathml_latex_service_spec.rb +383 -0
- data/spec/lib/mathml2latex/xslt_functions_spec.rb +39 -0
- data/spec/mathml2latex_spec.rb +52 -0
- data/spec/spec_helper.rb +15 -0
- metadata +257 -0
|
@@ -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:menclose">
|
|
6
|
+
<xsl:call-template name="menclose-start">
|
|
7
|
+
<xsl:with-param name="notation" select="@notation"/>
|
|
8
|
+
</xsl:call-template>
|
|
9
|
+
<xsl:apply-templates/>
|
|
10
|
+
<xsl:call-template name="menclose-end">
|
|
11
|
+
<xsl:with-param name="notation" select="@notation"/>
|
|
12
|
+
</xsl:call-template>
|
|
13
|
+
</xsl:template>
|
|
14
|
+
|
|
15
|
+
<xsl:template name="menclose-start">
|
|
16
|
+
<xsl:param name="notation"/>
|
|
17
|
+
<xsl:choose>
|
|
18
|
+
<xsl:when test="$notation = 'box' or $notation = 'roundedbox'">\boxed{</xsl:when>
|
|
19
|
+
<xsl:when test="$notation = 'updiagonalstrike'">\cancel{</xsl:when>
|
|
20
|
+
<xsl:when test="$notation = 'downdiagonalstrike'">\bcancel{</xsl:when>
|
|
21
|
+
<xsl:when test="$notation = 'updiagonalarrow'">\cancelto{</xsl:when>
|
|
22
|
+
<xsl:when test="$notation = 'top'">\overline{</xsl:when>
|
|
23
|
+
<xsl:when test="$notation = 'underline'">\underline{</xsl:when>
|
|
24
|
+
<xsl:when test="$notation = 'left'">\left|</xsl:when>
|
|
25
|
+
<xsl:when test="$notation = 'right'">\left.{</xsl:when>
|
|
26
|
+
<xsl:when test="$notation = 'radical'">\sqrt{</xsl:when>
|
|
27
|
+
<xsl:otherwise>\<xsl:value-of select="$notation" />{</xsl:otherwise>
|
|
28
|
+
</xsl:choose>
|
|
29
|
+
</xsl:template>
|
|
30
|
+
|
|
31
|
+
<xsl:template name="menclose-end">
|
|
32
|
+
<xsl:param name="notation"/>
|
|
33
|
+
<xsl:choose>
|
|
34
|
+
<xsl:when test="$notation = 'left'">\right.</xsl:when>
|
|
35
|
+
<xsl:when test="$notation = 'right'">}\right|</xsl:when>
|
|
36
|
+
<xsl:otherwise>}</xsl:otherwise>
|
|
37
|
+
</xsl:choose>
|
|
38
|
+
</xsl:template>
|
|
39
|
+
</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:merror">
|
|
6
|
+
<xsl:apply-templates/>
|
|
7
|
+
</xsl:template>
|
|
8
|
+
</xsl:stylesheet>
|
|
@@ -0,0 +1,64 @@
|
|
|
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:mfenced">
|
|
6
|
+
<xsl:choose>
|
|
7
|
+
<xsl:when test="@open">
|
|
8
|
+
<xsl:text>\left</xsl:text>
|
|
9
|
+
<xsl:if test="@open='{' or @open='}'"><xsl:text>\</xsl:text></xsl:if>
|
|
10
|
+
<xsl:choose>
|
|
11
|
+
<xsl:when test="@open='||'">\|</xsl:when>
|
|
12
|
+
<xsl:when test="@open='<'">\langle</xsl:when>
|
|
13
|
+
<xsl:when test="@open=''">.</xsl:when>
|
|
14
|
+
<xsl:otherwise><xsl:value-of select="@open"/></xsl:otherwise>
|
|
15
|
+
</xsl:choose>
|
|
16
|
+
</xsl:when>
|
|
17
|
+
<xsl:otherwise><xsl:text>\left(</xsl:text></xsl:otherwise>
|
|
18
|
+
</xsl:choose>
|
|
19
|
+
<xsl:choose>
|
|
20
|
+
<xsl:when test="count(./*)>1">
|
|
21
|
+
<xsl:variable name="symbol">
|
|
22
|
+
<xsl:choose>
|
|
23
|
+
<xsl:when test="@separators">
|
|
24
|
+
<xsl:call-template name="startspace">
|
|
25
|
+
<xsl:with-param name="symbol" select="@separators"/>
|
|
26
|
+
</xsl:call-template>
|
|
27
|
+
</xsl:when>
|
|
28
|
+
<xsl:otherwise>,</xsl:otherwise>
|
|
29
|
+
</xsl:choose>
|
|
30
|
+
</xsl:variable>
|
|
31
|
+
<xsl:for-each select="./*">
|
|
32
|
+
<xsl:apply-templates select="."/>
|
|
33
|
+
<xsl:if test="not(position()=last())">
|
|
34
|
+
<xsl:choose>
|
|
35
|
+
<xsl:when test="position()>string-length($symbol)">
|
|
36
|
+
<xsl:value-of select="substring($symbol,string-length($symbol))"/>
|
|
37
|
+
</xsl:when>
|
|
38
|
+
<xsl:otherwise>
|
|
39
|
+
<xsl:value-of select="substring($symbol,position(),1)"/>
|
|
40
|
+
</xsl:otherwise>
|
|
41
|
+
</xsl:choose>
|
|
42
|
+
</xsl:if>
|
|
43
|
+
</xsl:for-each>
|
|
44
|
+
</xsl:when>
|
|
45
|
+
<xsl:otherwise>
|
|
46
|
+
<xsl:apply-templates/>
|
|
47
|
+
</xsl:otherwise>
|
|
48
|
+
</xsl:choose>
|
|
49
|
+
<xsl:choose>
|
|
50
|
+
<xsl:when test="@close">
|
|
51
|
+
<xsl:text>\right</xsl:text>
|
|
52
|
+
<xsl:if test="@close='{' or @close='}'"><xsl:text>\</xsl:text></xsl:if>
|
|
53
|
+
<xsl:choose>
|
|
54
|
+
<xsl:when test="@close = ''">.</xsl:when>
|
|
55
|
+
<xsl:when test="@close='||'">\|</xsl:when>
|
|
56
|
+
<xsl:when test="@close='>'">\rangle</xsl:when>
|
|
57
|
+
<xsl:when test="@open=''">.</xsl:when>
|
|
58
|
+
<xsl:otherwise><xsl:value-of select="@close"/></xsl:otherwise>
|
|
59
|
+
</xsl:choose>
|
|
60
|
+
</xsl:when>
|
|
61
|
+
<xsl:otherwise><xsl:text>\right)</xsl:text></xsl:otherwise>
|
|
62
|
+
</xsl:choose>
|
|
63
|
+
</xsl:template>
|
|
64
|
+
</xsl:stylesheet>
|
|
@@ -0,0 +1,56 @@
|
|
|
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:mfrac">
|
|
6
|
+
<xsl:choose>
|
|
7
|
+
<xsl:when test="@bevelled='true'">
|
|
8
|
+
<xsl:text>\frac{</xsl:text>
|
|
9
|
+
<!-- <xsl:text>\raisebox{1ex}{</xsl:text>
|
|
10
|
+
<xsl:apply-templates select="./*[1]"/>
|
|
11
|
+
<xsl:text>}\!\left/ \!\raisebox{-1ex}{</xsl:text>
|
|
12
|
+
<xsl:apply-templates select="./*[2]"/>
|
|
13
|
+
<xsl:text>}\right.</xsl:text> -->
|
|
14
|
+
</xsl:when>
|
|
15
|
+
<xsl:when test="@linethickness">
|
|
16
|
+
<xsl:text>\genfrac{}{}{</xsl:text>
|
|
17
|
+
<xsl:choose>
|
|
18
|
+
<xsl:when test="number(@linethickness)">
|
|
19
|
+
<xsl:value-of select="@linethickness div 10"/>
|
|
20
|
+
<xsl:text>ex</xsl:text>
|
|
21
|
+
</xsl:when>
|
|
22
|
+
<xsl:when test="@linethickness='thin'">
|
|
23
|
+
<xsl:text>.05ex</xsl:text>
|
|
24
|
+
</xsl:when>
|
|
25
|
+
<xsl:when test="@linethickness='medium'"/>
|
|
26
|
+
<xsl:when test="@linethickness='thick'">
|
|
27
|
+
<xsl:text>.2ex</xsl:text>
|
|
28
|
+
</xsl:when>
|
|
29
|
+
<xsl:otherwise>
|
|
30
|
+
<xsl:value-of select="@linethickness"/>
|
|
31
|
+
</xsl:otherwise>
|
|
32
|
+
</xsl:choose>
|
|
33
|
+
<xsl:text>}{}{</xsl:text>
|
|
34
|
+
</xsl:when>
|
|
35
|
+
<xsl:otherwise>
|
|
36
|
+
<xsl:text>\frac{</xsl:text>
|
|
37
|
+
</xsl:otherwise>
|
|
38
|
+
</xsl:choose>
|
|
39
|
+
<xsl:if test="@numalign='right'">
|
|
40
|
+
<xsl:text>\hfill </xsl:text>
|
|
41
|
+
</xsl:if>
|
|
42
|
+
<xsl:apply-templates select="./*[1]"/>
|
|
43
|
+
<xsl:if test="@numalign='left'">
|
|
44
|
+
<xsl:text>\hfill </xsl:text>
|
|
45
|
+
</xsl:if>
|
|
46
|
+
<xsl:text>}{</xsl:text>
|
|
47
|
+
<xsl:if test="@denomalign='right'">
|
|
48
|
+
<xsl:text>\hfill </xsl:text>
|
|
49
|
+
</xsl:if>
|
|
50
|
+
<xsl:apply-templates select="./*[2]"/>
|
|
51
|
+
<xsl:if test="@denomalign='left'">
|
|
52
|
+
<xsl:text>\hfill </xsl:text>
|
|
53
|
+
</xsl:if>
|
|
54
|
+
<xsl:text>}</xsl:text>
|
|
55
|
+
</xsl:template>
|
|
56
|
+
</xsl:stylesheet>
|
|
@@ -0,0 +1,199 @@
|
|
|
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:mi|m:mn|m:mo|m:mtext|m:ms">
|
|
8
|
+
<xsl:call-template name="CommonTokenAtr"/>
|
|
9
|
+
</xsl:template>
|
|
10
|
+
|
|
11
|
+
<xsl:template name="mi">
|
|
12
|
+
<xsl:choose>
|
|
13
|
+
<xsl:when test="string-length(normalize-space(.))>1 and not(@mathvariant)">
|
|
14
|
+
<xsl:text>\mathrm{</xsl:text>
|
|
15
|
+
<xsl:value-of select="inst:fetch_symbols(normalize-space(.))" />
|
|
16
|
+
<xsl:text>}</xsl:text>
|
|
17
|
+
</xsl:when>
|
|
18
|
+
<xsl:otherwise>
|
|
19
|
+
<xsl:value-of select="inst:fetch_symbols(normalize-space(.))" />
|
|
20
|
+
</xsl:otherwise>
|
|
21
|
+
</xsl:choose>
|
|
22
|
+
</xsl:template>
|
|
23
|
+
|
|
24
|
+
<xsl:template name="mn">
|
|
25
|
+
<xsl:apply-templates/>
|
|
26
|
+
</xsl:template>
|
|
27
|
+
|
|
28
|
+
<xsl:template name="mo">
|
|
29
|
+
<xsl:choose>
|
|
30
|
+
<xsl:when test="@largeop = 'true'">\mbox{\large$</xsl:when>
|
|
31
|
+
<xsl:when test="local-name(preceding-sibling::*[1]) = 'mi'"><xsl:text>\operatorname </xsl:text></xsl:when>
|
|
32
|
+
</xsl:choose>
|
|
33
|
+
<xsl:variable name="content">
|
|
34
|
+
<xsl:choose>
|
|
35
|
+
<xsl:when test=".='⏜'">⌢</xsl:when>
|
|
36
|
+
<xsl:when test=".='⏝'">⌣</xsl:when>
|
|
37
|
+
<xsl:otherwise><xsl:value-of select="normalize-space(.)"/></xsl:otherwise>
|
|
38
|
+
</xsl:choose>
|
|
39
|
+
</xsl:variable>
|
|
40
|
+
<xsl:value-of select="inst:fetch_symbols($content)" />
|
|
41
|
+
<xsl:choose>
|
|
42
|
+
<xsl:when test="@largeop = 'true'">$}</xsl:when>
|
|
43
|
+
<xsl:otherwise></xsl:otherwise>
|
|
44
|
+
</xsl:choose>
|
|
45
|
+
</xsl:template>
|
|
46
|
+
|
|
47
|
+
<xsl:template name="mtext">
|
|
48
|
+
<xsl:variable name="content">
|
|
49
|
+
<xsl:call-template name="replaceMtextEntities">
|
|
50
|
+
<xsl:with-param name="content" select="."/>
|
|
51
|
+
</xsl:call-template>
|
|
52
|
+
</xsl:variable>
|
|
53
|
+
<xsl:text>\text{</xsl:text>
|
|
54
|
+
<xsl:value-of select="$content"/>
|
|
55
|
+
<xsl:text>}</xsl:text>
|
|
56
|
+
</xsl:template>
|
|
57
|
+
|
|
58
|
+
<xsl:template match="m:mspace">
|
|
59
|
+
<xsl:text>\phantom{\rule</xsl:text>
|
|
60
|
+
<xsl:if test="@depth">
|
|
61
|
+
<xsl:text>[-</xsl:text>
|
|
62
|
+
<xsl:value-of select="@depth"/>
|
|
63
|
+
<xsl:text>]</xsl:text>
|
|
64
|
+
</xsl:if>
|
|
65
|
+
<xsl:text>{</xsl:text>
|
|
66
|
+
<xsl:if test="not(@width)">
|
|
67
|
+
<xsl:text>0ex</xsl:text>
|
|
68
|
+
</xsl:if>
|
|
69
|
+
<xsl:value-of select="@width"/>
|
|
70
|
+
<xsl:text>}{</xsl:text>
|
|
71
|
+
<xsl:if test="not(@height)">
|
|
72
|
+
<xsl:text>0ex</xsl:text>
|
|
73
|
+
</xsl:if>
|
|
74
|
+
<xsl:value-of select="@height"/>
|
|
75
|
+
<xsl:text>}}</xsl:text>
|
|
76
|
+
</xsl:template>
|
|
77
|
+
|
|
78
|
+
<xsl:template name="ms">
|
|
79
|
+
<xsl:choose>
|
|
80
|
+
<xsl:when test="@lquote"><xsl:value-of select="@lquote"/></xsl:when>
|
|
81
|
+
<xsl:otherwise><xsl:text>"</xsl:text></xsl:otherwise>
|
|
82
|
+
</xsl:choose><xsl:apply-templates/><xsl:choose>
|
|
83
|
+
<xsl:when test="@rquote"><xsl:value-of select="@rquote"/></xsl:when>
|
|
84
|
+
<xsl:otherwise><xsl:text>"</xsl:text></xsl:otherwise>
|
|
85
|
+
</xsl:choose>
|
|
86
|
+
</xsl:template>
|
|
87
|
+
|
|
88
|
+
<xsl:template name="CommonTokenAtr">
|
|
89
|
+
<xsl:if test="@mathbackground">
|
|
90
|
+
<xsl:text>\colorbox[rgb]{</xsl:text>
|
|
91
|
+
<xsl:call-template name="color">
|
|
92
|
+
<xsl:with-param name="color" select="@mathbackground"/>
|
|
93
|
+
</xsl:call-template>
|
|
94
|
+
<xsl:text>}{$</xsl:text>
|
|
95
|
+
</xsl:if>
|
|
96
|
+
<xsl:if test="@color or @mathcolor"> <!-- Note: @color is deprecated in MathML 2.0 -->
|
|
97
|
+
<xsl:text>\textcolor[rgb]{</xsl:text>
|
|
98
|
+
<xsl:call-template name="color">
|
|
99
|
+
<xsl:with-param name="color" select="@color|@mathcolor"/>
|
|
100
|
+
</xsl:call-template>
|
|
101
|
+
<xsl:text>}{</xsl:text>
|
|
102
|
+
</xsl:if>
|
|
103
|
+
<xsl:if test="@mathvariant">
|
|
104
|
+
<xsl:choose>
|
|
105
|
+
<xsl:when test="@mathvariant='bold'">
|
|
106
|
+
<xsl:text>\mathbf{</xsl:text>
|
|
107
|
+
</xsl:when>
|
|
108
|
+
<xsl:when test="@mathvariant='italic'">
|
|
109
|
+
<xsl:text>\mathit{</xsl:text>
|
|
110
|
+
</xsl:when>
|
|
111
|
+
<xsl:when test="@mathvariant='bold-italic'"> <!-- Required definition -->
|
|
112
|
+
<xsl:text>\mathbit{</xsl:text>
|
|
113
|
+
</xsl:when>
|
|
114
|
+
<xsl:when test="@mathvariant='double-struck'"> <!-- Required amsfonts -->
|
|
115
|
+
<xsl:text>\mathbb{</xsl:text>
|
|
116
|
+
</xsl:when>
|
|
117
|
+
<xsl:when test="@mathvariant='bold-fraktur'"> <!-- Error -->
|
|
118
|
+
<xsl:text>{</xsl:text>
|
|
119
|
+
</xsl:when>
|
|
120
|
+
<xsl:when test="@mathvariant='script'">
|
|
121
|
+
<xsl:text>\mathcal{</xsl:text>
|
|
122
|
+
</xsl:when>
|
|
123
|
+
<xsl:when test="@mathvariant='bold-script'"> <!-- Error -->
|
|
124
|
+
<xsl:text>\mathsc{</xsl:text>
|
|
125
|
+
</xsl:when>
|
|
126
|
+
<xsl:when test="@mathvariant='fraktur'"> <!-- Required amsfonts -->
|
|
127
|
+
<xsl:text>\mathfrak{</xsl:text>
|
|
128
|
+
</xsl:when>
|
|
129
|
+
<xsl:when test="@mathvariant='sans-serif'">
|
|
130
|
+
<xsl:text>\mathsf{</xsl:text>
|
|
131
|
+
</xsl:when>
|
|
132
|
+
<xsl:when test="@mathvariant='bold-sans-serif'"> <!-- Required definition -->
|
|
133
|
+
<xsl:text>\mathbsf{</xsl:text>
|
|
134
|
+
</xsl:when>
|
|
135
|
+
<xsl:when test="@mathvariant='sans-serif-italic'"> <!-- Required definition -->
|
|
136
|
+
<xsl:text>\mathsfit{</xsl:text>
|
|
137
|
+
</xsl:when>
|
|
138
|
+
<xsl:when test="@mathvariant='sans-serif-bold-italic'"> <!-- Error -->
|
|
139
|
+
<xsl:text>\mathbsfit{</xsl:text>
|
|
140
|
+
</xsl:when>
|
|
141
|
+
<xsl:when test="@mathvariant='monospace'">
|
|
142
|
+
<xsl:text>\mathtt{</xsl:text>
|
|
143
|
+
</xsl:when>
|
|
144
|
+
<xsl:otherwise>
|
|
145
|
+
<xsl:text>{</xsl:text>
|
|
146
|
+
</xsl:otherwise>
|
|
147
|
+
</xsl:choose>
|
|
148
|
+
</xsl:if>
|
|
149
|
+
<xsl:call-template name="selectTemplate"/>
|
|
150
|
+
<xsl:if test="@mathvariant">
|
|
151
|
+
<xsl:text>}</xsl:text>
|
|
152
|
+
</xsl:if>
|
|
153
|
+
<xsl:if test="@color or @mathcolor">
|
|
154
|
+
<xsl:text>}</xsl:text>
|
|
155
|
+
</xsl:if>
|
|
156
|
+
<xsl:if test="@mathbackground">
|
|
157
|
+
<xsl:text>$}</xsl:text>
|
|
158
|
+
</xsl:if>
|
|
159
|
+
</xsl:template>
|
|
160
|
+
|
|
161
|
+
<xsl:template name="selectTemplate">
|
|
162
|
+
<xsl:choose>
|
|
163
|
+
<xsl:when test="local-name(.)='mi'">
|
|
164
|
+
<xsl:call-template name="mi"/>
|
|
165
|
+
</xsl:when>
|
|
166
|
+
<xsl:when test="local-name(.)='mn'">
|
|
167
|
+
<xsl:call-template name="mn"/>
|
|
168
|
+
</xsl:when>
|
|
169
|
+
<xsl:when test="local-name(.)='mo'">
|
|
170
|
+
<xsl:call-template name="mo"/>
|
|
171
|
+
</xsl:when>
|
|
172
|
+
<xsl:when test="local-name(.)='mtext'">
|
|
173
|
+
<xsl:call-template name="mtext"/>
|
|
174
|
+
</xsl:when>
|
|
175
|
+
<xsl:when test="local-name(.)='ms'">
|
|
176
|
+
<xsl:call-template name="ms"/>
|
|
177
|
+
</xsl:when>
|
|
178
|
+
</xsl:choose>
|
|
179
|
+
</xsl:template>
|
|
180
|
+
|
|
181
|
+
<xsl:template name="replaceMtextEntities">
|
|
182
|
+
<xsl:param name="content"/>
|
|
183
|
+
<xsl:choose>
|
|
184
|
+
<xsl:when test="contains($content,'   ')"> <!-- ThickSpace - space of width 5/18 em -->
|
|
185
|
+
<xsl:call-template name="replaceMtextEntities">
|
|
186
|
+
<xsl:with-param name="content" select="concat(substring-before($content,'   '),'\hspace{0.28em}',substring-after($content,'   '))"/>
|
|
187
|
+
</xsl:call-template>
|
|
188
|
+
</xsl:when>
|
|
189
|
+
<xsl:when test="contains($content,' ')"> <!-- ThinSpace - space of width 3/18 em -->
|
|
190
|
+
<xsl:call-template name="replaceMtextEntities">
|
|
191
|
+
<xsl:with-param name="content" select="concat(substring-before($content,' '),'\hspace{0.17em}',substring-after($content,' '))"/>
|
|
192
|
+
</xsl:call-template>
|
|
193
|
+
</xsl:when>
|
|
194
|
+
<xsl:otherwise>
|
|
195
|
+
<xsl:value-of select="normalize-space($content)"/>
|
|
196
|
+
</xsl:otherwise>
|
|
197
|
+
</xsl:choose>
|
|
198
|
+
</xsl:template>
|
|
199
|
+
</xsl:stylesheet>
|
|
@@ -0,0 +1,61 @@
|
|
|
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:mmultiscripts" mode="mprescripts">
|
|
6
|
+
<xsl:for-each select="m:mprescripts/following-sibling::*">
|
|
7
|
+
<xsl:if test="position() mod 2 and local-name(.)!='none'">
|
|
8
|
+
<xsl:text>{}_{</xsl:text>
|
|
9
|
+
<xsl:apply-templates select="."/>
|
|
10
|
+
<xsl:text>}</xsl:text>
|
|
11
|
+
</xsl:if>
|
|
12
|
+
<xsl:if test="not(position() mod 2) and local-name(.)!='none'">
|
|
13
|
+
<xsl:text>{}^{</xsl:text>
|
|
14
|
+
<xsl:apply-templates select="."/>
|
|
15
|
+
<xsl:text>}</xsl:text>
|
|
16
|
+
</xsl:if>
|
|
17
|
+
</xsl:for-each>
|
|
18
|
+
<xsl:apply-templates select="./*[1]"/>
|
|
19
|
+
<xsl:for-each select="m:mprescripts/preceding-sibling::*[position()!=last()]">
|
|
20
|
+
<xsl:if test="position()>2 and local-name(.)!='none'">
|
|
21
|
+
<xsl:text>{}</xsl:text>
|
|
22
|
+
</xsl:if>
|
|
23
|
+
<xsl:if test="position() mod 2 and local-name(.)!='none'">
|
|
24
|
+
<xsl:text>_{</xsl:text>
|
|
25
|
+
<xsl:apply-templates select="."/>
|
|
26
|
+
<xsl:text>}</xsl:text>
|
|
27
|
+
</xsl:if>
|
|
28
|
+
<xsl:if test="not(position() mod 2) and local-name(.)!='none'">
|
|
29
|
+
<xsl:text>^{</xsl:text>
|
|
30
|
+
<xsl:apply-templates select="."/>
|
|
31
|
+
<xsl:text>}</xsl:text>
|
|
32
|
+
</xsl:if>
|
|
33
|
+
</xsl:for-each>
|
|
34
|
+
</xsl:template>
|
|
35
|
+
|
|
36
|
+
<xsl:template match="m:mmultiscripts">
|
|
37
|
+
<xsl:choose>
|
|
38
|
+
<xsl:when test="m:mprescripts">
|
|
39
|
+
<xsl:apply-templates select="." mode="mprescripts"/>
|
|
40
|
+
</xsl:when>
|
|
41
|
+
<xsl:otherwise>
|
|
42
|
+
<xsl:apply-templates select="./*[1]"/>
|
|
43
|
+
<xsl:for-each select="*[position()>1]">
|
|
44
|
+
<xsl:if test="position()>2 and local-name(.)!='none'">
|
|
45
|
+
<xsl:text>{}</xsl:text>
|
|
46
|
+
</xsl:if>
|
|
47
|
+
<xsl:if test="position() mod 2 and local-name(.)!='none'">
|
|
48
|
+
<xsl:text>_{</xsl:text>
|
|
49
|
+
<xsl:apply-templates select="."/>
|
|
50
|
+
<xsl:text>}</xsl:text>
|
|
51
|
+
</xsl:if>
|
|
52
|
+
<xsl:if test="not(position() mod 2) and local-name(.)!='none'">
|
|
53
|
+
<xsl:text>^{</xsl:text>
|
|
54
|
+
<xsl:apply-templates select="."/>
|
|
55
|
+
<xsl:text>}</xsl:text>
|
|
56
|
+
</xsl:if>
|
|
57
|
+
</xsl:for-each>
|
|
58
|
+
</xsl:otherwise>
|
|
59
|
+
</xsl:choose>
|
|
60
|
+
</xsl:template>
|
|
61
|
+
</xsl:stylesheet>
|
|
@@ -0,0 +1,66 @@
|
|
|
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:mover">
|
|
8
|
+
<xsl:call-template name="mover">
|
|
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="over">
|
|
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="mover">
|
|
23
|
+
<xsl:param name="base"/>
|
|
24
|
+
<xsl:param name="over"/>
|
|
25
|
+
|
|
26
|
+
<xsl:variable name="diacritics-regex" select="'^[̀-̸⃐-⃯]$'" />
|
|
27
|
+
<xsl:variable name="is-diacritical-mark" select="inst:matches($over, $diacritics-regex)" />
|
|
28
|
+
|
|
29
|
+
<!-- original: scripts.xsl line 128 -->
|
|
30
|
+
<!-- modified based on: mml2tex.xsl line 312 -->
|
|
31
|
+
<xsl:choose>
|
|
32
|
+
<xsl:when test="$over = '⏞' or $over = '⏟'">
|
|
33
|
+
<xsl:text>\overbrace</xsl:text>
|
|
34
|
+
</xsl:when>
|
|
35
|
+
<xsl:when test="$over = '⎴' or $over = '⎵'">
|
|
36
|
+
<xsl:text>\overbracket</xsl:text>
|
|
37
|
+
</xsl:when>
|
|
38
|
+
<xsl:when test="$over = '^'"><!-- superscript circumflex/caret -->
|
|
39
|
+
<xsl:choose>
|
|
40
|
+
<xsl:when test="string-length($base) > 1">\widehat</xsl:when>
|
|
41
|
+
<xsl:otherwise>\hat</xsl:otherwise>
|
|
42
|
+
</xsl:choose>
|
|
43
|
+
</xsl:when>
|
|
44
|
+
<xsl:when test="$over = '~'"><!-- superscript tilde -->
|
|
45
|
+
<xsl:choose>
|
|
46
|
+
<xsl:when test="string-length($base) > 1">\widetilde</xsl:when>
|
|
47
|
+
<xsl:otherwise>\tilde</xsl:otherwise>
|
|
48
|
+
</xsl:choose>
|
|
49
|
+
</xsl:when>
|
|
50
|
+
<xsl:when test="inst:matches($over, '^[¯_̄̅‾]$')"><!-- macron, combining macron, combining overline -->
|
|
51
|
+
<xsl:text>\overline</xsl:text>
|
|
52
|
+
</xsl:when>
|
|
53
|
+
<xsl:when test="$is-diacritical-mark">
|
|
54
|
+
<xsl:apply-templates select="./*[2]"/>
|
|
55
|
+
</xsl:when>
|
|
56
|
+
<xsl:otherwise>
|
|
57
|
+
<xsl:text>\overset{</xsl:text>
|
|
58
|
+
<xsl:apply-templates select="./*[2]"/>
|
|
59
|
+
<xsl:text>}</xsl:text>
|
|
60
|
+
</xsl:otherwise>
|
|
61
|
+
</xsl:choose>
|
|
62
|
+
<xsl:text>{</xsl:text>
|
|
63
|
+
<xsl:apply-templates select="./*[1]"/>
|
|
64
|
+
<xsl:text>}</xsl:text>
|
|
65
|
+
</xsl:template>
|
|
66
|
+
</xsl:stylesheet>
|