Skip to content
Permalink
Browse files

Merge pull request #13114 from aeslaughter/MOOSEDocs-style-and-macros

Moose docs style and macros
  • Loading branch information...
aeslaughter committed Mar 26, 2019
2 parents d197e28 + bee5ce5 commit 4cd79ec5e8d434be19b68aa329d322e5de4eabd1
Showing with 851 additions and 89 deletions.
  1. BIN framework/doc/content/contrib/katex/fonts/KaTeX_AMS-Regular.ttf
  2. BIN framework/doc/content/contrib/katex/fonts/KaTeX_AMS-Regular.woff
  3. BIN framework/doc/content/contrib/katex/fonts/KaTeX_AMS-Regular.woff2
  4. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Caligraphic-Bold.ttf
  5. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Caligraphic-Bold.woff
  6. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Caligraphic-Bold.woff2
  7. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Caligraphic-Regular.ttf
  8. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Caligraphic-Regular.woff
  9. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Caligraphic-Regular.woff2
  10. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Fraktur-Bold.ttf
  11. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Fraktur-Bold.woff
  12. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Fraktur-Bold.woff2
  13. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Fraktur-Regular.ttf
  14. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Fraktur-Regular.woff
  15. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Fraktur-Regular.woff2
  16. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Main-Bold.ttf
  17. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Main-Bold.woff
  18. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Main-Bold.woff2
  19. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Main-BoldItalic.ttf
  20. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Main-BoldItalic.woff
  21. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Main-BoldItalic.woff2
  22. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Main-Italic.ttf
  23. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Main-Italic.woff
  24. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Main-Italic.woff2
  25. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Main-Regular.ttf
  26. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Main-Regular.woff
  27. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Main-Regular.woff2
  28. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Math-BoldItalic.ttf
  29. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Math-BoldItalic.woff
  30. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Math-BoldItalic.woff2
  31. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Math-Italic.ttf
  32. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Math-Italic.woff
  33. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Math-Italic.woff2
  34. BIN framework/doc/content/contrib/katex/fonts/KaTeX_SansSerif-Bold.ttf
  35. BIN framework/doc/content/contrib/katex/fonts/KaTeX_SansSerif-Bold.woff
  36. BIN framework/doc/content/contrib/katex/fonts/KaTeX_SansSerif-Bold.woff2
  37. BIN framework/doc/content/contrib/katex/fonts/KaTeX_SansSerif-Italic.ttf
  38. BIN framework/doc/content/contrib/katex/fonts/KaTeX_SansSerif-Italic.woff
  39. BIN framework/doc/content/contrib/katex/fonts/KaTeX_SansSerif-Italic.woff2
  40. BIN framework/doc/content/contrib/katex/fonts/KaTeX_SansSerif-Regular.ttf
  41. BIN framework/doc/content/contrib/katex/fonts/KaTeX_SansSerif-Regular.woff
  42. BIN framework/doc/content/contrib/katex/fonts/KaTeX_SansSerif-Regular.woff2
  43. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Script-Regular.ttf
  44. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Script-Regular.woff
  45. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Script-Regular.woff2
  46. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Size1-Regular.ttf
  47. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Size1-Regular.woff
  48. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Size1-Regular.woff2
  49. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Size2-Regular.ttf
  50. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Size2-Regular.woff
  51. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Size2-Regular.woff2
  52. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Size3-Regular.ttf
  53. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Size3-Regular.woff
  54. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Size3-Regular.woff2
  55. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Size4-Regular.ttf
  56. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Size4-Regular.woff
  57. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Size4-Regular.woff2
  58. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Typewriter-Regular.ttf
  59. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Typewriter-Regular.woff
  60. BIN framework/doc/content/contrib/katex/fonts/KaTeX_Typewriter-Regular.woff2
  61. +1 −1 framework/doc/content/contrib/katex/katex.min.css
  62. +1 −9 framework/doc/content/contrib/katex/katex.min.js
  63. +4 −1 modules/doc/config.yml
  64. +13 −1 modules/doc/content/python/MooseDocs/extensions/katex.md
  65. +48 −0 modules/doc/content/python/MooseDocs/extensions/style.md
  66. +0 −4 modules/doc/content/python/MooseDocs/index.md
  67. +1 −0 modules/doc/content/python/MooseDocs/specification.md
  68. +18 −0 python/MooseDocs/base/renderers.py
  69. +1 −0 python/MooseDocs/common/load_config.py
  70. +19 −7 python/MooseDocs/extensions/command.py
  71. +24 −2 python/MooseDocs/extensions/katex.py
  72. +5 −0 python/MooseDocs/extensions/pdf.py
  73. +38 −5 python/MooseDocs/extensions/style.py
  74. +5 −5 python/MooseDocs/test/content/extensions/bibtex.md
  75. +10 −0 python/MooseDocs/test/content/extensions/katex.md
  76. +1 −1 python/MooseDocs/test/content/extensions/materialicon.md
  77. +9 −0 python/MooseDocs/test/content/extensions/style.md
  78. +1 −0 python/MooseDocs/test/content/index.md
  79. +1 −1 python/MooseDocs/test/gold/html/extensions/katex.html
  80. +1 −1 python/MooseDocs/test/gold/html/extensions/katex_include.html
  81. +1 −1 python/MooseDocs/test/gold/html/extensions/package.html
  82. +1 −0 python/MooseDocs/test/gold/html/extensions/style.html
  83. +1 −1 python/MooseDocs/test/gold/html/index.html
  84. +60 −0 python/MooseDocs/test/gold/json/extensions/katex.json
  85. +1 −1 python/MooseDocs/test/gold/json/extensions/package.json
  86. +492 −0 python/MooseDocs/test/gold/json/extensions/style.json
  87. +34 −0 python/MooseDocs/test/gold/json/index.json
  88. +2 −0 python/MooseDocs/test/gold/latex/extensions/content.tex
  89. +12 −1 python/MooseDocs/test/gold/latex/extensions/katex.tex
  90. +1 −1 python/MooseDocs/test/gold/latex/extensions/package.tex
  91. +17 −0 python/MooseDocs/test/gold/latex/extensions/style.tex
  92. +2 −0 python/MooseDocs/test/gold/latex/index.tex
  93. +4 −0 python/MooseDocs/test/gold/latex/main.tex
  94. +1 −1 python/MooseDocs/test/gold/materialize/extensions/content.html
  95. +1 −1 python/MooseDocs/test/gold/materialize/extensions/katex.html
  96. +1 −1 python/MooseDocs/test/gold/materialize/extensions/katex_include.html
  97. +1 −1 python/MooseDocs/test/gold/materialize/extensions/package.html
  98. +1 −0 python/MooseDocs/test/gold/materialize/extensions/style.html
  99. +1 −1 python/MooseDocs/test/gold/materialize/index.html
  100. +5 −1 python/MooseDocs/test/html.yml
  101. +1 −0 python/MooseDocs/test/json.yml
  102. +5 −1 python/MooseDocs/test/latex.yml
  103. +5 −1 python/MooseDocs/test/materialize.yml
  104. +0 −38 python/MooseDocs/test/materialize_appsyntax.yml
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Large diffs are not rendered by default.

