asciidoctor-latex 1.5.0.3.dev → 1.5.0.4.dev

Sign up to get free protection for your applications and to get access to all the features.
Files changed (142) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.adoc +28 -5
  3. data/README.adoc +48 -23
  4. data/Rakefile +2 -1
  5. data/data/asciidoc_tex_macros.tex +86 -3
  6. data/data/extras.css +73 -1
  7. data/data/preamble_article.tex +15 -6
  8. data/data/preamble_book.tex +25 -9
  9. data/examples/README.adoc +341 -9
  10. data/examples/README.html +915 -0
  11. data/examples/math_article.adoc +46 -46
  12. data/examples/xref-equations.adoc +1 -2
  13. data/lib/asciidoctor-latex/click.css +2 -0
  14. data/lib/asciidoctor-latex/click.js +6 -0
  15. data/lib/asciidoctor-latex/jquery.js +4 -0
  16. data/lib/asciidoctor-latex/preamble_processor.rb +18 -0
  17. data/lib/asciidoctor/latex/click_block.rb +7 -4
  18. data/lib/asciidoctor/latex/converter.rb +75 -29
  19. data/lib/asciidoctor/latex/core_ext/utility.rb +55 -0
  20. data/lib/asciidoctor/latex/css.rb +50 -0
  21. data/lib/asciidoctor/latex/environment_block.rb +13 -6
  22. data/lib/asciidoctor/latex/inject_html.rb +2 -1
  23. data/lib/asciidoctor/latex/node_processors.rb +329 -152
  24. data/lib/asciidoctor/latex/prepend_processor.rb +1 -0
  25. data/lib/asciidoctor/latex/tex_postprocessor.rb +8 -3
  26. data/lib/asciidoctor/latex/tex_preprocessor.rb +31 -9
  27. data/lib/asciidoctor/latex/version.rb +1 -1
  28. data/test/examples/adoc/ampersand.adoc +2 -0
  29. data/test/examples/adoc/block_olist.adoc +58 -0
  30. data/test/examples/adoc/block_ulist.adoc +42 -0
  31. data/test/examples/adoc/box.adoc +35 -1
  32. data/test/examples/adoc/chem.adoc +8 -0
  33. data/test/examples/adoc/click_plain.adoc +24 -0
  34. data/test/examples/adoc/dlist.adoc +15 -0
  35. data/test/examples/adoc/env2.adoc +57 -0
  36. data/test/examples/adoc/env_joke.adoc +12 -0
  37. data/test/examples/adoc/env_plain.adoc +10 -0
  38. data/test/examples/adoc/eq-latex.adoc +39 -0
  39. data/test/examples/adoc/eq.adoc +18 -0
  40. data/test/examples/adoc/eq.tex +28 -0
  41. data/test/examples/adoc/eqalign.adoc +19 -6
  42. data/test/examples/adoc/eqalign.tex +25 -0
  43. data/test/examples/adoc/eqno-latex.adoc +120 -0
  44. data/test/examples/adoc/extras.adoc +14 -0
  45. data/test/examples/adoc/hypertarget.adoc +29 -0
  46. data/test/examples/adoc/image.adoc +7 -0
  47. data/test/examples/adoc/newEnvironments.tex +0 -0
  48. data/test/examples/adoc/table.adoc +6 -0
  49. data/test/examples/adoc/table.tex +10 -0
  50. data/test/examples/adoc/tex_pathologies.adoc +30 -0
  51. data/test/examples/html/env.html +147 -0
  52. data/test/examples/html/equations.html +14 -0
  53. data/test/examples/tex/ampersand.tex +2 -0
  54. data/test/examples/tex/block_admonition.tex +20 -0
  55. data/test/examples/tex/block_audio.tex +7 -0
  56. data/test/examples/tex/block_colist.tex +23 -0
  57. data/test/examples/tex/block_dlist.tex +117 -0
  58. data/test/examples/tex/block_example.tex +20 -0
  59. data/test/examples/tex/block_floating_title.tex +20 -0
  60. data/test/examples/tex/block_image.tex +46 -0
  61. data/test/examples/tex/block_listing.tex +59 -0
  62. data/test/examples/tex/block_literal.tex +28 -0
  63. data/test/examples/tex/block_olist.tex +119 -0
  64. data/test/examples/tex/block_open.tex +22 -0
  65. data/test/examples/tex/block_outline.tex +25 -0
  66. data/test/examples/tex/block_page_break.tex +4 -0
  67. data/test/examples/tex/block_paragraph.tex +13 -0
  68. data/test/examples/tex/block_pass.tex +3 -0
  69. data/test/examples/tex/block_preamble.tex +15 -0
  70. data/test/examples/tex/block_quote.tex +51 -0
  71. data/test/examples/tex/block_sidebar.tex +21 -0
  72. data/test/examples/tex/block_stem.tex +19 -0
  73. data/test/examples/tex/block_table.tex +188 -0
  74. data/test/examples/tex/block_thematic_break.tex +1 -0
  75. data/test/examples/tex/block_toc.tex +27 -0
  76. data/test/examples/tex/block_ulist.tex +96 -0
  77. data/test/examples/tex/block_verse.tex +39 -0
  78. data/test/examples/tex/block_video.tex +15 -0
  79. data/test/examples/tex/box.tex +25 -0
  80. data/test/examples/tex/chem.tex +7 -0
  81. data/test/examples/tex/click_plain.tex +25 -0
  82. data/test/examples/tex/dlist.tex +17 -0
  83. data/test/examples/tex/document.tex +25 -0
  84. data/test/examples/tex/embedded.tex +7 -0
  85. data/test/examples/tex/env.tex +7 -7
  86. data/test/examples/tex/env2.tex +29 -0
  87. data/test/examples/tex/env_joke.tex +9 -0
  88. data/test/examples/tex/env_plain.tex +7 -0
  89. data/test/examples/tex/eq-latex.tex +49 -0
  90. data/test/examples/tex/eq.tex +9 -0
  91. data/test/examples/tex/eqalign.tex +23 -0
  92. data/test/examples/tex/eqno-latex.tex +237 -0
  93. data/test/examples/tex/exponent1.tex +2 -0
  94. data/test/examples/tex/exponent2.tex +4 -0
  95. data/test/examples/tex/extras.tex +13 -0
  96. data/test/examples/tex/hypertarget.tex +25 -0
  97. data/test/examples/tex/image.tex +4 -0
  98. data/test/examples/tex/inline_anchor.tex +25 -0
  99. data/test/examples/tex/inline_break.tex +7 -0
  100. data/test/examples/tex/inline_button.tex +1 -0
  101. data/test/examples/tex/inline_callout.tex +4 -0
  102. data/test/examples/tex/inline_footnote.tex +9 -0
  103. data/test/examples/tex/inline_image.tex +25 -0
  104. data/test/examples/tex/inline_kbd.tex +3 -0
  105. data/test/examples/tex/inline_menu.tex +5 -0
  106. data/test/examples/tex/inline_quoted.tex +63 -0
  107. data/test/examples/tex/line_break.tex +4 -0
  108. data/test/examples/tex/listing.tex +10 -0
  109. data/test/examples/tex/literal.tex +42 -0
  110. data/test/examples/tex/macro_underscore.tex +6 -0
  111. data/test/examples/tex/math.tex +8 -0
  112. data/test/examples/tex/open_block.tex +10 -0
  113. data/test/examples/tex/page_break.tex +4 -0
  114. data/test/examples/tex/pass.tex +3 -0
  115. data/test/examples/tex/section.tex +51 -0
  116. data/test/examples/tex/sections.tex +13 -0
  117. data/test/examples/tex/table.tex +10 -0
  118. data/test/examples/tex/tex_pathologies.tex +26 -0
  119. data/test/examples/tex/zero.tex +1 -1
  120. metadata +188 -26
  121. data/examples/box.adoc +0 -16
  122. data/examples/chem.adoc +0 -17
  123. data/examples/eq-alignment.adoc +0 -5
  124. data/examples/eq-block.adoc +0 -60
  125. data/test/examples/adoc/admonition.adoc +0 -11
  126. data/test_jc/admonition.adoc +0 -4
  127. data/test_jc/click.adoc +0 -7
  128. data/test_jc/env.adoc +0 -31
  129. data/test_jc/example.adoc +0 -17
  130. data/test_jc/floating_title.adoc +0 -15
  131. data/test_jc/image.adoc +0 -84
  132. data/test_jc/images/frog.jpg +0 -0
  133. data/test_jc/images/red_frog.jpeg +0 -0
  134. data/test_jc/images/yellow_frog.jpeg +0 -0
  135. data/test_jc/listing.adoc +0 -9
  136. data/test_jc/lists.adoc +0 -20
  137. data/test_jc/math.adoc +0 -10
  138. data/test_jc/preamble.adoc +0 -14
  139. data/test_jc/section-numbered.adoc +0 -9
  140. data/test_jc/section.adoc +0 -7
  141. data/test_jc/sidebar.adoc +0 -61
  142. data/test_jc/verse.adoc +0 -15
