\ProvidesClass{notes}
\LoadClass[a4paper]{amsart}

\RequirePackage[utf8]{inputenc}
\RequirePackage[T1]{fontenc}
\RequirePackage{textcomp}
\RequirePackage[german, english]{babel}
\RequirePackage{amsmath, amssymb, amsthm}
\RequirePackage{mdframed}
\RequirePackage{tikz-cd}
\RequirePackage{fancyhdr}
\RequirePackage{geometry}
\RequirePackage{import}
\RequirePackage{pdfpages}
%\RequirePackage{transparent}
\RequirePackage{xcolor}
\RequirePackage{array}
\RequirePackage[shortlabels]{enumitem}
\RequirePackage{tikz}
\RequirePackage{pgfplots}
\RequirePackage{listings}
\RequirePackage{mathtools}
\RequirePackage{forloop}
\RequirePackage{totcount}
\RequirePackage{calc}
\RequirePackage{wasysym}
\RequirePackage{environ}
\RequirePackage{hyperref}
\RequirePackage{graphicx}

\usetikzlibrary{quotes, angles}
\pgfplotsset{
    compat=1.15,
    default 2d plot/.style={%
        grid=both,
        minor tick num=4,
        grid style={line width=.1pt, draw=gray!10},
        major grid style={line width=.2pt,draw=gray!50},
        axis lines=middle,
        enlargelimits={abs=0.2}
    },
}

% PAGE GEOMETRY
\geometry{
    top=1.2in,bottom=1.4in,left=1.3in,right=1.3in,
    bottom=35mm
}

% PARAGRAPH no indent but skip
%\setlength{\parskip}{3mm}
%\setlength{\parindent}{0mm}

\newtheorem{satz}{Proposition}[section]
\newtheorem{theorem}[satz]{Theorem}
\newtheorem{lemma}[satz]{Lemma}
\newtheorem{korollar}[satz]{Corollary}
\theoremstyle{definition}
\newtheorem{definition}[satz]{Definition}
\newtheorem*{definition*}{Definition}

%\theoremstyle{definition}
%\newmdtheoremenv{satz}{Satz}[section]
%\newmdtheoremenv{lemma}[satz]{Lemma}
%\newmdtheoremenv{korollar}[satz]{Korollar}
%\newmdtheoremenv{definition}[satz]{Definition}

\newtheorem{bsp}[satz]{Example}
\newtheorem{bem}[satz]{Remark}
\newtheorem{aufgabe}{Exercise}

% enable aufgaben counting
\regtotcounter{aufgabe}

% temporary calculation counter
\newcounter{var}

\newcommand{\N}{\mathbb{N}}
\newcommand{\R}{\mathbb{R}}
\newcommand{\Z}{\mathbb{Z}}
\newcommand{\Q}{\mathbb{Q}}
\newcommand{\C}{\mathbb{C}}

% HEADERS

\pagestyle{headings}