Oops, something went wrong.

Large diffs are not rendered by default.

Oops, something went wrong.
@@ -37,7 +37,10 @@ Extensions:
MooseDocs.extensions.bibtex:
duplicates:
- kim_phase-field_1999 # referenced in both Tensor Mechanics and Phase Field
MooseDocs.extensions.appsyntax:
MooseDocs.extensions.katex:
macros:
\pf: "\\frac{\\partial #1}{\\partial #2}"
MooseDocs.extensions.appsyntax: # WARNING: this must follow katex for doco pages to work
executable: ${MOOSE_DIR}/modules/combined
hide:
framework: !include framework/doc/hidden.yml
@@ -7,7 +7,7 @@ e.g., `[eq-heat]`.
!devel settings module=MooseDocs.extensions.katex
object=KatexExtension
id=katex-extension-config
caption=Available configure options for th KatexExtension object.
caption=Available configure options for the KatexExtension object.



@@ -59,4 +59,16 @@ shown below.
!devel example id=katex-inline caption=Example of an inline LaTeX equation.
This $y=2\phi$ is inline.

## Macros

It is possible to define macros within extension configuration. This is done using the
'macros' configuration parameter (see [katex-extension-config]). For example, the main configuration
file for contains the following allowing for equation in [katex-macro] to be defined.

!listing modules/doc/config.yml start=MooseDocs.extensions.katex end=MooseDocs.extensions.appsyntax

!devel example id=katex-macro caption=Example use of a macro defined in configuration file.
$\pf{T}{t} = c$