@@ -4,6 +4,7 @@ require 'asciidoctor/extensions'
4
4
  module Asciidoctor::LaTeX
5
5
 
6
6
  # THIS CLASS IS NO LONGER USED
7
+ # See 'inject_html.rb'
7
8
  # Prepend lines to a document
8
9
 
9
10
  class ClickStyleInsert < Asciidoctor::Extensions::Preprocessor
@@ -21,7 +21,9 @@ module Asciidoctor::LaTeX
21
21
  class TexPostprocessor < Asciidoctor::Extensions::Postprocessor
22
22
 
23
23
  def process document, output
24
- output = output.gsub('DOLLOD', '\$')
24
+ output = output.gsub('ESCAMPERSAND', '\\&')
25
+ output = output.gsub('ESCUNDERSCORE', '\\_')
26
+ output = output.gsub('ESCDOLLAR', '\\$')
25
27
  output = output.gsub('CHEMRIGHTARROW','->').gsub('CHEMLEFTARROW','<-').gsub('CHEMLEFTRIGHTARROW','<-->')
26
28
  output = output.gsub('\\(','$').gsub('\\)','$')
27
29
  output.gsub('!!!BACKSLASH', '\\')
@@ -32,13 +34,16 @@ module Asciidoctor::LaTeX
32
34
  class HTMLPostprocessor < Asciidoctor::Extensions::Postprocessor
