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

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

block auto !math start
  -- {{{ Environments & lists & their elements
  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⟩

  for kind <- @⟨chapter,section,subsection,subsubsection⟩

  string @kind
    name @kind environment
    snip
      \\@kind⋄{$1}
      $0


  -- }}}

block text
  import common/math-phrases

  -- {{{ References
  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
  -- }}}

  block auto
    -- {{{ Delimiters
    string "
      name quote
      snip ``$1''$0

    string $
      name inline math
      snip \$$1\$$0
    -- }}}

  string forcecr
    desc Force the content onto a new line
    snip {\ \\\}

block math
  -- {{{ Sigma/Pi notation
  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
  -- }}}
  -- {{{ Matrices
  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}
  -- }}}
  -- {{{ Equations
  for createabbr <- @⟨false,true⟩
  for operator <- @⟨@createabbr:
    @⟨eq,lt,gt⟩,
    @⟨neq,defas,leq,geq,iip,iib,iff⟩
  ⟩
  for symbol <- @⟨@createabbr:
    @⟨@operator:=,<,>⟩,
    @⟨@operator:\neq,\coloneq,\leq,\geq,\implies,\impliedby,\iff⟩
  ⟩

  block auto
    abbr @⟨@createabbr:op-@operator,@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\}
  -- }}}
  -- {{{ Explanations
  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 word
    -- {{{ Shorthands
    -- {{{ Constants
    for constkind <- @⟨default,shortened⟩
    for constant <- @⟨@constkind:
      @⟨star,delta,Delta,pi,tau,psi,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
    -- }}}
    -- {{{ Logic
    abbr frl \forall
    abbr exs \exists
    abbr nope \bot
    abbr yee \top
    -- }}}
    -- {{{ Set-theory
    abbr card \#
    abbr ccap \cap
    abbr ccup \cup
    abbr iin \in
    abbr nin \not\in
    abbr nuls \varnothing
    abbr ortco ^\bot
    abbr sdiff \setminus
    abbr sinter ^\circ
    abbr smul \times
    abbr speq \supseteq
    abbr spt \supset
    abbr sseq \subseteq
    abbr sst \subset
    -- }}}
    -- {{{ Numbers
    abbr niinf -\ifty
    abbr eniinf ^{-\ifty}
    abbr sniinf _{-\ifty}
    abbr mul \cdot
    abbr nlnl \pm
    abbr limsup \lim\sup
    -- }}}
    -- {{{ Misc
    abbr oball \ball
    abbr vsm \vecspace
    abbr mangle \measuredangle
    abbr com \circ
    -- }}}
    -- {{{ Fonts
    abbr bb \mathbb
    abbr cal \mathcal
    -- }}}
    -- }}}
    -- {{{ Sets
    for set <- @⟨N,Z,Q,I,R,C,P,F⟩
    abbr @⟨@set:nats,ints,rats,irats,rrea,comp,ppri,ffie⟩ \mathbb @set

    string set
      desc Create a set by escaping the brackets
      snip \{$1\}
    -- }}}
    -- {{{ Operators
    for noperator <- @⟨ordop,land,lor,equiv,pmod,ldots,cdots,perp,angle,sup⟩
    abbr @noperator \\@noperator

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

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

  block auto
    -- {{{ Subscripts & exponents
    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
    -- }}}
    -- {{{ Postfix notation
    block !word
      abbr .inv ^{-1}
      abbr .neg _-
      abbr .pos _+
      abbr .t ^T
    -- }}}
    -- {{{ Limits & integrals
    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 intd
      name definite integral
      snip \int_{$|1⟨$1,-\infty$1⟩}^$|2⟨{$2},\infty$2⟩ $3 \dif $0

    string inti
      name indefinite integral
      snip \int $1 \dif $0
    -- }}}