##########
# GLOBAL #
##########

global !p

def create_table(snip):
	rows = snip.buffer[snip.line].split('x')[0]
	cols = snip.buffer[snip.line].split('x')[1]
	int_val = lambda string: int(''.join(s for s in string if s.isdigit()))
	rows = int_val(rows)
	cols = int_val(cols)
	offset = cols + 1
	old_spacing = snip.buffer[snip.line][:snip.buffer[snip.line].rfind('\t') + 1]
	snip.buffer[snip.line] = ''
	final_str = old_spacing + "\\begin{tabular}{|" + "|".join(['$' + str(i + 1) for i in range(cols)]) + "|}\n"
	for i in range(rows):
		final_str += old_spacing + '\t'
		final_str += " & ".join(['$' + str(i * cols + j + offset) for j in range(cols)])
		final_str += " \\\\\\\n"
	final_str += old_spacing + "\\end{tabular}\n$0"
	snip.expand_anon(final_str)

def add_row(snip):
	row_len = int(''.join(s for s in snip.buffer[snip.line] if s.isdigit()))
	old_spacing = snip.buffer[snip.line][:snip.buffer[snip.line].rfind('\t') + 1]
	snip.buffer[snip.line] = ''
	final_str = old_spacing
	final_str += " & ".join(['$' + str(j + 1) for j in range(row_len)])
	final_str += " \\\\\\"
	snip.expand_anon(final_str)
endglobal


###############
# ENVIRONMENT #
###############

snippet lemma "Lemma" bi
\begin{lemma}
	${0:${VISUAL}}
\end{lemma}
endsnippet

snippet prop "Proposition" bi
\begin{prop}[$1]
	${0:${VISUAL}}
\end{prop}
endsnippet

snippet thrm "Theorem" bi
\begin{theorem}[$1]
	${0:${VISUAL}}
\end{theorem}
endsnippet

snippet post "postulate" bi
\begin{postulate}[$1]
	${0:${VISUAL}}
\end{postulate}
endsnippet

snippet prf "Proof" bi
\begin{myproof}[$1]
	${0:${VISUAL}}
\end{myproof}
endsnippet

snippet def "Definition" bi
\begin{definition}[$1]
	${0:${VISUAL}}
\end{definition}
endsnippet

snippet nte "Note" bi
\begin{note}[$1]
	${0:${VISUAL}}
\end{note}
endsnippet

snippet prob "Problem" bi
\begin{problem}[$1]
	${0:${VISUAL}}
\end{problem}
endsnippet

snippet corl "Corollary" bi
\begin{corollary}[$1]
	${0:${VISUAL}}
\end{corollary}
endsnippet

snippet example "Example" bi
\begin{example}[$1]
	${0:${VISUAL}}
\end{example}
endsnippet

snippet notion "Notation" bi
\begin{notation}[$1]
	$0${VISUAL}
\end{notation}
endsnippet

snippet conc "Conclusion" bi
\begin{conclusion}[$1]
	$0${VISUAL}
\end{conclusion}
endsnippet

snippet fig "Figure environment" bi
\begin{figure}[${1:htpb}]
	\centering
	${2:\includegraphics[width=0.8\textwidth]{$3}}
	\caption{${4:$3}}
	\label{fig:${5:${3/\W+/-/g}}}
\end{figure}
endsnippet

snippet abs "abstract environment" b
\begin{abstract}
	${0:${VISUAL}}
.\end{abstract}
endsnippet

snippet tab "tabular / array environment" b
\begin{${1:t}${1/(t)$|(a)$|(.*)/(?1:abular)(?2:rray)/}}{${2:c}}
$0${2/(?<=.)(c|l|r)|./(?1: & )/g}
\end{$1${1/(t)$|(a)$|(.*)/(?1:abular)(?2:rray)/}}
endsnippet

snippet table "Table environment" b
\begin{table}[${1:htpb}]
	\centering
	\caption{${2:caption}}
	\label{tab:${3:label}}

	\begin{${4:t}${4/(t)$|(a)$|(.*)/(?1:abular)(?2:rray)/}}{${5:c}}
		$0${5/(?<=.)(c|l|r)|./(?1: & )/g}
	\end{$4${4/(t)$|(a)$|(.*)/(?1:abular)(?2:rray)/}}
\end{table}
endsnippet

########
# MATH #
########

snippet cc "subset" w
\subset 
endsnippet

snippet inn "in " w
\in 
endsnippet

snippet Nn "cap" w
\cap 
endsnippet

snippet UU "cup" w
\cup 
endsnippet

snippet uuu "bigcup" w
\bigcup_{${1:i \in ${2: I}}} $0
endsnippet

snippet nnn "bigcap" w
\bigcap_{${1:i \in ${2: I}}} $0
endsnippet

snippet HH "H" w
\mathbb{H}
endsnippet

snippet DD "D" w
\mathbb{D}
endsnippet

snippet inmath "Inline Math" w
\\(${1}\\) $0
endsnippet