33
35
 
34
36
  def process document, output
37
+ output = output.gsub('ESCAMPERSAND', '&')
38
+ output = output.gsub('ESCUNDERSCORE', '_')
39
+ output = output.gsub('ESCDOLLAR', '$')
35
40
  output = output.gsub('\DOLLOD', '\$')
36
41
  # match_data = output.match /%%(.*)%%/
37
42
  # if match_data
38
43
  # output = output.gsub(match_data[0], match_data[1])
39
44
  # end
40
- output = output.gsub('DOLLOD', '$')
41
- output.gsub('!!!BACKSLASH', '\\')
45
+ output = output.gsub('!!!BACKSLASH', '\\')
46
+ # output.gsub('%', '\%') This messes up the html bigtimw
42
47
  end
43
48
 
44
49
  end
@@ -23,8 +23,7 @@ module Asciidoctor::LaTeX
23
23
  # TEX_DOLLAR_SUB = '\1\\\(\2\\\)\3'
24
24
 
25
25
  TEX_DOLLAR_RX = /\$(.*?)\$/
26
- TEX_DOLLAR_SUB = '\\\(\1\\\)'
27
- TEX_DOLLAR_SUB2 = '+\\\(\1\\\)+'
26
+ TEX_DOLLAR_SUB = 'pass:[\\\(\1\\\)]'
28
27
 
29
28
 
30
29
  def process document, reader
@@ -40,22 +39,45 @@ module Asciidoctor::LaTeX
40
39
  if line.include? '<-' and document.basebackend? 'tex'
41
40
  line = line.gsub('<-', 'CHEMLEFTARROW')
42
41
  end
43
- if line.include? '\$' and document.basebackend? 'html'
44
- line = line.gsub '\$', 'DOLLOD'
42
+
43
+ # SPECIAL CHARACTER SUBSTITUTIONS
44
+ if line.include? '\\&' and document.basebackend? 'html'
45
+ line = line.gsub '\\&', 'ESCAMPERSAND'
46
+ end
47
+ if line.include? '\\_' and document.basebackend? 'html'
48
+ line = line.gsub '\\_', 'ESCUNDERSCORE'
45
49
  end
46
- if line.include? '%' and document.basebackend? 'tex'
47
- line = line.gsub '%', '\%'
50
+ if line.include? '\\' and document.basebackend? 'html'
51
+ line = line.gsub '\\$', 'ESCDOLLAR'
48
52
  end
