global !p

# thanks to gilles castel

def math():
    return vim.eval('vimtex#syntax#in_mathzone()') == '1'

def env(name):
	[x,y] = vim.eval("vimtex#env#is_inside('" + name + "')") 
	return x != '0' and y != '0'
endglobal

# General

snippet beg "Begin / End" bA
\\begin{$1}
	$2
\\end{$1}$0
endsnippet

snippet pac "Package" b
\usepackage[$1]{$2}$0
endsnippet

snippet template "Basic template" b
\documentclass[$1]{$2}

$3

\begin{document}
	$0
\end{document}
endsnippet

snippet item "Itemize" bA
\begin{itemize}
    \item $0
\end{itemize}
endsnippet

snippet enum "Enumerate" bA
\begin{enumerate}
    \item $0
\end{enumerate}
endsnippet

snippet alph "Alphabet Enumerate" bA
\begin{enumerate}[label= (\alph*)]
    \item $1
\end{enumerate} $0
endsnippet

snippet desc "Description" bA
\begin{description}
    \item[$1] $2
\end{description} $0
endsnippet

snippet table "Table" b
\begin{table}[${1:htpb}]
    \centering
    \caption{${2:caption}}
    \label{tab:${3:label}}
    \begin{tabular}{${5:c}}
	$6${5/((?<=.)c|l|r)|./(?1: & )/g}
    \end{tabular}
\end{table} $0
endsnippet

priority 100
snippet ... "Ldots" iA
\ldots
endsnippet

snippet ~~ "Sim" iA
\sim
endsnippet

# Math

snippet sm "Math" wA
$${1}$`!p
if t[2] and t[2][0] not in [',', '.', '?', '-', ' ']:
    snip.rv = ' '
else:
    snip.rv = ''
`$2
endsnippet

snippet dm "Display Math" wA

\[
    $1
\] $0
endsnippet

snippet ali "Align" bA
\begin{align*}
    ${1:${VISUAL}}
\end{align*} $0
endsnippet

context "math()"
snippet => "Implies" Ai
\implies
endsnippet

context "math()"
snippet =< "Implied by" Ai
\impliedby
endsnippet

context "math()"
snippet iff "Iff" Ai
\iff
endsnippet

context "math()"
snippet bm "Bm" Ai
\bm{$1}$0
endsnippet

context "math()"
snippet sqrt "Square root" Ai
\sqrt{$1}$0
endsnippet

context "math()"
snippet box "Boxed" Ai
\boxed{$1}$0
endsnippet

context "math()"
snippet lll "L" iA
\ell
endsnippet

context "math()"
snippet xx "Cross" iA
\times
endsnippet

priority 100
context "math()"
snippet ** "Cdot" iA
\cdot
endsnippet

context "math()"
snippet norm "Norm" iA
\|$1\|$0
endsnippet

context "math()"
snippet nabl "Nabla" iA
\nabla
endsnippet

context "math()"
snippet del "Nabla" iA
\nabla
endsnippet

context "math()"
snippet \\\ "Set minus" iA
\setminus
endsnippet

context "math()"
snippet mcal "mathcal" iA
\mathcal{$1}$0
endsnippet

priority 100
context "math()"
snippet -> "To" iA
\to
endsnippet

priority 200
context "math()"
snippet <-> "Leftrightarrow" iA
\leftrightarrow
endsnippet

context "math()"
snippet !> "Maps to" iA
\mapsto
endsnippet

context "math()"
snippet set "Set" wA
\left\\{ $1 \right\\} $0
endsnippet

context "math()"
snippet || "Mid" iA
\mid
endsnippet

context "math()"
snippet cc "Subset" iA
\subset
endsnippet

context "math()"
snippet notin "Not in" iA
\not\in
endsnippet

priority 10
context "math()"
snippet in "In" iA
\in
endsnippet

context "math()"
snippet NN "Natural" iA
\N
endsnippet

context "math()"
snippet Nn "Cap" iA
\cap
endsnippet 

context "math()"
snippet isect "Cap" iA
\cap
endsnippet

context "math()"
snippet UU "Cup" iA
\cup
endsnippet

context "math()"
snippet union "Cup" iA
\cup
endsnippet

context "math()"
snippet uuu "Big cup" iA
\bigcup{${1:i \in ${2: I}}} $0
endsnippet

context "math()"
snippet nnn "Big cap" iA
\bigcap{${1:i \in ${2: I}}} $0
endsnippet

context "math()"
snippet OO "Empty Set" iA
\varnothing
endsnippet

context "math()"
snippet RR "Real" iA
\R
endsnippet

context "math()"
snippet QQ "Rational" iA
\Q
endsnippet

context "math()"
snippet ZZ "Integer" iA
\Z
endsnippet

context "math()"
snippet HH "H" iA
\mathbb{H}
endsnippet

context "math()"
snippet DD "D" iA
\mathbb{D}
endsnippet

context "math()"
snippet <! "Normal" iA
\triangleleft
endsnippet