snippet dm "Display Math" w
\[
	${1:${VISUAL}}
\]$0
endsnippet

snippet frac "Fraction" w
\frac{$1}{$2}$0
endsnippet

snippet compl "Complement" i
^{c}
endsnippet

snippet ss "Super Script" i
^{$1}$0
endsnippet

snippet __ "subscript" Aw
_{$1}$0
endsnippet

snippet srt "Square Root" wi
\sqrt{${1:${VISUAL}}}$0
endsnippet

snippet srto "... Root" wi
\sqrt[$1]{${2:${VISUAL}}}$0
endsnippet

snippet ceil "Ceil" w
\left\lceil $1 \right\rceil $0
endsnippet

snippet floor "Floor" w
\left\lfloor $1 \right\rfloor$0
endsnippet

snippet pmat "Pmat" w
\begin{pmatrix} $1 \end{pmatrix} $0
endsnippet

snippet bmat "Bmat" w
\begin{bmatrix} $1 \end{bmatrix} $0
endsnippet

snippet lrb "left\{ right\}" i
\left\\{ ${1:${VISUAL}} \right\\} $0
endsnippet

snippet lra "leftangle rightangle" wi
\left<${1:${VISUAL}} \right>$0
endsnippet

snippet conj "conjugate" w
\overline{$1}$0
endsnippet

snippet sum "sum" w
\sum_{n=${1:1}}^{${2:\infty}} ${3:a_n z^n}
endsnippet

snippet taylor "taylor" w
\sum_{${1:k}=${2:0}}^{${3:\infty}} ${4:c_$1} (x-a)^$1 $0
endsnippet

snippet lim "limit" w
\lim_{${1:n} \to ${2:\infty}} 
endsnippet

snippet limsup "limsup" w
\limsup_{${1:n} \to ${2:\infty}} 
endsnippet

snippet prod "product" w
\prod_{${1:n=${2:1}}}^{${3:\infty}} ${4:${VISUAL}} $0
endsnippet

snippet part "d/dx" w
\frac{\partial ${1:V}}{\partial ${2:x}} $0
endsnippet

snippet ooo "\infty" w
\infty
endsnippet

snippet rij "mrij" i
(${1:x}_${2:n})_{${3:$2}\\in${4:\\N}}$0
endsnippet

snippet => "Implies" w
\implies
endsnippet

snippet =< "Implied by" w
\impliedby
endsnippet

snippet iff "iff" w
\iff
endsnippet

snippet == "Equals" w
&= $1 \\\\
endsnippet

snippet != "Not Equal" w
\neq 
endsnippet

snippet <= "leq" w
\le 
endsnippet

snippet >= "geq" w
\ge 
endsnippet

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

snippet lll "l" w
\ell
endsnippet

snippet xx "cross" Aw
\times 
endsnippet

snippet '(?<!\\)(sin|cos|arccot|cot|csc|ln|log|exp|star|perp)' "ln" rw
\\`!p snip.rv = match.group(1)`
endsnippet

snippet <! "normal" Aw
\triangleleft 
endsnippet

snippet "((\d|\w)+)invs" "inverse" Awr
`!p snip.rv = match.group(1)`^{-1}
endsnippet

snippet !> "mapsto" Aw
\mapsto 
endsnippet

##########
# TABLES #
#########

pre_expand "create_table(snip)"
snippet "gentbl(\d+)x(\d+)" "Generate table of *width* by *height*" r
endsnippet

pre_expand "add_row(snip)"
snippet "tr(\d+)" "Add table row of dimension ..." r
endsnippet


###########
# POSTFIX #
###########

snippet bar "bar" wi
\bar{${1:${VISUAL}}}$0
endsnippet

snippet "\<(.*?)\|" "bra" wri
\bra{`!p snip.rv = match.group(1).replace('q', f'\psi').replace('f', f'\phi')`}
endsnippet

snippet "\|(.*?)\>" "ket" wri
\ket{`!p snip.rv = match.group(1).replace('q', f'\psi').replace('f', f'\phi')`}
endsnippet

snippet "(.*)\\bra{(.*?)}([^\|]*?)\>" "braket" Awri
`!p snip.rv = match.group(1)`\braket{`!p snip.rv = match.group(2)`}{`!p snip.rv = match.group(3).replace('q', f'\psi').replace('f', f'\phi')`}
endsnippet


#############
# PRE-AMBLE #
#############

snippet pac "usepackage - removes square braces if options removed" b
\usepackage`!p snip.rv='[' if t[1] else ""`${1:options}`!p snip.rv = ']' if t[1] else ""`{${2:package}}$0
endsnippet

snippet docls "Document Class" bA
\documentclass{$1}$0
endsnippet


#########
# OTHER #
#########

snippet acl "Acroynm expanded" bi
\acl{${1:acronym}}
endsnippet

snippet ac "Acroynm normal" bi
\ac{${1:acronym}}
endsnippet

# vim:ft=snippets:
