\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{pmdraw}[2025-01-28 v1.7 pmdraw]

% *------------------------------*
% |2````````````````````````````1|
% |`````____````____`````````````|
% |````|MFMF\  /MFMF|````````````|
% |````|MF|MF\/MF|MF|````````````|
% |````|MF|\MFMF/|MF|_______`````|
% |````|MF|``````|MFMFMFMFMF|````|
% |````|MF|``````|MF|````````````|
% |````|MF|``````|MF|___`````````|
% |``````````````|MFMFMF|````````|
% |``````````````|MF|````````````|
% |``````````````|MF|````````````|
% |``````````````|MF|````````````|
% |4````````````````````````````2|
% *------------------------------*

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                        %
% Required packages                                      %
%                                                        %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% \RequirePackage{datetime}
\RequirePackage{xkeyval}
\RequirePackage{tikz}
\usetikzlibrary{math,decorations.pathreplacing,calligraphy,backgrounds}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                        %
%  Internal control and option commands                  %
%   - loosely ordered alphabetically                     %
%   - includes default values where appropriate          %
%                                                        %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\newcommand{\pmdraw@braceLabel}{}% Label of brace

\newcommand{\pmdraw@diagSep}{1}% Vertical separation between bottom row of top diagram and top row of bottom diagram in product diagram

\newcommand{\pmdraw@drawAedgesOptions}{}% Draw options for added edges in product diagram
\newcommand{\pmdraw@drawAedgesOptionsDefault}{}% Default draw options for added edges in product diagram
\newcommand{\pmdraw@drawAedges}[2]{% Draws added edges in product diagram from #1 vertex to #2 vertex, assumes #1<#2
   \@ifclassloaded{beamer}{% If in beamer
       \uncover<\pmdraw@edgesAddedUncover>{% Uncovers added edges
           \foreach \x in {#1,...,#2} {% For each vertex in range
               \ifnum\value{pmdraw@ifEdgesAdded}=0% If drawing added edges
                   \draw[dotted,thick,apply style/.expand once=\pmdraw@drawAedgesOptionsDefault,apply style/.expand once=\pmdraw@drawAedgesOptions] (\x,0) -- (\x,-\pmdraw@diagSep);% Draw concatenation edge
               \else% If hiding top vertices
                   \phantom{%
                       \draw[dotted,thick,apply style/.expand once=\pmdraw@drawAedgesOptionsDefault,apply style/.expand once=\pmdraw@drawAedgesOptions] (\x,0) -- (\x,-\pmdraw@diagSep);% Draw concatenation edge
                   }%
               \fi%
           }%
       }%
   }{% If not in beamer
       \foreach \x in {#1,...,#2} {% For each vertex in range
           \ifnum\value{pmdraw@ifEdgesAdded}=0% If drawing added edges
               \draw[dotted,thick,apply style/.expand once=\pmdraw@drawAedgesOptionsDefault,apply style/.expand once=\pmdraw@drawAedgesOptions] (\x,0) -- (\x,-\pmdraw@diagSep);% Draw concatenation edge
           \else% If hiding top vertices
               \phantom{%
                   \draw[dotted,thick,apply style/.expand once=\pmdraw@drawAedgesOptionsDefault,apply style/.expand once=\pmdraw@drawAedgesOptions] (\x,0) -- (\x,-\pmdraw@diagSep);% Draw concatenation edge
               }%
           \fi%
       }%
   }%
   \pmdraw@AedgesLoop% Restart for loop
}