\newcommand{\incfig}[1]{%
    \def\svgwidth{\columnwidth}
    \import{./figures/}{#1.pdf_tex}
}
\pdfsuppresswarningpagegroup=1

% code listings, define style
\lstdefinestyle{mystyle}{
    commentstyle=\color{gray},
    keywordstyle=\color{blue},
    numberstyle=\tiny\color{gray},
    stringstyle=\color{black},
    basicstyle=\ttfamily\footnotesize,
    breakatwhitespace=false,         
    breaklines=true,                 
    captionpos=b,                    
    keepspaces=true,                 
    numbers=left,                    
    numbersep=5pt,                  
    showspaces=false,                
    showstringspaces=false,
    showtabs=false,                  
    tabsize=2
}

% activate my colour style
\lstset{style=mystyle}

% better stackrel
\let\oldstackrel\stackrel
\renewcommand{\stackrel}[2]{%
    \oldstackrel{\mathclap{#1}}{#2}
}%

% integral d sign
\makeatletter \renewcommand\d[2][]{\ensuremath{%
		\,\mathrm{d}^{#1}#2\@ifnextchar^{}{\@ifnextchar\d{}{\,}}}}
\makeatother

% contradiction
\newcommand{\contr}{\text{\Large\lightning}}

% disjoint unions: provides cupdot and bigcupdot
\makeatletter
\def\moverlay{\mathpalette\mov@rlay}
\def\mov@rlay#1#2{\leavevmode\vtop{%
   \baselineskip\z@skip \lineskiplimit-\maxdimen
   \ialign{\hfil$\m@th#1##$\hfil\cr#2\crcr}}}
\newcommand{\charfusion}[3][\mathord]{
    #1{\ifx#1\mathop\vphantom{#2}\fi
        \mathpalette\mov@rlay{#2\cr#3}
      }
    \ifx#1\mathop\expandafter\displaylimits\fi}
\makeatother

\newcommand{\cupdot}{\charfusion[\mathbin]{\cup}{\cdot}}
\newcommand{\bigcupdot}{\charfusion[\mathop]{\bigcup}{\cdot}}

\ExplSyntaxOn

% S-tackrelcompatible ALIGN environment
% some might also call it the S-uper ALIGN environment
% uses regular expressions to calculate the widest stackrel
% to put additional padding on both sides of relation symbols
\NewEnviron{salign}
{
    \begin{align}
        \lec_insert_padding:V \BODY
    \end{align}
}
% starred version that does no equation numbering
\NewEnviron{salign*}
{
    \begin{align*}
        \lec_insert_padding:V \BODY
    \end{align*}
}

% some helper variables
\tl_new:N \l__lec_text_tl
\seq_new:N \l_lec_stackrels_seq
\int_new:N \l_stackrel_count_int
\int_new:N \l_idx_int
\box_new:N \l_tmp_box
\dim_new:N \l_tmp_dim_a
\dim_new:N \l_tmp_dim_b
\dim_new:N \l_tmp_dim_needed

% function to insert padding according to widest stackrel
\cs_new_protected:Nn \lec_insert_padding:n
 {
  \tl_set:Nn \l__lec_text_tl { #1 }
  % get all stackrels in this align environment
  \regex_extract_all:nnN { \c{stackrel}{(.*?)}{(.*?)} } { #1 } \l_lec_stackrels_seq
  % get number of stackrels
  \int_set:Nn \l_stackrel_count_int { \seq_count:N \l_lec_stackrels_seq }
  \int_set:Nn \l_idx_int { 1 }
  \dim_set:Nn \l_tmp_dim_needed { 0pt }
  % iterate over stackrels
  \int_while_do:nn { \l_idx_int <= \l_stackrel_count_int }
  {
      % calculate width of text
      \hbox_set:Nn \l_tmp_box {$\seq_item:Nn \l_lec_stackrels_seq { \l_idx_int + 1 }$}
      \dim_set:Nn \l_tmp_dim_a {\box_wd:N \l_tmp_box}
      % calculate width of relation symbol
      \hbox_set:Nn \l_tmp_box {$\seq_item:Nn \l_lec_stackrels_seq { \l_idx_int + 2 }$}
      \dim_set:Nn \l_tmp_dim_b {\box_wd:N \l_tmp_box}
      % check if 0.5*(a-b) > minimum padding, if yes updated minimum padding
      \dim_compare:nNnTF
        { 1pt * \dim_ratio:nn { \l_tmp_dim_a - \l_tmp_dim_b } { 2pt } } > { \l_tmp_dim_needed }
        { \dim_set:Nn \l_tmp_dim_needed { 1pt * \dim_ratio:nn { \l_tmp_dim_a - \l_tmp_dim_b } { 2pt } } }
        { }
      \quad
      % increment list index by three, as every stackrel produces three list entries
      \int_incr:N \l_idx_int
      \int_incr:N \l_idx_int
      \int_incr:N \l_idx_int
  }
  % replace all relations with align characters (&) and add the needed padding
  \regex_replace_all:nnN
  { (<&|&<|\c{iff}&|&\c{iff}|\c{impliedby}&|&\c{impliedby}|\c{implies}&|&\c{implies}|\c{approx}&|&\c{approx}|\c{equiv}&|&\c{equiv}|=&|&=|\c{le}&|&\c{le}|\c{ge}&|&\c{ge}|&\c{stackrel}{.*?}{.*?}|\c{stackrel}{.*?}{.*?}&|&\c{neq}|\c{neq}&|\c{simeq}&|&\c{simeq}) }
      { \c{kern} \u{l_tmp_dim_needed} \1 \c{kern} \u{l_tmp_dim_needed} }
      \l__lec_text_tl
  \l__lec_text_tl
 }
\cs_generate_variant:Nn \lec_insert_padding:n { V }
\ExplSyntaxOff
