From ef2e0b092b417389d50c0973637a63b425061cb5 Mon Sep 17 00:00:00 2001 From: Charles Edward Gagnon <76854355+carloskiki@users.noreply.github.com> Date: Sun, 4 Aug 2024 15:29:25 -0400 Subject: [PATCH] Fix: Array line spacing (#4) * fix array rendering with custom line spacing * update changelog * add test for array fix * chore: rustfmt --- CHANGELOG.md | 1 + Cargo.toml | 5 ++ src/mathml.rs | 153 +++++++++++++++++++----------------- tests/environments.rs | 49 ++++++++++++ tests/out/environments.html | 19 +++++ tests/out/index.html | 3 +- tests/out/wikipedia.html | 86 +++----------------- 7 files changed, 165 insertions(+), 151 deletions(-) create mode 100644 tests/environments.rs create mode 100644 tests/out/environments.html diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c4c7ec..cffdc6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Fixed +- Array rendering with custom line spacing. - Expansion spans being to eagerly popped. - Benchmark errors and doc-tests not compiling. diff --git a/Cargo.toml b/Cargo.toml index 7195955..507e2cd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -44,6 +44,11 @@ name = "cross-browser" path = "tests/cross-browser.rs" harness = false +[[test]] +name = "environments" +path = "tests/environments.rs" +harness = false + [[bench]] name = "basic" harness = false diff --git a/src/mathml.rs b/src/mathml.rs index 7837915..29549b0 100644 --- a/src/mathml.rs +++ b/src/mathml.rs @@ -435,24 +435,7 @@ where if let Some(Environment::Group(EnvGrouping::Array { cols, cols_index })) = self.env_stack.last() { - self.writer.write_all(b"")?; - cols[*cols_index..] - .iter() - .map_while(|col| match col { - ArrayColumn::Separator(line) => Some(line), - _ => None, - }) - .try_for_each(|line| { - self.writer.write_all(match line { - Line::Solid => { - b"" - } - Line::Dashed => { - b"" - } - }) - })?; - self.writer.write_all(b"", tex_to_css_em(spacing) )?; + if let Some(Environment::Group(EnvGrouping::Array { cols, cols_index })) = + self.env_stack.last_mut() + { + let mut index = array_newline(&mut self.writer, cols)?; + while index < *cols_index { + array_align(&mut self.writer, cols, &mut index)?; + } + array_close_line(&mut self.writer, &cols[index..])?; + } else { + self.writer + .write_all(b"") } Some(Environment::Group(EnvGrouping::Array { cols, cols_index })) => { - self.writer.write_all(b" Some(line), - _ => None, - }) - .try_for_each(|line| { - *cols_index += 1; - self.writer.write_all(match line { - Line::Solid => { - b" class=\"menv-right-solid menv-border-only\"> { - b" class=\"menv-right-dashed menv-border-only\"> { - *cols_index += 2; - match (col, line) { - (ColumnAlignment::Left, Line::Solid) => { - b" class=\"cell-left menv-right-solid\">" - } - (ColumnAlignment::Left, Line::Dashed) => { - b" class=\"cell-left menv-right-dashed\">" - } - (ColumnAlignment::Center, Line::Solid) => { - b" class=\"menv-right-solid\">" - } - (ColumnAlignment::Center, Line::Dashed) => { - b" class=\"menv-right-dashed\">" - } - (ColumnAlignment::Right, Line::Solid) => { - b" class=\"cell-right menv-right-solid\">" - } - (ColumnAlignment::Right, Line::Dashed) => { - b" class=\"cell-right menv-right-dashed\">" - } - } - } - (ArrayColumn::Column(col), _) => { - *cols_index += 1; - match col { - ColumnAlignment::Left => b" class=\"cell-left\">", - ColumnAlignment::Center => b">", - ColumnAlignment::Right => b" class=\"cell-right\">", - } - } - (ArrayColumn::Separator(_), _) => unreachable!(), - }; - self.writer.write_all(to_append) + array_align(&mut self.writer, cols, cols_index) } _ => panic!("alignment not allowed in current environment"), } @@ -1021,6 +962,70 @@ fn array_newline(writer: &mut W, cols: &[ArrayColumn]) -> io::Result( + writer: &mut W, + cols: &[ArrayColumn], + cols_index: &mut usize, +) -> io::Result<()> { + writer.write_all(b" Some(line), + _ => None, + }) + .try_for_each(|line| { + *cols_index += 1; + writer.write_all(match line { + Line::Solid => b" class=\"menv-right-solid menv-border-only\"> b" class=\"menv-right-dashed menv-border-only\"> { + *cols_index += 2; + match (col, line) { + (ColumnAlignment::Left, Line::Solid) => b" class=\"cell-left menv-right-solid\">", + (ColumnAlignment::Left, Line::Dashed) => b" class=\"cell-left menv-right-dashed\">", + (ColumnAlignment::Center, Line::Solid) => b" class=\"menv-right-solid\">", + (ColumnAlignment::Center, Line::Dashed) => b" class=\"menv-right-dashed\">", + (ColumnAlignment::Right, Line::Solid) => b" class=\"cell-right menv-right-solid\">", + (ColumnAlignment::Right, Line::Dashed) => { + b" class=\"cell-right menv-right-dashed\">" + } + } + } + (ArrayColumn::Column(col), _) => { + *cols_index += 1; + match col { + ColumnAlignment::Left => b" class=\"cell-left\">", + ColumnAlignment::Center => b">", + ColumnAlignment::Right => b" class=\"cell-right\">", + } + } + (ArrayColumn::Separator(_), _) => unreachable!(), + }; + writer.write_all(to_append) +} + +fn array_close_line(writer: &mut W, rest_cols: &[ArrayColumn]) -> io::Result<()> { + writer.write_all(b"")?; + rest_cols + .iter() + .map_while(|col| match col { + ArrayColumn::Separator(line) => Some(line), + _ => None, + }) + .try_for_each(|line| { + writer.write_all(match line { + Line::Solid => b"", + Line::Dashed => b"", + }) + })?; + writer.write_all(b" { + $crate::round_trip!( + $name, + $($input),+, + display_mode = pulldown_latex::config::DisplayMode::Block + ); + }; + (should_panic, $name:ident, $($input:literal),+ $(,)?) => { + $crate::round_trip!( + should_panic, + $name, + $($input),+ + ); + } +} + +round_trip_display!( + arrays, + r#"\begin{array}{||c|r|l||} + a + b \\[2em] + a + b & c & d \\[2em] \hline + a + b + \end{array}"#, + r#"\begin{array}{c:c:c} + a & b & c \\ \hline + d & e & f \\ + \hdashline + g & h & i + \end{array}"#, +); diff --git a/tests/out/environments.html b/tests/out/environments.html new file mode 100644 index 0000000..f3a8ece --- /dev/null +++ b/tests/out/environments.html @@ -0,0 +1,19 @@ + + + +Mathematical Environments Tests + + + + +
Arrays
\begin{array}{||c|r|l||} + a + b \\[2em] + a + b & c & d \\[2em] \hline + a + b + \end{array}a+ba+bcda+b
\begin{array}{c:c:c} + a & b & c \\ \hline + d & e & f \\ + \hdashline + g & h & i + \end{array}abcdefghi
+ \ No newline at end of file diff --git a/tests/out/index.html b/tests/out/index.html index 91f01bb..22b7223 100644 --- a/tests/out/index.html +++ b/tests/out/index.html @@ -6,6 +6,7 @@ Wikipedia tests Mozilla tests - Cross Browser tests + Cross-Browser tests + Environments tests diff --git a/tests/out/wikipedia.html b/tests/out/wikipedia.html index c0924c6..f478f6b 100644 --- a/tests/out/wikipedia.html +++ b/tests/out/wikipedia.html @@ -6,80 +6,14 @@ -
Accents And Diacritics
\dot{a}, \ddot{a}, \acute{a}, \grave{a}a˙,a¨,a´,a`
\check{a}, \breve{a}, \tilde{a}, \bar{a}aˇ,a˘,a~,a
\hat{a}, \widehat{a}, \vec{a}a^,a^,a
Angle Brackets
\left \langle \frac{a}{b} \right \rangleab
Arc
\overset{\frown} {AB}AB
Area Of Quadrilateral
S=dD\sin\alphaS=dDsinα
Arrays
\begin{array}{||c|c::c|c||} - A & B & C & D \\ \hdashline - 1 & 2 & 3 & 4 \\ \hline - 5 & 6 & 7 & 8 \\ - 9 & 10 & 11 & 12 - \end{array}ABCD123456789101112
Arrows
\Rrightarrow, \Lleftarrow,
\Rightarrow, \nRightarrow, \Longrightarrow, \implies,,,
\Leftarrow, \nLeftarrow, \Longleftarrow,,
\Leftrightarrow, \nLeftrightarrow, \Longleftrightarrow, \iff,,,
\Uparrow, \Downarrow, \Updownarrow,,
\rightarrow, \to, \nrightarrow, \longrightarrow,,,
\leftarrow, \gets, \nleftarrow, \longleftarrow,,,
\leftrightarrow, \nleftrightarrow, \longleftrightarrow,,
\uparrow, \downarrow, \updownarrow,,
\nearrow, \swarrow, \nwarrow, \searrow,,,
\mapsto, \longmapsto,
\rightharpoonup \rightharpoondown \leftharpoonup \leftharpoondown \upharpoonleft \upharpoonright \downharpoonleft \downharpoonright \rightleftharpoons \leftrightharpoons
\curvearrowleft \circlearrowleft \Lsh \upuparrows \rightrightarrows \rightleftarrows \rightarrowtail \looparrowright
\curvearrowright \circlearrowright \Rsh \downdownarrows \leftleftarrows \leftrightarrows \leftarrowtail \looparrowleft
\hookrightarrow \hookleftarrow \multimap \leftrightsquigarrow \rightsquigarrow \twoheadrightarrow \twoheadleftarrow
Arrows Example
A \xleftarrow{n+\mu-1} B \xrightarrow[T]{n\pm i-1} CAn+µ1BTn±i1C
Bars And Double Bars
\left | \frac{a}{b} \right \vert|ab|
\left \| \frac{a}{b} \right \Vertab
Basic
\alphaα
f(x) = x^2f(x)=x2
\{1,e,\pi\}{1,e,π}
|z| \leq 2|z|2
Binomials
\binom{n}{k}(nk)
\tbinom{n}{k}(nk)
\dbinom{n}{k}(nk)
Blackboard Bold
\mathbb{ABCDEFGHI}𝔸𝔹𝔻𝔼𝔽𝔾𝕀
\mathbb{JKLMNOPQR}𝕁𝕂𝕃𝕄𝕆
\mathbb{STUVWXYZ}𝕊𝕋𝕌𝕍𝕎𝕏𝕐
Boldface
\mathbf{ABCDEFGHI}𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈
\mathbf{JKLMNOPQR}𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑
\mathbf{STUVWXYZ}𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙
\mathbf{abcdefghijklm}𝐚𝐛𝐜𝐝𝐞𝐟𝐠𝐡𝐢𝐣𝐤𝐥𝐦
\mathbf{nopqrstuvwxyz}𝐧𝐨𝐩𝐪𝐫𝐬𝐭𝐮𝐯𝐰𝐱𝐲𝐳
\mathbf{0123456789}𝟎𝟏𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗
Boldface Greek
\boldsymbol{\Alpha \Beta \Gamma \Delta \Epsilon \Zeta \Eta \Theta}𝚨𝚩𝚪𝚫𝚬𝚭𝚮𝚯
\boldsymbol{\Iota \Kappa \Lambda \Mu \Nu \Xi \Omicron \Pi}𝚰𝚱𝚲𝚳𝚴𝚵𝚶𝚷
\boldsymbol{\Rho \Sigma \Tau \Upsilon \Phi \Chi \Psi \Omega}𝚸𝚺𝚻𝚼𝚽𝚾𝚿𝛀
\boldsymbol{\alpha \beta \gamma \delta \epsilon \zeta \eta \theta}𝛂𝛃𝛄𝛅𝛜𝛇𝛈𝛉
\boldsymbol{\iota \kappa \lambda \mu \nu \xi \omicron \pi}𝛊𝛋𝛌µ𝛎𝛏𝛐𝛑
\boldsymbol{\rho \sigma \tau \upsilon \phi \chi \psi \omega}𝛒𝛔𝛕𝛖𝛗𝛘𝛙𝛚
\boldsymbol{\varepsilon\digamma\varkappa\varpi}𝛆𝮧𝛞𝛡
\boldsymbol{\varrho\varsigma\vartheta\varphi}𝛠𝛓𝛝𝛟
Bounds
\min x, \max y, \inf s, \sup tminx,maxy,infs,supt
\lim u, \liminf v, \limsup wlimu,lim infv,lim supw
\dim p, \deg q, \det m, \ker\phidimp,degq,detm,kerφ
Braces
\left \{ \frac{a}{b} \right \}{ab}
\left \lbrace \frac{a}{b} \right \rbrace{ab}
Brackets
\left [ \frac{a}{b} \right ][ab]
\left \lbrack \frac{a}{b} \right \rbrack[ab]
Calligraphiy
\mathcal{ABCDEFGHI}𝒜𝒞𝒟𝒢
\mathcal{JKLMNOPQR}𝒥𝒦𝒩𝒪𝒫𝒬
\mathcal{STUVWXYZ}𝒮𝒯𝒰𝒱𝒲𝒳𝒴𝒵
\mathcal{abcdefghi}𝒶𝒷𝒸𝒹𝒻𝒽𝒾
\mathcal{jklmnopqr}𝒿𝓀𝓁𝓂𝓃𝓅𝓆𝓇
\mathcal{stuvwxyz}𝓈𝓉𝓊𝓋𝓌𝓍𝓎𝓏
Cases
f(n) = - \begin{cases} - n/2, & \text{if }n\text{ is even} \\ - 3n+1, & \text{if }n\text{ is odd} - \end{cases}f(n)={n/2,if n is even3n+1,if n is odd
\begin{cases} - 3x + 5y + z \\ - 7x - 2y + 4z \\ - -6x + 3y + 2z - \end{cases}{3x+5y+z7x2y+4z6x+3y+2z
Closed Line Or Path Integral
\oint_{(x,y)\in C} x^3\, dx + 4y^2\, dy(x,y)Cx3dx+4y2dy
Color
{\color{Blue}x^2}+{\color{Orange}2x}-{\color{LimeGreen}1}x2+2x1
x=\frac{{\color{Blue}-b}\pm\sqrt{\color{Red}b^2-4ac}}{\color{Green}2a}x=b±b24ac2a
x\color{red}\neq y=zxy=z
x{\color{red}\neq} y=zxy=z
x\color{red}\neq\color{black} y=zxy=z
\frac{-b\color{Green}\pm\sqrt{b^2\color{Blue}-4{\color{Red}a}c}}{2a}=xb±b24ac2a=x
{\color{Blue}x^2}+{\color{Orange}2x}-{\color{LimeGreen}1}x2+2x1
\color{Blue}x^2\color{Black}+\color{Orange}2x\color{Black}-\color{LimeGreen}1x2+2x1
Combined Sub Superscript
x_2^3x23
{x_2}^3x23
Complex Numbers
|\bar{z}| = |z|, - |(\bar{z})^n| = |z|^n, - \arg(z^n) = n \arg(z)|z|=|z|,|(z)n|=|z|n,arg(zn)=narg(z)
Continuation And Cases
f(x) = - \begin{cases} - 1 & -1 \le x < 0 \\ - \frac{1}{2} & x = 0 \\ - 1 - x^2 & \text{otherwise} - \end{cases}f(x)={11x<012x=01x2otherwise
Coproduct
\coprod_{i=1}^N x_ii=1Nxi
\textstyle \coprod_{i=1}^N x_ii=1Nxi
Delimiter Sizes
( \bigl( \Bigl( \biggl( \Biggl( \dots \Biggr] \biggr] \Bigr] \bigr] ](((((]]]]]
\{ \bigl\{ \Bigl\{ \biggl\{ \Biggl\{ \dots \Biggr\rangle \biggr\rangle \Bigr\rangle \bigr\rangle \rangle{{{{{
\| \big\| \Big\| \bigg\| \Bigg\| \dots \Bigg| \bigg| \Big| \big| ||||||
\lfloor \bigl\lfloor \Bigl\lfloor \biggl\lfloor \Biggl\lfloor \dots \Biggr\rceil \biggr\rceil \Bigr\rceil \bigr\rceil \rceil
\uparrow \big\uparrow \Big\uparrow \bigg\uparrow \Bigg\uparrow \dots \Bigg\Downarrow \bigg\Downarrow \Big\Downarrow \big\Downarrow \Downarrow
\updownarrow \big\updownarrow \Big\updownarrow \bigg\updownarrow \Bigg\updownarrow \dots \Bigg\Updownarrow \bigg\Updownarrow \Big\Updownarrow \big\Updownarrow \Updownarrow
/ \big/ \Big/ \bigg/ \Bigg/ \dots \Bigg\backslash \bigg\backslash \Big\backslash \big\backslash \backslash/////\\\\\
Derivative Dots
\dot{x}, \ddot{x}x˙,x¨
Derivatives
x', y'', f', f''x,y,f,f
x^\prime, y^{\prime\prime}x,y
Differential And Derivatives
dt, \mathrm{d}t, \partial t, \nabla\psidt,dt,t,ψ
dy/dx, \mathrm{d}y/\mathrm{d}x, \frac{dy}{dx}, \frac{\mathrm{d}y}{\mathrm{d}x}dy/dx,dy/dx,dydx,dydx
\frac{\partial^2}{\partial x_1\partial x_2}y, \left.\frac{\partial^3 f}{\partial^2 x \partial y}\right\vert_{p_0}2x1x2y,3f2xy|p0
\prime, \backprime, f^\prime, f', f'', f^{(3)}, \dot y, \ddot y,,f,f,f,f(3),y˙,y¨
Differential Equations
u'' + p(x)u' + q(x)u=f(x),\quad x>au+p(x)u+q(x)u=f(x),x>a
Double Integral
\iint\limits_{D} dx\,dyDdxdy
Floor And Ceiling
\left \lfloor \frac{a}{b} \right \rfloorab
\left \lceil \frac{a}{b} \right \rceilab
Fraction And Small Fraction
\frac{a}{b}\ \tfrac{a}{b}ab ab
Fractions
\frac{2}{4} = 0.524=0.5
\tfrac{2}{4} = 0.524=0.5
\dfrac{2}{4} = 0.5 \qquad \dfrac{2}{c + \dfrac{2}{d + \dfrac{2}{4}}} = a24=0.52c+2d+24=a
\cfrac{2}{c + \cfrac{2}{d + \cfrac{2}{4}}} = a2c+2d+24=a
\cfrac{x}{1 + \cfrac{\cancel{y}}{\cancel{y}}} = \cfrac{x}{2}x1+yy=x2
Fraktur
\mathfrak{ABCDEFGHI}𝔄𝔅𝔇𝔈𝔉𝔊
\mathfrak{JKLMNOPQR}𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔
\mathfrak{STUVWXYZ}𝔖𝔗𝔘𝔙𝔚𝔛𝔜
\mathfrak{abcdefghijklm}𝔞𝔟𝔠𝔡𝔢𝔣𝔤𝔥𝔦𝔧𝔨𝔩𝔪
\mathfrak{nopqrstuvwxyz}𝔫𝔬𝔭𝔮𝔯𝔰𝔱𝔲𝔳𝔴𝔵𝔶𝔷
\mathfrak{0123456789}0123456789
Geometric
\parallel, \nparallel, \shortparallel, \nshortparallel,,,
\perp, \angle, \sphericalangle, \measuredangle, 45^\circ,,,,45
\Box, \square, \blacksquare, \diamond, \Diamond, \lozenge, \blacklozenge, \bigstar,,,,,,,
\bigcirc, \triangle, \bigtriangleup, \bigtriangledown,,,
\vartriangle, \triangledown,
\blacktriangle, \blacktriangledown, \blacktriangleleft, \blacktriangleright,,,
Greek Alphabet
\Alpha \Beta \Gamma \Delta \Epsilon \Zeta \Eta \ThetaΑΒΓΔΕΖΗΘ
\Iota \Kappa \Lambda \Mu \Nu \Xi \Omicron \PiΙΚΛΜΝΞΟΠ
\Rho \Sigma \Tau \Upsilon \Phi \Chi \Psi \OmegaΡΣΤΥΦΧΨΩ
\alpha \beta \gamma \delta \epsilon \zeta \eta \thetaαβγδϵζηθ
\iota \kappa \lambda \mu \nu \xi \omicron \piικλµνξοπ
\rho \sigma \tau \upsilon \phi \chi \psi \omegaρστυφχψω
\varGamma \varDelta \varTheta \varLambda \varXi \varPi \varSigma \varPhi \varUpsilon \varOmega𝛤𝛥𝛩𝛬𝛯𝛱𝛴𝛷𝛶𝛺
\varepsilon \digamma \varkappa \varpi \varrho \varsigma \vartheta \varphiεϝϰϖϱςϑϕ
Greek Italics
\mathit{\Alpha \Beta \Gamma \Delta \Epsilon \Zeta \Eta \Theta}𝛢𝛣𝛤𝛥𝛦𝛧𝛨𝛩
\mathit{\Iota \Kappa \Lambda \Mu \Nu \Xi \Omicron \Pi}𝛪𝛫𝛬𝛭𝛮𝛯𝛰𝛱
\mathit{\Rho \Sigma \Tau \Upsilon \Phi \Chi \Psi \Omega}𝛲𝛴𝛵𝛶𝛷𝛸𝛹𝛺
Greek Uppercase Boldface Italics
\boldsymbol{\varGamma \varDelta \varTheta \varLambda}𝛤𝛥𝛩𝛬
\boldsymbol{\varXi \varPi \varSigma \varUpsilon \varOmega}𝛯𝛱𝛴𝛶𝛺
Grouping
10^{30} a^{2+2}1030a2+2
a_{i,j} b_{f'}ai,jbf
Hebrew Symbols
\aleph \beth \gimel \daleth
Integral
\int\limits_{1}^{3}\frac{e^3/x}{x^2}\, dx13e3/xx2dx
\int_{1}^{3}\frac{e^3/x}{x^2}\, dx13e3/xx2dx
\textstyle \int\limits_{-N}^{N} e^x dxNNexdx
\textstyle \int_{-N}^{N} e^x dxNNexdx
Integral Equation
\phi_n(\kappa) = - \frac{1}{4\pi^2\kappa^2} \int_0^\infty - \frac{\sin(\kappa R)}{\kappa R} - \frac{\partial}{\partial R} - \left [ R^2\frac{\partial D_n(R)}{\partial R} \right ] \,dRφn(κ)=14π2κ20sin(κR)κRR[R2Dn(R)R]dR
Integrals
\int_a^x \int_a^s f(y)\,dy\,ds = \int_a^x f(y)(x-y)\,dyaxasf(y)dyds=axf(y)(xy)dy
\int_e^{\infty}\frac {1}{t(\ln t)^2}dt = \left. \frac{-1}{\ln t} \right\vert_e^\infty = 1e1t(lnt)2dt=1lnt|e=1
Intersections
\bigcap_{i=1}^n E_ii=1nEi
Italics
\mathit{0123456789}0123456789
Letter Like Symbols Or Constants
\infty, \aleph, \complement, \backepsilon, \eth, \Finv, \hbar,,,϶,ð,,
\Im, \imath, \jmath, \Bbbk, \ell, \mho, \wp, \Re, \circledS, \S, \P,ı,ȷ,𝕜,,,,,,§,
Limit
\lim_{x \to \infty} x_nlimxxn
\textstyle \lim_{x \to \infty} x_nlimxxn
Limits
\lim_{z\to z_0} f(z)=f(z_0)limzz0f(z)=f(z0)
Line Or Path Integral
\int_{(x,y)\in C} x^3\, dx + 4y^2\, dy(x,y)Cx3dx+4y2dy
Logic
\forall, \exists, \nexists,,
\therefore, \because, \And,,&
\lor, \vee, \curlyvee, \bigvee,,,
\land, \wedge, \curlywedge, \bigwedge,,,
\bar{q}, \bar{abc}, \overline{q}, \overline{abc}q,abc,q,abc
\lnot, \neg, \not\operatorname{R}, \bot, \to¬,¬,R,,
\vdash, \dashv, \vDash, \Vdash, \models,,,,
\Vvdash, \nvdash, \nVdash, \nvDash, \nVDash,,,,
\ulcorner, \urcorner, \llcorner, \lrcorner,,,
Matrices
\begin{matrix} - -x & y \\ - z & -v - \end{matrix}xyzv
\begin{vmatrix} - -x & y \\ - z & -v - \end{vmatrix}|xyzv|
\begin{Vmatrix} - -x & y \\ - z & -v - \end{Vmatrix}xyzv
\begin{bmatrix} - 0 & \cdots & 0 \\ - \vdots & \ddots & \vdots \\ - 0 & \cdots & 0 - \end{bmatrix}[0000]
\begin{Bmatrix} - x & y \\ - z & v - \end{Bmatrix}{xyzv}
\begin{pmatrix} - x & y \\ - z & v - \end{pmatrix}(xyzv)
\bigl( \begin{smallmatrix} - a&b\\ c&d - \end{smallmatrix} \bigr)(abcd)
Matrices And Determinants
\det(\mathsf{A}-\lambda\mathsf{I}) = 0det(𝖠λ𝖨)=0
Mixed
\left [ 0,1 \right )[0,1)
\left \langle \psi \right |ψ|
Mixed Faces
x y zxyz
\text{x y z}x y z
\text{if} n \text{is even}ifnis even
\text{if }n\text{ is even}if n is even
\text{if}~n\ \text{is even}if n is even
Modular Arithmetic
s_k \equiv 0 \pmod{m}sk0(modm)
a \bmod bamodb
\gcd(m, n), \operatorname{lcm}(m, n)gcd(m,n),lcm(m,n)
\mid, \nmid, \shortmid, \nshortmid,,,
Multiline Equations
\begin{align} - f(x) & = (a+b)^2 \\ - & = a^2+2ab+b^2 \\ - \end{align}f(x)=(a+b)2=a2+2ab+b2
\begin{alignat}{2} - f(x) & = (a-b)^2 \\ - & = a^2-2ab+b^2 \\ - \end{alignat}f(x)=(ab)2=a22ab+b2
\begin{align} - f(a,b) & = (a+b)^2 && = (a+b)(a+b) \\ - & = a^2+ab+ba+b^2 && = a^2+2ab+b^2 \\ - \end{align}f(a,b)=(a+b)2=(a+b)(a+b)=a2+ab+ba+b2=a2+2ab+b2
\begin{alignat}{3} - f(a,b) & = (a+b)^2 && = (a+b)(a+b) \\ - & = a^2+ab+ba+b^2 && = a^2+2ab+b^2 \\ - \end{alignat}f(a,b)=(a+b)2=(a+b)(a+b)=a2+ab+ba+b2=a2+2ab+b2
\begin{array}{lcl} - z & = & a \\ - f(x,y,z) & = & x + y + z - \end{array}z=af(x,y,z)=x+y+z
\begin{array}{lcr} - z & = & a \\ - f(x,y,z) & = & x + y + z - \end{array}z=af(x,y,z)=x+y+z
\begin{alignat}{4} - F:\; && C(X) && \;\to\; & C(X) \\ - && g && \;\mapsto\; & g^2 - \end{alignat}F:C(X)C(X)gg2
\begin{alignat}{4} - F:\; && C(X) && \;\to\; && C(X) \\ - && g && \;\mapsto\; && g^2 - \end{alignat}F:C(X)C(X)gg2
Multiple Equations
\begin{align} - u & = \tfrac{1}{\sqrt{2}}(x+y) \qquad & x &= \tfrac{1}{\sqrt{2}}(u+v) \\[0.6ex] - v & = \tfrac{1}{\sqrt{2}}(x-y) \qquad & y &= \tfrac{1}{\sqrt{2}}(u-v) - \end{align}u=12(x+y)x=12(u+v)v=12(xy)y=12(uv)
No Delimiter
\left . \frac{A}{B} \right \} \to XAB}X
Operators
+, -, \pm, \mp, \dotplus+,,±,,
\times, \div, \divideontimes, /, \backslash×,÷,,/,\
\cdot, * \ast, \star, \circ, \bullet,*,,,
\boxplus, \boxminus, \boxtimes, \boxdot,,,
\oplus, \ominus, \otimes, \oslash, \odot,,,,
\circleddash, \circledcirc, \circledast,,
\bigoplus, \bigotimes, \bigodot,,
Overbraces
\overbrace{ 1+2+\cdots+100 }^{5050}1+2++1005050
\underbrace{ a+b+\cdots+z }_{26}a+b++z26
Parentheses
\left ( \frac{a}{b} \right )(ab)
Preceding And Or Additional
{}_1^2\!\Omega_3^412Ω34
Prefixed Subscript
{}_pF_q(a_1,\dots,a_p;c_1,\dots,c_q;z) - = \sum_{n=0}^\infty - \frac{(a_1)_n\cdots(a_p)_n}{(c_1)_n\cdots(c_q)_n} - \frac{z^n}{n!}pFq(a1,,ap;c1,,cq;z)=n=0(a1)n(ap)n(c1)n(cq)nznn!
Product
\prod_{i=1}^N x_ii=1Nxi
\textstyle \prod_{i=1}^N x_ii=1Nxi
Projections
\Pr j, \hom l, \lVert z \rVert, \arg zPrj,homl,z,argz
Quadratic Formula
x = \frac{-b\pm\sqrt{b^2-4ac}}{2a}x=b±b24ac2a
Quadratic Polynomial
ax^2 + bx + c = 0ax2+bx+c=0
Quadruple Integral
\iiiint\limits_{D} dx\,dy\,dz\,dtDdxdydzdt
Radicals
\surd, \sqrt{2}, \sqrt[n]{2}, \sqrt[3]{\frac{x^3+y^3}{2}},2,2n,x3+y323
Relations
=, \ne, \neq, \equiv, \not\equiv=,,,,≢
\doteq, \doteqdot, \overset{\underset{\mathrm{def}}{}}{=}, :=,,=def,:=
\sim, \nsim, \backsim, \thicksim, \simeq, \backsimeq, \eqsim, \cong, \ncong,,,,,,,,
\approx, \thickapprox, \approxeq, \asymp, \propto, \varpropto,,,,,
<, \nless, \ll, \not\ll, \lll, \not\lll, \lessdot<,,,≪̸,,⋘̸,
>, \ngtr, \gg, \not\gg, \ggg, \not\ggg, \gtrdot>,,,≫̸,,⋙̸,
\le, \leq, \lneq, \leqq, \nleq, \nleqq, \lneqq, \lvertneqq,,,,,,,≨︀
\ge, \geq, \gneq, \geqq, \ngeq, \ngeqq, \gneqq, \gvertneqq,,,,,,,≩︀
\lessgtr, \lesseqgtr, \lesseqqgtr, \gtrless, \gtreqless, \gtreqqless,,,,,
\leqslant, \nleqslant, \eqslantless,,
\geqslant, \ngeqslant, \eqslantgtr,,
\lesssim, \lnsim, \lessapprox, \lnapprox,,,
\gtrsim, \gnsim, \gtrapprox, \gnapprox,,,
\prec, \nprec, \preceq, \npreceq, \precneqq,,,,
\succ, \nsucc, \succeq, \nsucceq, \succneqq,,,,
\preccurlyeq, \curlyeqprec,
\succcurlyeq, \curlyeqsucc,
\precsim, \precnsim, \precapprox, \precnapprox,,,
\succsim, \succnsim, \succapprox, \succnapprox,,,
Roman Typeface
\mathrm{ABCDEFGHI}ABCDEFGHI
\mathrm{JKLMNOPQR}JKLMNOPQR
\mathrm{STUVWXYZ}STUVWXYZ
\mathrm{abcdefghijklm}abcdefghijklm
\mathrm{nopqrstuvwxyz}nopqrstuvwxyz
\mathrm{0123456789}0123456789
Sans Serif
\mathsf{ABCDEFGHI}𝖠𝖡𝖢𝖣𝖤𝖥𝖦𝖧𝖨
\mathsf{JKLMNOPQR}𝖩𝖪𝖫𝖬𝖭𝖮𝖯𝖰𝖱
\mathsf{STUVWXYZ}𝖲𝖳𝖴𝖵𝖶𝖷𝖸𝖹
\mathsf{abcdefghijklm}𝖺𝖻𝖼𝖽𝖾𝖿𝗀𝗁𝗂𝗃𝗄𝗅𝗆
\mathsf{nopqrstuvwxyz}𝗇𝗈𝗉𝗊𝗋𝗌𝗍𝗎𝗏𝗐𝗑𝗒𝗓
\mathsf{0123456789}𝟢𝟣𝟤𝟥𝟦𝟧𝟨𝟩𝟪𝟫
Sans Serif Greek
\mathsf{\Alpha \Beta \Gamma \Delta \Epsilon \Zeta \Eta \Theta}ΑΒΓΔΕΖΗΘ
\mathsf{\Iota \Kappa \Lambda \Mu \Nu \Xi \Omicron \Pi}ΙΚΛΜΝΞΟΠ
\mathsf{\Rho \Sigma \Tau \Upsilon \Phi \Chi \Psi \Omega}ΡΣΤΥΦΧΨΩ
Sets
\{ \}, \emptyset, \varnothing{},,
\in, \notin \not\in, \ni, \not\ni,∉,,∌
\cap, \Cap, \sqcap, \bigcap,,,
\cup, \Cup, \sqcup, \bigcup, \bigsqcup, \uplus, \biguplus,,,,,,
\setminus, \smallsetminus, \times,,×
\subset, \Subset, \sqsubset,,
\supset, \Supset, \sqsupset,,
\subseteq, \nsubseteq, \subsetneq, \varsubsetneq, \sqsubseteq,,,⊊︀,
\supseteq, \nsupseteq, \supsetneq, \varsupsetneq, \sqsupseteq,,,⊋︀,
\subseteqq, \nsubseteqq, \subsetneqq, \varsubsetneqq,,,⫋︀
\supseteqq, \nsupseteqq, \supsetneqq, \varsupsetneqq,,,⫌︀
Slashes And Backslashes
\left / \frac{a}{b} \right \backslash/ab\
Small Script
{\scriptstyle\text{abcdefghijklm}}abcdefghijklm
Special
\amalg \P \S \% \dagger \ddagger \ldots \cdots \vdots \ddots⨿§%
\smile \frown \wr \triangleleft \triangleright
\diamondsuit, \heartsuit, \clubsuit, \spadesuit, \Game, \flat, \natural, \sharp,,,,,,,
Stacking
\overset{\alpha}{\omega}ωα
\underset{\alpha}{\omega}ωα
\overset{\alpha}{\underset{\gamma}{\omega}}ωγα
\stackrel{\alpha}{\omega}ωα
Standard Numerical Functions
\exp_a b = a^b, \exp b = e^b, 10^mexpab=ab,expb=eb,10m
\ln c = \log c, \lg d = \log_{10} dlnc=logc,lgd=log10d
\sin a, \cos b, \tan c, \cot d, \sec f, \csc gsina,cosb,tanc,cotd,secf,cscg
\arcsin h, \arccos i, \arctan jarcsinh,arccosi,arctanj
\sinh k, \cosh l, \tanh m, \coth nsinhk,coshl,tanhm,cothn
\operatorname{sh}k, \operatorname{ch}l, \operatorname{th}m, \operatorname{coth}nshk,chl,thm,cothn
\operatorname{argsh}o, \operatorname{argch}p, \operatorname{argth}qargsho,argchp,argthq
\sgn r, \left\vert s \right\vertsgnr,|s|
\min(x,y), \max(x,y)min(x,y),max(x,y)
Subscript
a_2a2
Sum
\sum_{k=1}^N k^2k=1Nk2
\textstyle \sum_{k=1}^N k^2k=1Nk2
Sum In Fraction
\frac{\sum_{k=1}^N k^2}{a}k=1Nk2a
\frac{\displaystyle \sum_{k=1}^N k^2}{a}k=1Nk2a
\frac{\sum\limits^{N}_{k=1} k^2}{a}k=1Nk2a
Summation
\sum_{i=0}^{n-1} ii=0n1i
\sum_{m=1}^\infty\sum_{n=1}^\infty\frac{m^2 n}{3^m\left(m 3^n + n 3^m\right)}m=1n=1m2n3m(m3n+n3m)
Super Super
10^{10^{8}}10108
Superscript
a^2, a^{x+3}a2,ax+3
Tall Parentheses And Fractions
2 = \left( \frac{\left(3-x\right) \times 2}{3-x} \right)2=((3x)×23x)
S_{\text{new}} = S_{\text{old}} - \frac{ \left( 5-T \right) ^2} {2}Snew=Sold(5T)22
\phi_n(\kappa) = 0.033C_n^2\kappa^{-11/3},\quad \frac{1}{L_0}\ll\kappa\ll\frac{1}{l_0}φn(κ)=0.033Cn2κ11/3,1L0κ1l0
Triple Integral
\iiint\limits_{D} dx\,dy\,dzDdxdydz
Underline Overline Vectors
\hat a \ \bar b \ \vec ca^ b c
\overrightarrow{a b} \ \overleftarrow{c d} \ \widehat{d e f}ab cd def^
\overline{g h i} \ \underline{j k l}ghi jkl_
Unions
\bigcup_{i=1}^n E_ii=1nEi
Unsorted
\diagup \diagdown \centerdot \ltimes \rtimes \leftthreetimes \rightthreetimes·
\eqcirc \circeq \triangleq \bumpeq \Bumpeq \doteqdot \risingdotseq \fallingdotseq
\intercal \barwedge \veebar \doublebarwedge \between \pitchfork
\vartriangleleft \ntriangleleft \vartriangleright \ntriangleright
\trianglelefteq \ntrianglelefteq \trianglerighteq \ntrianglerighteq
Up Down Updown Arrows
\left \uparrow \frac{a}{b} \right \downarrowab
\left \Uparrow \frac{a}{b} \right \Downarrowab
\left \updownarrow \frac{a}{b} \right \Updownarrowab
Volume Of Sphere Stand
V = \frac{1}{6} \pi h \left [ 3 \left ( r_1^2 + r_2^2 \right ) + h^2 \right ]V=16πh[3(r12+r22)+h2]
+
Arrays
\begin{array}{||c|r|l||} + a + b \\[2em] + a + b & c & d \\[2em] \hline + a + b + \end{array}a+ba+bcda+b
\begin{array}{c:c:c} + a & b & c \\ \hline + d & e & f \\ + \hdashline + g & h & i + \end{array}abcdefghi
\ No newline at end of file