+\def\latex-preamble/diagrams{
+ \startverb
+ \usepackage{tikz, tikz-cd, mathtools, amssymb, stmaryrd}
+ \usetikzlibrary{matrix,arrows}
+ \usetikzlibrary{backgrounds,fit,positioning,calc,shapes}
+ \usetikzlibrary{decorations.pathreplacing}
+ \usetikzlibrary{decorations.pathmorphing}
+ \usetikzlibrary{decorations.markings}
+
+ \tikzset{
+ desc/.style={sloped, fill=white,inner sep=2pt},
+ upright desc/.style={fill=white,inner sep=2pt},
+ pullback/.style = {
+ append after command={
+ \pgfextra{
+ \draw ($(\tikzlastnode) + (.2cm,-.5cm)$) -- ++(0.3cm,0) -- ++(0,0.3cm);
+ }
+ }
+ },
+ pullback 45/.style = {
+ append after command={
+ \pgfextra{
+ \draw[rotate = 45] ($(\tikzlastnode) + (.2cm,-.5cm)$) -- ++(0.3cm,0) -- ++(0,0.3cm);
+ }
+ }
+ },
+ ne pullback/.style = {
+ append after command={
+ \pgfextra{
+ \draw ($(\tikzlastnode) + (-.2cm,-.5cm)$) -- ++(-0.3cm,0) -- ++(0,0.3cm);
+ }
+ }
+ },
+ sw pullback/.style = {
+ append after command={
+ \pgfextra{
+ \draw ($(\tikzlastnode) + (.2cm,.5cm)$) -- ++(0.3cm,0) -- ++(0,-0.3cm);
+ }
+ }
+ },
+ dotted pullback/.style = {
+ append after command={
+ \pgfextra{
+ \draw [densely dotted] ($(\tikzlastnode) + (.2cm,-.5cm)$) -- ++(0.3cm,0) -- ++(0,0.3cm);
+ }
+ }
+ },
+ muted pullback/.style = {
+ append after command={
+ \pgfextra{
+ \draw [gray] ($(\tikzlastnode) + (.2cm,-.5cm)$) -- ++(0.3cm,0) -- ++(0,0.3cm);
+ }
+ }
+ },
+ pushout/.style = {
+ append after command={
+ \pgfextra{
+ \draw ($(\tikzlastnode) + (-.2cm,.5cm)$) -- ++(-0.3cm,0) -- ++(0,-0.3cm);
+ }
+ }
+ },
+ between/.style args={#1 and #2}{
+ at = ($(#1)!0.5!(#2)$)
+ },
+ diagram/.style = {
+ on grid,
+ node distance=2cm,
+ commutative diagrams/every diagram,
+ line width = .5pt,
+ every node/.append style = {
+ commutative diagrams/every cell,
+ }
+ },
+ fibration/.style = {
+ -{Triangle[open]}
+ },
+ etale/.style = {
+ -{Triangle[open]}
+ },
+ etale cover/.style= {
+ >={Triangle[open]},->.>
+ },
+ opfibration/.style = {
+ -{Triangle}
+ },
+ lies over/.style = {
+ |-{Triangle[open]}
+ },
+ op lies over/.style = {
+ |-{Triangle}
+ },
+ embedding/.style = {
+ {right hook}->
+ },
+ open immersion/.style = {
+ {right hook}-{Triangle[open]}
+ },
+ closed immersion/.style = {
+ {right hook}-{Triangle}
+ },
+ closed immersion*/.style = {
+ {left hook}-{Triangle}
+ },
+ embedding*/.style = {
+ {left hook}->
+ },
+ open immersion*/.style = {
+ {left hook}-{Triangle[open]}
+ },
+ exists/.style = {
+ densely dashed
+ },
+ }
+
+ \newlength{\dontworryaboutit}
+
+ \tikzset{
+ inline diagram/.style = {
+ commutative diagrams/every diagram,
+ commutative diagrams/cramped,
+ line width = .5pt,
+ every node/.append style = {
+ commutative diagrams/every cell,
+ anchor = base,
+ inner sep = 0pt
+ },
+ every path/.append style = {
+ outer xsep = 2pt
+ }
+ }
+ }
+
+ \tikzset{
+ square/nw/.style = {},
+ square/ne/.style = {},
+ square/se/.style = {},
+ square/sw/.style = {},
+ square/north/.style = {->},
+ square/south/.style = {->},
+ square/west/.style = {->},
+ square/east/.style = {->},
+ square/north/node/.style = {above},
+ square/south/node/.style = {below},
+ square/west/node/.style = {left},
+ square/east/node/.style = {right},
+ }
+
+ \ExplSyntaxOn
+
+ \bool_new:N \l_jon_glue_west
+
+ \keys_define:nn { jon-tikz/diagram } {
+ nw .tl_set:N = \l_jon_tikz_diagram_nw,
+ sw .tl_set:N = \l_jon_tikz_diagram_sw,
+ ne .tl_set:N = \l_jon_tikz_diagram_ne,
+ se .tl_set:N = \l_jon_tikz_diagram_se,
+
+ width .tl_set:N = \l_jon_tikz_diagram_width,
+ height .tl_set:N = \l_jon_tikz_diagram_height,
+
+ north .tl_set:N = \l_jon_tikz_diagram_north,
+ south .tl_set:N = \l_jon_tikz_diagram_south,
+ west .tl_set:N = \l_jon_tikz_diagram_west,
+ east .tl_set:N = \l_jon_tikz_diagram_east,
+
+ nw/style .code:n = {\tikzset{square/nw/.style = {#1}}},
+ sw/style .code:n = {\tikzset{square/sw/.style = {#1}}},
+ ne/style .code:n = {\tikzset{square/ne/.style = {#1}}},
+ se/style .code:n = {\tikzset{square/se/.style = {#1}}},
+
+ glue .choice:,
+ glue / west .code:n = {\bool_set:Nn \l_jon_glue_west \c_true_bool},
+
+ glue~target .tl_set:N = \l_jon_tikz_glue_target,
+
+ north/style .code:n = {\tikzset{square/north/.style = {#1}}},
+ north/node/style .code:n = {\tikzset{square/north/node/.style = {#1}}},
+ south/style .code:n = {\tikzset{square/south/.style = {#1}}},
+ south/node/style .code:n = {\tikzset{square/south/node/.style = {#1}}},
+ west/style .code:n = {\tikzset{square/west/.style = {#1}}},
+ west/node/style .code:n = {\tikzset{square/west/node/.style = {#1}}},
+ east/style .code:n = {\tikzset{square/east/.style = {#1}}},
+ east/node/style .code:n = {\tikzset{square/east/node/.style = {#1}}},
+
+ draft .meta:n = {
+ nw = {\__jon_tikz_diagram_fmt_placeholder:n {nw}},
+ sw = {\__jon_tikz_diagram_fmt_placeholder:n {sw}},
+ se = {\__jon_tikz_diagram_fmt_placeholder:n {se}},
+ ne = {\__jon_tikz_diagram_fmt_placeholder:n {ne}},
+ north = {\__jon_tikz_diagram_fmt_placeholder:n {north}},
+ south = {\__jon_tikz_diagram_fmt_placeholder:n {south}},
+ west = {\__jon_tikz_diagram_fmt_placeholder:n {west}},
+ east = {\__jon_tikz_diagram_fmt_placeholder:n {east}},
+ }
+ }
+
+ \tl_set:Nn \l_jon_tikz_diagram_width { 2cm }
+ \tl_set:Nn \l_jon_tikz_diagram_height { 2cm }
+
+
+ \cs_new:Npn \__jon_tikz_diagram_fmt_placeholder:n #1 {
+ \texttt{\textcolor{red}{#1}}
+ }
+
+ \keys_set:nn { jon-tikz/diagram } {
+ glue~target = {},
+ }
+
+
+ \cs_new:Nn \__jon_tikz_render_square:nn {
+ \group_begin:
+ \keys_set:nn {jon-tikz/diagram} {#2}
+ \bool_if:nTF \l_jon_glue_west {
+ \node (#1ne) [right = \l_jon_tikz_diagram_width~of~\l_jon_tikz_glue_target ne,square/ne] {$\l_jon_tikz_diagram_ne$};
+ \node (#1se) [below = \l_jon_tikz_diagram_height~of~#1ne,square/se] {$\l_jon_tikz_diagram_se$};
+ \draw[square/north] (\l_jon_tikz_glue_target ne) to node [square/north/node] {$\l_jon_tikz_diagram_north$} (#1ne);
+ \draw[square/east] (#1ne) to node [square/east/node] {$\l_jon_tikz_diagram_east$} (#1se);
+ \draw[square/south] (\l_jon_tikz_glue_target se) to node [square/south/node] {$\l_jon_tikz_diagram_south$} (#1se);
+ } {
+ \node (#1nw) [square/nw] {$\l_jon_tikz_diagram_nw$};
+ \node (#1sw) [below = \l_jon_tikz_diagram_height~of~#1nw,square/sw] {$\l_jon_tikz_diagram_sw$};
+ \draw[square/west] (#1nw) to node [square/west/node] {$\l_jon_tikz_diagram_west$} (#1sw);
+
+ \node (#1ne) [right = \l_jon_tikz_diagram_width~of~#1nw,square/ne] {$\l_jon_tikz_diagram_ne$};
+ \node (#1se) [below = \l_jon_tikz_diagram_height~of~#1ne,square/se] {$\l_jon_tikz_diagram_se$};
+ \draw[square/north] (#1nw) to node [square/north/node] {$\l_jon_tikz_diagram_north$} (#1ne);
+ \draw[square/east] (#1ne) to node [square/east/node] {$\l_jon_tikz_diagram_east$} (#1se);
+ \draw[square/south] (#1sw) to node [square/south/node] {$\l_jon_tikz_diagram_south$} (#1se);
+ }
+ \group_end:
+ }
+
+ \NewDocumentCommand\SpliceDiagramSquare{D<>{}m}{
+ \__jon_tikz_render_square:nn {#1} {#2}
+ }
+
+
+ \NewDocumentCommand\DiagramSquare{D<>{}O{}m}{
+ \begin{tikzpicture}[diagram,#2,baseline=(#1sw.base)]
+ \__jon_tikz_render_square:nn {#1} {#3}
+ \end{tikzpicture}
+ }
+
+ \ExplSyntaxOff
+ \stopverb
+}
+
+\def\latex-preamble/string-diagrams{
+ \startverb
+ \RequirePackage{tikz}
+ \RequirePackage{amsmath}
+ \usetikzlibrary{backgrounds, intersections, calc, spath3, fit}
+
+ \definecolor{catccolor}{RGB}{255,244,138}
+ \tikzstyle{dot}=[circle, draw=black, fill=black, minimum size=1mm, inner sep=0mm]
+ \tikzstyle{catc}=[catccolor!60]
+ \tikzstyle{catd}=[orange!40]
+ \tikzstyle{cate}=[red!40]
+ \tikzstyle{catf}=[blue!10]
+ \tikzstyle{catg}=[green!25]
+
+
+ \tikzstyle{blue halo}=[fill=blue!10, opacity=0.7, rounded corners]
+ \tikzstyle{white halo}=[fill=white, opacity=0.7, rounded corners]
+
+ \NewDocumentCommand\CreateRect{D<>{} m m}{
+ \path
+ coordinate (#1nw)
+ ++(#2,-#3) coordinate (#1se)
+ coordinate (#1sw) at (#1se -| #1nw)
+ coordinate (#1ne) at (#1nw -| #1se)
+ ;
+
+ \path[spath/save = #1north] (#1nw) to (#1ne);
+ \path[spath/save = #1west] (#1nw) to (#1sw);
+ \path[spath/save = #1east] (#1ne) to (#1se);
+ \path[spath/save = #1south] (#1sw) to (#1se);
+ }
+ \stopverb
+}