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

block auto start
  string begin
    name environment
    snip
      \begin{$1}
        $0
      \end{$1}

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

  string @⟨@env:olist,ulist,dm⟩
    name @⟨@env: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,defas,leq,geq,lt,gt,iip,iib,iff⟩
  for symbol <- @⟨@operator:=,\neq,\coloneq,\leq,\geq,<,>,\implies,\impliedby,\iff⟩

  block auto
    abbr @operator @symbol

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

    block 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 constkind <- @⟨default,shortened⟩
    for constant <- @⟨@constkind:
      @⟨star,delta,Delta,pi,tau,psi,phi,rho,sigma,alpha,beta,theta,gamma,omega,Omega,half,ordop,land,lor⟩,
      @⟨lam,eps,iinf⟩
    ⟩
    for expansion <- @⟨@constkind:
      @constant,
      @⟨@constant:lambda,epsilon,ifty⟩
    ⟩

    for operator <- @⟨,e,s⟩
    string @operator@constant
      snip @⟨@operator:,^,_⟩\\@expansion

    abbr niinf -\ifty
    abbr eniinf ^{-\ifty}
    abbr sniinf _{-\ifty}

    abbr frl \forall
    abbr exs \exists
    abbr nin \not\in
    abbr ccup \cup
    abbr ccap \cap
    abbr nope \bot
    abbr yee \top

    abbr nlnl \pm
    abbr vsm \vecspace
    abbr oball \ball

    for noperator <- @⟨ordop,land,lor⟩
    string @noperator
      snip \\@noperator

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

    for bioperator <- @⟨iprod,frac,binom,dist⟩
    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@⟨t(%a),(%d)⟩
      name auto exponent
      snip @0^@1 $0

    pattern (.*)so(%a)
      name auto subscript
      snip @0_@1 $0

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

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

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

    pattern (%a)(.)pp
      name auto function call
      snip @0(@1) $0

    pattern (%a)d(.)p
      name auto derivative call
      snip @0'(@1) $0

    pattern (%a)i(.)p
      name auto preimage call
      snip @0^{-1}(@1) $0

    block !word
      abbr .inv ^{-1}
      abbr .neg _-
      abbr .pos _+

    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