[KaTeX]: https://khan.github.io/KaTeX
@@ -0,0 +1,48 @@
# Style Extension

The style extension exists to apply, as the name suggests, style to markdown text via the "style"
command. The list of available configuration options is provided in [style-extension-config].

## Extension Configuration

!devel settings module=MooseDocs.extensions.style
object=StyleExtension
id=style-extension-config
caption=Available configure options for the StyleExtension object.

## Style Command

Style can be applied to blocks of text via the block versions of the "style" command. For example,
to center text horizontally use the "halign" setting as follows.

!devel! example id=style-block-example caption=Example use of "style" command for a block of text.
!style halign=center
This text should be centered.
!devel-end!

!devel! example id=style-block-example2
caption=Example use of "style" command for a block of text with multiple paragraphs.
!style! halign=center
This text should be centered.

As should this text.
!style-end!
!devel-end!


Inline text may also be style, for example the following creates colored text within a box.

!devel! example id=style-inline-example caption=Example use of "style" command for inline text.
It is possible to create [!style color=red border=2](red text within a box) using the "style"
command.
!devel-end!



The complete list of available settings is provide in [style-command-settings].


!devel settings module=MooseDocs.extensions.style
object=StyleCommand
id=style-command-settings
caption=Available settings for the 'style' command.
@@ -19,10 +19,6 @@ The single-source markdown files may be converted into various media forms, incl
this one), slide shows, and pdfs (via LaTeX). Most importantly, custom markdown syntax is easily
created so it is possible to develop syntax to meet the needs of any project.

!alert warning title=LaTeX and slide show support are under development.
Currently, the MooseDocs system only supports web-site (html) output like the site you are reading.
However, support for the other formats will be available soon.

The following links provide additional details on the MOOSE documentation system:

- [MooseDocs/specification.md]
@@ -58,6 +58,7 @@ tables. [user-ext] provides a list of extensions that are useful for those writi
| [/acronym.md] | Provides means for defining and listing acronyms across pages. |
| [/graph.md] | Adds [plotly](https://plot.ly) support for creating charts. |
| [/gallery.md] | Tools for building image galleries. |
| [/style.md] | Command for setting text styling. |

!table id=devel-ext caption=List of extensions useful for writing extensions for "MooseDown".
| Extension | Description |
@@ -9,6 +9,7 @@

"""Defines Renderer objects that convert AST (from Reader) into an output format."""
import os
import re
import logging
import traceback
import codecs
@@ -322,6 +323,7 @@ class LatexRenderer(Renderer):
def __init__(self, *args, **kwargs):
self._packages = dict()
self._preamble = list()
self._commands = dict()
Renderer.__init__(self, *args, **kwargs)

def getRoot(self):
@@ -330,6 +332,22 @@ def getRoot(self):
"""
return latex.LatexBase(None, None)

def addNewCommand(self, cmd, content):
"""
Add a NewDocumentCommand to latex preamble.
"""
num = 0
for match in re.finditer(r'#(?P<num>[0-9]+)', content):
num = max(num, int(match.group('num')))

args = [latex.Brace(string=cmd, escape=False), latex.Brace(string='m'*num)]
self._commands[cmd] = latex.Command(None, 'NewDocumentCommand', args=args, escape=False,
string=content, start='\n')

def getNewCommands(self):
"""Return the dict of new commands."""
return self._commands

def addPackage(self, pkg, *args, **kwargs):
"""
Add a LaTeX package to the list of packages for rendering (see pdf.py)
@@ -24,6 +24,7 @@
'MooseDocs.extensions.floats',
'MooseDocs.extensions.command',
'MooseDocs.extensions.include',
'MooseDocs.extensions.style',
'MooseDocs.extensions.media',
'MooseDocs.extensions.listing',
'MooseDocs.extensions.table',
@@ -63,7 +63,8 @@ def extend(self, reader, renderer):
self.requires(core)
reader.addBlock(BlockBlockCommand(), location='_begin')
reader.addBlock(BlockInlineCommand(), location='<BlockBlockCommand')
reader.addInline(OldInlineCommand(), location='_begin') #TODO: add deprecated message
reader.addInline(OlderInlineCommand(), location='_begin') #TODO: add deprecated message
reader.addInline(OldInlineCommand(), location='_begin') #TODO: add deprecated message
reader.addInline(InlineCommand(), location='_begin')

class CommandComponent(components.TokenComponent): #pylint: disable=abstract-method
@@ -149,16 +150,27 @@ class BlockBlockCommand(CommandBase):
r'(?=\n*\Z|\n{2,})', # ends with empty line or end of string
flags=re.UNICODE|re.MULTILINE|re.DOTALL)

class OldInlineCommand(CommandBase):
class OlderInlineCommand(CommandBase):
RE = re.compile(r'!{2}(?P<command>\w+) *(?P<subcommand>\w+)? *(?P<settings>.*?)!{2}',
flags=re.UNICODE)

class OldInlineCommand(CommandBase):
RE = re.compile(r'\[(?P<command>\w+)!(?!(?P<subcommand>\w+)!)?(?P<inline>.*?)'
r' *(?P<settings>\w+=.*?)?\]',
flags=re.UNICODE)

class InlineCommand(CommandBase):
"""Inline commands as:
[!command key=value]
[!command!subcommand key=value]
[command key=value]
[command](content in here)
[command!subcommand key=value]
[command!subcommand key=value](content in here)
"""

RE = re.compile(r'\[(?P<command>\w+)!(?!(?P<subcommand>\w+)!)?(?P<inline>.*?)'
r' *(?P<settings>\w+=.*?)?\]',
flags=re.UNICODE)
RE = re.compile(r'\[' # opening bracket "["
r'!(?P<command>\w+)' # the primary command
r'(?:!(?P<subcommand>\w+))?' # optional subcommand
r' *(?P<settings>\w+=.*?)?' # optional settings
r'\]' # closing bracket "]"
r'(?:\((?P<inline>.*?)\))?', # optional inline content
flags=re.UNICODE|re.DOTALL)
@@ -37,8 +37,13 @@ def defaultConfig():
config = components.Extension.defaultConfig()
config['prefix'] = ('Eq.', r"The prefix to used when referring to an equation by " \
r"the \\label content.")
config['macros'] = (None, "Macro definitions to apply to equations.")
return config

def __init__(self, *args, **kwargs):
super(KatexExtension, self).__init__(*args, **kwargs)
self.macros = None

def initMetaData(self, page, meta):
meta.initData('labels', set())

@@ -58,6 +63,16 @@ def extend(self, reader, renderer):
renderer.addCSS('katex_moose', "css/katex_moose.css")
renderer.addJavaScript('katex', "contrib/katex/katex.min.js", head=True)

if self.get('macros', None):
mc = ','.join('"{}":"{}"'.format(k, v) for k, v in self.get('macros').iteritems()) #pylint: disable=no-member
self.macros = '{' + mc + '}'

elif isinstance(renderer, renderers.LatexRenderer):
renderer.addPackage('amsfonts')
if self.get('macros', None):
for k, v in self.get('macros').iteritems(): #pylint: disable=no-member
renderer.addNewCommand(k, v)

def postTokenize(self, ast, page, meta, reader):
labels = set()
count = 0
@@ -154,9 +169,16 @@ def createHTML(self, parent, token, page): #pylint: disable=no-self-use

# Build the KaTeX script
script = html.Tag(div, 'script')
config = dict()
config['displayMode'] = display
config['throwOnError'] = 'false'
if self.extension.macros:
config['macros'] = self.extension.macros

config_str = ','.join('{}:{}'.format(key, value) for key, value in config.iteritems())
content = u'var element = document.getElementById("%s");' % token['bookmark']
content += u'katex.render("%s", element, {displayMode:%s,throwOnError:false});' % \
(token['tex'].encode('string-escape'), display)
content += u'katex.render("%s", element, {%s});' % \
(token['tex'].encode('string-escape'), config_str.encode('string-escape'))
html.String(script, content=content)

return parent
@@ -126,6 +126,10 @@ def _processPages(self, root):
for preamble in self.translator.renderer.getPreamble():
latex.String(main, content='\n' + preamble, escape=False)

# New Commands
for cmd in self.translator.renderer.getNewCommands().itervalues():
cmd.parent = main

doc = latex.Environment(main, 'document', end='\n')
for node in anytree.PreOrderIter(root, filter_=lambda n: 'page' in n):
page = node['page']
@@ -139,6 +143,7 @@ def _processPages(self, root):
latex.Command(doc, 'bibliographystyle', start='\n', string=u'unsrtnat')
latex.Command(doc, 'bibliography', string=u','.join(bib_files), start='\n',
escape=False)