53
+ # It is important the previous transformation
54
+ # come before the next one
49
55
  if line.include? '$'
50
- line = line.gsub TEX_DOLLAR_RX, TEX_DOLLAR_SUB2
56
+ line = line.gsub TEX_DOLLAR_RX, TEX_DOLLAR_SUB
51
57
  end
58
+
52
59
  # protect math, e.g., (a^2)^3 from Asciidoc subsitutions:
53
60
  if line =~ /^\\\[/
54
- line = line.gsub /^\\\[/, '+\\['
61
+ line = line.gsub '\\[', "+++\n\\["
62
+ # line = line.gsub /^\\\[/, '+\\]'
63
+ # line = line.gsub '\\[', '\\['
55
64
  end
56
65
  if line =~ /^\\\]/
57
- line = line.gsub /^\\\]/, '\\]+'
66
+ line = line.gsub '\\]', "\\]\n+++\n"
67
+ # line = line.gsub /'^\\\]/, '\\]+'
68
+ # line = line.gsub '\\]', '\\]+'
58
69
  end
70
+ # if line =~ /\[env\..*?\]/
71
+ # m = line.match /(\[env\..*?)\]/
72
+ # line = line.gsub m[1], m[1]+',subs=none'
73
+ # end
74
+ # if line =~ /\&/
75
+ # line = line.gsub('&', '\\\&')
76
+ # end
77
+ # We do need to make this substitution, but ONLY ouutside
78
+ # of mathematical text.
79
+ # Please $FIXME!
80
+ #
59
81
  # We would like to ensure that underscores in names,
60
82
  # e.g., MACRO_NAME, do not cause LaTeX bugs. However,
61
83
  # the code below introduces a more serious bug: expressons
@@ -1,5 +1,5 @@
1
1
  module Asciidoctor
2
2
  module LaTeX
3
- VERSION = '1.5.0.3.dev'
3
+ VERSION = '1.5.0.4.dev'
4
4
  end
5
5
  end