\newcommand{\pmdraw@drawBraceDrawOptions}{}% Draw options for brace
\newcommand{\pmdraw@drawBraceNodeOptions}{}% Node options for brace
\newcommand{\pmdraw@drawBraceDefault}[3]{% Draws brace a brace starting from #1 vertex to #2 vertex with label #3, assumes #1<#2 - DEFAULT
   \ifnum\pmdraw@ifProdDiag=1% If drawing a product diagram or if placing brace above diagram
       \draw[
           very thick,
           decorate,
           decoration={calligraphic brace,amplitude=6pt},
           apply style/.expand once=\pmdraw@drawBraceDrawOptions
       ] (#1-0.17,\pmdraw@rowSep+0.5) -- (#2+0.17,\pmdraw@rowSep+0.5)
       node[
           pos=0.5,
           above=6pt,
           apply style/.expand once=\pmdraw@drawBraceNodeOptions
       ] {\(#3\)};% Draw brace on top of diagram
   \else% If not drawing a product diagram or if placing brace below diagram
       \draw[
           very thick,
           decorate,
           decoration={calligraphic brace,mirror,amplitude=6pt},
           apply style/.expand once=\pmdraw@drawBraceDrawOptions
       ] (#1-0.17,-0.5) -- (#2+0.17,-0.5)
       node[
           pos=0.5,
           below=6pt,
           apply style/.expand once=\pmdraw@drawBraceNodeOptions
       ] {\(#3\)};% Draw brace on bottom of diagram
   \fi%
}
\let\pmdraw@drawBrace\pmdraw@drawBraceDefault% Draws brace a brace starting from #1 vertex to #2 vertex with label #3, assumes #1<#2

\newcommand{\pmdraw@drawDotsDrawOptions}{}% Draw options for dots between bricks
\newcommand{\pmdraw@drawDotsNodeOptions}{}% Node options for dots between bricks
\newcommand{\pmdraw@drawDotsDefault}[2]{% Draws dots between bricks at (#1,#2) - DEFAULT
   \draw[apply style/.expand once=\pmdraw@drawDotsDrawOptions] (#1,#2) node[apply style/.expand once=\pmdraw@drawDotsNodeOptions] {\(\dots\)};%
}
\let\pmdraw@drawDots\pmdraw@drawDotsDefault% Draws dots between bricks at (#1,#2)

\newcommand{\pmdraw@drawEdgeDrawOptions}{}% Draw options for edge

\newcommand{\pmdraw@drawLabelBDrawOptions}{}% Draw options for label of a vertex in bottom row
\newcommand{\pmdraw@drawLabelBNodeOptions}{}% Node options for label of a vertex in bottom row
\newcommand{\pmdraw@drawLabelBottomDefault}[3]{% For bottom row, draws the label #3 for a vertex at (#1,#2) - DEFAULT
   \draw[apply style/.expand once=\pmdraw@drawLabelBDrawOptions] (#1,#2) node[below=6pt,apply style/.expand once=\pmdraw@drawLabelBNodeOptions] {\(#3'\)};%
}
\let\pmdraw@drawLabelBottom\pmdraw@drawLabelBottomDefault% For bottom row, draws the label #3 for a vertex at (#1,#2)

\newcommand{\pmdraw@drawLabelTDrawOptions}{}% Draw options for label of a vertex in top row
\newcommand{\pmdraw@drawLabelTNodeOptions}{}% Node options for label of a vertex in top row
\newcommand{\pmdraw@drawLabelTopDefault}[3]{% For top row, draws the label #3 for a vertex at (#1,#2) - DEFAULT
   \draw[apply style/.expand once=\pmdraw@drawLabelTDrawOptions] (#1,#2) node[above=6pt,apply style/.expand once=\pmdraw@drawLabelTNodeOptions] {\(#3\)};%
}
\let\pmdraw@drawLabelTop\pmdraw@drawLabelTopDefault% For top row, draws the label #3 for a vertex at (#1,#2)

\newcommand{\pmdraw@drawLedgesDrawOptions}{}% Draw options for lower non-transversal edges
\newcommand{\pmdraw@drawLedgesDrawOptionsDefault}{}% Default draw options for lower non-transversal edges
\newcommand{\pmdraw@drawLedgesDrawDefault}[2]{% Draws lower non-transversal edge from #1 vertex to #2 vertex, assumes #1<#2 - DEFAULT
   \draw[apply style/.expand once=\pmdraw@drawLedgesDrawOptionsDefault,apply style/.expand once=\pmdraw@drawLedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#1,0) arc (180:90:\pmdraw{edgeHeight});% Draw left arch
   \draw[apply style/.expand once=\pmdraw@drawLedgesDrawOptionsDefault,apply style/.expand once=\pmdraw@drawLedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#1+\pmdraw{edgeHeight},\pmdraw{edgeHeight}) -- (#2-\pmdraw{edgeHeight},\pmdraw{edgeHeight});% Draw straight line
   \draw[apply style/.expand once=\pmdraw@drawLedgesDrawOptionsDefault,apply style/.expand once=\pmdraw@drawLedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#2-\pmdraw{edgeHeight},\pmdraw{edgeHeight}) arc (90:0:\pmdraw{edgeHeight});% Draw right arc
   \renewcommand{\pmdraw@drawEdgeDrawOptions}{}% Reset draw options for edge
}
\let\pmdraw@drawLedgesDraw\pmdraw@drawLedgesDrawDefault% Draws lower non-transversal edge from #1 vertex to #2 vertex, assumes #1<#2

\newcommand{\pmdraw@drawNoLabelBa}{-1}% 1st vertex to skip label in bottom row
\newcommand{\pmdraw@drawNoLabelBb}{-1}% 2nd vertex to skip label in bottom row
\newcommand{\pmdraw@drawNoLabelBc}{-1}% 3rd vertex to skip label in bottom row
\newcommand{\pmdraw@drawNoLabelBd}{-1}% 4th vertex to skip label in bottom row
\newcommand{\pmdraw@drawNoLabelBe}{-1}% 5th vertex to skip label in bottom row
\newcommand{\pmdraw@drawNoLabelBf}{-1}% 6th vertex to skip label in bottom row
\newcommand{\pmdraw@drawNoLabelBg}{-1}% 7th vertex to skip label in bottom row
\newcommand{\pmdraw@drawNoLabelBh}{-1}% 8th vertex to skip label in bottom row
\newcommand{\pmdraw@drawNoLabelBi}{-1}% 9th vertex to skip label in bottom row
\newcommand{\pmdraw@drawNoLabelTa}{-1}% 1st vertex to skip label in top row
\newcommand{\pmdraw@drawNoLabelTb}{-1}% 2nd vertex to skip label in top row
\newcommand{\pmdraw@drawNoLabelTc}{-1}% 3rd vertex to skip label in top row
\newcommand{\pmdraw@drawNoLabelTd}{-1}% 4th vertex to skip label in top row
\newcommand{\pmdraw@drawNoLabelTe}{-1}% 5th vertex to skip label in top row
\newcommand{\pmdraw@drawNoLabelTf}{-1}% 6th vertex to skip label in top row
\newcommand{\pmdraw@drawNoLabelTg}{-1}% 7th vertex to skip label in top row
\newcommand{\pmdraw@drawNoLabelTh}{-1}% 8th vertex to skip label in top row
\newcommand{\pmdraw@drawNoLabelTi}{-1}% 9th vertex to skip label in top row

\newcommand{\pmdraw@drawNoVertexBa}{-1}% 1st vertex to skip in bottom row
\newcommand{\pmdraw@drawNoVertexBb}{-1}% 2nd vertex to skip in bottom row
\newcommand{\pmdraw@drawNoVertexBc}{-1}% 3rd vertex to skip in bottom row
\newcommand{\pmdraw@drawNoVertexBd}{-1}% 4th vertex to skip in bottom row
\newcommand{\pmdraw@drawNoVertexBe}{-1}% 5th vertex to skip in bottom row
\newcommand{\pmdraw@drawNoVertexBf}{-1}% 6th vertex to skip in bottom row
\newcommand{\pmdraw@drawNoVertexBg}{-1}% 7th vertex to skip in bottom row
\newcommand{\pmdraw@drawNoVertexBh}{-1}% 8th vertex to skip in bottom row
\newcommand{\pmdraw@drawNoVertexBi}{-1}% 9th vertex to skip in bottom row
\newcommand{\pmdraw@drawNoVertexTa}{-1}% 1st vertex to skip in top row
\newcommand{\pmdraw@drawNoVertexTb}{-1}% 2nd vertex to skip in top row
\newcommand{\pmdraw@drawNoVertexTc}{-1}% 3rd vertex to skip in top row
\newcommand{\pmdraw@drawNoVertexTd}{-1}% 4th vertex to skip in top row
\newcommand{\pmdraw@drawNoVertexTe}{-1}% 5th vertex to skip in top row
\newcommand{\pmdraw@drawNoVertexTf}{-1}% 6th vertex to skip in top row
\newcommand{\pmdraw@drawNoVertexTg}{-1}% 7th vertex to skip in top row
\newcommand{\pmdraw@drawNoVertexTh}{-1}% 8th vertex to skip in top row
\newcommand{\pmdraw@drawNoVertexTi}{-1}% 9th vertex to skip in top row

\newcommand{\pmdraw@drawTedgesDrawOptions}{}% Draw options for transversal edges
\newcommand{\pmdraw@drawTedgesDrawOptionsDefault}{}% Default draw options for transversal edges
\newcommand{\pmdraw@drawTedgesDrawDefault}[2]{% Draws transversal edge from #1 vertex in top row to #2 vertex in bottom row - DEFAULT
   \ifnum\pmdraw@ifTedgeHorizontal=0% If drawing a straight line edge
       \draw[apply style/.expand once=\pmdraw@drawTedgesDrawOptionsDefault,apply style/.expand once=\pmdraw@drawTedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#1,\pmdraw@rowSep) -- (#2,0);% Draw straight line
   \else% If transversal edge is drawn horizontally
       \ifnum#1>#2% If edge goes from top right to bottom left
           \draw[apply style/.expand once=\pmdraw@drawTedgesDrawOptionsDefault,apply style/.expand once=\pmdraw@drawTedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#2,0) arc (180:90:\pmdraw{Tlevel});% Draw bottom arch
           \draw[apply style/.expand once=\pmdraw@drawTedgesDrawOptionsDefault,apply style/.expand once=\pmdraw@drawTedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#2+\pmdraw{Tlevel},\pmdraw{Tlevel}) -- (#1-\pmdraw@rowSep+\pmdraw{Tlevel}, \pmdraw{Tlevel});% Draw straight line
           \draw[apply style/.expand once=\pmdraw@drawTedgesDrawOptionsDefault,apply style/.expand once=\pmdraw@drawTedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#1-\pmdraw@rowSep+\pmdraw{Tlevel},\pmdraw{Tlevel}) arc (270:360:{\pmdraw@rowSep-\pmdraw{Tlevel}});% Draw top arc
       \else% If edge goes from top left to bottom right
           \draw[apply style/.expand once=\pmdraw@drawTedgesDrawOptionsDefault,apply style/.expand once=\pmdraw@drawTedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#2,0) arc (0:90:\pmdraw{Tlevel});% Draw bottom arch
           \draw[apply style/.expand once=\pmdraw@drawTedgesDrawOptionsDefault,apply style/.expand once=\pmdraw@drawTedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#2-\pmdraw{Tlevel},\pmdraw{Tlevel}) -- (#1+\pmdraw@rowSep-\pmdraw{Tlevel}, \pmdraw{Tlevel});% Draw straight line
           \draw[apply style/.expand once=\pmdraw@drawTedgesDrawOptionsDefault,apply style/.expand once=\pmdraw@drawTedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#1+\pmdraw@rowSep-\pmdraw{Tlevel},\pmdraw{Tlevel}) arc (270:180:{\pmdraw@rowSep-\pmdraw{Tlevel}});% Draw top arc
       \fi%
       \renewcommand{\pmdraw@ifTedgeHorizontal}{0}% Reset flag to default
   \fi%
   \renewcommand{\pmdraw@drawEdgeDrawOptions}{}% Reset draw options for edge
}
\let\pmdraw@drawTedgesDraw\pmdraw@drawTedgesDrawDefault% Draws transversal edge from #1 vertex in top row to #2 vertex in bottom row

\newcommand{\pmdraw@drawUedgesDrawOptions}{}% Draw options for upper non-transversal edges
\newcommand{\pmdraw@drawUedgesDrawOptionsDefault}{}% Default draw options for upper non-transversal edges
\newcommand{\pmdraw@drawUedgesDrawDefault}[2]{% Draws upper non-transversal edge from #1 vertex to #2 vertex, assumes #1<#2 - DEFAULT
   \draw[apply style/.expand once=\pmdraw@drawUedgesDrawOptionsDefault,apply style/.expand once=\pmdraw@drawUedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#1,\pmdraw@rowSep) arc (180:270:\pmdraw{edgeHeight});% Draw left arch
   \draw[apply style/.expand once=\pmdraw@drawUedgesDrawOptionsDefault,apply style/.expand once=\pmdraw@drawUedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#1+\pmdraw{edgeHeight},\pmdraw@rowSep-\pmdraw{edgeHeight}) -- (#2-\pmdraw{edgeHeight},\pmdraw@rowSep-\pmdraw{edgeHeight});% Draw straight line
   \draw[apply style/.expand once=\pmdraw@drawUedgesDrawOptionsDefault,apply style/.expand once=\pmdraw@drawUedgesDrawOptions,apply style/.expand once=\pmdraw@drawEdgeDrawOptions] (#2-\pmdraw{edgeHeight},\pmdraw@rowSep-\pmdraw{edgeHeight}) arc (270:360:\pmdraw{edgeHeight});% Draw right arc
   \renewcommand{\pmdraw@drawEdgeDrawOptions}{}% Reset draw options for edge
}
\let\pmdraw@drawUedgesDraw\pmdraw@drawUedgesDrawDefault% Draws upper non-transversal edge from #1 vertex to #2 vertex, assumes #1<#2

\newcommand{\pmdraw@drawVertexOptions}{}% Draw options for vertices
\newcommand{\pmdraw@drawVertexOptionsDefault}{}% Default draw options for vertices
\newcommand{\pmdraw@drawVertexDefault}[2]{% Draws a vertex at (#1,#2) - Default
   \fill[apply style/.expand once=\pmdraw@drawVertexOptionsDefault,apply style/.expand once=\pmdraw@drawVertexOptions] (#1,#2) circle (.17);%
}
\let\pmdraw@drawVertex\pmdraw@drawVertexDefault% Draws a vertex at (#1,#2)

\newcommand{\pmdraw@edgeUncover}{1-}% Sets the uncover options of edge
\newcommand{\pmdraw@edgesAddedUncover}{1-}% Sets the uncover options of added edges
\newcommand{\pmdraw@edgesUncover}{1-}% Sets the uncover options of edges

\newcommand{\pmdraw@hookAfterBrick}{}% Hook after drawing a brick
\newcommand{\pmdraw@hookAfterDiagram}{}% Hook after drawing a diagram
\newcommand{\pmdraw@hookBeforeBrick}{}% Hook before drawing a brick
\newcommand{\pmdraw@hookBeforeDiagram}{}% Hook before drawing a diagram

\newcommand{\pmdraw@ifDiagWDots}{0}% Boolean if drawing a diagram with dots
\newcommand{\pmdraw@ifEdgesFirst}{0}% Boolean if drawing edges before vertices
\newcommand{\pmdraw@ifGrid}{0}% Boolean if displaying helper grid
\newcommand{\pmdraw@ifLabelsB}{0}% Boolean if displaying labels for vertices in bottom row
\newcommand{\pmdraw@ifLabelsT}{0}% Boolean if displaying labels for vertices in top row
\newcommand{\pmdraw@ifProdDiag}{0}% Boolean if drawing a product diagram
\newcommand{\pmdraw@ifTedgesFirst}{0}% Boolean if drawing transversal edges before non-transversal edges
\newcommand{\pmdraw@ifTedgeHorizontal}{0}% Boolean if transversal edge is drawn horizontally

\newcommand{\pmdraw@NTedgesHeight}{-1000}% Height of non-transversal edges if manually set, a value of -1000 sets height automatically

\newcommand{\pmdraw@reset}{% Resets user keys and other flags to default values after drawing diagram
   \renewcommand{\pmdraw@diagSep}{1}% Resets vertical space between product diagrams
   \renewcommand{\pmdraw@drawAedgesOptions}{}% Resets draw options for added edges in product diagram
   \let\pmdraw@drawDots\pmdraw@drawDotsDefault% Resets drawing of dots between bricks
   \renewcommand{\pmdraw@edgesAddedUncover}{1-}% Resets the uncover options of added edges
   \renewcommand{\pmdraw@hookAfterDiagram}{}% Clears hook after drawing a diagram
   \renewcommand{\pmdraw@hookBeforeDiagram}{}% Clears hook before drawing a diagram
   \renewcommand{\pmdraw@ifGrid}{0}% Hides grid
   \renewcommand{\pmdraw@ifDiagWDots}{0}% Reset if drawing a diagram with dots
   \renewcommand{\pmdraw@rowSep}{2}% Resets vertical separation between rows of vertices in brick
   \renewcommand{\pmdraw@tikz}{}% Resets tikz options
   \renewcommand{\pmdraw@vertexSep}{0}% Resets vertical space between product diagrams
   \setcounter{pmdraw@blankB}{0}% Resets number of blank vertices in bottom row to the left of brick
   \setcounter{pmdraw@blankT}{0}% Resets number of blank vertices in top row to the left of brick
   \setcounter{pmdraw@bottomShift}{0}% Resets shift on right end of bottom row of brick
   \setcounter{pmdraw@topShift}{0}% Resets shift on right end of top row of brick
   \setcounter{pmdraw@ifDiagWDotsFirst}{1}% Reset if drawing first brick of diagram
   \setcounter{pmdraw@ifEdgesAdded}{0}% Resets boolean if hiding added edges
}

\newcommand{\pmdraw@rowSep}{2}% Vertical separation between rows of vertices in brick

\newcommand{\pmdraw@tikz}{}% Tikz options

\newcommand{\pmdraw@verticesBottomUncover}{1-}% Sets the uncover options of bottom vertices
\newcommand{\pmdraw@verticesTopUncover}{1-}% Sets the uncover options of top vertices

\newcommand{\pmdraw@vertexSep}{0}% Vertical separation between bottom row of top diagram and top row of bottom diagram in product diagram not for added edges

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                        %
%  Counters                                              %
%   - loosely ordered alphabetically                     %
%   - includes default values where appropriate          %
%                                                        %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\newcounter{pmdraw@blankB}% Number of blank vertices in bottom row to the left of brick
\newcounter{pmdraw@blankT}% Number of blank vertices in top row to the left of brick

\newcounter{pmdraw@bottomTotal}% Size of bottom row of brick
\newcounter{pmdraw@bottomShift}% Shift on right end of bottom row of brick

\newcounter{pmdraw@braceL}% Left starting vertex of brace
\newcounter{pmdraw@braceR}% Right terminating vertex of brace

\newcounter{pmdraw@brickShift}% Shift required for bricks after dots in diagram with dots

\newcounter{pmdraw@degreeB}% Degree (number of vertices) of bottom row of brick
\newcounter{pmdraw@degreeT}% Degree (number of vertices) of top row of brick

\newcounter{pmdraw@ifDiagWDotsFirst}% In drawing with dots, boolean if drawing first brick of diagram
\setcounter{pmdraw@ifDiagWDotsFirst}{1}

\newcounter{pmdraw@ifEdge}% Boolean if hiding edge
\setcounter{pmdraw@ifEdge}{0}
\newcounter{pmdraw@ifEdgesAdded}% Boolean if hiding added edges
\setcounter{pmdraw@ifEdgesAdded}{0}
\newcounter{pmdraw@ifEdges}% Boolean if hiding edges
\setcounter{pmdraw@ifEdges}{0}

\newcounter{pmdraw@ifVerticesBottom}% Boolean if hiding bottom row of vertices
\setcounter{pmdraw@ifVerticesBottom}{0}
\newcounter{pmdraw@ifVerticesTop}% Boolean if hiding top row of vertices
\setcounter{pmdraw@ifVerticesTop}{0}

\newcounter{pmdraw@labelStartB}% Starting value of labels of vertices in bottom row
\setcounter{pmdraw@labelStartB}{1}
\newcounter{pmdraw@labelStartT}% Starting value of labels of vertices in top row
\setcounter{pmdraw@labelStartT}{1}

\newcounter{pmdraw@NTlevel}% Level corresponding to a height for a non-transversal edge

\newcounter{pmdraw@topTotal}% Size of top row of brick
\newcounter{pmdraw@topShift}% Shift on right end of top row of brick

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                        %
%  Keys for bricks                                       %
%   - ordered as per manual                              %
%                                                        %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% To pass draw options to \draw command
% Verbatim copy from:
% https://tex.stackexchange.com/a/64237
\tikzset{apply style/.code={\tikzset{#1}}}

\define@key{pmdraw@brick}{degree}{% Sets degree (number of vertices per row) of diagram
   \setcounter{pmdraw@degreeB}{#1}% Sets degree (number of vertices per row) for bottom row
   \setcounter{pmdraw@degreeT}{#1}% Sets degree (number of vertices per row) for top row
}
\define@key{pmdraw@brickDefault}{degree}{% Sets default degree (number of vertices per row) of diagram
   \setkeys{pmdraw@brick}{%
       \savevalue{degree bottom}=#1%
   }%
   \setkeys{pmdraw@brick}{%
       \savevalue{degree top}=#1%
   }%
}
\define@key{pmdraw@brick}{degree bottom}{% Sets degree (number of vertices per row) for bottom row
   \setcounter{pmdraw@degreeB}{#1}%
}
\define@key{pmdraw@brickDefault}{degree bottom}{% Sets default degree (number of vertices per row) for bottom row
   \setkeys{pmdraw@brick}{%
       \savevalue{degree bottom}=#1%
   }%
}
\define@key{pmdraw@brick}{degree top}{% Sets degree (number of vertices per row) for top row
   \setcounter{pmdraw@degreeT}{#1}%
}
\define@key{pmdraw@brickDefault}{degree top}{% Sets default degree (number of vertices per row) for top row
   \setkeys{pmdraw@brick}{%
       \savevalue{degree top}=#1%
   }%
}

\define@key{pmdraw@brick}{blank bottom}{% Sets the number of blank vertices on left of bottom row
   \setcounter{pmdraw@blankB}{#1}%
}
\define@key{pmdraw@brickDefault}{blank bottom}{% Sets the default number of blank vertices on left of bottom row
   \setkeys{pmdraw@brick}{%
       \savevalue{blank bottom}=#1%
   }%
}
\define@key{pmdraw@brick}{blank top}{% Sets the number of blank vertices on left of top row
   \setcounter{pmdraw@blankT}{#1}%
}
\define@key{pmdraw@brickDefault}{blank top}{% Sets the default number of blank vertices on left of top row
   \setkeys{pmdraw@brick}{%
       \savevalue{blank top}=#1%
   }%
}

\define@key{pmdraw@brick}{row sep}{% Sets vertical separation between rows of vertices in brick
   \renewcommand{\pmdraw@rowSep}{#1}%
}
\define@key{pmdraw@brickDefault}{row sep}{% Sets default vertical separation between rows of vertices in brick
   \setkeys{pmdraw@brick}{%
       \savevalue{row sep}=#1%
   }%
}

\define@key{pmdraw@brick}{vertices}{% Sets the draw options of vertices
   \renewcommand{\pmdraw@drawVertexOptions}{#1}%
}
\define@key{pmdraw@brick}{verticesDefault}{% Sets the default draw options of vertices
   \renewcommand{\pmdraw@drawVertexOptionsDefault}{#1}%
}
\define@key{pmdraw@brickDefault}{vertices}{% Sets the default draw options of vertices
   \setkeys{pmdraw@brick}{%
       \savevalue{verticesDefault}=#1%
   }%
}
\define@key{pmdraw@brick}{no vertex bottom 1}{% Sets 1st vertex to skip in bottom row
   \renewcommand{\pmdraw@drawNoVertexBa}{#1}%
}
\define@key{pmdraw@brickDefault}{no vertex bottom 1}{% Sets default 1st vertex to skip in bottom row
   \setkeys{pmdraw@brick}{%
       \savevalue{no vertex bottom 1}=#1%
   }%
}
\define@key{pmdraw@brick}{no vertex bottom 2}{% Sets 2nd vertex to skip in bottom row
   \renewcommand{\pmdraw@drawNoVertexBb}{#1}%
}
\define@key{pmdraw@brickDefault}{no vertex bottom 2}{% Sets default 2nd vertex to skip in bottom row
   \setkeys{pmdraw@brick}{%
       \savevalue{no vertex bottom 2}=#1%
   }%
}
\define@key{pmdraw@brick}{no vertex bottom 3}{% Sets 3rd vertex to skip in bottom row
   \renewcommand{\pmdraw@drawNoVertexBc}{#1}%
}
\define@key{pmdraw@brickDefault}{no vertex bottom 3}{% Sets default 3rd vertex to skip in bottom row
   \setkeys{pmdraw@brick}{%
       \savevalue{no vertex bottom 3}=#1%
   }%
}
\define@key{pmdraw@brick}{no vertex bottom 4}{% Sets 4th vertex to skip in bottom row
   \renewcommand{\pmdraw@drawNoVertexBd}{#1}%
}
\define@key{pmdraw@brickDefault}{no vertex bottom 4}{% Sets default 4th vertex to skip in bottom row
   \setkeys{pmdraw@brick}{%
       \savevalue{no vertex bottom 4}=#1%
   }%
}
\define@key{pmdraw@brick}{no vertex bottom 5}{% Sets 5th vertex to skip in bottom row
   \renewcommand{\pmdraw@drawNoVertexBe}{#1}%
}
\define@key{pmdraw@brickDefault}{no vertex bottom 5}{% Sets default 5th vertex to skip in bottom row
   \setkeys{pmdraw@brick}{%
       \savevalue{no vertex bottom 5}=#1%
   }%
}
\define@key{pmdraw@brick}{no vertex bottom 6}{% Sets 6th vertex to skip in bottom row
   \renewcommand{\pmdraw@drawNoVertexBf}{#1}%
}
\define@key{pmdraw@brickDefault}{no vertex bottom 6}{% Sets default 6th vertex to skip in bottom row
   \setkeys{pmdraw@brick}{%
       \savevalue{no vertex bottom 6}=#1%
   }%
}
\define@key{pmdraw@brick}{no vertex bottom 7}{% Sets 7th vertex to skip in bottom row
   \renewcommand{\pmdraw@drawNoVertexBg}{#1}%
}
\define@key{pmdraw@brickDefault}{no vertex bottom 7}{% Sets default 7th vertex to skip in bottom row
   \setkeys{pmdraw@brick}{%
       \savevalue{no vertex bottom 7}=#1%
   }%
}
\define@key{pmdraw@brick}{no vertex bottom 8}{% Sets 8th vertex to skip in bottom row
   \renewcommand{\pmdraw@drawNoVertexBh}{#1}%
}
\define@key{pmdraw@brickDefault}{no vertex bottom 8}{% Sets default 8th vertex to skip in bottom row
   \setkeys{pmdraw@brick}{%
       \savevalue{no vertex bottom 8}=#1%
   }%
}
\define@key{pmdraw@brick}{no vertex bottom 9}{% Sets 9th vertex to skip in bottom row
   \renewcommand{\pmdraw@drawNoVertexBi}{#1}%
}
\define@key{pmdraw@brickDefault}{no vertex bottom 9}{% Sets default 9th vertex to skip in bottom row
   \setkeys{pmdraw@brick}{%
       \savevalue{no vertex bottom 9}=#1%
   }%
}
\define@key{pmdraw@brick}{no vertex top 1}{% Sets 1st vertex to skip in top row
   \renewcommand{\pmdraw@drawNoVertexTa}{#1}%
}
\define@key{pmdraw@brickDefault}{no vertex top 1}{% Sets default 1st vertex to skip in top row
   \setkeys{pmdraw@brick}{%
       \savevalue{no vertex top 1}=#1%
   }%
}
\define@key{pmdraw@brick}{no vertex top 2}{% Sets 2nd vertex to skip in top row
   \renewcommand{\pmdraw@drawNoVertexTb}{#1}%
}
\define@key{pmdraw@brickDefault}{no vertex top 2}{% Sets default 2nd vertex to skip in top row
   \setkeys{pmdraw@brick}{%
       \savevalue{no vertex top 2}=#1%
   }%
}
\define@key{pmdraw@brick}{no vertex top 3}{% Sets 3rd vertex to skip in top row
   \renewcommand{\pmdraw@drawNoVertexTc}{#1}%
}
\define@key{pmdraw@brickDefault}{no vertex top 3}{% Sets default 3rd vertex to skip in top row
   \setkeys{pmdraw@brick}{%
       \savevalue{no vertex top 3}=#1%
   }%
}
\define@key{pmdraw@brick}{no vertex top 4}{% Sets 4th vertex to skip in top row
   \renewcommand{\pmdraw@drawNoVertexTd}{#1}%
}
\define@key{pmdraw@brickDefault}{no vertex top 4}{% Sets default 4th vertex to skip in top row
   \setkeys{pmdraw@brick}{%
       \savevalue{no vertex top 4}=#1%
   }%
}
\define@key{pmdraw@brick}{no vertex top 5}{% Sets 5th vertex to skip in top row
   \renewcommand{\pmdraw@drawNoVertexTe}{#1}%
}
\define@key{pmdraw@brickDefault}{no vertex top 5}{% Sets default 5th vertex to skip in top row
   \setkeys{pmdraw@brick}{%
       \savevalue{no vertex top 5}=#1%
   }%
}
\define@key{pmdraw@brick}{no vertex top 6}{% Sets 6th vertex to skip in top row
   \renewcommand{\pmdraw@drawNoVertexTf}{#1}%
}
\define@key{pmdraw@brickDefault}{no vertex top 6}{% Sets default 6th vertex to skip in top row
   \setkeys{pmdraw@brick}{%
       \savevalue{no vertex top 6}=#1%
   }%
}
\define@key{pmdraw@brick}{no vertex top 7}{% Sets 7th vertex to skip in top row
   \renewcommand{\pmdraw@drawNoVertexTg}{#1}%
}
\define@key{pmdraw@brickDefault}{no vertex top 7}{% Sets default 7th vertex to skip in top row
   \setkeys{pmdraw@brick}{%
       \savevalue{no vertex top 7}=#1%
   }%
}
\define@key{pmdraw@brick}{no vertex top 8}{% Sets 8th vertex to skip in top row
   \renewcommand{\pmdraw@drawNoVertexTh}{#1}%
}
\define@key{pmdraw@brickDefault}{no vertex top 8}{% Sets default 8th vertex to skip in top row
   \setkeys{pmdraw@brick}{%
       \savevalue{no vertex top 8}=#1%
   }%
}
\define@key{pmdraw@brick}{no vertex top 9}{% Sets 9th vertex to skip in top row
   \renewcommand{\pmdraw@drawNoVertexTi}{#1}%
}
\define@key{pmdraw@brickDefault}{no vertex top 9}{% Sets default 9th vertex to skip in top row
   \setkeys{pmdraw@brick}{%
       \savevalue{no vertex top 9}=#1%
   }%
}

\define@key{pmdraw@brick}{vertices options}{% Sets the draw command of vertices
   \renewcommand{\pmdraw@drawVertex}[2]{#1}%
}

\define@key{pmdraw@brick}{labels}[1]{% Draws labels for vertices
   \renewcommand{\pmdraw@ifLabelsB}{#1}%
   \renewcommand{\pmdraw@ifLabelsT}{#1}%
}
\define@key{pmdraw@brickDefault}{labels}[1]{% Sets the default drawing labels for vertices
   \setkeys{pmdraw@brick}{%
       \savevalue{labels}=#1%
   }%
}
\define@key{pmdraw@brick}{labels bottom}[1]{% Draws labels for bottom vertices
   \renewcommand{\pmdraw@ifLabelsB}{#1}%
}
\define@key{pmdraw@brickDefault}{labels bottom}[1]{% Sets the default drawing labels for bottom vertices
   \setkeys{pmdraw@brick}{%
       \savevalue{labels bottom}=#1%
   }%
}
\define@key{pmdraw@brick}{labels top}[1]{% Draws labels for top vertices
   \renewcommand{\pmdraw@ifLabelsT}{#1}%
}
\define@key{pmdraw@brickDefault}{labels top}[1]{% Sets the default drawing labels for top vertices
   \setkeys{pmdraw@brick}{%
       \savevalue{labels top}=#1%
   }%
}

\define@key{pmdraw@brick}{labels start}{% Sets starting number for vertex labels
   \setcounter{pmdraw@labelStartT}{#1}%
   \setcounter{pmdraw@labelStartB}{#1}%
}
\define@key{pmdraw@brickDefault}{labels start}{% Sets the default starting number for vertex labels
   \setkeys{pmdraw@brick}{%
       \savevalue{labels start}=#1%
   }%
}
\define@key{pmdraw@brick}{labels bottom start}{% Sets starting number for bottom vertex labels
   \setcounter{pmdraw@labelStartB}{#1}%
}
\define@key{pmdraw@brickDefault}{labels bottom start}{% Sets the default starting number for bottom vertex labels
   \setkeys{pmdraw@brick}{%
       \savevalue{labels bottom start}=#1%
   }%
}
\define@key{pmdraw@brick}{labels top start}{% Sets starting number for top vertex labels
   \setcounter{pmdraw@labelStartT}{#1}%
}
\define@key{pmdraw@brickDefault}{labels top start}{% Sets the default starting number for top vertex labels
   \setkeys{pmdraw@brick}{%
       \savevalue{labels top start}=#1%
   }%
}

\define@key{pmdraw@brick}{no label bottom 1}{% Sets 1st label to skip in bottom row
   \renewcommand{\pmdraw@drawNoLabelBa}{#1}%
}
\define@key{pmdraw@brickDefault}{no label bottom 1}{% Sets the default 1st label to skip in bottom row
   \setkeys{pmdraw@brick}{%
       \savevalue{no label bottom 1}=#1%
   }%
}
\define@key{pmdraw@brick}{no label bottom 2}{% Sets 2nd label to skip in bottom row
   \renewcommand{\pmdraw@drawNoLabelBb}{#1}%
}
\define@key{pmdraw@brickDefault}{no label bottom 2}{% Sets the default 2nd label to skip in bottom row
   \setkeys{pmdraw@brick}{%
       \savevalue{no label bottom 2}=#1%
   }%
}
\define@key{pmdraw@brick}{no label bottom 3}{% Sets 3rd label to skip in bottom row
   \renewcommand{\pmdraw@drawNoLabelBc}{#1}%
}
\define@key{pmdraw@brickDefault}{no label bottom 3}{% Sets the default 3rd label to skip in bottom row
   \setkeys{pmdraw@brick}{%
       \savevalue{no label bottom 3}=#1%
   }%
}
\define@key{pmdraw@brick}{no label bottom 4}{% Sets 4th label to skip in bottom row
   \renewcommand{\pmdraw@drawNoLabelBd}{#1}%
}
\define@key{pmdraw@brickDefault}{no label bottom 4}{% Sets the default 4th label to skip in bottom row
   \setkeys{pmdraw@brick}{%
       \savevalue{no label bottom 4}=#1%
   }%
}
\define@key{pmdraw@brick}{no label bottom 5}{% Sets 5th label to skip in bottom row
   \renewcommand{\pmdraw@drawNoLabelBe}{#1}%
}
\define@key{pmdraw@brickDefault}{no label bottom 5}{% Sets the default 5th label to skip in bottom row
   \setkeys{pmdraw@brick}{%
       \savevalue{no label bottom 5}=#1%
   }%
}
\define@key{pmdraw@brick}{no label bottom 6}{% Sets 6th label to skip in bottom row
   \renewcommand{\pmdraw@drawNoLabelBf}{#1}%
}
\define@key{pmdraw@brickDefault}{no label bottom 6}{% Sets the default 6th label to skip in bottom row
   \setkeys{pmdraw@brick}{%
       \savevalue{no label bottom 6}=#1%
   }%
}
\define@key{pmdraw@brick}{no label bottom 7}{% Sets 7th label to skip in bottom row
   \renewcommand{\pmdraw@drawNoLabelBg}{#1}%
}
\define@key{pmdraw@brickDefault}{no label bottom 7}{% Sets the default 7th label to skip in bottom row
   \setkeys{pmdraw@brick}{%
       \savevalue{no label bottom 7}=#1%
   }%
}
\define@key{pmdraw@brickDefault}{no label bottom 8}{% Sets the default 8th label to skip in bottom row
   \setkeys{pmdraw@brick}{%
       \savevalue{no label bottom 8}=#1%
   }%
}
\define@key{pmdraw@brick}{no label bottom 8}{% Sets 8th label to skip in bottom row
   \renewcommand{\pmdraw@drawNoLabelBh}{#1}%
}
\define@key{pmdraw@brickDefault}{no label bottom 8}{% Sets the default 8th label to skip in bottom row
   \setkeys{pmdraw@brick}{%
       \savevalue{no label bottom 8}=#1%
   }%
}
\define@key{pmdraw@brick}{no label bottom 9}{% Sets 9th label to skip in bottom row
   \renewcommand{\pmdraw@drawNoLabelBi}{#1}%
}
\define@key{pmdraw@brickDefault}{no label bottom 9}{% Sets the default 9th label to skip in bottom row
   \setkeys{pmdraw@brick}{%
       \savevalue{no label bottom 9}=#1%
   }%
}
\define@key{pmdraw@brick}{no label top 1}{% Sets 1st label to skip in top row
   \renewcommand{\pmdraw@drawNoLabelTa}{#1}%
}
\define@key{pmdraw@brickDefault}{no label top 1}{% Sets the default 1st label to skip in top row
   \setkeys{pmdraw@brick}{%
       \savevalue{no label top 1}=#1%
   }%
}
\define@key{pmdraw@brick}{no label top 2}{% Sets 2nd label to skip in top row
   \renewcommand{\pmdraw@drawNoLabelTb}{#1}%
}
\define@key{pmdraw@brickDefault}{no label top 2}{% Sets the default 2nd label to skip in top row
   \setkeys{pmdraw@brick}{%
       \savevalue{no label top 2}=#1%
   }%
}
\define@key{pmdraw@brick}{no label top 3}{% Sets 3rd label to skip in top row
   \renewcommand{\pmdraw@drawNoLabelTc}{#1}%
}
\define@key{pmdraw@brickDefault}{no label top 3}{% Sets the default 3rd label to skip in top row
   \setkeys{pmdraw@brick}{%
       \savevalue{no label top 3}=#1%
   }%
}
\define@key{pmdraw@brick}{no label top 4}{% Sets 4th label to skip in top row
   \renewcommand{\pmdraw@drawNoLabelTd}{#1}%
}
\define@key{pmdraw@brickDefault}{no label top 4}{% Sets the default 4th label to skip in top row
   \setkeys{pmdraw@brick}{%
       \savevalue{no label top 4}=#1%
   }%
}
\define@key{pmdraw@brick}{no label top 5}{% Sets 5th label to skip in top row
   \renewcommand{\pmdraw@drawNoLabelTe}{#1}%
}
\define@key{pmdraw@brickDefault}{no label top 5}{% Sets the default 5th label to skip in top row
   \setkeys{pmdraw@brick}{%
       \savevalue{no label top 5}=#1%
   }%
}
\define@key{pmdraw@brick}{no label top 6}{% Sets 6th label to skip in top row
   \renewcommand{\pmdraw@drawNoLabelTf}{#1}%
}
\define@key{pmdraw@brickDefault}{no label top 6}{% Sets the default 6th label to skip in top row
   \setkeys{pmdraw@brick}{%
       \savevalue{no label top 6}=#1%
   }%
}
\define@key{pmdraw@brick}{no label top 7}{% Sets 7th label to skip in top row
   \renewcommand{\pmdraw@drawNoLabelTg}{#1}%
}
\define@key{pmdraw@brickDefault}{no label top 7}{% Sets the default 7th label to skip in top row
   \setkeys{pmdraw@brick}{%
       \savevalue{no label top 7}=#1%
   }%
}
\define@key{pmdraw@brickDefault}{no label top 8}{% Sets the default 8th label to skip in top row
   \setkeys{pmdraw@brick}{%
       \savevalue{no label top 8}=#1%
   }%
}
\define@key{pmdraw@brick}{no label top 8}{% Sets 8th label to skip in top row
   \renewcommand{\pmdraw@drawNoLabelTh}{#1}%
}
\define@key{pmdraw@brickDefault}{no label top 8}{% Sets the default 8th label to skip in top row
   \setkeys{pmdraw@brick}{%
       \savevalue{no label top 8}=#1%
   }%
}
\define@key{pmdraw@brick}{no label top 9}{% Sets 9th label to skip in top row
   \renewcommand{\pmdraw@drawNoLabelTi}{#1}%
}
\define@key{pmdraw@brickDefault}{no label top 9}{% Sets the default 9th label to skip in top row
   \setkeys{pmdraw@brick}{%
       \savevalue{no label top 9}=#1%
   }%
}

\define@key{pmdraw@brick}{labels bottom draw}{% Sets the draw options for labels of bottom vertices
   \renewcommand{\pmdraw@drawLabelBDrawOptions}{#1}%
}
\define@key{pmdraw@brickDefault}{labels bottom draw}{% Sets the default draw options for labels of bottom vertices
   \setkeys{pmdraw@brick}{%
       \savevalue{labels bottom draw}=#1%
   }%
}
\define@key{pmdraw@brick}{labels bottom node}{% Sets the node options for labels of bottom vertices
   \renewcommand{\pmdraw@drawLabelBNodeOptions}{#1}%
}
\define@key{pmdraw@brickDefault}{labels bottom node}{% Sets the default node options for labels of bottom vertices
   \setkeys{pmdraw@brick}{%
       \savevalue{labels bottom node}=#1%
   }%
}
\define@key{pmdraw@brick}{labels top draw}{% Sets the draw options for labels of top vertices
   \renewcommand{\pmdraw@drawLabelTDrawOptions}{#1}%
}
\define@key{pmdraw@brickDefault}{labels top draw}{% Sets the default draw options for labels of top vertices
   \setkeys{pmdraw@brick}{%
       \savevalue{labels top draw}=#1%
   }%
}
\define@key{pmdraw@brick}{labels top node}{% Sets the node options for labels of top vertices
   \renewcommand{\pmdraw@drawLabelTNodeOptions}{#1}%
}
\define@key{pmdraw@brickDefault}{labels top node}{% Sets the default node options for labels of top vertices
   \setkeys{pmdraw@brick}{%
       \savevalue{labels top node}=#1%
   }%
}

\define@key{pmdraw@brick}{labels bottom options}{% Sets the draw command of labels of bottom vertices
   \renewcommand{\pmdraw@drawLabelBottom}[3]{#1}%
}
\define@key{pmdraw@brick}{labels top options}{% Sets the draw command of labels of top vertices
   \renewcommand{\pmdraw@drawLabelTop}[3]{#1}%
}

\define@key{pmdraw@brick}{no dots}[1]{% Does not draw dots in bricks
   \setcounter{pmdraw@ifDiagWDotsFirst}{#1}%
}

\define@key{pmdraw@brick}{dots draw}{% Sets the draw options for drawing of dots
   \renewcommand{\pmdraw@drawDotsDrawOptions}{#1}%
}
\define@key{pmdraw@brickDefault}{dots draw}{% Sets the default draw options for drawing of dots
   \setkeys{pmdraw@brick}{%
       \savevalue{dots draw}=#1%
   }%
}
\define@key{pmdraw@brick}{dots node}{% Sets the node options for drawing of dots
   \renewcommand{\pmdraw@drawDotsNodeOptions}{#1}%
}
\define@key{pmdraw@brickDefault}{dots node}{% Sets the default node options for drawing of dots
   \setkeys{pmdraw@brick}{%
       \savevalue{dots node}=#1%
   }%
}

\define@key{pmdraw@brick}{vertices bottom phantom}[1]{% Does not draw bottom vertices
   \setcounter{pmdraw@ifVerticesBottom}{#1}%
}
\define@key{pmdraw@brickDefault}{vertices bottom phantom}{% Sets the default to not draw bottom vertices
   \setkeys{pmdraw@brick}{%
       \savevalue{vertices bottom phantom}=#1%
   }%
}
\define@key{pmdraw@brick}{vertices top phantom}[1]{% Does not draw top vertices
   \setcounter{pmdraw@ifVerticesTop}{#1}%
}
\define@key{pmdraw@brickDefault}{vertices top phantom}{% Sets the default to not draw top vertices
   \setkeys{pmdraw@brick}{%
       \savevalue{vertices top phantom}=#1%
   }%
}

\define@key{pmdraw@brick}{vertices bottom uncover}{% Sets the uncover options of bottom vertices
   \renewcommand{\pmdraw@verticesBottomUncover}{#1}%
}
\define@key{pmdraw@brickDefault}{vertices bottom uncover}{% Sets the default uncover options of bottom vertices
   \setkeys{pmdraw@brick}{%
       \savevalue{vertices bottom uncover}=#1%
   }%
}
\define@key{pmdraw@brick}{vertices top uncover}{% Sets the uncover options of top vertices
   \renewcommand{\pmdraw@verticesTopUncover}{#1}%
}
\define@key{pmdraw@brickDefault}{vertices top uncover}{% Sets the default uncover options of top vertices
   \setkeys{pmdraw@brick}{%
       \savevalue{vertices top uncover}=#1%
   }%
}

\define@key{pmdraw@brick}{levels}[1]{% Sets number of horizontal levels for non-transversal edges and evenly spaces them
   \tikzmath{%
       \pmdraw{edgeSepU} = (0.5*\pmdraw@rowSep)/(#1 + 1);% Calculates vertical separation between each edge
       \pmdraw{edgeSepL} = \pmdraw{edgeSepU};% Calculates vertical separation between each edge
   }%
}
\define@key{pmdraw@brickDefault}{levels}{% Sets the default number of horizontal levels for non-transversal edges and evenly spaces them
   \setkeys{pmdraw@brick}{%
       \savevalue{levels}=#1%
   }%
}
\define@key{pmdraw@brick}{levels bottom}{% Sets number of horizontal levels for lower non-transversal edges and evenly spaces them
   \tikzmath{%
       \pmdraw{edgeSepL} = (0.5*\pmdraw@rowSep)/(#1 + 1);% Calculates vertical separation between each edge
   }%
}
\define@key{pmdraw@brickDefault}{levels bottom}{% Sets the default number of horizontal levels for lower non-transversal edges and evenly spaces them
   \setkeys{pmdraw@brick}{%
       \savevalue{levels bottom}=#1%
   }%
}
\define@key{pmdraw@brick}{levels top}{% Sets number of horizontal levels for upper non-transversal edges and evenly spaces them
   \tikzmath{%
       \pmdraw{edgeSepU} = (0.5*\pmdraw@rowSep)/(#1 + 1);% Calculates vertical separation between each edge
   }%
}
\define@key{pmdraw@brickDefault}{levels top}{% Sets the default number of horizontal levels for upper non-transversal edges and evenly spaces them
   \setkeys{pmdraw@brick}{%
       \savevalue{levels top}=#1%
   }%
}

\define@key{pmdraw@brick}{levels sep}{% Sets vertical separation of horizontal levels for non-transversal edges
   \tikzmath{%
       \pmdraw{edgeSepU} = #1;%
       \pmdraw{edgeSepL} = \pmdraw{edgeSepU};%
   }%
}
\define@key{pmdraw@brickDefault}{levels sep}{% Sets the default vertical separation of horizontal levels for non-transversal edges
   \setkeys{pmdraw@brick}{%
       \savevalue{levels sep}=#1%
   }%
}
\define@key{pmdraw@brick}{levels sep bottom}{% Sets vertical separation of lower horizontal levels for non-transversal edges
   \tikzmath{%
       \pmdraw{edgeSepL} = #1;%
   }%
}
\define@key{pmdraw@brickDefault}{levels sep bottom}{% Sets the default vertical separation of lower horizontal levels for non-transversal edges
   \setkeys{pmdraw@brick}{%
       \savevalue{levels sep bottom}=#1%
   }%
}
\define@key{pmdraw@brick}{levels sep top}{% Sets vertical separation of upper horizontal levels for non-transversal edges
   \tikzmath{%
       \pmdraw{edgeSepU} = #1;%
   }%
}
\define@key{pmdraw@brickDefault}{levels sep top}{% Sets the default vertical separation of upper horizontal levels for non-transversal edges
   \setkeys{pmdraw@brick}{%
       \savevalue{levels sep top}=#1%
   }%
}

\define@key{pmdraw@brick}{edges}{% Sets the draw options of all edges
   \renewcommand{\pmdraw@drawUedgesDrawOptions}{#1}%
   \renewcommand{\pmdraw@drawLedgesDrawOptions}{#1}%
   \renewcommand{\pmdraw@drawTedgesDrawOptions}{#1}%
}
\define@key{pmdraw@brick}{edgesDefault}{% Sets the default draw options of all edges
   \renewcommand{\pmdraw@drawUedgesDrawOptionsDefault}{#1}%
   \renewcommand{\pmdraw@drawLedgesDrawOptionsDefault}{#1}%
   \renewcommand{\pmdraw@drawTedgesDrawOptionsDefault}{#1}%
}
\define@key{pmdraw@brickDefault}{edges}{% Sets the default draw options of all edges
   \setkeys{pmdraw@brick}{%
       \savevalue{edgesDefault}=#1%
   }%
}
\define@key{pmdraw@brick}{edges non-transversal}{% Sets the draw options of non-transversal edges
   \renewcommand{\pmdraw@drawUedgesDrawOptions}{#1}%
   \renewcommand{\pmdraw@drawLedgesDrawOptions}{#1}%
}
\define@key{pmdraw@brick}{edges non-transversalDefault}{% Sets the default draw options of non-transversal edges
   \renewcommand{\pmdraw@drawUedgesDrawOptionsDefault}{#1}%
   \renewcommand{\pmdraw@drawLedgesDrawOptionsDefault}{#1}%
}
\define@key{pmdraw@brickDefault}{edges non-transversal}{% Sets the default draw options of non-transversal edges
   \setkeys{pmdraw@brick}{%
       \savevalue{edges non-transversalDefault}=#1%
   }%
}
\define@key{pmdraw@brick}{edges upper}{% Sets the draw options of upper non-transversal edges
   \renewcommand{\pmdraw@drawUedgesDrawOptions}{#1}%
}
\define@key{pmdraw@brick}{edges upperDefault}{% Sets the default draw options of upper non-transversal edges
   \renewcommand{\pmdraw@drawUedgesDrawOptionsDefault}{#1}%
}
\define@key{pmdraw@brickDefault}{edges upper}{% Sets the default draw options of upper non-transversal edges
   \setkeys{pmdraw@brick}{%
       \savevalue{edges upperDefault}=#1%
   }%
}
\define@key{pmdraw@brick}{edges lower}{% Sets the draw options of lower non-transversal edges
   \renewcommand{\pmdraw@drawLedgesDrawOptions}{#1}%
}
\define@key{pmdraw@brick}{edges lowerDefault}{% Sets the defaultdraw options of lower non-transversal edges
   \renewcommand{\pmdraw@drawLedgesDrawOptionsDefault}{#1}%
}
\define@key{pmdraw@brickDefault}{edges lower}{% Sets the default draw options of lower non-transversal edges
   \setkeys{pmdraw@brick}{%
       \savevalue{edges lowerDefault}=#1%
   }%
}
\define@key{pmdraw@brick}{edges transversal}{% Sets the draw options of transversal edges
   \renewcommand{\pmdraw@drawTedgesDrawOptions}{#1}%
}
\define@key{pmdraw@brick}{edges transversalDefault}{% Sets the default draw options of transversal edges
   \renewcommand{\pmdraw@drawTedgesDrawOptionsDefault}{#1}%
}
\define@key{pmdraw@brickDefault}{edges transversal}{% Sets the default draw options of transversal edges
   \setkeys{pmdraw@brick}{%
       \savevalue{edges transversalDefault}=#1%
   }%
}

\define@key{pmdraw@brick}{edges first}[1]{% Draws edges before vertices
   \renewcommand{\pmdraw@ifEdgesFirst}{#1}%
}
\define@key{pmdraw@brickDefault}{edges first}{% Sets the default to draw edges before vertices
   \setkeys{pmdraw@brick}{%
       \savevalue{edges first}=#1%
   }%
}
\define@key{pmdraw@brick}{transversals first}[1]{% Draws transversal edges before non-transversal edges
   \renewcommand{\pmdraw@ifTedgesFirst}{#1}%
}
\define@key{pmdraw@brickDefault}{transversals first}{% Sets the default to draw transversal edges before non-transversal edges
   \setkeys{pmdraw@brick}{%
       \savevalue{transversals first}=#1%
   }%
}

\define@key{pmdraw@brick}{edges phantom}[1]{% Does not draw edges
   \setcounter{pmdraw@ifEdges}{#1}%
}
\define@key{pmdraw@brickDefault}{edges phantom}{% Sets the default to not draw edge
   \setkeys{pmdraw@brick}{%
       \savevalue{edges phantom}=#1%
   }%
}

\define@key{pmdraw@brick}{edges uncover}{% Sets the uncover options of edges
   \renewcommand{\pmdraw@edgesUncover}{#1}%
}
\define@key{pmdraw@brickDefault}{edges uncover}{% Sets the default uncover options of edges
   \setkeys{pmdraw@brick}{%
       \savevalue{edges uncover}=#1%
   }%
}

\define@key{pmdraw@brick}{brace}{% Draws a brace
   \setkeys{pmdraw@brace}{% Sets default keys for brace
       left=\usevalue{left},
       right=\usevalue{right},
       above=\usevalue{above}
   }%
   \setkeys{pmdraw@brace}{#1}% Processes details of brace
   \pmdraw@drawBrace{\value{pmdraw@braceL}}{\value{pmdraw@braceR}}{\pmdraw@braceLabel}% Draws brace
   \let\pmdraw@drawBrace\pmdraw@drawBraceDefault% Resets brace options if changed
}
\define@key{pmdraw@brickDefault}{brace}{% Sets the default brace
   \setkeys{pmdraw@brick}{%
       \savevalue{brace}=#1%
   }%
}

\define@key{pmdraw@brick}{brace draw}{% Sets the draw options for drawing of brace
   \renewcommand{\pmdraw@drawBraceDrawOptions}{#1}%
}
\define@key{pmdraw@brickDefault}{brace draw}{% Sets the default draw options for drawing of brace
   \setkeys{pmdraw@brick}{%
       \savevalue{brace draw}=#1%
   }%
}
\define@key{pmdraw@brick}{brace node}{% Sets the node options for drawing of brace
   \renewcommand{\pmdraw@drawBraceNodeOptions}{#1}%
}
\define@key{pmdraw@brickDefault}{brace node}{% Sets the default node options for drawing of brace
   \setkeys{pmdraw@brick}{%
       \savevalue{brace node}=#1%
   }%
}

\define@key{pmdraw@brick}{decorate before}{% Hook for decorations before brick is drawn
   \renewcommand{\pmdraw@hookBeforeBrick}{#1}%
}
\define@key{pmdraw@brickDefault}{decorate before}{% Sets the default hook for decorations before brick is drawn
   \setkeys{pmdraw@brick}{%
       \savevalue{decorate before}=#1%
   }%
}
\define@key{pmdraw@brick}{decorate after}{% Hook for decorations after brick is drawn
   \renewcommand{\pmdraw@hookAfterBrick}{#1}%
}
\define@key{pmdraw@brickDefault}{decorate after}{% Sets the default hook for decorations after brick is drawn
   \setkeys{pmdraw@brick}{%
       \savevalue{decorate after}=#1%
   }%
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                        %
%  Keys for edges                                        %
%   - ordered as per manual                              %
%                                                        %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\define@key{pmdraw@NTedges}{level}{% Sets level of non-transversal edge
   \setcounter{pmdraw@NTlevel}{#1}%
}
\define@key{pmdraw@NTedgesDefault}{level}{% Sets the default level of non-transversal edge
   \setkeys{pmdraw@NTedges}{%
       \savevalue{level}=#1%
   }%
}

\define@key{pmdraw@NTedges}{height}{% Sets manual height of non-transversal edge
   \renewcommand{\pmdraw@NTedgesHeight}{#1}%
}
\define@key{pmdraw@NTedgesDefault}{height}{% Sets the default manual height of non-transversal edge
   \setkeys{pmdraw@NTedges}{%
       \savevalue{height}=#1%
   }%
}

\define@key{pmdraw@NTedges}{edge draw}{% Sets the draw options for drawing of edge
   \renewcommand{\pmdraw@drawEdgeDrawOptions}{#1}%
}
\define@key{pmdraw@NTedgesDefault}{edge draw}{% Sets the default draw options for drawing of edge
   \setkeys{pmdraw@NTedges}{%
       \savevalue{edge draw}=#1%
   }%
}

\define@key{pmdraw@NTedges}{options}{% Sets the draw command of non-transversal edge
   \renewcommand{\pmdraw@drawUedgesDraw}[2]{#1}%
   \renewcommand{\pmdraw@drawLedgesDraw}[2]{#1}%
}

\define@key{pmdraw@NTedges}{phantom}[1]{% Does not draw edge
   \setcounter{pmdraw@ifEdge}{#1}%
}
\define@key{pmdraw@NTedgesDefault}{phantom}{% Sets the default to not draw edge
   \setkeys{pmdraw@NTedges}{%
       \savevalue{phantom}=#1%
   }%
}

\define@key{pmdraw@NTedges}{uncover}{% Sets the uncover options of edge
   \renewcommand{\pmdraw@edgeUncover}{#1}%
}
\define@key{pmdraw@NTedgesDefault}{uncover}{% Sets the default uncover options of edge
   \setkeys{pmdraw@NTedges}{%
       \savevalue{uncover}=#1%
   }%
}

\define@key{pmdraw@Tedges}{height}{% Sets manual height of transversal edge
   \tikzmath{%
       \pmdraw{Tlevel} = #1;%
   }%
   \renewcommand{\pmdraw@ifTedgeHorizontal}{1}% Flags manual height
}
\define@key{pmdraw@TedgesDefault}{height}{% Sets the default manual height of transversal edge
   \setkeys{pmdraw@Tedges}{%
       \savevalue{height}=#1%
   }%
}

\define@key{pmdraw@Tedges}{edge draw}{% Sets the draw options for drawing of edge
   \renewcommand{\pmdraw@drawEdgeDrawOptions}{#1}%
}
\define@key{pmdraw@TedgesDefault}{edge draw}{% Sets the default draw options for drawing of edge
   \setkeys{pmdraw@Tedges}{%
       \savevalue{edge draw}=#1%
   }%
}

\define@key{pmdraw@Tedges}{options}{% Sets the draw command of transversal edge
   \renewcommand{\pmdraw@drawTedgesDraw}[2]{#1}%
}

\define@key{pmdraw@Tedges}{phantom}[1]{% Does not draw edge
   \setcounter{pmdraw@ifEdge}{#1}%
}
\define@key{pmdraw@TedgesDefault}{phantom}{% Sets the default to not draw edge
   \setkeys{pmdraw@Tedges}{%
       \savevalue{phantom}=#1%
   }%
}

\define@key{pmdraw@Tedges}{uncover}{% Sets the uncover options of edge
   \renewcommand{\pmdraw@edgeUncover}{#1}%
}
\define@key{pmdraw@TedgesDefault}{uncover}{% Sets the default uncover options of edge
   \setkeys{pmdraw@Tedges}{%
       \savevalue{uncover}=#1%
   }%
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                        %
%  Keys for brace                                        %
%   - ordered as per manual                              %
%                                                        %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\define@key{pmdraw@brace}{left}{% Sets starting position of brace
   \setcounter{pmdraw@braceL}{#1}%
}
\define@key{pmdraw@braceDefault}{left}{% Sets the default starting position of brace
   \setkeys{pmdraw@brace}{%
       \savevalue{left}=#1%
   }%
}

\define@key{pmdraw@brace}{right}{% Sets terminating position of brace
   \setcounter{pmdraw@braceR}{#1}%
}
\define@key{pmdraw@braceDefault}{right}{% Sets the default terminating position of brace
   \setkeys{pmdraw@brace}{%
       \savevalue{right}=#1%
   }%
}

\define@key{pmdraw@brace}{label}{% Sets label of brace
   \renewcommand{\pmdraw@braceLabel}{#1}%
}

\define@key{pmdraw@brace}{above}[1]{% Set flag to draw brace above diagram
   \renewcommand{\pmdraw@ifProdDiag}{#1}%
}
\define@key{pmdraw@braceDefault}{above}{% Sets the default flag to draw brace above diagram
   \setkeys{pmdraw@brace}{%
       \savevalue{above}=#1%
   }%
}

\define@key{pmdraw@brace}{options}{% Sets the draw command of brace
   \renewcommand{\pmdraw@drawBrace}[3]{#1}%
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                        %
%  Keys for diagrams and product diagrams                %
%   - ordered as per manual                              %
%                                                        %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\define@key{pmdraw@diagram}{row sep}{% Sets vertical separation between rows of vertices in diagram
   \renewcommand{\pmdraw@rowSep}{#1}%
}
\define@key{pmdraw@diagramDefault}{row sep}{% Sets the default vertical separation between rows of vertices in diagram
   \setkeys{pmdraw@diagram}{%
       \savevalue{row sep}=#1%
   }%
}

\define@key{pmdraw@diagram}{tikz}{% Sets the tikz options
   \renewcommand{\pmdraw@tikz}{#1}%
}
\define@key{pmdraw@diagramDefault}{tikz}{% Sets the default tikz options
   \setkeys{pmdraw@diagram}{%
       \savevalue{tikz}=#1%
   }%
}

\define@key{pmdraw@diagram}{dots options}{% Sets the draw command of dots between bricks
   \renewcommand{\pmdraw@drawDots}[2]{#1}%
}


\define@key{pmdraw@diagram}{grid}[1]{% Flag for drawing coordinate grid
   \renewcommand{\pmdraw@ifGrid}{#1}%
}
\define@key{pmdraw@diagramDefault}{grid}{% Sets the default flag for drawing coordinate grid
   \setkeys{pmdraw@diagram}{%
       \savevalue{grid}=#1%
   }%
}

\define@key{pmdraw@diagram}{decorate before}{% Hook before drawing diagrams
   \renewcommand{\pmdraw@hookBeforeDiagram}{#1}%
}
\define@key{pmdraw@diagramDefault}{decorate before}{% Sets the default hook before drawing diagrams
   \setkeys{pmdraw@diagram}{%
       \savevalue{decorate before}=#1%
   }%
}
\define@key{pmdraw@diagram}{decorate after}{% Hook after drawing diagrams
   \renewcommand{\pmdraw@hookAfterDiagram}{#1}%
}
\define@key{pmdraw@diagramDefault}{decorate after}{% Sets the default hook after drawing diagrams
   \setkeys{pmdraw@diagram}{%
       \savevalue{decorate after}=#1%
   }%
}

\define@key{pmdraw@diagram}{diagram sep}{% Sets vertical separation between bottom row of top diagram and top row of bottom diagram in product diagram
   \renewcommand{\pmdraw@diagSep}{#1}%
}
\define@key{pmdraw@diagramDefault}{diagram sep}{% Sets the default vertical separation between bottom row of top diagram and top row of bottom diagram in product diagram
   \setkeys{pmdraw@diagram}{%
       \savevalue{diagram sep}=#1%
   }%
}
\define@key{pmdraw@diagram}{vertex sep}{% Sets vertical separation between bottom row of top diagram and top row of bottom diagram in product diagram not for added edges
   \renewcommand{\pmdraw@vertexSep}{#1}%
}
\define@key{pmdraw@diagramDefault}{vertex sep}{% Sets the default vertical separation between bottom row of top diagram and top row of bottom diagram in product diagram not for added edges
   \setkeys{pmdraw@diagram}{%
       \savevalue{vertex sep}=#1%
   }%
}

\define@key{pmdraw@diagram}{edges added}{% Sets the draw options for drawing of added edges in product diagram
   \renewcommand{\pmdraw@drawAedgesOptions}{#1}%
}
\define@key{pmdraw@diagram}{edges addedDefault}{% Sets the default draw options for drawing of added edges in product diagram
   \renewcommand{\pmdraw@drawAedgesOptionsDefault}{#1}%
}
\define@key{pmdraw@diagramDefault}{edges added}{% Sets the default draw options for drawing of added edges in product diagram
   \setkeys{pmdraw@diagram}{%
       \savevalue{edges addedDefault}=#1%
   }%
}
\define@key{pmdraw@diagram}{edges added phantom}[1]{% Does not draw added edges
   \setcounter{pmdraw@ifEdgesAdded}{#1}%
}
\define@key{pmdraw@diagramDefault}{edges added phantom}{% Sets the default to not draw added edges
   \setkeys{pmdraw@diagram}{%
       \savevalue{edges added phantom}=#1%
   }%
}
\define@key{pmdraw@diagram}{edges added uncover}{% Sets the uncover options of added edges
   \renewcommand{\pmdraw@edgesAddedUncover}{#1}%
}
\define@key{pmdraw@diagramDefault}{edges added uncover}{% Sets the default uncover options of added edges
   \setkeys{pmdraw@diagram}{%
       \savevalue{edges added uncover}=#1%
   }%
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                        %
%  Keys for default key settings                         %
%   - ordered as per manual                              %
%                                                        %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\define@key{pmdraw@default}{brick}{% Sets the default key options of brick keys
   \setkeys{pmdraw@brickDefault}{#1}%
}

\define@key{pmdraw@default}{NTedges}{% Sets the default key options of non-transversal edge keys
   \setkeys{pmdraw@NTedgesDefault}{#1}%
}

\define@key{pmdraw@default}{Tedges}{% Sets the default key options of transversal edge keys
   \setkeys{pmdraw@TedgesDefault}{#1}%
}

\define@key{pmdraw@default}{brace}{% Sets the default key options of brace keys
   \setkeys{pmdraw@braceDefault}{#1}%
}

\define@key{pmdraw@default}{diagram}{% Sets the default key options of diagram keys
   \setkeys{pmdraw@diagramDefault}{#1}%
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                        %
%  User commands                                         %
%   - loosely ordered alphabetically                     %
%                                                        %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\newcommand{\pmdBrick}[4][]{% Draws brick
   % #1 Options
   % #2 Upper non-transversal edges, as list [<options>]{<left vertex>}{<right vertex>}, eg [level=1]{2}{3}
   % #3 Lower non-transversal edges, as list [<options>]{<left vertex>}{<right vertex>}, eg [level=1]{2}{3}
   % #4 Transversals, as list [<options>]{<upper vertex>}{<lower vertex>}, eg [level=1]{2}{3}
   \pmdDiagram{{[#1]{#2}{#3}{#4}}}% Uses complete diagram method to draw brick
}

\newcommand{\pmdDiagram}[2][]{% Draws diagram
   % #1 Options
   % #2 List of bricks
   \setkeys{pmdraw@diagram}{% Sets default key values for diagrams
       row sep=\usevalue{row sep},
       tikz=\usevalue{tikz},
       grid=\usevalue{grid},
       decorate before=\usevalue{decorate before},
       decorate after=\usevalue{decorate after},
       diagram sep=\usevalue{diagram sep},
       vertex sep=\usevalue{vertex sep},
       edges added phantom=\usevalue{edges added phantom},
       edges added uncover=\usevalue{edges added uncover}
   }%
   \setkeys{pmdraw@diagram}{#1}% Processes options
   \renewcommand{\pmdraw@ifDiagWDots}{1}% Flags that diagram has dots
   \setcounter{pmdraw@brickShift}{0}% Reset shifting of individual bricks
   \ifmmode% If drawing diagram in a maths equation
       \,% Add space
       \ifnum\pmdraw@ifGrid=1% If displaying helper grid
           \begin{tikzpicture}[scale=.5,baseline=0.405cm,show grid=true,apply style/.expand once=\pmdraw@tikz]%
       \else% If not displaying helper grid
           \begin{tikzpicture}[scale=.5,baseline=0.405cm,apply style/.expand once=\pmdraw@tikz]%
       \fi%
           \pmdraw@hookBeforeDiagram% Hook before drawing diagrams
           \pmdraw@bricksLoop% Commences loop for each brick to be drawn
           #2%
           \pmdEmpty% Terminates loop
           \pmdraw@hookAfterDiagram% Hook after drawing diagrams
       \end{tikzpicture}%
       \,% Add space
   \else% If drawing diagram in normal text
       \raisebox{0.5cm}{% Raise diagram so bottom row is on text baseline
           \ifnum\pmdraw@ifGrid=1% If displaying helper grid
               \begin{tikzpicture}[scale=.5,baseline=0.405cm,show grid=true,apply style/.expand once=\pmdraw@tikz]%
           \else% If not displaying helper grid
               \begin{tikzpicture}[scale=.5,baseline=0.405cm,apply style/.expand once=\pmdraw@tikz]%
           \fi%
               \pmdraw@hookBeforeDiagram% Hook before drawing diagrams
               \pmdraw@bricksLoop% Commences loop for each brick to be drawn
               #2%
               \pmdEmpty% Terminates loop
               \pmdraw@hookAfterDiagram% Hook after drawing diagrams
           \end{tikzpicture}%
       }%
   \fi%
   \pmdraw@reset% Resets user keys and other flags to default values
}

\newcommand{\pmdEmpty}{}% Indicates no edges, internally halts input loops, always is = {}

\newcommand{\pmdProduct}[4][]{% Draws product diagram
   % #1 Options
   % #2 List of added edges
   % #3 Top diagram as list of bricks
   % #4 Bottom diagram as list of bricks
   \setkeys{pmdraw@diagram}{% Sets default key values for diagrams
       row sep=\usevalue{row sep},
       tikz=\usevalue{tikz},
       grid=\usevalue{grid},
       decorate before=\usevalue{decorate before},
       decorate after=\usevalue{decorate after},
       diagram sep=\usevalue{diagram sep},
       vertex sep=\usevalue{vertex sep},
       edges added phantom=\usevalue{edges added phantom},
       edges added uncover=\usevalue{edges added uncover}
   }%
   \setkeys{pmdraw@diagram}{#1}% Processes options
   \ifmmode% If drawing diagram in a maths equation
       \,% Add space
       \ifnum\pmdraw@ifGrid=1% If displaying helper grid
           \begin{tikzpicture}[scale=.5,baseline=-.3475cm,show grid=true,apply style/.expand once=\pmdraw@tikz]%
       \else% If not displaying helper grid
           \begin{tikzpicture}[scale=.5,baseline=-.3475cm,apply style/.expand once=\pmdraw@tikz]%
       \fi%
           \pmdraw@hookBeforeDiagram% Hook before drawing diagrams
           \pmdraw@AedgesLoop% Commences loop for added edges to be drawn
           #2%
           \pmdEmpty% Terminates loop
           \renewcommand{\pmdraw@ifDiagWDots}{1}% Flags that diagram has dot
           \renewcommand{\pmdraw@ifProdDiag}{1}% Flags that diagram is product
           \setcounter{pmdraw@brickShift}{0}% Reset shifting of individual bricks
           \pmdraw@bricksLoop% Commences loop for each brick to be drawn
           #3%
           \pmdEmpty% Terminates loop
           \renewcommand{\pmdraw@ifProdDiag}{0}% Resets flag that diagram is product
           \setcounter{pmdraw@ifDiagWDotsFirst}{1}% Reset if drawing first brick of diagram
           \setcounter{pmdraw@brickShift}{0}% Reset shifting of individual bricks
           \begin{scope}[shift={(0,-\pmdraw@diagSep-\pmdraw@rowSep-\pmdraw@vertexSep)}]% Shift coordinates to be underneath top diagram
               \pmdraw@bricksLoop% Commences loop for each brick to be drawn
               #4%
               \pmdEmpty% Terminates loop
               \renewcommand{\pmdraw@ifDiagWDots}{0}% Reset if drawing a diagram with dots
               \setcounter{pmdraw@ifDiagWDotsFirst}{1}% Reset if drawing first brick of diagram
           \end{scope}%
           \pmdraw@hookAfterDiagram% Hook after drawing diagrams
       \end{tikzpicture}%
       \,% Add space
   \else% If drawing diagram in normal text
       \raisebox{2cm}{% Raise diagram so bottom row is on text baseline
           \ifnum\pmdraw@ifGrid=1% If displaying helper grid
               \begin{tikzpicture}[scale=.5,baseline=0.405cm,show grid=true,apply style/.expand once=\pmdraw@tikz]%
           \else% If not displaying helper grid
               \begin{tikzpicture}[scale=.5,baseline=0.405cm,apply style/.expand once=\pmdraw@tikz]%
           \fi%
               \pmdraw@hookBeforeDiagram% Hook before drawing diagrams
               \pmdraw@AedgesLoop% Commences loop for added edges to be drawn
               #2%
               \pmdEmpty% Terminates loop
               \renewcommand{\pmdraw@ifDiagWDots}{1}% Flags that diagram has dot
               \renewcommand{\pmdraw@ifProdDiag}{1}% Flags that diagram is product
               \setcounter{pmdraw@brickShift}{0}% Reset shifting of individual bricks
               \pmdraw@bricksLoop% Commences loop for each brick to be drawn
               #3%
               \pmdEmpty% Terminates loop
               \renewcommand{\pmdraw@ifProdDiag}{0}% Resets flag that diagram is products
               \setcounter{pmdraw@ifDiagWDotsFirst}{1}% Reset if drawing first brick of diagram
               \setcounter{pmdraw@brickShift}{0}% Reset shifting of individual bricks
               \begin{scope}[shift={(0,-\pmdraw@diagSep-\pmdraw@rowSep-\pmdraw@vertexSep)}]% Shift coordinates to be underneath top diagram
                   \pmdraw@bricksLoop% Commences loop for each brick to be drawn
                   #4%
                   \pmdEmpty% Terminates loop
                   \renewcommand{\pmdraw@ifDiagWDots}{0}% Reset if drawing a diagram with dots
                   \setcounter{pmdraw@ifDiagWDotsFirst}{1}% Reset if drawing first brick of diagram
               \end{scope}%
               \pmdraw@hookAfterDiagram% Hook after drawing diagrams diagram
           \end{tikzpicture}%
       }%
   \fi%
   \pmdraw@reset% Resets user keys and other flags to default values
}

\newcommand{\pmdProductTriple}[6][]{% Draws triple product diagram
   % #1 Options
   % #2 List of top added edges
   % #3 List of bottom added edges
   % #4 Top diagram as list of bricks
   % #5 Middle diagram as list of bricks
   % #6 Bottom diagram as list of bricks
   \setkeys{pmdraw@diagram}{% Sets default key values for diagrams
       row sep=\usevalue{row sep},
       tikz=\usevalue{tikz},
       grid=\usevalue{grid},
       decorate before=\usevalue{decorate before},
       decorate after=\usevalue{decorate after},
       diagram sep=\usevalue{diagram sep},
       vertex sep=\usevalue{vertex sep},
       edges added phantom=\usevalue{edges added phantom},
       edges added uncover=\usevalue{edges added uncover}
   }%
   \setkeys{pmdraw@diagram}{#1}% Processes options
   \ifmmode% If drawing diagram in a maths equation
       \,% Add space
       \ifnum\pmdraw@ifGrid=1% If displaying helper grid
           \begin{tikzpicture}[scale=.5,baseline=-1.0975cm,show grid=true,apply style/.expand once=\pmdraw@tikz]%
       \else% If not displaying helper grid
           \begin{tikzpicture}[scale=.5,baseline=-1.0975cm,apply style/.expand once=\pmdraw@tikz]%
       \fi%
           \pmdraw@hookBeforeDiagram% Hook before drawing diagrams
           \pmdraw@AedgesLoop% Commences loop for top added edges to be drawn
           #2%
           \pmdEmpty% Terminates loop
           \renewcommand{\pmdraw@ifDiagWDots}{1}% Flags that diagram has dot
           \renewcommand{\pmdraw@ifProdDiag}{1}% Flags that diagram is product
           \setcounter{pmdraw@brickShift}{0}% Reset shifting of individual bricks
           \pmdraw@bricksLoop% Commences loop for each top brick to be drawn
           #4%
           \pmdEmpty% Terminates loop
           \renewcommand{\pmdraw@ifProdDiag}{0}% Resets flag that diagram is product
           \setcounter{pmdraw@ifDiagWDotsFirst}{1}% Reset if drawing first brick of diagram
           \setcounter{pmdraw@brickShift}{0}% Reset shifting of individual bricks
           \begin{scope}[shift={(0,-\pmdraw@diagSep-\pmdraw@rowSep-\pmdraw@vertexSep)}]% Shift coordinates to be underneath top diagram
               \pmdraw@AedgesLoop% Commences loop for bottom added edges to be drawn
               #3%
               \pmdEmpty% Terminates loop
               \pmdraw@bricksLoop% Commences loop for each middle brick to be drawn
               #5%
               \pmdEmpty% Terminates loop
               \setcounter{pmdraw@ifDiagWDotsFirst}{1}% Reset if drawing first brick of diagram
               \setcounter{pmdraw@brickShift}{0}% Reset shifting of individual bricks
               \begin{scope}[shift={(0,-\pmdraw@diagSep-\pmdraw@rowSep-\pmdraw@vertexSep)}]% Shift coordinates to be underneath middle diagram
                   \pmdraw@bricksLoop% Commences loop for each bottom brick to be drawn
                   #6%
                   \pmdEmpty% Terminates loop
                   \setcounter{pmdraw@brickShift}{0}% Reset shifting of individual bricks
               \end{scope}%
           \end{scope}%
           \renewcommand{\pmdraw@ifDiagWDots}{0}% Reset if drawing a diagram with dots
           \pmdraw@hookAfterDiagram% Hook after drawing diagrams
       \end{tikzpicture}%
       \,% Add space
   \else% If drawing diagram in normal text
       \raisebox{2cm}{% Raise diagram so bottom row is on text baseline
           \ifnum\pmdraw@ifGrid=1% If displaying helper grid
               \begin{tikzpicture}[scale=.5,baseline=-1.095cm,show grid=true,apply style/.expand once=\pmdraw@tikz]%
           \else% If not displaying helper grid
               \begin{tikzpicture}[scale=.5,baseline=-1.095cm,apply style/.expand once=\pmdraw@tikz]%
           \fi%
               \pmdraw@hookBeforeDiagram% Hook before drawing diagrams
               \pmdraw@AedgesLoop% Commences loop for added edges to be drawn
               #2%
               \pmdEmpty% Terminates loop
               \renewcommand{\pmdraw@ifDiagWDots}{1}% Flags that diagram has dot
               \renewcommand{\pmdraw@ifProdDiag}{1}% Flags that diagram is product
               \setcounter{pmdraw@brickShift}{0}% Reset shifting of individual bricks
               \pmdraw@bricksLoop% Commences loop for each brick to be drawn
               #4%
               \pmdEmpty% Terminates loop
               \renewcommand{\pmdraw@ifProdDiag}{0}% Resets flag that diagram is product
               \setcounter{pmdraw@ifDiagWDotsFirst}{1}% Reset if drawing first brick of diagram
               \setcounter{pmdraw@brickShift}{0}% Reset shifting of individual bricks
               \begin{scope}[shift={(0,-\pmdraw@diagSep-\pmdraw@rowSep-\pmdraw@vertexSep)}]% Shift coordinates to be underneath top diagram
                   \pmdraw@AedgesLoop% Commences loop for bottom added edges to be drawn
                   #3%
                   \pmdEmpty% Terminates loop
                   \pmdraw@bricksLoop% Commences loop for each middle brick to be drawn
                   #5%
                   \pmdEmpty% Terminates loop
                   \setcounter{pmdraw@ifDiagWDotsFirst}{1}% Reset if drawing first brick of diagram
                   \setcounter{pmdraw@brickShift}{0}% Reset shifting of individual bricks
                   \begin{scope}[shift={(0,-\pmdraw@diagSep-\pmdraw@rowSep-\pmdraw@vertexSep)}]% Shift coordinates to be underneath middle diagram
                       \pmdraw@bricksLoop% Commences loop for each bottom brick to be drawn
                       #6%
                       \pmdEmpty% Terminates loop
                       \setcounter{pmdraw@brickShift}{0}% Reset shifting of individual bricks
                   \end{scope}%
               \end{scope}%
               \renewcommand{\pmdraw@ifDiagWDots}{0}% Reset if drawing a diagram with dots
               \pmdraw@hookAfterDiagram% Hook after drawing diagrams
           \end{tikzpicture}%
       }%
   \fi%
   \pmdraw@reset% Resets user keys and other flags to default values
}

\newcommand{\pmdSetDefault}[1]{% Sets the entered styles as the default
   \setkeys{pmdraw@default}{#1}%
}

\newcommand{\pmdSetToOriginalDefault}{% Sets the styles as the default of the package
   \setkeys{pmdraw@default}{% Saves values
       brick={% Sets default for brick keys
           degree=0,
           degree bottom=0,
           degree top=0,
           blank bottom=0,
           blank top=0,
           row sep=2,
           no vertex bottom 1=-1,
           no vertex bottom 2=-1,
           no vertex bottom 3=-1,
           no vertex bottom 4=-1,
           no vertex bottom 5=-1,
           no vertex bottom 6=-1,
           no vertex bottom 7=-1,
           no vertex bottom 8=-1,
           no vertex bottom 9=-1,
           no vertex top 1=-1,
           no vertex top 2=-1,
           no vertex top 3=-1,
           no vertex top 4=-1,
           no vertex top 5=-1,
           no vertex top 6=-1,
           no vertex top 7=-1,
           no vertex top 8=-1,
           no vertex top 9=-1,
           labels=0,
           labels bottom=0,
           labels top=0,
           labels start=1,
           labels bottom start=1,
           labels top start=1,
           no label bottom 1=-1,
           no label bottom 2=-1,
           no label bottom 3=-1,
           no label bottom 4=-1,
           no label bottom 5=-1,
           no label bottom 6=-1,
           no label bottom 7=-1,
           no label bottom 8=-1,
           no label bottom 9=-1,
           no label top 1=-1,
           no label top 2=-1,
           no label top 3=-1,
           no label top 4=-1,
           no label top 5=-1,
           no label top 6=-1,
           no label top 7=-1,
           no label top 8=-1,
           no label top 9=-1,
           labels bottom draw={},
           labels bottom node={},
           labels top draw={},
           labels top node={},
           dots draw={},
           dots node={},
           vertices bottom phantom=0,
           vertices top phantom=0,
           vertices bottom uncover={1-},
           vertices top uncover={1-},
           levels=1,
           levels bottom=1,
           levels top=1,
           levels sep=(0.5*\pmdraw@rowSep)/2,
           levels sep bottom=(0.5*\pmdraw@rowSep)/2,
           levels sep top=(0.5*\pmdraw@rowSep)/2,
           edges first=0,
           transversals first=0,
           edges phantom=0,
           edges uncover={1-},
           brace draw={},
           brace node={},
           decorate before={},
           decorate after={}
       }
   }
   \setkeys{pmdraw@default}{% Saves values
       NTedges={% Sets default for non-transversal edge keys
           level=1,
           height=-1000,
           edge draw={},
           phantom=0,
           uncover={1-}
       }
   }
   \setkeys{pmdraw@default}{% Saves values
       Tedges={% Sets default for transversal edge keys
           edge draw={},
           phantom=0,
           uncover={1-}
       }
   }
   \setkeys{pmdraw@default}{% Saves values
       brace={% Sets default for brace keys
           left=0,
           right=0,
           above=0
       }
   }
   \setkeys{pmdraw@default}{% Saves values
       diagram={% Sets default for diagram keys
           row sep=2,
           tikz={},
           grid=0,
           decorate before={},
           decorate after={},
           diagram sep=1,
           vertex sep=0,
           edges added phantom=0,
           edges added uncover={1-}
       }
   }
   \renewcommand{\pmdraw@drawVertexOptionsDefault}{}% Resets default draw options for vertices
   \renewcommand{\pmdraw@drawLedgesDrawOptionsDefault}{}% Resets default draw options for lower non-transversal edges
   \renewcommand{\pmdraw@drawUedgesDrawOptionsDefault}{}% Resets default draw options for upper non-transversal edges
   \renewcommand{\pmdraw@drawTedgesDrawOptionsDefault}{}% Resets Default draw options for transversal edges
   \renewcommand{\pmdraw@drawAedgesOptionsDefault}{}% Resets default draw options for added edges in product diagram
}
\pmdSetToOriginalDefault% Sets original default values

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                        %
%  For loop commands                                     %
%   - loosely ordered alphabetically                     %
%                                                        %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\newcommand{\pmdraw@AedgesLoop}{% Starts loop for added edges in product diagram
   \@ifnextchar\pmdEmpty{}{% If not at end of list
       \pmdraw@drawAedges% Draw each edge
   }%
}
\newcommand{\pmdraw@bricksLoop}{% Starts loop to iterate over each brick in diagram
   \@ifnextchar\pmdEmpty{}{% If not at end of list
       \pmdraw@drawBrickInit% Draw each brick
   }%
}
\newcommand{\pmdraw@LedgesLoop}{% Starts loop for lower non-transversal edges
   \@ifnextchar\pmdEmpty{}{% If not at end of list
       \pmdraw@drawLedges% Draw each edge
   }%
}
\newcommand{\pmdraw@TedgesLoop}{% Starts loop for transversal edges
   \@ifnextchar\pmdEmpty{}{% If not at end of list
       \pmdraw@drawTedges% Draw each edge
   }%
}
\newcommand{\pmdraw@UedgesLoop}{% Starts loop for upper non-transversal edges
   \@ifnextchar\pmdEmpty{}{% If not at end of list
       \pmdraw@drawUedges% Draw each edge
   }%
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                        %
%  Draw commands                                         %
%   - loosely ordered alphabetically                     %
%                                                        %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\newcommand{\pmdraw@drawBottomVertices}{% Draws bottom row of vertices
   \setcounter{pmdraw@bottomTotal}{\value{pmdraw@blankB}}% Store size of bottom row of vertices
   \addtocounter{pmdraw@bottomTotal}{\value{pmdraw@degreeB}}% Store size of bottom row of vertices
   \ifnum\value{pmdraw@ifDiagWDotsFirst}=1% If drawing first brick of diagram
       \setcounter{pmdraw@ifDiagWDotsFirst}{0}% Mark that first brick has been drawn
   \else% If not drawing first brick of diagram
       \pmdraw@drawDots{0.5*\value{pmdraw@topShift}+0.5*\value{pmdraw@blankT}}{\pmdraw@rowSep}% Draw upper dots
       \pmdraw@drawDots{0.5*\value{pmdraw@bottomShift}+0.5*\value{pmdraw@blankB}}{0}% Draw lower dots
   \fi%
   \ifnum\value{pmdraw@topTotal}>\value{pmdraw@bottomTotal}% If top row is longer than bottom row
       \ifnum\pmdraw@ifDiagWDots=1% If drawing a diagram with dots
           \addtocounter{pmdraw@brickShift}{\value{pmdraw@topTotal}}% Keep track of size of diagram
           % Store shifts
           \setcounter{pmdraw@topShift}{-\value{pmdraw@topTotal}}%
           \addtocounter{pmdraw@topShift}{\value{pmdraw@topTotal}}%
           \setcounter{pmdraw@bottomShift}{-\value{pmdraw@topTotal}}%
           \addtocounter{pmdraw@bottomShift}{\value{pmdraw@bottomTotal}}%
       \else% If drawing a diagram without dots
           \setcounter{pmdraw@brickShift}{\value{pmdraw@topTotal}}% Keep track of size of diagram
       \fi%
   \else% If bottom row is longer than top row
       \ifnum\pmdraw@ifDiagWDots=1% If drawing a diagram with dots
           \addtocounter{pmdraw@brickShift}{\value{pmdraw@bottomTotal}}% Keep track of size of diagram
           % Store shifts
           \setcounter{pmdraw@topShift}{-\value{pmdraw@bottomTotal}}%
           \addtocounter{pmdraw@topShift}{\value{pmdraw@topTotal}}%
           \setcounter{pmdraw@bottomShift}{-\value{pmdraw@bottomTotal}}%
           \addtocounter{pmdraw@bottomShift}{\value{pmdraw@bottomTotal}}%
       \else% If drawing a diagram without dots
           \setcounter{pmdraw@brickShift}{\value{pmdraw@bottomTotal}}% Keep track of size of diagram
       \fi%
   \fi%
   \foreach \x in {1,...,\value{pmdraw@degreeB}} {% For each vertex in row
       \ifnum\pmdraw@drawNoVertexBa=\x\else% If not skipping vertex
           \ifnum\pmdraw@drawNoVertexBb=\x\else% If not skipping vertex
               \ifnum\pmdraw@drawNoVertexBc=\x\else% If not skipping vertex
                   \ifnum\pmdraw@drawNoVertexBd=\x\else% If not skipping vertex
                       \ifnum\pmdraw@drawNoVertexBe=\x\else% If not skipping vertex
                           \ifnum\pmdraw@drawNoVertexBf=\x\else% If not skipping vertex
                               \ifnum\pmdraw@drawNoVertexBg=\x\else% If not skipping vertex
                                   \ifnum\pmdraw@drawNoVertexBh=\x\else% If not skipping vertex
                                       \ifnum\pmdraw@drawNoVertexBi=\x\else% If not skipping vertex
                                           \pmdraw@drawVertex{\x + \value{pmdraw@blankB}}{0}% Draw lower vertex
                                       \fi%
                                   \fi%
                               \fi%
                           \fi%
                       \fi%
                   \fi%
               \fi%
           \fi%
       \fi%
       \ifnum\pmdraw@drawNoLabelBa=\x\else% If not skipping label
           \ifnum\pmdraw@drawNoLabelBb=\x\else% If not skipping label
               \ifnum\pmdraw@drawNoLabelBc=\x\else% If not skipping label
                   \ifnum\pmdraw@drawNoLabelBd=\x\else% If not skipping label
                       \ifnum\pmdraw@drawNoLabelBe=\x\else% If not skipping label
                           \ifnum\pmdraw@drawNoLabelBf=\x\else% If not skipping label
                               \ifnum\pmdraw@drawNoLabelBg=\x\else% If not skipping label
                                   \ifnum\pmdraw@drawNoLabelBh=\x\else% If not skipping label
                                       \ifnum\pmdraw@drawNoLabelBi=\x\else% If not skipping label
                                           \ifnum\pmdraw@ifLabelsB=1% If drawing labels
                                               \pmdraw@drawLabelBottom{\x + \value{pmdraw@blankT}}{0}{\thepmdraw@labelStartB}% Draw label
                                           \fi%
                                       \fi%
                                   \fi%
                               \fi%
                           \fi%
                       \fi%
                   \fi%
               \fi%
           \fi%
       \fi%
       \stepcounter{pmdraw@labelStartB}% Update label counter
   }%
}
\newcommand{\pmdraw@drawBrickInit}[1]{% Initialises the drawing of a brick
   \ifnum\value{pmdraw@ifDiagWDotsFirst}=0% If not drawing first brick in diagram
       \stepcounter{pmdraw@brickShift}% Makes space for dots to left of current brick
   \fi%
   \begin{scope}[shift={(\value{pmdraw@brickShift},0)}]% Shift brick to the right of already drawn bricks
       \pmdraw@drawBrick#1% Draw brick
   \end{scope}%
   \pmdraw@bricksLoop% Restart for loop
}
\newcommand{\pmdraw@drawBrick}[4][]{% Draws a brick
   % #1 Options
   % #2 Upper non-transversal edges, as list [<options>]{<left vertex>}{<right vertex>}, eg [level=1]{2}{3}
   % #3 Lower non-transversal edges, as list [<options>]{<left vertex>}{<right vertex>}, eg [level=1]{2}{3}
   % #4 Transversals, as list [<options>]{<upper vertex>}{<lower vertex>}, eg [level=1]{2}{3}
   \setkeys{pmdraw@brick}{% Set default values for brick keys
       degree bottom=\usevalue{degree bottom},
       degree top=\usevalue{degree top},
       blank bottom=\usevalue{blank bottom},
       blank top=\usevalue{blank top},
       row sep=\usevalue{row sep},
       no vertex bottom 1=\usevalue{no vertex bottom 1},
       no vertex bottom 2=\usevalue{no vertex bottom 2},
       no vertex bottom 3=\usevalue{no vertex bottom 3},
       no vertex bottom 4=\usevalue{no vertex bottom 4},
       no vertex bottom 5=\usevalue{no vertex bottom 5},
       no vertex bottom 6=\usevalue{no vertex bottom 6},
       no vertex bottom 7=\usevalue{no vertex bottom 7},
       no vertex bottom 8=\usevalue{no vertex bottom 8},
       no vertex bottom 9=\usevalue{no vertex bottom 9},
       no vertex top 1=\usevalue{no vertex top 1},
       no vertex top 2=\usevalue{no vertex top 2},
       no vertex top 3=\usevalue{no vertex top 3},
       no vertex top 4=\usevalue{no vertex top 4},
       no vertex top 5=\usevalue{no vertex top 5},
       no vertex top 6=\usevalue{no vertex top 6},
       no vertex top 7=\usevalue{no vertex top 7},
       no vertex top 8=\usevalue{no vertex top 8},
       no vertex top 9=\usevalue{no vertex top 9},
       labels=\usevalue{labels},
       labels bottom=\usevalue{labels bottom},
       labels top=\usevalue{labels top},
       labels start=\usevalue{labels start},
       labels bottom start=\usevalue{labels bottom start},
       labels top start=\usevalue{labels top start},
       no label bottom 1=\usevalue{no label bottom 1},
       no label bottom 2=\usevalue{no label bottom 2},
       no label bottom 3=\usevalue{no label bottom 3},
       no label bottom 4=\usevalue{no label bottom 4},
       no label bottom 5=\usevalue{no label bottom 5},
       no label bottom 6=\usevalue{no label bottom 6},
       no label bottom 7=\usevalue{no label bottom 7},
       no label bottom 8=\usevalue{no label bottom 8},
       no label bottom 9=\usevalue{no label bottom 9},
       no label top 1=\usevalue{no label top 1},
       no label top 2=\usevalue{no label top 2},
       no label top 3=\usevalue{no label top 3},
       no label top 4=\usevalue{no label top 4},
       no label top 5=\usevalue{no label top 5},
       no label top 6=\usevalue{no label top 6},
       no label top 7=\usevalue{no label top 7},
       no label top 8=\usevalue{no label top 8},
       no label top 9=\usevalue{no label top 9},
       labels bottom draw=\usevalue{labels bottom draw},
       labels bottom node=\usevalue{labels bottom node},
       labels top draw=\usevalue{labels top draw},
       labels top node=\usevalue{labels top node},
       dots draw=\usevalue{dots draw},
       dots node=\usevalue{dots node},
       vertices bottom phantom=\usevalue{vertices bottom phantom},
       vertices top phantom=\usevalue{vertices top phantom},
       vertices bottom uncover=\usevalue{vertices bottom uncover},
       vertices top uncover=\usevalue{vertices top uncover},
       levels=\usevalue{levels},
       levels bottom=\usevalue{levels bottom},
       levels top=\usevalue{levels top},
       levels sep=\usevalue{levels sep},
       levels sep bottom=\usevalue{levels sep bottom},
       levels sep top=\usevalue{levels sep top},
       edges first=\usevalue{edges first},
       transversals first=\usevalue{transversals first},
       edges phantom=\usevalue{edges phantom},
       edges uncover=\usevalue{edges uncover},
       brace draw=\usevalue{brace draw},
       brace node=\usevalue{brace node},
       decorate before=\usevalue{decorate before},
       decorate after=\usevalue{decorate after}
   }%
   \setkeys{pmdraw@brick}{levels,#1}% Processes options and set default levels
   \pmdraw@hookBeforeBrick% Hook before drawing brick
   \ifnum\pmdraw@ifEdgesFirst=0% If drawing vertices first
       \@ifclassloaded{beamer}{% If in beamer
           \uncover<\pmdraw@verticesTopUncover>{% Uncovers top vertices
               \ifnum\value{pmdraw@ifVerticesTop}=0% If drawing top vertices
                   \pmdraw@drawTopVertices% Draw base diagram
               \else% If hiding top vertices
                   \phantom{%
                       \pmdraw@drawTopVertices% Draw base diagram
                   }%
               \fi%
           }%
           \uncover<\pmdraw@verticesBottomUncover>{% Uncovers bottom vertices
               \ifnum\value{pmdraw@ifVerticesBottom}=0% If drawing bottom vertices
                   \pmdraw@drawBottomVertices% Draw base diagram
               \else% If hiding top vertices
                   \phantom{%
                       \pmdraw@drawBottomVertices% Draw base diagram
                   }%
               \fi%
           }%
           \uncover<\pmdraw@edgesUncover>{% Uncovers edges
               \ifnum\value{pmdraw@ifEdges}=0% If drawing edges
                   \ifnum\pmdraw@ifTedgesFirst=0% If drawing non-transversals first
                       \pmdraw@UedgesLoop% Draws upper edges
                       #2%
                       \pmdEmpty%
                       \pmdraw@LedgesLoop% Draws lower edges
                       #3%
                       \pmdEmpty%
                       \pmdraw@TedgesLoop% Draws transversals
                       #4%
                       \pmdEmpty%
                   \else% If drawing transversal first
                       \pmdraw@TedgesLoop% Draws transversals
                       #4%
                       \pmdEmpty%
                       \pmdraw@UedgesLoop% Draws upper edges
                       #2%
                       \pmdEmpty%
                       \pmdraw@LedgesLoop% Draws lower edges
                       #3%
                       \pmdEmpty%
                   \fi%
               \else% If hiding edges
                   \phantom{%
                       \ifnum\pmdraw@ifTedgesFirst=0% If drawing non-transversals first
                           \pmdraw@UedgesLoop% Draws upper edges
                           #2%
                           \pmdEmpty%
                           \pmdraw@LedgesLoop% Draws lower edges
                           #3%
                           \pmdEmpty%
                           \pmdraw@TedgesLoop% Draws transversals
                           #4%
                           \pmdEmpty%
                       \else% If drawing transversal first
                           \pmdraw@TedgesLoop% Draws transversals
                           #4%
                           \pmdEmpty%
                           \pmdraw@UedgesLoop% Draws upper edges
                           #2%
                           \pmdEmpty%
                           \pmdraw@LedgesLoop% Draws lower edges
                           #3%
                           \pmdEmpty%
                       \fi%
                   }%
               \fi%
           }%
       }{% If not in beamer
           \ifnum\value{pmdraw@ifVerticesTop}=0% If drawing top vertices
               \pmdraw@drawTopVertices% Draw base diagram
           \else% If hiding top vertices
               \phantom{%
                   \pmdraw@drawTopVertices% Draw base diagram
               }%
           \fi%
           \ifnum\value{pmdraw@ifVerticesBottom}=0% If drawing bottom vertices
               \pmdraw@drawBottomVertices% Draw base diagram
           \else% If hiding top vertices
               \phantom{%
                   \pmdraw@drawBottomVertices% Draw base diagram
               }%
           \fi%
           \ifnum\value{pmdraw@ifEdges}=0% If drawing edges
               \ifnum\pmdraw@ifTedgesFirst=0% If drawing non-transversals first
                   \pmdraw@UedgesLoop% Draws upper edges
                   #2%
                   \pmdEmpty%
                   \pmdraw@LedgesLoop% Draws lower edges
                   #3%
                   \pmdEmpty%
                   \pmdraw@TedgesLoop% Draws transversals
                   #4%
                   \pmdEmpty%
               \else% If drawing transversal first
                   \pmdraw@TedgesLoop% Draws transversals
                   #4%
                   \pmdEmpty%
                   \pmdraw@UedgesLoop% Draws upper edges
                   #2%
                   \pmdEmpty%
                   \pmdraw@LedgesLoop% Draws lower edges
                   #3%
                   \pmdEmpty%
               \fi%
           \else% If hiding edges
               \phantom{%
                   \ifnum\pmdraw@ifTedgesFirst=0% If drawing non-transversals first
                       \pmdraw@UedgesLoop% Draws upper edges
                       #2%
                       \pmdEmpty%
                       \pmdraw@LedgesLoop% Draws lower edges
                       #3%
                       \pmdEmpty%
                       \pmdraw@TedgesLoop% Draws transversals
                       #4%
                       \pmdEmpty%
                   \else% If drawing transversal first
                       \pmdraw@TedgesLoop% Draws transversals
                       #4%
                       \pmdEmpty%
                       \pmdraw@UedgesLoop% Draws upper edges
                       #2%
                       \pmdEmpty%
                       \pmdraw@LedgesLoop% Draws lower edges
                       #3%
                       \pmdEmpty%
                   \fi%
               }%
           \fi%
       }%
   \else% If drawing edges first
       \@ifclassloaded{beamer}{% If in beamer
           \uncover<\pmdraw@edgesUncover>{% Uncovers edges
               \ifnum\value{pmdraw@ifEdges}=0% If drawing edges
                   \ifnum\pmdraw@ifTedgesFirst=0% If drawing non-transversals first
                       \pmdraw@UedgesLoop% Draws upper edges
                       #2%
                       \pmdEmpty%
                       \pmdraw@LedgesLoop% Draws lower edges
                       #3%
                       \pmdEmpty%
                       \pmdraw@TedgesLoop% Draws transversals
                       #4%
                       \pmdEmpty%
                   \else% If drawing transversal first
                       \pmdraw@TedgesLoop% Draws transversals
                       #4%
                       \pmdEmpty%
                       \pmdraw@UedgesLoop% Draws upper edges
                       #2%
                       \pmdEmpty%
                       \pmdraw@LedgesLoop% Draws lower edges
                       #3%
                       \pmdEmpty%
                   \fi%
               \else% If hiding edges
                   \phantom{%
                       \ifnum\pmdraw@ifTedgesFirst=0% If drawing non-transversals first
                           \pmdraw@UedgesLoop% Draws upper edges
                           #2%
                           \pmdEmpty%
                           \pmdraw@LedgesLoop% Draws lower edges
                           #3%
                           \pmdEmpty%
                           \pmdraw@TedgesLoop% Draws transversals
                           #4%
                           \pmdEmpty%
                       \else% If drawing transversal first
                           \pmdraw@TedgesLoop% Draws transversals
                           #4%
                           \pmdEmpty%
                           \pmdraw@UedgesLoop% Draws upper edges
                           #2%
                           \pmdEmpty%
                           \pmdraw@LedgesLoop% Draws lower edges
                           #3%
                           \pmdEmpty%
                       \fi%
                   }%
               \fi%
           }%
           \uncover<\pmdraw@verticesTopUncover>{% Uncovers top vertices
               \ifnum\value{pmdraw@ifVerticesTop}=0% If drawing top vertices
                   \pmdraw@drawTopVertices% Draw base diagram
               \else% If hiding top vertices
                   \phantom{%
                       \pmdraw@drawTopVertices% Draw base diagram
                   }%
               \fi%
           }%
           \uncover<\pmdraw@verticesBottomUncover>{% Uncovers bottm vertices
               \ifnum\value{pmdraw@ifVerticesBottom}=0% If drawing bottom vertices
                   \pmdraw@drawBottomVertices% Draw base diagram
               \else% If hiding top vertices
                   \phantom{%
                       \pmdraw@drawBottomVertices% Draw base diagram
                   }%
               \fi%
           }%
       }{% If not in beamer
           \ifnum\value{pmdraw@ifEdges}=0% If drawing edges
               \ifnum\pmdraw@ifTedgesFirst=0% If drawing non-transversals first
                   \pmdraw@UedgesLoop% Draws upper edges
                   #2%
                   \pmdEmpty%
                   \pmdraw@LedgesLoop% Draws lower edges
                   #3%
                   \pmdEmpty%
                   \pmdraw@TedgesLoop% Draws transversals
                   #4%
                   \pmdEmpty%
               \else% If drawing transversal first
                   \pmdraw@TedgesLoop% Draws transversals
                   #4%
                   \pmdEmpty%
                   \pmdraw@UedgesLoop% Draws upper edges
                   #2%
                   \pmdEmpty%
                   \pmdraw@LedgesLoop% Draws lower edges
                   #3%
                   \pmdEmpty%
               \fi%
           \else% If hiding edges
               \phantom{%
                   \ifnum\pmdraw@ifTedgesFirst=0% If drawing non-transversals first
                       \pmdraw@UedgesLoop% Draws upper edges
                       #2%
                       \pmdEmpty%
                       \pmdraw@LedgesLoop% Draws lower edges
                       #3%
                       \pmdEmpty%
                       \pmdraw@TedgesLoop% Draws transversals
                       #4%
                       \pmdEmpty%
                   \else% If drawing transversal first
                       \pmdraw@TedgesLoop% Draws transversals
                       #4%
                       \pmdEmpty%
                       \pmdraw@UedgesLoop% Draws upper edges
                       #2%
                       \pmdEmpty%
                       \pmdraw@LedgesLoop% Draws lower edges
                       #3%
                       \pmdEmpty%
                   \fi%
               }%
           \fi%
           \ifnum\value{pmdraw@ifVerticesTop}=0% If drawing top vertices
               \pmdraw@drawTopVertices% Draw base diagram
           \else% If hiding top vertices
               \phantom{%
                   \pmdraw@drawTopVertices% Draw base diagram
               }%
           \fi%
           \ifnum\value{pmdraw@ifVerticesBottom}=0% If drawing bottom vertices
               \pmdraw@drawBottomVertices% Draw base diagram
           \else% If hiding top vertices
               \phantom{%
                   \pmdraw@drawBottomVertices% Draw base diagram
               }%
           \fi%
       }%
   \fi%
   \pmdraw@hookAfterBrick% Hook after drawing brick
   % Resets user keys and other flags to default values
   \renewcommand{\pmdraw@drawBraceDrawOptions}{}%
   \renewcommand{\pmdraw@drawBraceNodeOptions}{}%
   \renewcommand{\pmdraw@drawDotsDrawOptions}{}%
   \renewcommand{\pmdraw@drawDotsNodeOptions}{}%
   \renewcommand{\pmdraw@drawLabelBDrawOptions}{}%
   \renewcommand{\pmdraw@drawLabelBNodeOptions}{}%
   \renewcommand{\pmdraw@drawLabelTDrawOptions}{}%
   \renewcommand{\pmdraw@drawLabelTNodeOptions}{}%
   \renewcommand{\pmdraw@drawLedgesDrawOptions}{}%
   \renewcommand{\pmdraw@drawNoLabelBa}{-1}%
   \renewcommand{\pmdraw@drawNoLabelBb}{-1}%
   \renewcommand{\pmdraw@drawNoLabelBc}{-1}%
   \renewcommand{\pmdraw@drawNoLabelBd}{-1}%
   \renewcommand{\pmdraw@drawNoLabelBe}{-1}%
   \renewcommand{\pmdraw@drawNoLabelBf}{-1}%
   \renewcommand{\pmdraw@drawNoLabelBg}{-1}%
   \renewcommand{\pmdraw@drawNoLabelBh}{-1}%
   \renewcommand{\pmdraw@drawNoLabelBi}{-1}%
   \renewcommand{\pmdraw@drawNoLabelTa}{-1}%
   \renewcommand{\pmdraw@drawNoLabelTb}{-1}%
   \renewcommand{\pmdraw@drawNoLabelTc}{-1}%
   \renewcommand{\pmdraw@drawNoLabelTd}{-1}%
   \renewcommand{\pmdraw@drawNoLabelTe}{-1}%
   \renewcommand{\pmdraw@drawNoLabelTf}{-1}%
   \renewcommand{\pmdraw@drawNoLabelTg}{-1}%
   \renewcommand{\pmdraw@drawNoLabelTh}{-1}%
   \renewcommand{\pmdraw@drawNoLabelTi}{-1}%
   \renewcommand{\pmdraw@drawNoVertexBa}{-1}%
   \renewcommand{\pmdraw@drawNoVertexBb}{-1}%
   \renewcommand{\pmdraw@drawNoVertexBc}{-1}%
   \renewcommand{\pmdraw@drawNoVertexBd}{-1}%
   \renewcommand{\pmdraw@drawNoVertexBe}{-1}%
   \renewcommand{\pmdraw@drawNoVertexBf}{-1}%
   \renewcommand{\pmdraw@drawNoVertexBg}{-1}%
   \renewcommand{\pmdraw@drawNoVertexBh}{-1}%
   \renewcommand{\pmdraw@drawNoVertexBi}{-1}%
   \renewcommand{\pmdraw@drawNoVertexTa}{-1}%
   \renewcommand{\pmdraw@drawNoVertexTb}{-1}%
   \renewcommand{\pmdraw@drawNoVertexTc}{-1}%
   \renewcommand{\pmdraw@drawNoVertexTd}{-1}%
   \renewcommand{\pmdraw@drawNoVertexTe}{-1}%
   \renewcommand{\pmdraw@drawNoVertexTf}{-1}%
   \renewcommand{\pmdraw@drawNoVertexTg}{-1}%
   \renewcommand{\pmdraw@drawNoVertexTh}{-1}%
   \renewcommand{\pmdraw@drawNoVertexTi}{-1}%
   \renewcommand{\pmdraw@drawTedgesDrawOptions}{}%
   \renewcommand{\pmdraw@drawUedgesDrawOptions}{}%
   \renewcommand{\pmdraw@drawVertexOptions}{}%
   \renewcommand{\pmdraw@hookBeforeBrick}{}%
   \renewcommand{\pmdraw@hookAfterBrick}{}%
   \renewcommand{\pmdraw@ifEdgesFirst}{0}%
   \renewcommand{\pmdraw@ifLabelsB}{0}%
   \renewcommand{\pmdraw@ifLabelsT}{0}%
   \renewcommand{\pmdraw@ifTedgesFirst}{0}%
   \renewcommand{\pmdraw@edgesUncover}{1-}%
   \renewcommand{\pmdraw@verticesBottomUncover}{1-}%
   \renewcommand{\pmdraw@verticesTopUncover}{1-}%
   \let\pmdraw@drawLabelBottom\pmdraw@drawLabelBottomDefault%
   \let\pmdraw@drawLabelTop\pmdraw@drawLabelTopDefault%
   \let\pmdraw@drawLabelBottom\pmdraw@drawLabelBottomDefault%
   \let\pmdraw@drawVertex\pmdraw@drawVertexDefault%
   \setcounter{pmdraw@blankB}{0}%
   \setcounter{pmdraw@blankT}{0}%
   \setcounter{pmdraw@labelStartB}{1}%
   \setcounter{pmdraw@labelStartT}{1}%
   \setcounter{pmdraw@ifEdges}{0}%
   \setcounter{pmdraw@ifVerticesBottom}{0}%
   \setcounter{pmdraw@ifVerticesTop}{0}%
}
\newcommand{\pmdraw@drawLedges}[3][]{% Draws lower non-transversal edge, #1 options, #2 L vertex, #3 R vertex
   \setcounter{pmdraw@NTlevel}{1}% Store default level of edge
   \setkeys{pmdraw@NTedges}{% Sets default non-transversal edge keys
       level=\usevalue{level},
       height=\usevalue{height},
       edge draw=\usevalue{edge draw},
       phantom=\usevalue{phantom},
       uncover=\usevalue{uncover}
   }%
   \setkeys{pmdraw@NTedges}{#1}% Processes options
   \ifdim\pmdraw@NTedgesHeight pt=-1000pt% If using default heights
       \tikzmath{%
           \pmdraw{edgeHeight}=\value{pmdraw@NTlevel}*\pmdraw{edgeSepL};% Calculates height based on level of edge
       }%
   \else% If using manual heights
       \tikzmath{%
           \pmdraw{edgeHeight}=\pmdraw@NTedgesHeight;% Set manual height
       }%
   \fi%
   \@ifclassloaded{beamer}{% If in beamer
       \uncover<\pmdraw@edgeUncover>{% Uncovers edge
           \ifnum\value{pmdraw@ifEdge}=0% If drawing edge
               \pmdraw@drawLedgesDraw{#2}{#3}% Draw edge
           \else% If hiding edge
               \phantom{%
                   \pmdraw@drawLedgesDraw{#2}{#3}% Draw edge
               }%
           \fi%
       }%
   }{% If not in beamer
       \ifnum\value{pmdraw@ifEdge}=0% If drawing edge
           \pmdraw@drawLedgesDraw{#2}{#3}% Draw edge
       \else% If hiding edge
           \phantom{%
               \pmdraw@drawLedgesDraw{#2}{#3}% Draw edge
           }%
       \fi%
   }%
   % Resets user keys and other flags to default values
   \renewcommand{\pmdraw@NTedgesHeight}{-1000}%
   \renewcommand{\pmdraw@edgeUncover}{1-}%
   \setcounter{pmdraw@ifEdge}{0}%
   \let\pmdraw@drawLedgesDraw\pmdraw@drawLedgesDrawDefault%
   \pmdraw@LedgesLoop% Restart for loop
}
\newcommand{\pmdraw@drawTedges}[3][]{% Draws transversal edge, #1 options, #2 upper vertex, #3 lower vertex
   \setkeys{pmdraw@Tedges}{% Sets default key values for transversal edges
       edge draw=\usevalue{edge draw},
       phantom=\usevalue{phantom},
       uncover=\usevalue{uncover}
   }%
  \setkeys{pmdraw@Tedges}{#1}% Processes options
  \@ifclassloaded{beamer}{% If in beamer
      \uncover<\pmdraw@edgeUncover>{% Uncovers edge
          \ifnum\value{pmdraw@ifEdge}=0% If drawing edge
              \pmdraw@drawTedgesDraw{#2}{#3}% Draw edge
          \else% If hiding edge
              \phantom{%
                  \pmdraw@drawTedgesDraw{#2}{#3}% Draw edge
              }%
          \fi%
      }%
  }{% If not in beamer
      \ifnum\value{pmdraw@ifEdge}=0% If drawing edge
          \pmdraw@drawTedgesDraw{#2}{#3}% Draw edge
      \else% If hiding edge
          \phantom{%
              \pmdraw@drawTedgesDraw{#2}{#3}% Draw edge
          }%
      \fi%
  }%
  % Resets user keys and other flags to default values
  \renewcommand{\pmdraw@edgeUncover}{1-}%
  \setcounter{pmdraw@ifEdge}{0}%
  \let\pmdraw@drawTedgesDraw\pmdraw@drawTedgesDrawDefault%
  \pmdraw@TedgesLoop% Restart for loop
}
\newcommand{\pmdraw@drawTopVertices}{% Draws top row of vertices
   \setcounter{pmdraw@topTotal}{\value{pmdraw@blankT}}% Store size of top row of vertices
   \addtocounter{pmdraw@topTotal}{\value{pmdraw@degreeT}}% Store size of top row of vertices
   \foreach \x in {1,...,\value{pmdraw@degreeT}} {% For each vertex in row
       \ifnum\pmdraw@drawNoVertexTa=\x\else% If not skipping vertex
           \ifnum\pmdraw@drawNoVertexTb=\x\else% If not skipping vertex
               \ifnum\pmdraw@drawNoVertexTc=\x\else% If not skipping vertex
                   \ifnum\pmdraw@drawNoVertexTd=\x\else% If not skipping vertex
                       \ifnum\pmdraw@drawNoVertexTe=\x\else% If not skipping vertex
                           \ifnum\pmdraw@drawNoVertexTf=\x\else% If not skipping vertex
                               \ifnum\pmdraw@drawNoVertexTg=\x\else% If not skipping vertex
                                   \ifnum\pmdraw@drawNoVertexTh=\x\else% If not skipping vertex
                                       \ifnum\pmdraw@drawNoVertexTi=\x\else% If not skipping vertex
                                           \pmdraw@drawVertex{\x + \value{pmdraw@blankT}}{\pmdraw@rowSep}% Draw upper vertex
                                       \fi%
                                   \fi%
                               \fi%
                           \fi%
                       \fi%
                   \fi%
               \fi%
           \fi%
       \fi%
       \ifnum\pmdraw@drawNoLabelTa=\x\else% If not skipping label
           \ifnum\pmdraw@drawNoLabelTb=\x\else% If not skipping label
               \ifnum\pmdraw@drawNoLabelTc=\x\else% If not skipping label
                   \ifnum\pmdraw@drawNoLabelTd=\x\else% If not skipping label
                       \ifnum\pmdraw@drawNoLabelTe=\x\else% If not skipping label
                           \ifnum\pmdraw@drawNoLabelTf=\x\else% If not skipping label
                               \ifnum\pmdraw@drawNoLabelTg=\x\else% If not skipping label
                                   \ifnum\pmdraw@drawNoLabelTh=\x\else% If not skipping label
                                       \ifnum\pmdraw@drawNoLabelTi=\x\else% If not skipping label
                                           \ifnum\pmdraw@ifLabelsT=1% If drawing labels
                                               \pmdraw@drawLabelTop{\x + \value{pmdraw@blankT}}{\pmdraw@rowSep}{\thepmdraw@labelStartT}% Draw label
                                           \fi%
                                       \fi%
                                   \fi%
                               \fi%
                           \fi%
                       \fi%
                   \fi%
               \fi%
           \fi%
       \fi%
       \stepcounter{pmdraw@labelStartT}% Update label counter
   }%
}
\newcommand{\pmdraw@drawUedges}[3][]{% Draws upper non-transversal edge, #1 options, #2 L vertex, #3 R vertex
   \setcounter{pmdraw@NTlevel}{1}% Store default level of edge
   \setkeys{pmdraw@NTedges}{% Sets default non-transversal edge keys
       level=\usevalue{level},
       height=\usevalue{height},
       edge draw=\usevalue{edge draw},
       phantom=\usevalue{phantom},
       uncover=\usevalue{uncover}
   }%
   \setkeys{pmdraw@NTedges}{#1}% Processes options
   \ifdim\pmdraw@NTedgesHeight pt=-1000pt% If using default heights
       \tikzmath{%
           \pmdraw{edgeHeight}=\value{pmdraw@NTlevel}*\pmdraw{edgeSepU};% Calculates height based on level of edge
       }%
   \else% If using manual heights
       \tikzmath{%
           \pmdraw{edgeHeight}=\pmdraw@rowSep-\pmdraw@NTedgesHeight;% Set manual height
       }%
   \fi%
   \@ifclassloaded{beamer}{% If in beamer
       \uncover<\pmdraw@edgeUncover>{% Uncovers edge
           \ifnum\value{pmdraw@ifEdge}=0% If drawing edge
               \pmdraw@drawUedgesDraw{#2}{#3}% Draw edge
           \else% If hiding edge
               \phantom{%
                   \pmdraw@drawUedgesDraw{#2}{#3}% Draw edge
               }%
           \fi%
       }%
   }{% If not in beamer
       \ifnum\value{pmdraw@ifEdge}=0% If drawing edge
           \pmdraw@drawUedgesDraw{#2}{#3}% Draw edge
       \else% If hiding edge
           \phantom{%
               \pmdraw@drawUedgesDraw{#2}{#3}% Draw edge
           }%
       \fi%
   }%
   % Resets user keys and other flags to default values
   \renewcommand{\pmdraw@NTedgesHeight}{-1000}%
   \renewcommand{\pmdraw@edgeUncover}{1-}%
   \setcounter{pmdraw@ifEdge}{0}%
   \let\pmdraw@drawLedgesDraw\pmdraw@drawLedgesDrawDefault%
   \let\pmdraw@drawUedgesDraw\pmdraw@drawUedgesDrawDefault%
   \pmdraw@UedgesLoop% Restart for loop
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                        %
%  Grid creation                                         %
%                                                        %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% This is a verbatim copy of:
% https://tex.stackexchange.com/a/467908

\newif\if@showgrid@grid
\newif\if@showgrid@left
\newif\if@showgrid@right
\newif\if@showgrid@below
\newif\if@showgrid@above
\tikzset{%
   every show grid/.style={},
   show grid/.style={execute at end picture={\@showgrid{grid=true,#1}}},%
   show grid/.default={true},
   show grid/.cd,
   labels/.style={font={\sffamily\small},help lines},
   xlabels/.style={},
   ylabels/.style={},
   keep bb/.code={\useasboundingbox (current bounding box.south west) rectangle (current bounding box.north west);},
   true/.style={left,below},
   false/.style={left=false,right=false,above=false,below=false,grid=false},
   none/.style={left=false,right=false,above=false,below=false},
   all/.style={left=true,right=true,above=true,below=true},
   grid/.is if=@showgrid@grid,
   left/.is if=@showgrid@left,
   right/.is if=@showgrid@right,
   below/.is if=@showgrid@below,
   above/.is if=@showgrid@above,
   false,
}

\def\@showgrid#1{%
   \begin{scope}[every show grid,show grid/.cd,#1]
   \if@showgrid@grid
   \begin{pgfonlayer}{background}
   \draw [help lines]
       (current bounding box.south west) grid
       (current bounding box.north east);
%
   \pgfpointxy{1}{1}%
   \edef\xs{\the\pgf@x}%
   \edef\ys{\the\pgf@y}%
   \pgfpointanchor{current bounding box}{south west}
   \edef\xa{\the\pgf@x}%
   \edef\ya{\the\pgf@y}%
   \pgfpointanchor{current bounding box}{north east}
   \edef\xb{\the\pgf@x}%
   \edef\yb{\the\pgf@y}%
   \pgfmathtruncatemacro\xbeg{ceil(\xa/\xs)}
   \pgfmathtruncatemacro\xend{floor(\xb/\xs)}
   \if@showgrid@below
   \foreach \X in {\xbeg,...,\xend} {
       \node [below,show grid/labels,show grid/xlabels] at (\X,\ya) {\X};
   }
   \fi
   \if@showgrid@above
   \foreach \X in {\xbeg,...,\xend} {
       \node [above,show grid/labels,show grid/xlabels] at (\X,\yb) {\X};
   }
   \fi
   \pgfmathtruncatemacro\ybeg{ceil(\ya/\ys)}
   \pgfmathtruncatemacro\yend{floor(\yb/\ys)}
   \if@showgrid@left
   \foreach \Y in {\ybeg,...,\yend} {
       \node [left,show grid/labels,show grid/ylabels] at (\xa,\Y) {\Y};
   }
   \fi
   \if@showgrid@right
   \foreach \Y in {\ybeg,...,\yend} {
       \node [right,show grid/labels,show grid/ylabels] at (\xb,\Y) {\Y};
   }
   \fi
   \end{pgfonlayer}
   \fi
   \end{scope}
}
\tikzset{every show grid/.style={show grid/keep bb}}%  Keep the original bounding box!

\endinput