return main

def _reportLatexWarnings(self, lnode, content):
@@ -8,14 +8,15 @@
#* Licensed under LGPL 2.1, please see LICENSE for details
#* https://www.gnu.org/licenses/lgpl-2.1.html

from MooseDocs.base import components
from MooseDocs.base import components, renderers
from MooseDocs.common import exceptions
from MooseDocs.extensions import command
from MooseDocs.tree import tokens, html
from MooseDocs.tree import tokens, html, latex

def make_extension(**kwargs):
return StyleExtension(**kwargs)

StyleToken = tokens.newToken('StyleToken', halign='left', border=0)
StyleToken = tokens.newToken('StyleToken', halign='left', color=None, border=0)

class StyleExtension(command.CommandExtension):
@staticmethod
@@ -28,6 +29,10 @@ def extend(self, reader, renderer):
self.addCommand(reader, StyleCommand())
renderer.add('StyleToken', RenderStyleToken())

if isinstance(renderer, renderers.LatexRenderer):
renderer.addPackage(u'xcolor')


class StyleCommand(command.CommandComponent):
COMMAND = 'style'
SUBCOMMAND = None
@@ -37,23 +42,51 @@ def defaultSettings():
settings = command.CommandComponent.defaultSettings()
settings['halign'] = (None, "The horizontal alignment ('center', 'left', or 'right')")
settings['border'] = (None, "The size of the border in pixels")
settings['color'] = (None, "Set the color of content.")
return settings

def createToken(self, parent, info, page):
return StyleToken(parent,
halign=self.settings['halign'],
border=self.settings['border'],
color=self.settings['color'],
**self.attributes)

class RenderStyleToken(components.RenderComponent):

def createHTML(self, parent, token, page):
style = [token['style']]
if token['halign']:
if token['halign'] not in ('center', 'left', 'right'):
msg = "The supplied string for 'halign' is '{}' but it must be " \
"'center', 'left', 'right'."
raise exceptions.MooseDocsException(msg, token['halign'])

style.append('text-align:{}'.format(token['halign']))
if token['border']:
style.append('border-width:{}px;border-style:solid'.format(token['border']))
return html.Tag(parent, 'div', token, style=';'.join(style))
if token['color']:
style.append('color:{}'.format(token['color']))

tag_type = 'span'
if token.info.pattern in ('BlockInlineCommand', 'BlockBlockCommand'):
tag_type = 'div'
return html.Tag(parent, tag_type, token, style=';'.join(style))

def createLatex(self, parent, token, page):
pass
master = parent

if token['halign']:
halign = token['halign']
if halign != 'center':
halign = 'flush{}'.format(halign)
master = latex.Environment(master, halign)

if token['border']:
master = latex.Environment(master, 'fbox')

if token['color']:
master = latex.Brace(master)
latex.Command(master, 'color', string=token['color'])

return master
@@ -1,17 +1,17 @@
# Bibtex Extension

I did some work [cite!slaughter2014framework]
I did some work [!cite](slaughter2014framework)


[cite!slaughter2014framework, slaughter2015continuous]
[!cite](slaughter2014framework, slaughter2015continuous)


[cite!slaughter2014framework, slaughter2015continuous, gaston2015physics]
[!cite](slaughter2014framework, slaughter2015continuous, gaston2015physics)


[citep!slaughter2014framework]
[!citep](slaughter2014framework)


[citep!slaughter2014framework, slaughter2015continuous]
[!citep](slaughter2014framework, slaughter2015continuous)

!bibtex bibliography
@@ -22,3 +22,13 @@ G_{\mu\nu} = 8\pi G(T_{\mu\nu} + \rho_{\Lambda} g_{\mu\nu})
\end{equation}

The fundamental theorem of calculus: [calculus].

## Macros

\begin{equation}
c = \pm\sqrt{a^2 + b^2}\in\RR
\end{equation}

\begin{equation}
\pf{T}{t} = c
\end{equation}
@@ -4,4 +4,4 @@ This is a paragraph.

!icon help faicon=question-circle

This is an icon !!icon home!! that inline with the text.
This is an icon [!icon!home] that inline with the text.
Oops, something went wrong.

0 comments on commit 4cd79ec

Please sign in to comment.
You can’t perform that action at this time.