context "math()"
snippet <> "Diamond" iA
\diamond
endsnippet

context "math()"
snippet '(?<!i)sts' "Text Subscript" irA
_\text{$1} $0
endsnippet

context "math()"
snippet tt "Text" iA
\text{$1}$0
endsnippet

priority 200
context "math()"
snippet rowvec "Row Vector" iA
\mqty[$1]$0
endsnippet

context "math()"
snippet case "Cases" wA
\begin{case}
    $1
\end{cases} $0
endsnippet

priority 10
context "math()"
snippet "bar" "Bar" riA
\overline{$1}$0
endsnippet

priority 100
context "math()"
snippet "([a-zA-Z])bar" "Bar" riA
\overline{`!p snip.rv = match.group(1)`}
endsnippet

priority 10
context "math()"
snippet "hat" "Hat" riA
\hat{$1}$0
endsnippet

priority 100
context "math()"
snippet "([a-zA-Z])hat" "Hat" riA
\hat{`!p snip.rv = match.group(1)`}
endsnippet

priority 10
context "math()"
snippet "vec" "Vec" riA
\vec{$1}$0
endsnippet

priority 100
context "math()"
snippet "([a-zA-Z])vec" "Vec" riA
\vec{`!p snip.rv = match.group(1)`}
endsnippet

priority 100
context "math()"
snippet '(?<!\\)(sin|cos|arccot|cot|csc|ln|log|exp|star|perp|arcsin|arccos|arctan|arccot|arccsc|arcsec)' "Functions" rwA
\\`!p snip.rv = match.group(1)`
endsnippet

priority 200
context "math()"
snippet '(?<!\\)(alpha|beta|gamma|Delta|delta|epsilon|zeta|eta|Theta|theta|iota|kappa|Lambda|lambda|mu|nu|Xi|xi|Pi|pi|varpi|Sigma|sigma|tau|Phi|phi|varphi|chi|Psi|psi|Omega|omega)' "Greek" rwA
\\`!p snip.rv = match.group(1)`
endsnippet

context "math()"
snippet // "Fraction" iA
\\frac{${VISUAL}}{$1}$0
endsnippet

context "math()"
snippet / "Fraction" i
\\frac{${VISUAL}}{$1}$0
endsnippet

context "math()"
snippet  '((\d+)|(\d*)(\\)?([A-Za-z]+)((\^|_)(\{\d+\}|\d))*)/' "Symbol Fraction" wrA
\\frac{`!p snip.rv = match.group(1)`}{$1}$0
endsnippet

priority 1000
context "math()"
snippet '^.*\)/' "() Frac" wrA
`!p
stripped = match.string[:-1]
depth = 0
i = len(stripped) - 1
while True:
    if stripped[i] == ")":
        depth += 1
    if stripped[i] == "(":
        depth -= 1
    if depth == 0:
        break
    i -= 1
snip.rv = stripped[0:i] + "\\frac{" + stripped[i+1:-1] + "}"
`{$1}$0
endsnippet

context "math()"
snippet __ "Full Subscript" iA
_{$1}$0
endsnippet

context "math()"
snippet '([A-Za-z])(\d)' "Subscript" wrA
`!p snip.rv = match.group(1)`_`!p snip.rv = match.group(2)`
endsnippet

context "math()"
snippet '([A-Za-z])(\d\d)' "Subscript 2" wrA
`!p snip.rv = match.group(1)`_{`!p snip.rv = match.group(2)`}
endsnippet

context "math()"
snippet xnn "Subscript xn" iA
x_{n}
endsnippet

context "math()"
snippet ynn "Subscript yn" iA
y_{n}
endsnippet

context "math()"
snippet xii "Subscript xi" iA
x_{i}
endsnippet

context "math()"
snippet yii "Subscript yi" iA
y_{i}
endsnippet

context "math()"
snippet xjj "Subscript xj" iA
x_{j}
endsnippet

context "math()"
snippet yjj "Subscript yj" iA
y_{j}
endsnippet

context "math()"
snippet xp1 "Subscript x n+1" iA
x_{n+1}
endsnippet

context "math()"
snippet xp1 "Subscript y n+1" iA
y_{n+1}
endsnippet

context "math()"
snippet xmm "Subscript xm" iA
x_{m}
endsnippet

context "math()"
snippet ymm "Subscript ym" iA
y_{m}
endsnippet

context "math()"
snippet x_ "Subscript x" iA
x_{$1}$0
endsnippet

context "math()"
snippet y_ "Subscript y" iA
y_{$1}$0
endsnippet

context "math()"
snippet == "Equals" iA
&= $1 \\\\$0
endsnippet

context "math()"
snippet != "Not Equals" iA
\neq
endsnippet

context "math()"
snippet ceil "Ceil" iA
\left\lceil $1 \right\rceil $0
endsnippet

context "math()"
snippet floor "Floor" iA
\left\lfloor $1 \right\rfloor$0
endsnippet

context "math()"
snippet pmat "Paren Matrix" iA
\begin{pmatrix} $1 \end{pmatrix} $0
endsnippet

