for thmenv <- @⟨theorem,lemma,exercise,definition,corollary,example⟩
for thmprefix <- @⟨@thmenv:thm,lem,exe,def,cor,exa⟩

block auto !math start
  for env <- @⟨$1,enumerate,itemize,align*⟩

  string @⟨@env:begin,olist,ulist,dm⟩
    name @⟨@env:environment,ordered list,unordered list,display math⟩
    snip
      \begin{@env}
        $0
      \end{@env}

  string proof
    snip
      \begin{proof}$?1⟨[Proof of @^⟨$1⟩]⟩
        $0
      \end{proof}

  string ciff
    name cases for ⟺
    snip
      \begin{enumerate}
        \item[$\implies$]$1,
        \item[$\impliedby$]$2,
      \end{enumerate}
      $0

  string item
    snip \item$|1⟨,[$1] $0⟩

block text
  string ref
    snip \ref{$1}$0
  string r@thmprefix
    snip \ref{@thmprefix:$1}$0

  string pref
    snip (\ref{$1})$0
  string pr@thmprefix
    snip (\ref{@thmprefix:$1})$0

  string quote
    snip ``$1''$0
  string forcecr
    snip {\ \\\\}

  pattern ([Ll]et)
    name definition
    snip @1 \$$1 = $2\$

  block auto
    string im
      name inline math
      snip \$$1\$$0

block math
  for shorthand <- @⟨sum,prod⟩
  for symbol <- @⟨@shorthand:sigma,pi⟩
  for operation <- @⟨@shorthand:sum,product⟩
  string b@shorthand
    name @symbol @operation
    desc Write out a @operation using big @symbol notation
    snip \\@symbol{$|1⟨$1 = $2,$1⟩}^$|2⟨{$2},\infty$2⟩ $0

  for matkind <- @⟨matrix,determinant⟩
  for matenv <- @⟨@matkind:bmatrix,vmatrix⟩
  for shorthand <- @⟨@matkind:mat,det⟩

  string 2@shorthand
    name 2x2 @matkind
    snip
      \begin{@matenv}
        $1 & $2 \\\\
        $3 & $4
      \end{@matenv}

  string 3@shorthand
    name 3x3 @matkind
    snip
      \begin{@matenv}
        $1 & $2 & $3 \\\\
        $4 & $5 & $6 \\\\
        $7 & $8 & $9
      \end{@matenv}

  for operator <- @⟨eq,neq,leq,geq,lt,gt⟩
  for symbol <- @⟨@operator:=,\neq,\leq,\geq,<,>⟩

  block auto
    string a@operator
      name align at @operator
      snip &@symbol $0

  block auto start
    string al@operator
      name aligned @operator
      snip
        \\\\ $1 &@symbol $2
        $0

    string cr@operator
      name start with @operator
      snip \\\\&@symbol $0

  block start
    string eqsystem
      name system of equations
      snip
        \left\{
          \begin{array}{rl}
            $0
          \end{array}
        \right\}

  block end
    for suffix <- @⟨add,sub,rmul,pow,inv⟩
    string ex@suffix
      snip
        && \lrb{\square @⟨@suffix:
          + $1,
          - $1,
          \cdot $1,
          ^{$1},
          ^{-1},
        ⟩}$0

    for prefix <- @⟨neg,mul,ln⟩
    string ex@prefix
      snip && \lrb{@⟨@prefix:-,$1,\ln⟩ \square}$0

    string exdiv
      snip && \lrb{\frac \square {$1}}$0
    string exint
      snip && \lrb{\int\square \dif $1}$0
    string exdint
      snip && \lrb{\int_{$1}^{$2}\square \dif $3}$0

    for kind <- @⟨texpl,extrin,exbound,exdef⟩
    string @kind
      snip
        && \lrb{\text{@⟨@kind:
          $1,
          triangle inequality on $$1$,
          $$1$ is bounded,
          definition of $$1$,
        ⟩}}$0

  block auto
    for constant <- @⟨star,delta,Delta,pi,tau,psi,phi,rho,sigma,alpha,beta,theta,gamma,omega,Omega⟩
    string @constant
      snip \\@constant

    for shortconstant <- @⟨eps,lam⟩
    string @shortconstant
      snip \\@⟨@shortconstant:epsilon,lambda⟩

    for operator <- @⟨overline,hat,abs,norm,prob,diprod,sin,cos,sqrt,ln,lrb,zmod⟩
    string @operator
      snip \\@operator$|1⟨{$1}, $0⟩

    for bioperator <- @⟨iprod,frac,binom⟩
    string @bioperator
      snip \\@bioperator$|1⟨ $1,{$1}⟩$|2⟨ $2,{$2}⟩ $0

    string set
      desc Create a set by escaping the brackets
      snip \{$1\}

    pattern e([%a%d])
      name auto exponent
      snip ^@0

    pattern s([%a%d])
      name auto subscript
      snip _@0

    pattern (\?[%a]+)(%d)
      name auto digt subscript
      snip @0_@1

    string ss
      name subscript
      snip _{$1}$0

    string ee
      name exponent
      snip ^{$1}$0

    for limtarget <- @⟨anything,zero,infinity,negative infinity⟩
    for prefix <- @⟨@limtarget:,z,i,n⟩
    for limtargetsymbol <- @⟨@limtarget:$2,0,\infty,-\infty⟩
    string @prefix⋄lim
      name limit to @limtarget
      snip \lim_{$1 \to @limtargetsymbol} $0

    string dint
      name definite integral
      snip \int_{$|1⟨$1,-\infty$1⟩}^$|2⟨{$2},\infty$2⟩ $3 \dif $0

    string iint
      name indefinite integral
      snip \int $1 \dif $0