@@ -0,0 +1,2 @@
1
+ //.ampersand
2
+ Rhythm & Blues
@@ -0,0 +1,58 @@
1
+
2
+ // This file has been modified to remove
3
+ // nesting to level five, which LaTeX
4
+ // cannot handle
5
+
6
+ // .basic
7
+ . Step 1
8
+ . Step 2
9
+ . Step 3
10
+
11
+ // .with_start
12
+ [start=6]
13
+ . Step 1
14
+ . Step 2
15
+ . Step 3
16
+
17
+ // .with_numeration_styles
18
+ [decimal]
19
+ . level 1
20
+ [upperalpha]
21
+ .. level 2
22
+ [loweralpha]
23
+ ... level 3
24
+ [lowerroman]
25
+ .... level 4
26
+
27
+
28
+ // .with_title
29
+ .Steps
30
+ . Step 1
31
+ . Step 2
32
+ . Step 3
33
+
34
+ // .with_id_and_role
35
+ [#steps.green]
36
+ . Step 1
37
+ . Step 2
38
+ . Step 3
39
+
40
+ // .max_nesting
41
+ . level 1
42
+ .. level 2
43
+ ... level 3
44
+ .... level 4
45
+ .. level 2
46
+
47
+ // .complex_content
48
+ . Every list item has at least one paragraph of content,
49
+ which may be wrapped, even using a hanging indent.
50
+ +
51
+ Additional paragraphs or blocks are adjoined by putting
52
+ a list continuation on a line adjacent to both blocks.
53
+ +
54
+ list continuation:: a plus sign (`{plus}`) on a line by itself
55
+
56
+ . A literal paragraph does not require a list continuation.
57
+
58
+ $ gem install asciidoctor
@@ -0,0 +1,42 @@
1
+ // .basic
2
+ * Edgar Allen Poe
3
+ * Sheri S. Tepper
4
+ * Bill Bryson
5
+
6
+ // .with_title
7
+ .Writers
8
+ * Edgar Allen Poe
9
+ * Sheri S. Tepper
10
+ * Bill Bryson
11
+
12
+ // .with_id_and_role
13
+ [#authors.green]
14
+ * Edgar Allen Poe
15
+ * Sheri S. Tepper
16
+ * Bill Bryson
17
+
18
+ // .max_nesting
19
+ * level 1
20
+ ** level 2
21
+ *** level 3
22
+ **** level 4
23
+ ** level 2
24
+
25
+ // .complex_content
26
+ * Every list item has at least one paragraph of content,
27
+ which may be wrapped, even using a hanging indent.
28
+ +
29
+ Additional paragraphs or blocks are adjoined by putting
30
+ a list continuation on a line adjacent to both blocks.
31
+ +
32
+ list continuation:: a plus sign (`{plus}`) on a line by itself
33
+
34
+ * A literal paragraph does not require a list continuation.
35
+
36
+ $ gem install asciidoctor
37
+
38
+ // .checklist
39
+ - [*] checked
40
+ - [x] also checked
41
+ - [ ] not checked
42
+ - normal list item
@@ -1,8 +1,42 @@
1
- //.box
2
1
 
2
+ This is a common problem and it is the first thing I check when
3
+ I’m having a javascript problem (I actually do step 1 and 2 with
4
+ my style.css as well). After checking that the file path is correct,
5
+ I double check by viewing the page source using Firefox, I then click
6
+ on the .js link. If it opens up the jQuery file (Double check it
7
+ is opening the correct file) then the destination is correct.
8
+ If it does not, or it opens a page-not-found, then I know I
9
+ have a problem with my file path.
10
+
11
+ [env.box]
12
+ --
13
+ Buurem lok medes, nor. Paat for deng zu locnoop.
14
+ Vor daal grustem balimor tuul, man vep, dar slek.
15
+ Morem labdis zoruk opmaak del!
16
+ --
17
+
18
+ This is a common problem and it is the first thing I check when
19
+ I’m having a javascript problem (I actually do step 1 and 2 with
20
+ my style.css as well). After checking that the file path is correct,
21
+ I double check by viewing the page source using Firefox, I then click
22
+ on the .js link. If it opens up the jQuery file (Double check it
23
+ is opening the correct file) then the destination is correct.
24
+ If it does not, or it opens a page-not-found, then I know I
25
+ have a problem with my file path.
26
+
27
+ .Zaar yek la!
3
28
  [env.box]
4
29
  --
5
30
  Buurem lok medes, nor. Paat for deng zu locnoop.
6
31
  Vor daal grustem balimor tuul, man vep, dar slek.
7
32
  Morem labdis zoruk opmaak del!
8
33
  --
34
+
35
+ This is a common problem and it is the first thing I check when
36
+ I’m having a javascript problem (I actually do step 1 and 2 with
37
+ my style.css as well). After checking that the file path is correct,
38
+ I double check by viewing the page source using Firefox, I then click
39
+ on the .js link. If it opens up the jQuery file (Double check it
40
+ is opening the correct file) then the destination is correct.
41
+ If it does not, or it opens a page-not-found, then I know I
42
+ have a problem with my file path.
@@ -0,0 +1,8 @@
1
+ //.chem-env
2
+ [env.chem]
3
+ --
4
+ 2Fe2O3 + 3C -> 4Fe + 3CO2
5
+ --
6
+
7
+ //.chem-inline
8
+ chem::[Fe3+], chem::[H20]
@@ -0,0 +1,24 @@
1
+
2
+
3
+ //.click-normal
4
+ [click.remark]
5
+ --
6
+ This is a normal remark.
7
+ --
8
+
9
+ //.click-plain
10
+ [click.remark%plain]
11
+ --
12
+ This is a plain remark.
13
+ --
14
+
15
+ //.numbered
16
+ [click.remark%numbered]
17
+ --
18
+ This is a numbered remark.
19
+ --
20
+
21
+ [click.remark%numbered]
22
+ --
23
+ So is this.
24
+ --
@@ -0,0 +1,15 @@
1
+ //.dlist
2
+ Foo:: A lambda expession of the first kind
3
+ Bar:: A lambda expressi of the second kind. A lambda expressi of the second kind.
4
+ A lambda expressi of the second kind.
5
+ A lambda expressi of the second kind.
6
+ A lambda expressi of the second kind.
7
+ A lambda expressi of the second kind.
8
+ A lambda expressi of the second kind.
9
+ A lambda expressi of the second kind.
10
+ Baababababbababa:: A very long word. A very long word.
11
+ A very long word. A very long word.
12
+ A very long word. A very long word.
13
+ A very long word. A very long word.
14
+ A very long word. A very long word.
15
+ X:: A short word.
@@ -0,0 +1,57 @@
1
+ //. env block
2
+
3
+
4
+ [env.definition]
5
+ --
6
+ A line is the path of shortest length between two points.
7
+ --
8
+
9
+ //. env block, cross ref
10
+
11
+ [env.definition#def-point]
12
+ --
13
+ A point is that which has no breadth.
14
+ --
15
+
16
+
17
+ //.env
18
+ [env.joke]
19
+ --
20
+ An engineer, a mathematician, and a philosopher met
21
+ at a bar for a drink. After a few beers, talk
22
+ turned to the question of how best to understand
23
+ the world ... (to be continued)
24
+ --
25
+
26
+ //.auto-numbered
27
+ [env.objection]
28
+ --
29
+ Your honor, my client could not have committed the
30
+ crime of which he is accused because he was
31
+ confined to the state penitentary at the time
32
+ that it occurred. If it please the court, ...
33
+ --
34
+
35
+ //. env with title
36
+ .Inadmissible testimony
37
+ [env.objection]
38
+ --
39
+ Your honor, that testimony cannot be
40
+ heard in this courtroom because it
41
+ was obtained under duress and without
42
+ informing my client of his rights.
43
+ --
44
+
45
+ //. with no option
46
+ .Improper procedure
47
+ [env.objection%no-number]
48
+ --
49
+ Your honor, the physical evidence
50
+ was not secured and was handled sloppily.
51
+ We cannot be sure tha the items which
52
+ the prosecution wishes to present here
53
+ have any association with my client
54
+ whatsoever.
55
+ --
56
+
57
+ .Cross referneces
@@ -0,0 +1,12 @@
1
+ //.joke
2
+ [env.joke]
3
+ --
4
+ Three men, a mathematician, a lawyer,
5
+ and a doctor ...
6
+ --
7
+
8
+ [env.joke%plain]
9
+ --
10
+ Three men, a mathematician, a lawyer,
11
+ and a doctor ...
12
+ --
@@ -0,0 +1,10 @@
1
+ //.env_plain
2
+ [env.remark]
3
+ --
4
+ This is a normal remark.
5
+ --
6
+
7
+ [env.remark%plain]
8
+ --
9
+ This is a plain remark.
10
+ --
@@ -0,0 +1,39 @@
1
+
2
+
3
+ == Some Equations
4
+
5
+
6
+ === Number Theory
7
+
8
+ The equation
9
+ $a^2 + b^2 = c^2$ has infinitely many
10
+ non-proportional integer solutions.
11
+ The integer solutions of the equation
12
+ \[
13
+ a^3 + b^3 = c^3
14
+ \]
15
+ are trivial: at least one entry is
16
+ zero and the others are "obvious"
17
+
18
+ === Calculus
19
+
20
+ A definite integral:
21
+ \[
22
+ \int_0^1 x^n dx = \frac{1}{n}
23
+ \]
24
+
25
+ The fundamental theorem of calculus:
26
+ \[
27
+ \frac{d}{dx} \int_a^x f(t) dt = f(x)
28
+ \]
29
+
30
+ === Linear algebra
31
+
32
+ A matrix:
33
+ \[
34
+ M = \left[
35
+ \begin{array}{ c c }
36
+ 1 & 2 \\
37
+ 3 & 4
38
+ \end{array} \right]
39
+ \]
@@ -4,9 +4,27 @@ The Pythagorean theorem, $a^2 + b^2 = c^2$,
4
4
  relates the hypotenuse to the altitude
5
5
  and base of a right triangle.
6
6
 
7
+
8
+
7
9
  Euler's formula states that
8
10
  \[
9
11
  e^{2\pi \sqrt{-1}} = 1
10
12
  \]
11
13
 
12
14
  Ain't that great!
15
+
16
+ [env.equation]
17
+ --
18
+ \sum_{k=1}^\infty \frac{1}{n}
19
+ --
20
+
21
+ [env.equation#hoho]
22
+ --
23
+ \sum_{k=1}^\infty \frac{1}{n^2}
24
+ --
25
+
26
+
27
+ [env.equation%numbered]
28
+ --
29
+ \sum_{k=1}^\infty \frac{1}{n^3}
30
+ --