context "math()"
snippet bmat "Bracket Matrix" iA
\begin{bmatrix} $1 \end{bmatrix} $0
endsnippet

context "math()"
snippet Bmat "Brace Matrix" iA
\begin{Bmatrix} $1 \end{Bmatrix} $0
endsnippet

context "math()"
snippet vmat "Vert Matrix" iA
\begin{vmatrix} $1 \end{vmatrix} $0
endsnippet

context "math()"
snippet () "Parenthesis" iA
\left( ${1:${VISUAL}} \right) $0
endsnippet

context "math()"
snippet lr "Parenthesis" i
\left( ${1:${VISUAL}} \right) $0
endsnippet

context "math()"
snippet lr( "Parenthesis" i
\left( ${1:${VISUAL}} \right) $0
endsnippet

context "math()"
snippet lr| "Verticals" i
\left| ${1:${VISUAL}} \right| $0
endsnippet

context "math()"
snippet lr{ "Braces" i
\left\\{ ${1:${VISUAL}} \right\\} $0
endsnippet

context "math()"
snippet lrb "Braces" i
\left\\{ ${1:${VISUAL}} \right\\} $0
endsnippet

context "math()"
snippet lr[ "Brackets" i
\left[ ${1:${VISUAL}} \right] $0
endsnippet

context "math()"
snippet lra "Angled" iA
\left<${1:${VISUAL}} \right>$0
endsnippet

context "math()"
snippet conj "Conjugate" iA
\overline{$1}$0
endsnippet

context "math()"
snippet sr "Square" iA
^2
endsnippet

context "math()"
snippet cb "Cube" iA
^3
endsnippet

context "math()"
snippet invs "Inverse" iA
^{-1}
endsnippet

context "math()"
snippet compl "Complement" iA
^{c}
endsnippet

context "math()"
snippet tp "To the power" iA
^{$1}$0
endsnippet

context "math()"
snippet bp "Paren to the power" iA
^{($1)}$0
endsnippet

context "math()"
snippet sum "Bounded Sum" w
\sum_{${1:n=${2:1}}}^{${3:\infty}} $3
endsnippet

context "math()"
snippet prod "Product" w
\prod{${1:n=${2:1}}}^{${3:\infty}} $4
endsnippet

context "math()"
snippet ssum "Sum Symbol" w
\sum $1
endsnippet

context "math()"
snippet lim "Limit" w
\lim_{${1:n} \to ${2:\infty}} $0
endsnippet

context "math()"
snippet ooo "Infinity" iA
\infty
endsnippet

context "math()"
snippet limsup "Limit Supremum" w
\limsup_{${1:n} \to ${2:\infty}} $0
endsnippet

context "math()"
snippet part "Partial Derivative" w
\pdv[$1]{${2:v}}{${3:x}} $0
endsnippet

priority 300
context "math()"
snippet int "Definite Integral" w
\int_{${1:-\infty}}^{${2:\infty}} $3
endsnippet

priority 300
context "math()"
snippet iint "Indefinite Integral" w
\int $1
endsnippet

context "math()"
snippet <= "Less than or equal" iA
\le
endsnippet

context "math()"
snippet >= "Greater than or equal" iA
\ge
endsnippet

context "math()"
snippet >> "Greater greater" iA
\gg
endsnippet

context "math()"
snippet << "Less less" iA
\ll
endsnippet

context "math()"
snippet EE "There exists" iA
\exists
endsnippet

context "math()"
snippet AA "For all" iA
\forall
endsnippet

snippet plot "Plot" w
\begin{figure}[$1]
    \centering
    \begin{tikzpicture}
        \begin{axis}[
            xmin= ${2:-10}, xmax= ${3:10},
            ymin= ${4:-10}, ymax = ${5:10},
            axis lines = middle,
        ]
            \addplot[domain=$2:$3, samples=${6:100}]{$7};
        \end{axis}
    \end{tikzpicture}
    \caption{$8}
    \label{${9:$8}}
\end{figure} $0
endsnippet

snippet nn "Tikz node" w
\node[$5] (${1/[^0-9a-zA-Z]//g}${2}) ${3:at (${4:0,0}) }{$${1}$};
$0
endsnippet

snippet problem "Problem" iA
\pbl{$1}
    $0
endsnippet

# English

snippet ltable "Long table" b
\begin{longtable}{${1:|p{5cm}|p{10cm}|}}
    \hline
    $2
    \hline
\end{longtable} $0
endsnippet

snippet --- "Hline" iA
\hline
endsnippet

# Code

snippet sc "Code" wA
\texttt{${1}}`!p
if t[2] and t[2][0] not in [',', '.', '?', '-', ' ']:
    snip.rv = ' '
else:
    snip.rv = ''
`$2
endsnippet

snippet dc "Display Code" wA
\begin{minted}[$1]
$2
\end{minted} $0
endsnippet

snippet impc "Import Code" wA
\inputminted{$1}{$2}$0
endsnippet