% The Dynkin Diagrams package.
%
% Version 3.141 592 653 589 793 238 4
%
% This package draws Dynkin diagrams in LaTeX 
% documents, using the TikZ package.
% Please see the file dynkin-diagrams.tex
% for examples of use of this package.
%
% Benjamin McKay
% b.mckay@ucc.ie
%
% Released under the LaTeX Project Public License v1.3c or later, see 
% http://www.latex-project.org/lppl.txt
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesPackage{dynkin-diagrams}[2023/06/02 Dynkin diagrams]
\RequirePackage{tikz}
\RequirePackage{xstring}
\RequirePackage{etoolbox}
\RequirePackage{pgfkeys}
\RequirePackage{pgfopts}
\RequirePackage{amsmath}
\RequirePackage{amssymb}
\RequirePackage{mathtools}
\usetikzlibrary{
	arrows,
	arrows.meta,
	backgrounds,
	calc,
	decorations.markings,
	decorations.pathreplacing,
	decorations.pathmorphing,
	fit,
	patterns,
	shadows}
%%%
%%% Application programming interface: 
%%% See dynkin-diagrams.tex file for examples of use.
%%%
\ifx\draw@lie@hasse@root\undefined\relax
\pgfdeclarelayer{background}
\pgfdeclarelayer{Dynkin behind}
\pgfsetlayers{background,Dynkin behind,main}
\fi
\newif\ifold@dynkin@is@backwards
\newif\ifold@dynkin@is@upsidedown
\newif\ifold@dynkin@is@extended
\newif\ifold@dynkin@label@the@roots
\newif\ifold@dynkin@label@star@the@roots
\newif\ifold@dynkin@is@twisted
\newif\ifold@dynkin@reverse@arrows
\newif\ifold@dynkin@left@fold
\newif\ifold@dynkin@right@fold
\newif\ifold@dynkin@odd
\NewDocumentCommand\dynkin@save{}%
{%
\xdef\dynkin@ply@value{1}%
\ifdynkin@is@backwards\global\old@dynkin@is@backwardstrue\else\global\old@dynkin@is@backwardsfalse\fi%
\ifdynkin@is@upsidedown\global\old@dynkin@is@upsidedowntrue\else\global\old@dynkin@is@upsidedownfalse\fi%
\ifdynkin@is@extended\global\old@dynkin@is@extendedtrue\else\global\old@dynkin@is@extendedfalse\fi%
{\global\dynkin@is@twistedfalse}%
\ifdynkin@label@the@roots\global\old@dynkin@label@the@rootstrue\else\global\old@dynkin@label@the@rootsfalse\fi%
\ifdynkin@label@star@the@roots\global\old@dynkin@label@star@the@rootstrue\else\global\old@dynkin@label@star@the@rootsfalse\fi%
\ifdynkin@is@twisted\global\old@dynkin@is@twistedtrue\else\global\old@dynkin@is@twistedfalse\fi%
\ifdynkin@reverse@arrows\global\old@dynkin@reverse@arrowstrue\else\global\old@dynkin@reverse@arrowsfalse\fi%
\ifdynkin@left@fold\global\old@dynkin@left@foldtrue\else\global\old@dynkin@left@foldfalse\fi%
\ifdynkin@left@fold\global\old@dynkin@right@foldtrue\else\global\old@dynkin@right@foldfalse\fi%
\ifdynkin@odd\global\old@dynkin@oddtrue\else\global\old@dynkin@oddfalse\fi%
}%
\NewDocumentCommand\dynkin@restore{}%
{%
\ifold@dynkin@is@backwards\global\dynkin@is@backwardstrue\else\global\dynkin@is@backwardsfalse\fi%
\ifold@dynkin@is@upsidedown\global\dynkin@is@upsidedowntrue\else\global\dynkin@is@upsidedownfalse\fi%
\ifold@dynkin@is@extended\global\dynkin@is@extendedtrue\else\global\dynkin@is@extendedfalse\fi%
\ifold@dynkin@label@the@roots\global\dynkin@label@the@rootstrue\else\global\dynkin@label@the@rootsfalse\fi%
\ifold@dynkin@label@star@the@roots\global\dynkin@label@star@the@rootstrue\else\global\dynkin@label@star@the@rootsfalse\fi%
\ifold@dynkin@is@twisted\global\dynkin@is@twistedtrue\else\global\dynkin@is@twistedfalse\fi%
\ifold@dynkin@reverse@arrows\global\dynkin@reverse@arrowstrue\else\global\dynkin@reverse@arrowsfalse\fi%
\ifold@dynkin@left@fold\global\dynkin@left@foldtrue\else\global\dynkin@left@foldfalse\fi%
\ifold@dynkin@left@fold\global\dynkin@right@foldtrue\else\global\dynkin@right@foldfalse\fi%
\ifold@dynkin@odd\global\dynkin@oddtrue\else\global\dynkin@oddfalse\fi%
}%
\NewDocumentEnvironment{dynkinDiagram}{O{}mO{0}m}%
{%
\dynkin@save{}%
\begin{tikzpicture}[baseline=(origin.base)]%
\@dynkin[#1]{#2}[#3]{#4}%
}%
{%
\end{tikzpicture}%
\dynkin@restore{}%
}%

\NewDocumentCommand\dynkin@check@if@in@tikZ{}%
{\ifdefined\filldraw\relax\else\dynkin@error@not@in@tikz\fi}

\NewDocumentCommand\dynkin{O{}mO{0}m}%
{%
\dynkin@save{}%
\ifdefined\filldraw\relax%
\@dynkin[vertical shift=0,#1]{#2}[#3]{#4}%
\else%
\tikz[baseline=(origin.base)]{\@dynkin[#1]{#2}[#3]{#4}}%
\fi%
\dynkin@restore{}%
}%


%% Names for Dynkin diagrams.
\xdef\dynkin@indefinite@number@symbol{n}
\NewDocumentCommand\dynkinIndefiniteSymbol{m}%
{%
\xdef\dynkin@indefinite@number@symbol{#1}%
}%
\NewDocumentCommand\dynkinName{O{}mO{0}m}%
{%
	\dynkin@save{}%
	\xdef\dynkin@ply@value{1}%
	\xdef\dynkin@label@directions{}%
	\xdef\dynkin@label@directions@star{}%
	\setcounter{dynkinRootNo}{0}%
	\dynkin@clear@indefinite@edge@list%
	\xdef\dynkin@parabolic{0}%
	\pgfkeys{/Dynkin diagram, #1}%
	\xdef\dynkin@user@series{#2}%
	\xdef\dynkin@twisted@series{#3}%
	\xdef\dynkin@user@string{#4}%
	\xdef\dynkin@string{#4}%
	\xdef\dynkin@series{#2}%
	\dynkin@grok@series%
	\expandafter\expandafter%
	\ifx\csname dynkin\dynkin@series \endcsname\relax%
	% Undefined series
	\dynkin@error@series%
	\fi	
%%	\IfSubStr{ABCDEFGHI}{\dynkin@series}{}{\dynkin@error@series}%
%%	\IfInteger{\dynkin@string}%
	\if!\ifnum9<1\dynkin@string!\fi%
%%	{%
		\dynkin@integer@rank%
%%	}%
%%	{%
		% Turn Satake codes into Dynkin diagram expressions in \dynkin@string.
\else\dynkin@grok@Satake@codes\fi%
%%	}%
	% Expand out any digits in \dynkin@string into multiples of the various root marks.
	\expand@Dynkin@Roots@Digits%
	% Assign to \dynkin@roots the input string \dynkin@string with all . symbols removed,
	% so we only get the symbols representing the marks for the various roots.
	\StrDel{\dynkin@string}{.}[\temp]%
	\xdef\dynkin@roots{\temp}%
	\StrLen{\dynkin@roots}[\temp]%
	\global\dynkin@nodes=\temp\relax%
	\dynkin@grok@indefinite@edges%
	\dynkin@find@rank{}%
	\ensuremath{%
		\dynkin@series^{%
			\ifdynkin@is@extended{1}%
			\else{%
				\IfStrEq{\dynkin@twisted@series}{0}%
				{}%
				{\dynkin@twisted@series}%
				}%
			\fi%
		}%
		_%
		{%
			\ifx\dynkin@user@string\empty\relax%
				\dynkin@indefinite@number@symbol%
			\else%
				\ifdynkin@Satake@diagram%
					\dynkin@user@string%
				\else%
					\IfStrEq{\dynkin@user@string}{even}{ev}%
					{%
						\IfStrEq{\dynkin@user@string}{odd}{od}%
						{%
							\the\dynkin@rank%
						}%
					}%
				\fi%
			\fi%
			\IfStrEq{\dynkin@parabolic}{0}%
				{}%
				{,\dynkin@parabolic}
		}%
	}%
\dynkin@restore{}%
}%

%% Returns the current Dynkin diagram ordering as a string.
\NewDocumentCommand\currentDynkinOrdering{}%
{%
	\dynkin@ordering%
}%

\newcount\dynkinOverrideRoot
\NewDocumentCommand\dynkin@override@label@directions{}%
{%
	\dynkinOverrideRoot1\relax%
	\ifdynkin@is@extended%
		\global\dynkinOverrideRoot0\relax%
	\fi%
	\foreach \overRide in \dynkin@label@directions@override
	{%
		\IfStrEq{\overRide}{}%
		{%
		}%
		{%
			\dynkinPutLabelInDirection{\the\dynkinOverrideRoot}{\overRide}%
		}%
		\global\advance\dynkinOverrideRoot by 1\relax%
	}%
}%

\NewDocumentCommand\dynkinRefreshRoots{}%
{%
	\dynkin@override@label@directions{}%
	\dynkin@draw@all@roots{}%
	\ifdynkin@label@the@roots%
		\dynkinPrintLabels{}%
	\fi%
	\ifdynkin@label@star@the@roots%
		\dynkinPrintLabelsStar{}%
	\fi%
}%


\xdef\dynkin@label@direction{}

\NewDocumentCommand\dynkin@translate@direction{m}%
{%
	\xdef\Dir{#1}
	\ifdynkin@is@backwards
		\IfStrEqCase{\Dir}{%
			{0}{\xdef\Dir{4}}%
			{1}{\xdef\Dir{3}}%
			{2}{\xdef\Dir{2}}%
			{3}{\xdef\Dir{1}}%
			{4}{\xdef\Dir{0}}%
			{5}{\xdef\Dir{7}}%
			{6}{\xdef\Dir{6}}%
			{7}{\xdef\Dir{5}}%
		}%
		[\ClassError%
			{Dynkin diagrams}%
			{Unrecognized root label direction: 
			``\temp'' in Dynkin diagram \dynkin@user@series{\dynkin@user@string}}%
			{}]		
	\fi
	\ifdynkin@is@upsidedown
		\IfStrEqCase{\Dir}{%
			{1}{\xdef\Dir{7}}%
			{2}{\xdef\Dir{6}}%
			{3}{\xdef\Dir{5}}%
			{5}{\xdef\Dir{3}}%
			{6}{\xdef\Dir{2}}%
			{7}{\xdef\Dir{1}}%
		}%
	\fi
	\IfStrEqCase{\Dir}{%
		{0}{\xdef\dynkin@label@direction{right}}%
		{1}{\xdef\dynkin@label@direction{above right}}%
		{2}{\xdef\dynkin@label@direction{above}}%
		{3}{\xdef\dynkin@label@direction{above left}}%
		{4}{\xdef\dynkin@label@direction{left}}%
		{5}{\xdef\dynkin@label@direction{below left}}%
		{6}{\xdef\dynkin@label@direction{below}}%
		{7}{\xdef\dynkin@label@direction{below right}}%
	}%
}%
\newcount\dynkin@rpo%
\NewDocumentCommand\drlap{m}%
{%
\IfStrEq{\dynkin@label@direction}{left}%
{%
	#1%
}%
{%
	\IfStrEq{\dynkin@label@direction}{right}%
	{%
	#1%
	}%
	{%
	\mathrlap{#1}%
	}%
}%
}%
%% \dynkinLabelRoot{<r>}{<s>} or \dynkinLabelRoot*{<r>}{<s>}
%% Prints the label string <s> on the Dynkin diagram at root number <r>, in the current ordering convention.
%% Starred form uses the alternate label location.
\NewDocumentCommand\dynkinLabelRoot{smm}%
{%
	\dynkin@check@if@in@tikZ%
	\ifnum\dynkin@nodes<#2\relax%
		\ClassError{Dynkin diagrams}%
		{Unrecognized root: 
		``#2'' found when labelling Dynkin diagram
		 \dynkin@user@series{\dynkin@user@string}. 
		Allowed values are up to \the\dynkin@nodes}%
		{}%
	\fi%
	\ifx#3\empty\relax%
	\else%
		\dynkin@rpo=#2\relax%
		\advance\dynkin@rpo by 1\relax%
		\IfBooleanTF{#1}%
		{%
			\StrMid{\dynkin@label@directions@star}{\the\dynkin@rpo}{\the\dynkin@rpo}[\dynkin@direction@letter]%
		}%
		{%
			\StrMid{\dynkin@label@directions}{\the\dynkin@rpo}{\the\dynkin@rpo}[\dynkin@direction@letter]%
		}%
		\dynkin@translate@direction{\dynkin@direction@letter}%
		\IfBooleanTF{#1}%
		{%
		\node[inner sep=\dynkin@root@radius,%
			label={%
				[/Dynkin diagram/text style]%
				\dynkin@label@direction:%
				\(\pgfkeys{/Dynkin diagram/label macro*=#3}\)%
				}%
			]%
			at (\dynkin@root@name #2){};%
		}%
		{%
		\node[inner sep=\dynkin@root@radius,%
			label={%
				[/Dynkin diagram/text style]%
				\dynkin@label@direction:%
				\(\pgfkeys{/Dynkin diagram/label macro=#3}\)%
				}%
			]%
			at (\dynkin@root@name #2){};%
		}%
	\fi%
}%
\newcounter{dynkinRootNo}
\NewDocumentCommand\@dynkinLabelThisRoot{m}%
{%
\stepcounter{dynkinRootNo}%
\dynkinLabelRoot{\arabic{dynkinRootNo}}{#1}%
}%
\NewDocumentCommand\@dynkinLabelThisRootStar{m}%
{%
\stepcounter{dynkinRootNo}%
\dynkinLabelRoot*{\arabic{dynkinRootNo}}{#1}%
}%

\NewDocumentCommand\dynkinBrace{somm}%[text]{start}{end}
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\xdef\braceYshift{1mm}%
	}%
	{%
		\xdef\braceYshift{-1mm}%
	}%
	\draw[%
		decoration=%
			{%
				brace,
				\IfBooleanF{#1}{mirror},
				raise=0.05cm,
			},%
		decorate]%
		($(root #3)-({\dynkin@root@radius},
		\IfBooleanTF{#1}%
			{{-\dynkin@root@radius}}%
			{{\dynkin@root@radius}}%
		)$) 
		   	-- 
		($(root #4)+({\dynkin@root@radius},
		\IfBooleanTF{#1}%
			{{\dynkin@root@radius}}%
			{{-\dynkin@root@radius}}%
		)$) 
 		node%
		[%
			pos=0.5,%
		   	anchor=\IfBooleanTF{#1}{south}{north},%
	  		yshift=\braceYshift,%
			/Dynkin diagram/text style%
		]% 
		{\IfValueT{#2}{\(#2\)}};%
}%

\NewDocumentCommand\dynkin@involution{somD<>{}om}%
{%
	\begin{pgfonlayer}{Dynkin behind}%
	\IfValueTF{#2}%
	{%
		\IfValueTF{#5}%
		{%
			\draw[/Dynkin diagram/involution,#2] 
				(root #3) to 
				node[%
					midway,
					/Dynkin diagram/text style,
					#4]
				{$#5$} 
				(root #6);%
		}%
		{%
			\draw[/Dynkin diagram/involution,#2] 
				(root #3) to (root #6);%
		}%		
	}%
	{%
		\IfBooleanTF{#1}
		{%
			\IfValueTF{#5}%
			{%
				\draw[/Dynkin diagram/involution] 
					(root #3)
					to
					node[%
						midway,
						/Dynkin diagram/text style,
						#4]
					{$#5$}
					(root #6);%
			}%
			{%
				\draw[/Dynkin diagram/involution] 
					(root #3) to[bend left] (root #6);%
			}%
		}%
		{%
			\IfValueTF{#5}%
			{%
				\draw[/Dynkin diagram/involution] 
					(root #3) 
					to[bend right] 
					node[%
						midway,
						/Dynkin diagram/text style,
						#4]
					{$#5$}
					(root #6);%
			}%
			{%
				\draw[/Dynkin diagram/involution]
					(root #3) to[bend right] (root #6);%
			}%
		}%
	}%
	\end{pgfonlayer}%
}%

\DeclareListParser*{\forDynkinSemicolonsvlist}{;}
\def\dynkin@involution@input@splitter#1{\dynkin@involution#1}
\NewDocumentCommand\dynkin@draw@involutions{}%
{%
	\expandafter\forDynkinSemicolonsvlist%
		\expandafter\dynkin@involution@input@splitter%
		\expandafter{\dynkin@involution@list}%
}%

%% \dynkinPrintLabels
%% Prints the labels on the Dynkin diagram,in the given ordering. Uses the default labels if ``label'' is set without a list of ``labels'' being set.
\newcommand{\dynkinPrintLabels}%
{%
	\dynkin@check@if@in@tikZ%
	\ifx\dynkin@label@list\empty\relax%
		\foreach \i in {1,...,\the\dynkin@nodes}{\dynkinLabelRoot{\i}{\i}}%
		\ifdynkin@is@extended%
			\dynkinLabelRoot{0}{0}%
		\else%
			\ifdynkin@is@twisted%
				\dynkinLabelRoot{0}{0}%
			\fi%
		\fi%
	\else%
		\ifdynkin@is@extended%
			\setcounter{dynkinRootNo}{-1}%	
		\else%
			\ifdynkin@is@twisted%
				\setcounter{dynkinRootNo}{-1}%	
			\else%
				\setcounter{dynkinRootNo}{0}%	
			\fi%
		\fi%
		\foreach \i in \dynkin@label@list%
		{%
			\@dynkinLabelThisRoot{\i}%
		}%
		\ifdynkin@is@extended%
			\setcounter{dynkinRootNo}{-1}%	
		\else%
			\ifdynkin@is@twisted%
				\setcounter{dynkinRootNo}{-1}%	
			\else%
				\setcounter{dynkinRootNo}{0}%	
			\fi%
		\fi%
    \fi%
}%

% Print alternate location labels.
\newcommand{\dynkinPrintLabelsStar}%
{%
	\dynkin@check@if@in@tikZ%
	\ifx\dynkin@label@list@star\empty\relax%
		\foreach \i in {1,...,\the\dynkin@nodes}{\dynkinLabelRoot*{\i}{\i}}%
		\ifdynkin@is@extended%
			\dynkinLabelRoot*{0}{0}%
		\else%
			\ifdynkin@is@twisted%
				\dynkinLabelRoot*{0}{0}%
			\fi%
		\fi%
	\else%
		\ifdynkin@is@extended%
			\setcounter{dynkinRootNo}{-1}%	
		\else%
			\ifdynkin@is@twisted%
				\setcounter{dynkinRootNo}{-1}%	
			\else%
				\setcounter{dynkinRootNo}{0}%	
			\fi%
		\fi%
		\foreach \i in \dynkin@label@list@star%
		{%
			\@dynkinLabelThisRootStar{\i}%
		}%
		\ifdynkin@is@extended%
			\setcounter{dynkinRootNo}{-1}%	
		\else%
			\ifdynkin@is@twisted%
				\setcounter{dynkinRootNo}{-1}%	
			\else%
				\setcounter{dynkinRootNo}{0}%	
			\fi%
		\fi%
	\fi%
}%

%% \dynkinEdgeLabel{<n1>}{<n2>}{<s>}
%% Prints <s> between root <n1> and <n2> on the current Dynkin diagram in the current root ordering.
\NewDocumentCommand\dynkinEdgeLabel{smmm}%
{%
	\convertRootPair{#2}{#3}%
	\IfBooleanTF{#1}%
	{%
		\draw[draw=none] 
		(\dynkin@root@name \the\@dynkin@from@root) to 
		node[auto,%
		swap,%
		inner sep=\dynkin@root@radius,%
		/Dynkin diagram/text style,%
		/Dynkin diagram/edge label]
		{\(\pgfkeys{/Dynkin diagram/label macro*=#4}\)}%
		(\dynkin@root@name \the\@dynkin@to@root);%
	}%
	{%
		\draw[draw=none] (\dynkin@root@name \the\@dynkin@from@root) to 
		node[auto,%
		inner sep=\dynkin@root@radius,%
		/Dynkin diagram/text style,%
		/Dynkin diagram/edge label] 
		{\(\pgfkeys{/Dynkin diagram/label macro*=#4}\)}%
		(\dynkin@root@name \the\@dynkin@to@root);%
	}%
}%


\NewDocumentCommand\dynkinDrawCrossRootMark{O{}m}%
{%
	\draw[/Dynkin diagram,x,#1]%
		($(#2)+(\dynkin@root@radius,\dynkin@root@radius)$)%
		--%
		($(#2)-(\dynkin@root@radius,\dynkin@root@radius)$);%
	\draw[/Dynkin diagram,x,#1]%
		($(#2)+(-\dynkin@root@radius,\dynkin@root@radius)$)%
		--%
		($(#2)+(\dynkin@root@radius,-\dynkin@root@radius)$);%
}%

%% \dynkinCrossRootMark{<n>}
%% Prints a cross at root <n> on the current Dynkin diagram.
%% The starred form accepts <n> in the Bourbaki ordering.
\NewDocumentCommand\dynkinCrossRootMark{sO{}m}%
{%
	\dynkin@check@if@in@tikZ%	
	\IfBooleanTF{#1}%
	{%
		\convertRootNumber{#3}%
	}%
	{%
		\dynkin@Root@Number=#3\relax%
	}%
	\dynkinDrawCrossRootMark[#2]{\dynkin@root@name \the\dynkin@Root@Number}%
}%

%% \dynkinHeavyCrossRootMark{<n>}
%% Prints a heavy cross at root <n> on the current Dynkin diagram.
%% The starred form accepts <n> in the Bourbaki ordering.
\NewDocumentCommand\dynkinHeavyCrossRootMark{sO{}m}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootNumber{#3}%
	}%
	{%
		\dynkin@Root@Number=#3\relax%
	}%
	\draw[/Dynkin diagram,X,#2]%
		($(\dynkin@root@name \the\dynkin@Root@Number)+(\dynkin@root@radius,\dynkin@root@radius)$)%
		--%
		($(\dynkin@root@name \the\dynkin@Root@Number)-(\dynkin@root@radius,\dynkin@root@radius)$);%
	\draw[/Dynkin diagram,X,#2]%
		($(\dynkin@root@name \the\dynkin@Root@Number)+(-\dynkin@root@radius,\dynkin@root@radius)$)%
		--%
		($(\dynkin@root@name \the\dynkin@Root@Number)+(\dynkin@root@radius,-\dynkin@root@radius)$);%
}%


%% \dynkinHollowRootMark{<n>}
%% Prints an hollow dot at root <n> on the current Dynkin diagram.
%% The starred form accepts <n> in the Bourbaki ordering.
\NewDocumentCommand\dynkinHollowRootMark{sO{}m}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootNumber{#3}%
	}%
	{%
		\dynkin@Root@Number=#3\relax%
	}%
	\fill[/Dynkin diagram,o,#2] (\dynkin@root@name \the\dynkin@Root@Number) circle (\dynkin@root@radius);%
}%

%% \dynkinDoubleHollowRootMark{<n>}
%% Prints a double hollow dot at root <n> on the current Dynkin diagram.
%% The starred form accepts <n> in the Bourbaki ordering.
\NewDocumentCommand\dynkinDoubleHollowRootMark{sO{}m}%
{%
	\dynkin@check@if@in@tikZ%	
	\IfBooleanTF{#1}%
	{%
		\convertRootNumber{#3}%
	}%
	{%
		\dynkin@Root@Number=#3\relax%
	}%
	\fill[/Dynkin diagram,o,#2] (\dynkin@root@name \the\dynkin@Root@Number) circle (2*\dynkin@root@radius);%
	\fill[/Dynkin diagram,o,#2] (\dynkin@root@name \the\dynkin@Root@Number) circle (\dynkin@root@radius);%
}%

\NewDocumentCommand\dynkinDrawSolidRootMark{O{}m}%
{%
	\dynkin@check@if@in@tikZ%	
	\fill[/Dynkin diagram,*,#1] (#2) circle (\dynkin@root@radius);%
}%

%% \dynkinSolidRootMark{<n>}
%% Prints a solid dot at root <n> on the current Dynkin diagram.
%% The starred form accepts <n> in the Bourbaki ordering.
\NewDocumentCommand\dynkinSolidRootMark{sO{}m}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootNumber{#3}%
	}%
	{%
		\dynkin@Root@Number=#3\relax%
	}%
	\dynkinDrawSolidRootMark[#2]{\dynkin@root@name \the\dynkin@Root@Number}%
%	\fill[/Dynkin diagram,*,#2] (\dynkin@root@name \the\dynkin@Root@Number) circle (\dynkin@root@radius);%
}%

%% \dynkinTensorRootMark{<n>}
%% Prints a tensor product symbol at root <n> on the current Dynkin diagram.
%% The starred form accepts <n> in the Bourbaki ordering.
\NewDocumentCommand\dynkinTensorRootMark{sO{}m}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootNumber{#3}%
	}%
	{%
		\dynkin@Root@Number=#3\relax%
	}%
	\fill[/Dynkin diagram,o,#2] (\dynkin@root@name \the\dynkin@Root@Number) circle ({\dynkin@root@radius});%
	\draw[/Dynkin diagram,t,#2]%
		($(\dynkin@root@name \the\dynkin@Root@Number)+({\dynkin@root@radius/sqrt(2)},{\dynkin@root@radius/sqrt(2)})$)%
		--%
		($(\dynkin@root@name \the\dynkin@Root@Number)-({\dynkin@root@radius/sqrt(2)},{\dynkin@root@radius/sqrt(2)})$);%
	\draw[/Dynkin diagram,t,#2]%
		($(\dynkin@root@name \the\dynkin@Root@Number)+({-\dynkin@root@radius/sqrt(2)},{\dynkin@root@radius/sqrt(2)})$)%
		--%
		($(\dynkin@root@name \the\dynkin@Root@Number)+({\dynkin@root@radius/sqrt(2)},{-\dynkin@root@radius/sqrt(2)})$);%
}%

% \dynkinRootMark{<s>}{<n>}
% Prints a dot at root <n> on the current Dynkin diagram using mark style <s>.
% Use <s> empty to get the default mark style.
% The starred form accepts <n> in the Bourbaki ordering.
\NewDocumentCommand\dynkinRootMark{smm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\IfStrEqCase{#2}%
		{%
			{}{\dynkinRootMark*{\dynkin@root@mark}{#3}}%
			{*}{\dynkinSolidRootMark*{#3}}%
			{O}{\dynkinDoubleHollowRootMark*{#3}}%
			{X}{\dynkinHeavyCrossRootMark*{#3}}%
			{o}{\dynkinHollowRootMark*{#3}}%
			{t}{\dynkinTensorRootMark*{#3}}%
			{x}{\dynkinCrossRootMark*{#3}}%
		}%
		[\ClassError%
			{Dynkin diagrams}%
			{Unrecognized root mark: ``#2'' in Dynkin diagram%
			 \dynkin@user@series{\dynkin@user@string}}%
			{}]
	}%
	{%
		\IfStrEqCase{#2}%
		{%
			{}{\dynkinRootMark{\dynkin@root@mark}{#3}}%
			{*}{\dynkinSolidRootMark{#3}}%
			{O}{\dynkinDoubleHollowRootMark{#3}}%
			{X}{\dynkinHeavyCrossRootMark{#3}}%
			{o}{\dynkinHollowRootMark{#3}}%
			{t}{\dynkinTensorRootMark{#3}}%
			{x}{\dynkinCrossRootMark{#3}}%
		}%
		[\ClassError{Dynkin diagrams}{Unrecognized root mark: ``#2'' in Dynkin diagram \dynkin@user@series{\dynkin@user@string}}{}]
	}%
}%

%% \dynkinDefiniteSingleEdge{<p>}{<q>}
%% Draws a single line from root <p> to root <q> on the current Dynkin diagram in the current label ordering.
%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinDefiniteSingleEdge{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#3}{#4}%
	}%
	{%
		\@dynkin@from@root=#3\relax%
		\@dynkin@to@root=#4\relax%
	}%
	\begin{pgfonlayer}{Dynkin behind}%
		\draw[/Dynkin diagram,edge,#2] 
			($(\dynkin@root@name \the\@dynkin@from@root)$) 
			-- 
			($(\dynkin@root@name \the\@dynkin@to@root)$);%
	\end{pgfonlayer}%
}%

%% \dynkinIndefiniteSingleEdge{<p>}{<q>}
%% Draws a single line from root <p> to root <q> on the current Dynkin diagram in the current label ordering,
%% drawn as dashed to indicate an edge containing an indefinite number of roots.
%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinIndefiniteSingleEdge{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#3}{#4}%
	}%
	{%
		\@dynkin@from@root=#3\relax%
		\@dynkin@to@root=#4\relax%
	}%
	\begin{pgfonlayer}{Dynkin behind}%
		\draw[/Dynkin diagram,edge,#2] 
			($(\dynkin@root@name \the\@dynkin@from@root)$) 
			-- 
			(${(2/3)}*(\dynkin@root@name \the\@dynkin@from@root)+{(1/3)}*(\dynkin@root@name \the\@dynkin@to@root)$);%
		\draw[/Dynkin diagram,indefinite edge,#2] 
			(${(2/3)}*(\dynkin@root@name \the\@dynkin@from@root)+{(1/3)}*(\dynkin@root@name \the\@dynkin@to@root)$)
			-- 
			(${(1/3)}*(\dynkin@root@name \the\@dynkin@from@root)+{(2/3)}*(\dynkin@root@name \the\@dynkin@to@root)$);%
		\draw[/Dynkin diagram,edge,#2] 
			(${(1/3)}*(\dynkin@root@name \the\@dynkin@from@root)+{(2/3)}*(\dynkin@root@name \the\@dynkin@to@root)$)
			-- 
			($(\dynkin@root@name \the\@dynkin@to@root)$);%
	\end{pgfonlayer}%
}%	

%%% \dynkinRightFold{<p>}{<q>}
%%% Draws an arrow to represent folding from root <p> to root <q> on the current Dynkin diagram in the current label ordering, curving to the right.
%%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinRightFold{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\dynkinFold*[/Dynkin diagram,fold right style,#2]{#3}{#4}%
	}%
	{%
		\dynkinFold[/Dynkin diagram,fold right style,#2]{#3}{#4}%
	}%
}%

%%% \dynkinLeftFold{<p>}{<q>}
%%% Draws an arrow to represent folding from root <p> to root <q> on the current Dynkin diagram in the current label ordering, curving to the left.
%%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinLeftFold{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\dynkinFold*[/Dynkin diagram,fold left style,#2]{#3}{#4}%
	}%
	{%
		\dynkinFold[/Dynkin diagram,fold left style,#2]{#3}{#4}%
	}%
}%

%% \dynkinFold{<p>}{<q>}
%% Draws some colouring to indicate which roots are being folded together, including roots <p> and <q>.
%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinFold{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#3}{#4}%
	}%
	{%
		\@dynkin@from@root=#3\relax%
		\@dynkin@to@root=#4\relax%
	}%
%	\convertRootPair{\@dynkin@from@root}{\@dynkin@to@root}%
	\begin{pgfonlayer}{Dynkin behind}%
		\draw[/Dynkin diagram/fold style,#2] 
			($(\dynkin@root@name \the\@dynkin@from@root)$)
			to 
			($(\dynkin@root@name \the\@dynkin@to@root)$);
	\end{pgfonlayer}%
}%


%% \dynkinDefiniteRightDownArc{<p>}{<q>}
%% Draws a quarter circle from root <p> to root <q> on the current Dynkin diagram in the current label ordering.
%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinDefiniteRightDownArc{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#3}{#4}%
	}%
	{%
		\@dynkin@from@root=#3\relax%
		\@dynkin@to@root=#4\relax%
	}%
	\begin{pgfonlayer}{Dynkin behind}%
	\draw[/Dynkin diagram,edge,fill=none,#2]%
		($(\dynkin@root@name \the\@dynkin@from@root)$)%
		arc (90:0:\dynkin@fold@radius);%
	\end{pgfonlayer}%
}%

%% \dynkinIndefiniteRightDownArc{<p>}{<q>}
%% Draws a quarter circle from root <p> to root <q> on the current Dynkin diagram in the current label ordering.
%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinIndefiniteRightDownArc{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#3}{#4}%
	}%
	{%
		\@dynkin@from@root=#3\relax%
		\@dynkin@to@root=#4\relax%
	}%
	\node (center) at ($(\dynkin@root@name \the\@dynkin@from@root)-(0,\dynkin@fold@radius)$) {};%
	\begin{pgfonlayer}{Dynkin behind}%
	\draw[/Dynkin diagram,edge,fill=none,#2] 
		(center)
		++(90:\dynkin@fold@radius)
		arc [start angle=90, end angle=60, radius=\dynkin@fold@radius];%
	\draw[/Dynkin diagram,indefinite edge,fill=none,#2]
		(center)
		++(60:\dynkin@fold@radius)
		arc [start angle=60, end angle=30, radius=\dynkin@fold@radius];%
	\draw[/Dynkin diagram,edge,fill=none,#2]
		(center)
		++(30:\dynkin@fold@radius)
		arc [start angle=30, end angle=0, radius=\dynkin@fold@radius];%
	\end{pgfonlayer}%
}%

%% \dynkinDefiniteRightUpArc{<p>}{<q>}
%% Draws a quarter circle from root <p> to root <q> on the current Dynkin diagram in the current label ordering.
%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinDefiniteRightUpArc{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#3}{#4}%
	}%
	{%
		\@dynkin@from@root=#3\relax%
		\@dynkin@to@root=#4\relax%
	}%
	\begin{pgfonlayer}{Dynkin behind}%
	\draw[/Dynkin diagram,edge,fill=none,#2]%
		($(\dynkin@root@name \the\@dynkin@from@root)$)%
		arc (-90:0:\dynkin@fold@radius);%
	\end{pgfonlayer}%
}%

%% \dynkinIndefiniteRightUpArc{<p>}{<q>}
%% Draws a quarter circle from root <p> to root <q> on the current Dynkin diagram in the current label ordering.
%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinIndefiniteRightUpArc{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#3}{#4}%
	}%
	{%
		\@dynkin@from@root=#3\relax%
		\@dynkin@to@root=#4\relax%
	}%
	\node (center) at ($(\dynkin@root@name \the\@dynkin@from@root)+(0,\dynkin@fold@radius)$) {};%
	\begin{pgfonlayer}{Dynkin behind}%
	\draw[/Dynkin diagram,edge,fill=none,#2] 
		(center)
		++(-90:\dynkin@fold@radius)
		arc [start angle=-90, end angle=-60, radius=\dynkin@fold@radius];%
	\draw[/Dynkin diagram,indefinite edge,fill=none,#2]
		(center)
		++(-60:\dynkin@fold@radius)
		arc [start angle=-60, end angle=-30, radius=\dynkin@fold@radius];%
	\draw[/Dynkin diagram,edge,fill=none,#2]
		(center)
		++(-30:\dynkin@fold@radius)
		arc [start angle=-30, end angle=0, radius=\dynkin@fold@radius];%
	\end{pgfonlayer}%
}%


%% \dynkinDefiniteLeftDownArc{<p>}{<q>}
%% Draws a quarter circle from root <p> to root <q> on the current Dynkin diagram in the current label ordering.
%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinDefiniteLeftDownArc{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#3}{#4}%
	}%
	{%
		\@dynkin@from@root=#3\relax%
		\@dynkin@to@root=#4\relax%
	}%
	\begin{pgfonlayer}{Dynkin behind}%
	\draw[/Dynkin diagram,edge,fill=none,#2]%
		($(\dynkin@root@name \the\@dynkin@from@root)$)%
		arc (90:180:\dynkin@fold@radius);%
	\end{pgfonlayer}%
}%

%% \dynkinIndefiniteLeftDownArc{<p>}{<q>}
%% Draws a quarter circle from root <p> to root <q> on the current Dynkin diagram in the current label ordering.
%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinIndefiniteLeftDownArc{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#3}{#4}%
	}%
	{%
		\@dynkin@from@root=#3\relax%
		\@dynkin@to@root=#4\relax%
	}%
	\node (center) at ($(\dynkin@root@name \the\@dynkin@from@root)-(0,\dynkin@fold@radius)$) {};%
	\begin{pgfonlayer}{Dynkin behind}%
	\draw[/Dynkin diagram,edge,fill=none,#2] 
		(center)
		++(90:\dynkin@fold@radius)
		arc [start angle=90, end angle=120, radius=\dynkin@fold@radius];%
	\draw[/Dynkin diagram,indefinite edge,fill=none,#2]
		(center)
		++(120:\dynkin@fold@radius)
		arc [start angle=120, end angle=150, radius=\dynkin@fold@radius];%
	\draw[/Dynkin diagram,edge,fill=none,#2]
		(center)
		++(150:\dynkin@fold@radius)
		arc [start angle=150, end angle=180, radius=\dynkin@fold@radius];%
	\end{pgfonlayer}%
}%

%% \dynkinDefiniteLeftUpArc{<p>}{<q>}
%% Draws a quarter circle from root <p> to root <q> on the current Dynkin diagram in the current label ordering.
%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinDefiniteLeftUpArc{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#3}{#4}%
	}%
	{%
		\@dynkin@from@root=#3\relax%
		\@dynkin@to@root=#4\relax%
	}%
	\begin{pgfonlayer}{Dynkin behind}%
	\draw[/Dynkin diagram,edge,fill=none,#2] 
		($(\dynkin@root@name \the\@dynkin@from@root)$) 
		arc (-90:-180:\dynkin@fold@radius);%
	\end{pgfonlayer}%
}%

%% \dynkinIndefiniteLeftUpArc{<p>}{<q>}
%% Draws a quarter circle from root <p> to root <q> on the current Dynkin diagram in the current label ordering.
%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinIndefiniteLeftUpArc{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#3}{#4}%
	}%
	{%
		\@dynkin@from@root=#3\relax%
		\@dynkin@to@root=#4\relax%
	}%
	\node (center) at ($(\dynkin@root@name \the\@dynkin@from@root)+(0,\dynkin@fold@radius)$) {};%
	\begin{pgfonlayer}{Dynkin behind}%%
	\draw[/Dynkin diagram,edge,fill=none,#2] 
		(center)
		++(-90:\dynkin@fold@radius)
		arc [start angle=-90, end angle=-120, radius=\dynkin@fold@radius];%
	\draw[/Dynkin diagram,indefinite edge,fill=none,#2]
		(center)
		++(-120:\dynkin@fold@radius)
		arc [start angle=-120, end angle=-150, radius=\dynkin@fold@radius];%
	\draw[/Dynkin diagram,edge,fill=none,#2]
		(center)
		++(-150:\dynkin@fold@radius)
		arc [start angle=-150, end angle=-180, radius=\dynkin@fold@radius];%
	\end{pgfonlayer}%
}%


%% \dynkinDefiniteSemiCircle{<p>}{<q>}
%% Draws a half circle from root <p> to root <q> on the current Dynkin diagram in the current label ordering.
%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinDefiniteSemiCircle{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#3}{#4}%
	}%
	{%
		\@dynkin@from@root=#3\relax%
		\@dynkin@to@root=#4\relax%
	}%
	\begin{pgfonlayer}{Dynkin behind}%%
	\draw[/Dynkin diagram,edge,fill=none,#2] 
		($(\dynkin@root@name \the\@dynkin@from@root)$) 
		arc (90:-90:\dynkin@fold@radius);%
	\end{pgfonlayer}%
}%

%% \dynkinIndefiniteSemiCircle{<p>}{<q>}
%% Draws a half circle from root <p> to root <q> on the current Dynkin diagram in the current label ordering.
%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinIndefiniteSemiCircle{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#3}{#4}%
	}%
	{%
		\@dynkin@from@root=#3\relax%
		\@dynkin@to@root=#4\relax%
	}%
	\node (center) at ($(\dynkin@root@name \the\@dynkin@from@root)-(0,\dynkin@fold@radius)$) {};%
	\begin{pgfonlayer}{Dynkin behind}%%
	\draw[/Dynkin diagram,edge,fill=none,#2] 
		(center)
		++(90:\dynkin@fold@radius)
		arc [start angle=90, end angle=30, radius=\dynkin@fold@radius];%
	\draw[/Dynkin diagram,indefinite edge,fill=none,#2]
		(center)
		++(30:\dynkin@fold@radius)
		arc [start angle=30, end angle=-30, radius=\dynkin@fold@radius];%
	\draw[/Dynkin diagram,edge,fill=none,#2]
		(center)
		++(-90:\dynkin@fold@radius)
		arc [start angle=-90, end angle=-30, radius=\dynkin@fold@radius];%
	\end{pgfonlayer}%
}%

%% \dynkinDefiniteDoubleRightDownArc{<p>}{<q>}
%% Draws a quarter circle from root <p> to root <q> on the current Dynkin diagram in the current label ordering
%% as a double path.
%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinDefiniteDoubleRightDownArc{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#3}{#4}%
	}%
	{%
		\@dynkin@from@root=#3\relax%
		\@dynkin@to@root=#4\relax%
	}%
	\begin{pgfonlayer}{Dynkin behind}%%
	\draw[/Dynkin diagram,edge,double,fill=none,#2]%
		($(\dynkin@root@name \the\@dynkin@from@root)$)%
		arc (90:0:{\dynkin@fold@radius});%
	\ifdynkin@arrows%
		\ifdynkin@reverse@arrows%
			\path[
				/Dynkin diagram/arrow shape,
			,tips] 
				($(\dynkin@root@name \the\@dynkin@to@root)$)%
				arc (0:45:{\dynkin@fold@radius});%
		\else%
			\path[
				/Dynkin diagram/arrow shape,
			,tips] 
				($(\dynkin@root@name \the\@dynkin@from@root)$)%
				arc (90:45:{\dynkin@fold@radius});%
		\fi%
	\fi%
	\end{pgfonlayer}%
}%


%% \dynkinDefiniteDoubleUpRightArc{<p>}{<q>}
%% Draws a quarter circle from root <p> to root <q> on the current Dynkin diagram in the current label ordering
%% as a double path.
%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinDefiniteDoubleUpRightArc{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#3}{#4}%
	}%
	{%
		\@dynkin@from@root=#3\relax%
		\@dynkin@to@root=#4\relax%
	}%
	\begin{pgfonlayer}{Dynkin behind}%%
	\draw[/Dynkin diagram,edge,double,fill=none,#2]%
		($(\dynkin@root@name \the\@dynkin@from@root)$)%
		arc (180:90:{\dynkin@fold@radius});%
	\ifdynkin@arrows%
		\ifdynkin@reverse@arrows%
			\path[%
				/Dynkin diagram/arrow shape,
			tips] 
				($(\dynkin@root@name \the\@dynkin@to@root)$)%
				arc (90:135:{\dynkin@fold@radius});%
		\else%
			\path[
				/Dynkin diagram/arrow shape,
			tips] 
				($(\dynkin@root@name \the\@dynkin@from@root)$)%
				arc (180:135:{\dynkin@fold@radius});%
		\fi%
	\fi%
	\end{pgfonlayer}%
}%


%% \dynkinDefiniteDoubleUpLeftArc{<p>}{<q>}
%% Draws a quarter circle from root <p> to root <q> on the current Dynkin diagram in the current label ordering
%% as a double path.
%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinDefiniteDoubleUpLeftArc{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#3}{#4}%
	}%
	{%
		\@dynkin@from@root=#3\relax%
		\@dynkin@to@root=#4\relax%
	}%
	\begin{pgfonlayer}{Dynkin behind}%%
	\draw[/Dynkin diagram,edge,double,fill=none,#2]%
		($(\dynkin@root@name \the\@dynkin@from@root)$)%
		arc (0:90:{\dynkin@fold@radius});%
	\ifdynkin@arrows%
		\ifdynkin@reverse@arrows%
			\path[%
				/Dynkin diagram/arrow shape,
			,tips] 
				($(\dynkin@root@name \the\@dynkin@to@root)$)%
				arc (90:45:{\dynkin@fold@radius});%
		\else%
			\path[%
				/Dynkin diagram/arrow shape,
			,tips] 
				($(\dynkin@root@name \the\@dynkin@from@root)$)%
				arc (0:45:{\dynkin@fold@radius});%
		\fi%
	\fi%
	\end{pgfonlayer}%
}%




%% \dynkinDefiniteDoubleDownRightArc{<p>}{<q>}
%% Draws a quarter circle from root <p> to root <q> on the current Dynkin diagram in the current label ordering
%% as a double path.
%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinDefiniteDoubleDownRightArc{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#3}{#4}%
	}%
	{%
		\@dynkin@from@root=#3\relax%
		\@dynkin@to@root=#4\relax%
	}%
	\begin{pgfonlayer}{Dynkin behind}%%
	\draw[/Dynkin diagram,edge,double,fill=none,#2]%
		($(\dynkin@root@name \the\@dynkin@from@root)$)%
		-- 
		($(\dynkin@root@name \the\@dynkin@to@root)+(-\dynkin@fold@radius,\dynkin@fold@radius)$)%
		arc (-180:-90:{\dynkin@fold@radius});%
	\ifdynkin@arrows%
		\ifdynkin@reverse@arrows%
			\path[%
				/Dynkin diagram/arrow shape,
			tips] 
				($(\dynkin@root@name \the\@dynkin@to@root)$)%
				arc (-90:-135:{\dynkin@fold@radius});%
		\else%
			\path[%
				/Dynkin diagram/arrow shape,
				,tips] 
				($(\dynkin@root@name \the\@dynkin@from@root)$)%
				arc (180:225:{\dynkin@fold@radius});%
		\fi%
	\fi%
	\end{pgfonlayer}%
}%


%% \dynkinDefiniteDoubleRightUpArc{<p>}{<q>}
%% Draws a quarter circle from root <p> to root <q> on the current Dynkin diagram in the current label ordering
%% as a double path.
%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinDefiniteDoubleRightUpArc{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#3}{#4}%
	}%
	{%
		\@dynkin@from@root=#3\relax%
		\@dynkin@to@root=#4\relax%
	}%
	\begin{pgfonlayer}{Dynkin behind}%%
	\draw[/Dynkin diagram,edge,double,fill=none,#2]%
		($(\dynkin@root@name \the\@dynkin@from@root)$)%
		arc (270:360:{\dynkin@fold@radius});%
	\ifdynkin@arrows%
		\ifdynkin@reverse@arrows%
			\path[%
				/Dynkin diagram/arrow shape,
			,tips] 
			($(\dynkin@root@name \the\@dynkin@to@root)$)%
			arc (0:-45:\dynkin@fold@radius);%
		\else%
			\path[%
				/Dynkin diagram/arrow shape,
			,tips] 
			($(\dynkin@root@name \the\@dynkin@from@root)$)%
			arc (270:315:\dynkin@fold@radius);%
		\fi%
	\fi%
	\end{pgfonlayer}%
}%

%% \dynkinDefiniteDoubleLeftDownArc{<p>}{<q>}
%% Draws a quarter circle from root <p> to root <q> on the current Dynkin diagram in the current label ordering
%% as a double path.
%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinDefiniteDoubleLeftDownArc{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#3}{#4}%
	}%
	{%
		\@dynkin@from@root=#3\relax%
		\@dynkin@to@root=#4\relax%
	}%
	\begin{pgfonlayer}{Dynkin behind}%%
	\draw[/Dynkin diagram,edge,double,fill=none,#2]%
		($(\dynkin@root@name \the\@dynkin@from@root)$)%
		arc (90:180:{\dynkin@fold@radius});%
	\ifdynkin@arrows%
		\ifdynkin@reverse@arrows%
			\path[%
				/Dynkin diagram/arrow shape,
			,tips] 
				($(\dynkin@root@name \the\@dynkin@to@root)$)%
				arc (180:{180-45}:{\dynkin@fold@radius});%
		\else%
			\path[
				/Dynkin diagram/arrow shape,
			,tips] 
				($(\dynkin@root@name \the\@dynkin@from@root)$)%
				arc (90:135:{\dynkin@fold@radius});%
		\fi%
	\fi%
	\end{pgfonlayer}%
}%


%% \dynkinDefiniteDoubleDownLeftArc{<p>}{<q>}
%% Draws a quarter circle from root <p> to root <q> on the current Dynkin diagram in the current label ordering
%% as a double path.
%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinDefiniteDoubleDownLeftArc{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#3}{#4}%
	}%
	{%
		\@dynkin@from@root=#3\relax%
		\@dynkin@to@root=#4\relax%
	}%
	\begin{pgfonlayer}{Dynkin behind}%%
	\draw[/Dynkin diagram,edge,double,fill=none,#2]%
		($(\dynkin@root@name \the\@dynkin@from@root)$)%
		arc (360:270:{\dynkin@fold@radius});% 
	\ifdynkin@arrows%
		\ifdynkin@reverse@arrows%
			\path[
				/Dynkin diagram/arrow shape,
			,tips] 
				($(\dynkin@root@name \the\@dynkin@to@root)$)%
				arc (-90:-45:{\dynkin@fold@radius});%
		\else%
			\path[
				/Dynkin diagram/arrow shape,
			,tips] 
				($(\dynkin@root@name \the\@dynkin@from@root)$)%
				arc (360:315:{\dynkin@fold@radius});%
		\fi%
	\fi%
	\end{pgfonlayer}%
}%



%% \dynkinDefiniteDoubleLeftUpArc{<p>}{<q>}
%% Draws a quarter circle from root <p> to root <q> on the current Dynkin diagram in the current label ordering
%% as a double path.
%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinDefiniteDoubleLeftUpArc{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#3}{#4}%
	}%
	{%
		\@dynkin@from@root=#3\relax%
		\@dynkin@to@root=#4\relax%
	}%
	\begin{pgfonlayer}{Dynkin behind}%%
		\draw[/Dynkin diagram,edge,double,fill=none,#2]%
			($(\dynkin@root@name \the\@dynkin@from@root)$)%
			arc (-90:-180:{\dynkin@fold@radius});%
		\ifdynkin@arrows%
			\ifdynkin@reverse@arrows%
				\path[%
				/Dynkin diagram/arrow shape,
				,tips] 
					($(\dynkin@root@name \the\@dynkin@to@root)$)%
					arc (-180:-135:\dynkin@fold@radius);%
			\else%
				\path[,
				/Dynkin diagram/arrow shape,
				tips] 
					($(\dynkin@root@name \the\@dynkin@from@root)$)%
					arc (-90:-135:\dynkin@fold@radius);%
			\fi%
		\fi%
	\end{pgfonlayer}%
}%


%% \dynkinDefiniteDoubleDownRightSemiCircle{<p>}{<q>}
%% Draws a semi circle from root <p> to root <q> on the current Dynkin diagram in the current label ordering
%% as a double path.
%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinDefiniteDoubleDownRightSemiCircle{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#3}{#4}%
	}%
	{%
		\@dynkin@from@root=#3\relax%
		\@dynkin@to@root=#4\relax%
	}%
	\begin{pgfonlayer}{Dynkin behind}%%
		\draw[/Dynkin diagram,edge,double,fill=none,#2]%
			($(\dynkin@root@name \the\@dynkin@from@root)$)%
			arc (90:-90:{\dynkin@fold@radius});%
		\ifdynkin@arrows%
			\ifdynkin@reverse@arrows%
				\path[
				/Dynkin diagram/arrow shape,
				,tips] 
					($(\dynkin@root@name \the\@dynkin@to@root)$)%
					arc (-90:0:\dynkin@fold@radius);%
			\else%
				\path[
				/Dynkin diagram/arrow shape,
				,tips] 
					($(\dynkin@root@name \the\@dynkin@from@root)$)%
					arc (90:0:\dynkin@fold@radius);%
			\fi%
		\fi%
	\end{pgfonlayer}%
}%




%%% \dynkinDefiniteTripleDownRightSemiCircle{<p>}{<q>}
%%% Draws a semi circle from root <p> to root <q> on the current Dynkin diagram in the current label ordering
%%% as a triple path.
%%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinDefiniteTripleDownRightSemiCircle{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#3}{#4}%
	}%
	{%
		\@dynkin@from@root=#3\relax%
		\@dynkin@to@root=#4\relax%
	}%
	\begin{pgfonlayer}{Dynkin behind}%%
		\draw[/Dynkin diagram,
			edge,
			double,
			double distance=\dynkin@root@radius,
			fill=none,
			{Straight Barb[length=1pt]}-{Straight Barb[length=1pt]},
			#2]%
			($(\dynkin@root@name \the\@dynkin@from@root)$)%
			arc (90:-90:{\dynkin@fold@radius});%
		\draw[/Dynkin diagram,edge,fill=none,#2]%
			($(\dynkin@root@name \the\@dynkin@from@root)$)%
			arc (90:-90:{\dynkin@fold@radius});%
		\ifdynkin@arrows%
			\ifdynkin@reverse@arrows%
				\path[
				/Dynkin diagram/arrow shape,
				,tips] 
					($(\dynkin@root@name \the\@dynkin@to@root)$)%
					arc (-90:0:\dynkin@fold@radius);%
			\else%
				\path[
				/Dynkin diagram/arrow shape,
				,tips] 
					($(\dynkin@root@name \the\@dynkin@from@root)$)%
					arc (90:0:\dynkin@fold@radius);%
			\fi%
		\fi%
	\end{pgfonlayer}%%
}%




%% \dynkinDefiniteDoubleUpRightSemiCircle{<p>}{<q>}
%% Draws a semi circle from root <p> to root <q> on the current Dynkin diagram in the current label ordering
%% as a double path.
%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinDefiniteDoubleUpRightSemiCircle{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#3}{#4}%
	}%
	{%
		\@dynkin@from@root=#3\relax%
		\@dynkin@to@root=#4\relax%
	}%
	\begin{pgfonlayer}{Dynkin behind}%%
		\draw[/Dynkin diagram,edge,double,fill=none,#2]%
			($(\dynkin@root@name \the\@dynkin@from@root)$)%
			arc (-90:90:{\dynkin@fold@radius});%
		\ifdynkin@arrows%
			\ifdynkin@reverse@arrows%
				\path[
				/Dynkin diagram/arrow shape,
				,tips] 
					($(\dynkin@root@name \the\@dynkin@to@root)$)%
					arc (90:0:\dynkin@fold@radius);%
			\else%
				\path[
				/Dynkin diagram/arrow shape,
				,tips] 
					($(\dynkin@root@name \the\@dynkin@from@root)$)%
					arc (-90:0:\dynkin@fold@radius);%
			\fi%
		\fi%
	\end{pgfonlayer}%%
}%


%% \dynkinEdge[<o>]{<f>}{<p>}{<q>}
%% Applies \dynkinDefinite<f>[<o>]{<p>}{<q>} if the edge <p><q> is definite, 
%% otherwise applies \dynkinIndefinite<f>[<o>]{<p>}{<q>}
%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinEdge{sO{}mmm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#4}{#5}%
		\dynkin@is@edge@indefinite{\@dynkin@from@root}{\@dynkin@to@root}%
		\ifdynkin@is@indefinite@edge%
			\csname dynkinIndefinite#3\endcsname[#2]%
				{\@dynkin@from@root}{\@dynkin@to@root}%
		\else%
			\csname dynkinDefinite#3\endcsname[#2]%
				{\@dynkin@from@root}{\@dynkin@to@root}%
		\fi%
	}%
	{%
		\dynkin@is@edge@indefinite{#4}{#5}%
		\ifdynkin@is@indefinite@edge%
			\csname dynkinIndefinite#3\endcsname[#2]{#4}{#5}%
		\else%
			\csname dynkinDefinite#3\endcsname[#2]{#4}{#5}%
		\fi%
	}%
}%

%% \dynkinEdgeArrow{<p>}{<q>}
%% Draws an arrow head on the edge from root <p> to root <q>.
%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinEdgeArrow{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\ifdynkin@arrows%
		\IfBooleanTF{#1}%
		{%
			\convertRootPair{#3}{#4}%
		}%
		{%
			\@dynkin@from@root=#3\relax%
			\@dynkin@to@root=#4\relax%
		}%
		\begin{pgfonlayer}{Dynkin behind}%%
			\ifdynkin@reverse@arrows%
				\node (from-arrow-node) 
					at
					($(\dynkin@root@name \the\@dynkin@to@root)$){};%
				\node (to-arrow-node) 
					at
					($(\dynkin@root@name \the\@dynkin@from@root)$){};%
			\else%
				\node (from-arrow-node) 
					at
					($(\dynkin@root@name \the\@dynkin@from@root)$){};%
				\node (to-arrow-node) 
					at
					($(\dynkin@root@name \the\@dynkin@to@root)$){};%
			\fi%
			\node (middle-node)
				at
				($.5*(from-arrow-node)+.5*(to-arrow-node)$){};%
			\node (arrow-node)
				at
				($(middle-node)!.5*\dynkin@arrow@width!(to-arrow-node)$) {};%
			\path[
				/Dynkin diagram/arrow shape,
				tips] 
				($(from-arrow-node)$) 
				-- 
				($(arrow-node)$);%
		\end{pgfonlayer}%%
	\fi%
}%
\NewDocumentCommand\dynkinKacDoubleArrow{O{}mm}%
{%
	\draw[
		arrows = {-{Triangle Cap[length=.8mm,fill=white]}},%
		/Dynkin diagram,
		edge,
		double=white,
		fill=white,
		double distance=1.8pt,
		#1]%
		(\dynkin@root@name \the#2)--(\dynkin@root@name \the#3);%
	\draw[
		arrows = {-{Classical TikZ Rightarrow[length=1mm]}},%
		/Dynkin diagram,
		edge,
		double distance=1.8pt,
		#1]%
		(\dynkin@root@name \the#2)--(\dynkin@root@name \the#3);%
}%
\NewDocumentCommand\dynkinKacTripleArrow{O{}mm}%
{%
	\draw[
		arrows = {-{Triangle Cap[length=.8mm,fill=white]}},%
		/Dynkin diagram,
		edge,
		double=white,
		fill=white,
		double distance=1.8pt,
		#1]%
		(\dynkin@root@name \the#2)--(\dynkin@root@name \the#3);%
	\draw[
		arrows = {-{Classical TikZ Rightarrow[length=1mm]}},%
		/Dynkin diagram,
		edge,
		double distance=1.8pt,
		#1]%
		(\dynkin@root@name \the#2)--(\dynkin@root@name \the#3);%
	\draw[
		/Dynkin diagram,
		edge,
		shorten >=1.1mm,
		#1]%
		(\dynkin@root@name \the#2)--(\dynkin@root@name \the#3);%
}%
\NewDocumentCommand\dynkinKacQuadrupleArrow{O{}mm}%
{%
	\draw[
		arrows = {-{Triangle Cap[length=1.127mm,fill=white]}},%
		/Dynkin diagram,
		edge,
		double=white,
		fill=white,
		shorten >=1mm,
		shorten <=1mm, 
		double distance=3.6pt,
		#1]%
		(\dynkin@root@name \the#2)--(\dynkin@root@name \the#3);%
	\draw[
		arrows = {-{Classical TikZ Rightarrow[length=1.2mm]}},%
		/Dynkin diagram,
		edge,
		double distance=3.6pt,
		shorten <=.83mm,
		#1]%
		(\dynkin@root@name \the#2)--(\dynkin@root@name \the#3);%
	\draw[
		arrows = {-{Classical TikZ Rightarrow[length=1.2mm]}},%
		/Dynkin diagram,
		edge,
		double distance=1.2pt,
		shorten <= .83mm,
		#1]%
		(\dynkin@root@name \the#2)--(\dynkin@root@name \the#3);%
}%
\newcount\dynkin@onesbit%
\newcount\dynkin@twosbit%
%% \dynkinDefiniteDoubleEdge{<p>}{<q>}
%% Draws an oriented double line from root <p> to root <q> on the current Dynkin diagram.
%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinDefiniteDoubleEdge{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#3}{#4}%
	}%
	{%
		\@dynkin@from@root=#3\relax%
		\@dynkin@to@root=#4\relax%
	}%
	\StrChar{\dynkin@roots}{\the\@dynkin@from@root}[\my@root@marker]%
	\IfStrEq{\my@root@marker}{x}%
	{%
		\global\dynkin@onesbit=1\relax%
	}%
	{%
		\global\dynkin@onesbit=0\relax%
	}%
	\StrChar{\dynkin@roots}{\the\@dynkin@to@root}[\my@root@marker]%
	\IfStrEq{\my@root@marker}{x}%
	{%
		\global\dynkin@twosbit=1\relax%
	}%
	{%
		\global\dynkin@twosbit=0\relax%
	}%
	\ifdynkin@Kac@arrows
		\begin{pgfonlayer}{Dynkin behind}%%
			\ifdynkin@arrows%
				\ifdynkin@reverse@arrows
					\ifdynkin@is@backwards
						\dynkinKacDoubleArrow[#2]%
							{\@dynkin@from@root}{\@dynkin@to@root}
					\else%
						\dynkinKacDoubleArrow[#2]%
							{\@dynkin@to@root}{\@dynkin@from@root}
					\fi%
				\else%
					\ifdynkin@is@backwards
						\dynkinKacDoubleArrow[#2]%
							{\@dynkin@to@root}{\@dynkin@from@root}
					\else%
						\dynkinKacDoubleArrow[#2]%
							{\@dynkin@from@root}{\@dynkin@to@root}
					\fi%
				\fi%
			\else%
				\draw[/Dynkin diagram,edge,double distance=3pt,#2]%
					(\dynkin@root@name \the\@dynkin@from@root)%
					--%
					(\dynkin@root@name \the\@dynkin@to@root);%
			\fi%
		\end{pgfonlayer}%%
	\else
		\def\LL{.5*\dynkin@root@radius}
		\begin{pgfonlayer}{Dynkin behind}%%
			\draw[/Dynkin diagram,edge,#2]%
				($(\dynkin@root@name \the\@dynkin@from@root)$)%
				--%
				+({\the\dynkin@onesbit*\LL},{\LL})%
				--%
				($(\dynkin@root@name \the\@dynkin@to@root)%
				+(-\the\dynkin@twosbit*\LL,\LL)$)%
				--%
				($(\dynkin@root@name \the\@dynkin@to@root)$)%
				--%
				($(\dynkin@root@name \the\@dynkin@to@root)%
				-(\the\dynkin@twosbit*\LL,\LL)$)%
				--%
				($(\dynkin@root@name \the\@dynkin@from@root)%
				+(\the\dynkin@onesbit*\LL,-\LL)$)%
				--%
				cycle;%
		\end{pgfonlayer}%%
		\ifdynkin@arrows%
			\dynkinEdgeArrow[#2]%
			{\the\@dynkin@from@root}%
			{\the\@dynkin@to@root}%
		\fi%
	\fi%
}%

%% \dynkinTripleEdge{<p><q>}
%% Draws an oriented triple line from root <p> to root <q> on the current Dynkin diagram.
%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinTripleEdge{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#3}{#4}%
	}%
	{%
		\@dynkin@from@root=#3\relax%
		\@dynkin@to@root=#4\relax%
	}%
	\StrChar{\dynkin@roots}{\the\@dynkin@from@root}[\my@root@marker]%
	\IfStrEq{\my@root@marker}{x}%
	{%
		\global\dynkin@onesbit=1\relax%
	}%
	{%
		\global\dynkin@onesbit=0\relax%
	}%
	\StrChar{\dynkin@roots}{\the\@dynkin@to@root}[\my@root@marker]%
	\IfStrEq{\my@root@marker}{x}%
	{%
		\global\dynkin@twosbit=1\relax%
	}%
	{%
		\global\dynkin@twosbit=0\relax%
	}%
	\ifdynkin@Kac@arrows
		\begin{pgfonlayer}{Dynkin behind}%%
			\ifdynkin@arrows%
				\ifdynkin@reverse@arrows
					\ifdynkin@is@backwards
						\dynkinKacTripleArrow[#2]{\@dynkin@from@root}{\@dynkin@to@root}
					\else%
						\dynkinKacTripleArrow[#2]{\@dynkin@to@root}{\@dynkin@from@root}
					\fi%
				\else%
					\ifdynkin@is@backwards
						\dynkinKacTripleArrow[#2]{\@dynkin@to@root}{\@dynkin@from@root}
					\else%
						\dynkinKacTripleArrow[#2]{\@dynkin@from@root}{\@dynkin@to@root}
					\fi%
				\fi%
			\else%
				\draw[/Dynkin diagram,edge,double distance=3pt,#2]%
					(\dynkin@root@name \the\@dynkin@from@root)%
					--%
					(\dynkin@root@name \the\@dynkin@to@root);%
				\draw[/Dynkin diagram,edge,#2]%
					(\dynkin@root@name \the\@dynkin@from@root)%
					--%
					(\dynkin@root@name \the\@dynkin@to@root);%
			\fi%
		\end{pgfonlayer}%%
	\else
		\begin{pgfonlayer}{Dynkin behind}%%
			\draw[/Dynkin diagram,edge,#2]%
				($(\dynkin@root@name \the\@dynkin@from@root)$)%
				--%
				+({\the\dynkin@onesbit*\dynkin@root@radius},%
				{\dynkin@root@radius})%
				--%
				($(\dynkin@root@name \the\@dynkin@to@root)%
				+(-\dynkin@twosbit*\dynkin@root@radius,%
				\dynkin@root@radius)$)%
				--%
				($(\dynkin@root@name \the\@dynkin@to@root)$)%
				--%
				($(\dynkin@root@name \the\@dynkin@to@root)%
				-(\dynkin@twosbit*\dynkin@root@radius,%
				\dynkin@root@radius)$)%
				--%
				($(\dynkin@root@name \the\@dynkin@from@root)%
				+(\dynkin@onesbit*\dynkin@root@radius,%
				-\dynkin@root@radius)$)%
				--%
				cycle;%
			\draw[/Dynkin diagram,edge,#2] 
				($(\dynkin@root@name \the\@dynkin@from@root)$) 
				-- 
				($(\dynkin@root@name \the\@dynkin@to@root)$);%
		\end{pgfonlayer}%%
		\ifdynkin@arrows%
			\dynkinEdgeArrow[#2]%
				{\the\@dynkin@from@root}%
				{\the\@dynkin@to@root}%
		\fi%
	\fi%
}%


%% \dynkinQuadrupleEdge{<p>}{<q>}
%% \dynkinQuadrupleEdge*{<p>}{<q>}
%% Draws an oriented edge of valence 4 from root <p> to root <q> on the current Dynkin diagram.
%% The starred form accepts <p> and <q> in the Bourbaki ordering.
\NewDocumentCommand\dynkinQuadrupleEdge{sO{}mm}%
{%
	\dynkin@check@if@in@tikZ%	
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#3}{#4}%
	}%
	{%
		\@dynkin@from@root=#3\relax%
		\@dynkin@to@root=#4\relax%
	}%
	\ifdynkin@Kac@arrows
		\begin{pgfonlayer}{Dynkin behind}%%
			\ifdynkin@arrows%
				\ifdynkin@reverse@arrows
					\ifdynkin@is@backwards
						\dynkinKacQuadrupleArrow[#2]%
							{\@dynkin@from@root}{\@dynkin@to@root}
					\else%
						\dynkinKacQuadrupleArrow[#2]%
							{\@dynkin@to@root}{\@dynkin@from@root}
					\fi%
				\else%
					\ifdynkin@is@backwards
						\dynkinKacQuadrupleArrow[#2]%
							{\@dynkin@to@root}{\@dynkin@from@root}
					\else%
						\dynkinKacQuadrupleArrow[#2]%
							{\@dynkin@from@root}{\@dynkin@to@root}
					\fi%
				\fi%
			\else%
				\draw[/Dynkin diagram,edge,double distance=3pt,#2]%
					(\dynkin@root@name \the\@dynkin@from@root)%
					--%
					(\dynkin@root@name \the\@dynkin@to@root);%
				\draw[/Dynkin diagram,edge,#2]%
					(\dynkin@root@name \the\@dynkin@from@root)%
					--%
					(\dynkin@root@name \the\@dynkin@to@root);%
			\fi%
		\end{pgfonlayer}%%
	\else
		\begin{pgfonlayer}{Dynkin behind}%%
			\draw[/Dynkin diagram,edge,#2]%
				($(\dynkin@root@name \the\@dynkin@from@root)%
				+(0,\dynkin@root@radius)$)--%
				($(\dynkin@root@name \the\@dynkin@to@root)%
				+(0,\dynkin@root@radius)$)--%
				($(\dynkin@root@name \the\@dynkin@to@root)%
				+(0,-\dynkin@root@radius)$)--%
				($(\dynkin@root@name \the\@dynkin@from@root)%
				+(0,-\dynkin@root@radius)$)--%
				cycle;
			\draw[/Dynkin diagram,edge,#2]%
				($(\dynkin@root@name \the\@dynkin@from@root)%
				+(0,\dynkin@root@radius/3)$)--%
				($(\dynkin@root@name \the\@dynkin@to@root)%
				+(0,\dynkin@root@radius/3)$)--%
				($(\dynkin@root@name \the\@dynkin@to@root)%
				+(0,-\dynkin@root@radius/3)$)--%
				($(\dynkin@root@name \the\@dynkin@from@root)%
				+(0,-\dynkin@root@radius/3)$)--%
				cycle;
		\end{pgfonlayer}%%
		\ifdynkin@arrows%
			\dynkinEdgeArrow[#2]%
				{\the\@dynkin@from@root}%
				{\the\@dynkin@to@root}%
		\fi%
	\fi%
}%


%% \repeatCharacter{<n>}{<s>} 
%% Outputs <n> copies of the string <s>
\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\repeatCharacter}{O{}mm}
 {
  \int_compare:nT { #2 > 0 }
   {
    #3 \prg_replicate:nn { #2 - 1 } { #1#3 }
   }
 }
\ExplSyntaxOff

%% \stringCharacterInPosition{<s>}{<n>} 
%% Outputs the element of string <s> in position <n>.
\ExplSyntaxOn
\cs_new:Npn \stringCharacterInPosition #1 #2
{
\str_item:fn { #1 } { #2 }
}
\cs_generate_variant:Nn \str_item:nn {f}
\ExplSyntaxOff




%%% 
%%% Implementation:
%%%

\def\dynkin@diagram@name{anonymous}
% Default diagram name
\def\dynkin@root@mark{*} 	
% Default mark
\def\dynkin@affine@root@mark{o}
% Default affine root mark
\def\dynkin@roots{}
% List of marks for each root.
\def\dynkin@user@series{}
% Series string passed from user. 
% For example: 
%      \dynkin{A}{3} passes the string A,
%      \dynkin{A2}{*o*} passes the string A2,
%      \dynkin{E2}{} passes the string E2.
\def\dynkin@user@string{}
% Control string passed from user. 
% For example: 
%      \dynkin{A}{3} passes the string 3,
%      \dynkin{A}{*o*} passes the string *o*,
%      \dynkin{A}{III} passes the string III.
\def\dynkin@string{}
% \dynkin@user@string{} with some modifications to it to expand it out.
\def\dynkin@series{A}
% Which series of root system: A,B,C,D,E,F,G
\def\dynkin@involution@list{}
% List of involutions among roots to draw.
\def\dynkin@label@list{}
% List of labels for the roots.
\def\dynkin@label@list@star{}
% List of alternate labels for the roots.
\newcount\dynkin@rank%
\newcount\dynkin@rank@minus@one%
\newcount\dynkin@rank@minus@two%
\newcount\dynkin@rank@minus@three%
% Which rank of root system: 1,2,...
\newcount\dynkin@nodes
% How many nodes (besides the zero node for affine diagrams) are there?
\newif\ifdynkin@is@backwards
% Are we drawing this thing in a reverse direction?
\newif\ifdynkin@is@upsidedown
% Are we drawing this thing in a reverse direction?
\newif\ifdynkin@is@extended
% Is this an extended extended root system?
\newif\ifdynkin@is@twisted
% Is this a twisted extended root system?
\def\dynkin@twisted@series{0}
% Which Kac series? 0=finite, 1,2,3->infinite
\newif\ifdynkin@label@the@roots
% Should we label the roots by the current root ordering convention?
\newif\ifdynkin@label@star@the@roots
% Should we label the roots by the current root ordering convention?
\newif\ifdynkin@reverse@arrows
% Should we reverse the directions of all arrows?
\newif\ifdynkin@arrows
% Should we draw arrows on Dynkin diagrams?
\newif\ifdynkin@left@fold
% Is the left side of the Dynkin diagram folded?
\newif\ifdynkin@right@fold
% Is the right side of the Dynkin diagram folded?
\newif\ifdynkin@Coxeter
% Should we draw Coxeter diagrams?
\newif\ifdynkin@Kac@arrows
% Should we draw arrows following Kac?
\newif\ifdynkin@odd
% For twisted A series diagrams, is the rank odd?
\newcount\dynkin@ply
% Maximum number of nodes arranged vertically in the folding of the Dynkin diagram
\def\dynkin@ply@value{1}
% Default maximum number of nodes arranged vertically in the folding of the Dynkin diagram
\def\dynkin@label@directions{}
% List of directions in which to draw the labels attached to the roots.
\def\dynkin@label@directions@override{}
% List of directions in which to draw the labels attached to the roots, as overridden by the user.
\def\dynkin@label@directions@star{}
% List of directions in which to draw the labels attached to the roots, for alternate labels.
\def\dynkin@current@location{(0,0)}
\def\dynkin@arrow@width{1.5*\dynkin@root@radius}
\def\dynkin@arrow@style{length=\dynkin@arrow@width}
\def\dynkin@horizontal@shift{0pt}
\def\dynkin@vertical@shift{.5ex}
% Shift applied to all Dynkin diagrams
\NewDocumentCommand\regurgitate{m}{#1}
\pgfkeys{
 /Dynkin diagram/.is family,
 /Dynkin diagram,
	affine mark/.estore in = \dynkin@affine@root@mark,
	affinemark/.forward to = /Dynkin diagram/affine mark,
	affine-mark/.forward to = /Dynkin diagram/affine mark,
	affine-mark = o,
	arrow color/.estore in = /Dynkin diagram/arrow style,
	arrow-color/.forward to=/Dynkin diagram/arrow style,
	arrowcolor/.forward to=/Dynkin diagram/arrow style,
	arrow shape/.style={-{Computer Modern Rightarrow[\dynkin@arrow@style]}},
	arrow style/.estore in = \dynkin@arrow@style,
	arrow-style/.forward to=/Dynkin diagram/arrow style,
	arrowstyle/.forward to=/Dynkin diagram/arrow style,
	arrow width/.estore in = \dynkin@arrow@width,
	arrows/.is if = dynkin@arrows,
	arrows = true,
	at/.estore in = \dynkin@current@location,
	at/.default = {(0,0)},
	backwards/.is if = dynkin@is@backwards,
	backwards = false,
	bird-arrow/.style = {
		arrow shape/.style={-{bird[length=1.25*\dynkin@root@radius]}},
	},
	bird arrow/.style = {
		arrow shape/.style={-{bird[length=1.25*\dynkin@root@radius]}},
	},
	Bourbaki-arrow/.style={
		arrow shape/.style={-{Bourbaki[length=2*\dynkin@root@radius]}},
	},
	Bourbaki arrow/.style = {
		arrow shape/.style={-{Bourbaki[length=2*\dynkin@root@radius]}},
	},
	Coxeter/.is if = dynkin@Coxeter,
	Coxeter=false,
	double edges/.style = {
	 	fold style/.style = {
	 		draw=black,
	 		double=white,
	 		fill=none,
	 		double distance=\dynkin@root@radius,
	 		line width=\defaultpgflinewidth}
	},
	double-edges/.forward to=/Dynkin diagram/double edges/.style,
	doubleedges/.forward to=/Dynkin diagram/double edges/.style,
	double fold/.style = {
	 	fold style/.style = {
	 		draw=black,
	 		double=black!40,
	 		fill=none,
	 		double distance=\dynkin@root@radius,
	 		line width=\defaultpgflinewidth}
	},
	double-fold/.forward to=/Dynkin diagram/double fold/.style,
	doublefold/.forward to=/Dynkin diagram/double fold/.style,
	double left/.style = {
	 	fold left style/.style = {
	 		draw=black,
	 		double=white,
	 		fill=none,
	 		double distance=\dynkin@root@radius,
	 		line width=\defaultpgflinewidth}
	 	},
	double-left/.forward to=/Dynkin diagram/double left/.style,
	doubleleft/.forward to=/Dynkin diagram/double left/.style,
	double fold left/.style = {
	 	fold left style/.style = {
	 		draw=black,
	 		double=black!40,
	 		fill=none,
	 		double distance=\dynkin@root@radius,
	 		line width=\defaultpgflinewidth}
	 	},
	double-fold-left/.forward to=/Dynkin diagram/double fold left/.style,
	doublefoldleft/.forward to=/Dynkin diagram/double fold left/.style,
	double right/.style = {
	 	fold right style/.style = {
	 		draw=black,
	 		double=white,
	 		fill=none,
	 		double distance=\dynkin@root@radius,
	 		line width=\defaultpgflinewidth}
	 	},
	double-right/.forward to=/Dynkin diagram/double right/.style,
	doubleright/.forward to=/Dynkin diagram/double right/.style,
	double fold right/.style = {
	 	fold right style/.style = {
	 		draw=black,
	 		double=black!40,
	 		fill=none,
	 		double distance=\dynkin@root@radius,
	 		line width=\defaultpgflinewidth}
	 	},
	double-fold-right/.forward to=/Dynkin diagram/double fold right/.style,
	doublefoldright/.forward to=/Dynkin diagram/double fold right/.style,
	edge label/.style={
		text height=1.5ex,
		text depth=.25ex,
		label distance=4pt
	},
	edgelabel/.forward to=/Dynkin diagram/edge label/.style,
	edge length/.estore in = \dynkin@edge@length,
	edge-length/.forward to=/Dynkin diagram/edge length,
	edgelength/.forward to=/Dynkin diagram/edge length,
	edge length = .35cm,
	edge/.style={solid,draw=black,fill=white,thin},
	extended/.is if = dynkin@is@extended,
	extended = false,
	fold left/.is if = dynkin@left@fold,
	fold-left/.forward to = /Dynkin diagram/fold left,
	foldleft/.forward to = /Dynkin diagram/fold left,
	fold left = false,
	fold/.style={/Dynkin diagram/ply=2,fold style},
	fold style/.style = {
		/Dynkin diagram/ply=2,
		solid,
		draw=black!40,
		fill=none,
		line width=\dynkin@root@radius,
		{Triangle Cap[]}-{Triangle Cap[]}
		},
	fold-style/.forward to=/Dynkin diagram/fold style/.style,
	foldstyle/.forward to=/Dynkin diagram/fold style/.style,
	fold left style/.style = {},
	fold-left-style/.forward to=/Dynkin diagram/fold left style/.style,
	foldleftstyle/.forward to=/Dynkin diagram/fold left style/.style,
	fold radius/.estore in = \dynkin@fold@radius,
	fold-radius/.forward to=/Dynkin diagram/fold radius,
	foldradius/.forward to=/Dynkin diagram/fold radius,
	fold radius=.3cm,
	fold right/.is if = dynkin@right@fold,
	fold-right/.forward to = fold right,
	foldright/.forward to = fold right,
	fold right = false,
	fold right style/.style = {},
	fold-right-style/.forward to=/Dynkin diagram/fold right style/.style,
	foldrightstyle/.forward to=/Dynkin diagram/fold right style/.style,
	gonality/.estore in = \dynkin@gonality,
	gonality/.default = 0,
	horizontal shift/.estore in=\dynkin@horizontal@shift,
	horizontal shift/.default=0pt,
	horizontal-shift/.forward to=/Dynkin diagram/horizontal shift,
	horizontalshift/.forward to=/Dynkin diagram/horizontal shift,
	indefinite edge ratio/.estore in = \dynkin@indefinite@edge@ratio,
	indefinite-edge-ratio/.forward to = /Dynkin diagram/indefinite edge ratio,
	indefiniteedgeratio/.forward to = /Dynkin diagram/indefinite edge ratio,
	indefinite edge ratio = 1.6,
	indefinite edge/.style={
		solid,
		draw=black,
		fill=white,
		thin,
		densely dotted
	},
	indefinite-edge/.forward to=/Dynkin diagram/indefinite edge/.style,
	indefiniteedge/.forward to=/Dynkin diagram/indefinite edge/.style,
	involution/.style={latex-latex,black},
	involutions/.default = {},
 	involutions/.store in = \dynkin@involution@list,
 	expand involutions/.estore in = \dynkin@involution@list,
	Kac arrows/.is if = dynkin@Kac@arrows,
	Kac-arrows/.forward to = /Dynkin diagram/Kac arrows,
	Kacarrows/.forward to = /Dynkin diagram/Kac arrows,
	Kac arrows=false,
	Kac/.style={
		Kac arrows=true,
		ordering=Kac,
		root radius=.05cm,
		edge length=.66cm,
		indefinite edge ratio = 3,
		edge/.style={
			solid,
			draw=black,
			fill=white,
			thin,
			shorten <=1mm,
			shorten >=1mm
		},
		fold style/.style = {
			solid,
			draw=black!40,
			fill=none,
			line width=\dynkin@root@radius,
			shorten <=1mm,
			shorten >=1mm
		},
		mark=o,
		indefinite edge/.style={
			solid,
			draw=black,
			fill=none,
			thin,
			loosely dotted
		},
	},
	label/.is if = dynkin@label@the@roots,
	label = false,
	label*/.is if = dynkin@label@star@the@roots,
	label*=false,
	label depth/.style={
		/tikz/every label/.append style={
			text depth={depth("#1"}
		}
	},
	label depth/.default=g,
	label depth,
	label-depth/.forward to = /Dynkin diagram/label depth,
	labeldepth/.forward to = /Dynkin diagram/label depth, 
	label directions/.default = {},
	label directions/.store in = \dynkin@label@directions@override,
	expand label directions/.estore in = \dynkin@label@directions@override,
	label* directions/.default = {},
	label* directions/.store in = \dynkin@label@star@directions@override,
	expand label* directions/.estore in = \dynkin@label@star@directions@override,
	label height/.style={/tikz/every label/.append style={text height={height("#1"}}},
	label height/.default=b,
	label height,
	label-height/.forward to = /Dynkin diagram/label height,
	labelheight/.forward to = /Dynkin diagram/label height,
	label macro/.code = {\regurgitate{#1}},
	label-macro/.forward to=/Dynkin diagram/label macro,
	labelmacro/.forward to=/Dynkin diagram/label macro,
	label macro*/.code = {\regurgitate{#1}},
	label-macro*/.forward to=/Dynkin diagram/label macro*,
	labelmacro*/.forward to=/Dynkin diagram/label macro*,
	labels/.default = {},
 	labels/.store in = \dynkin@label@list,
	expand labels/.default = {},
 	expand labels/.estore in = \dynkin@label@list,
	labels*/.default = {},
 	labels*/.store in = \dynkin@label@list@star,
	expand labels*/.default = {},
 	expand labels*/.estore in = \dynkin@label@list,
	make indefinite edge/.code={\dynkin@set@edge@indefinite@pair{#1}},
	make-indefinite-edge/.forward to=/Dynkin diagram/make indefinite edge,
	makeindefiniteedge/.forward to=/Dynkin diagram/make indefinite edge,
	mark/.estore in = \dynkin@root@mark,
	mark = *,
	name/.estore in = \dynkin@diagram@name,
	name = anonymous,
	odd/.is if = dynkin@odd,
	odd=false,
	ordering/.store in = \dynkin@ordering,
	ordering = Bourbaki,
	parabolic/.estore in = \dynkin@parabolic,
	parabolic/.default = 0,
	ply/.estore in = \dynkin@ply@value,
	ply/.default = 1,
	reverse arrows/.is if = dynkin@reverse@arrows,
	reverse arrows = false,
	reverse-arrows/.forward to = /Dynkin diagram/reverse arrows,
	reversearrows/.forward to = /Dynkin diagram/reverse arrows,
	root radius/.estore in = \dynkin@root@radius,
	root-radius/.forward to=/Dynkin diagram/root radius,
	rootradius/.forward to=/Dynkin diagram/root radius,
	root radius=.05cm,
	separator length/.estore in = \dynkin@separator@length,
	separator-length/.forward to=/Dynkin diagram/separator length,
	separatorlength/.forward to=/Dynkin diagram/separator length,
	separator length = .35cm,
	text style/.style={#1},
	text style/.default={black,scale=.7},
	text-style/.forward to=text style/.style,
	textstyle/.forward to=text style/.style,
	twisted/.is if = dynkin@is@twisted,
	twisted = false,
	twisted series/.estore in = \dynkin@twisted@series,
	twisted-series/.forward to = /Dynkin diagram/twisted series,
	twistedseries/.forward to = /Dynkin diagram/twisted series,
	twisted series/.default = 0,
	upside down/.is if = dynkin@is@upsidedown,
	upside down = false,
	upside-down/.forward to = /Dynkin diagram/upside down,
	upsidedown/.forward to = /Dynkin diagram/upside down,
	vertical shift/.estore in=\dynkin@vertical@shift,
	vertical shift/.default=.5ex,
	vertical-shift/.forward to=/Dynkin diagram/vertical shift,
	verticalshift/.forward to=/Dynkin diagram/vertical shift,
	x shift in edge lengths/.code=%
		{%
			\pgfmathsetlengthmacro%
				\dynkin@horizontal@shift%
				{(#1*\dynkin@edge@length)+\dynkin@horizontal@shift}%
		},%
	y shift in edge lengths/.code=%
		{%
			\pgfmathsetlengthmacro%
				\dynkin@vertical@shift%
				{(#1*\dynkin@edge@length)+\dynkin@vertical@shift}%
		},%
	*/.style = {
		solid,
		draw=black,
		fill=black,
	},
	O/.style = {
		solid,
		draw=black,
		fill=white,
	},
	X/.style = {
		solid,
		draw=black, 
		very thick,
		line cap=round
	},
	o/.style = {
		solid,
		draw=black,
		fill=white,
	},
	t/.style = {
		solid,
		draw=black,
		fill=white,
	},
	x/.style = {
		solid,
		thick,
		draw=black,
		line cap=round		
	},
	ceref/.style={
		edge length=.48cm,	
		indefinite edge/.style={
			shorten <=2pt,
			shorten >=2pt,
			solid,
			draw=black,
			fill=white,
			thin,
			densely dotted
		},
		edge/.style={
			solid,
			draw=black,
			fill=white,
			thin,
			double copy shadow={
				draw=black!90,
				fill=none,
				thin,
				shadow xshift=.1pt, 
				shadow yshift=-.15pt
			},
		},
		*/.style={
			yscale=1.2,
			solid,
			draw=black,
			fill=gray,
			double copy shadow={
				fill=black,
				shadow xshift=0.1pt,
				shadow yshift=-0.15pt
			},
		},
		o/.style={
			yscale=1.2,
			solid,
			draw=black,
			fill=white,
			double copy shadow={
				fill=black,
				shadow xshift=0.1pt, 
				shadow yshift=-0.15pt
			},
		},
		O/.style={
			yscale=1.2,
			solid,
			draw=black,
			fill=white,
			double copy shadow={
				fill=green,
				shadow xshift=0.1pt,
				shadow yshift=-0.15pt
			},
		}
		t/.style={
			yscale=1.2,
			solid,
			draw=black,
			fill=white,
		},
	},
	.search also={/tikz},
}
\ProcessPgfPackageOptions{/Dynkin diagram}\relax
\newcount\dynkin@drpo%
\newcount\dynkin@where%
%% \dynkinPutLabelInDirection{<r>}{<d>}
%% Assigns to \dynkin@label@directions or \dynkin@label@directions@star the direction that the label of root <r> (in default ordering) should sit from the root node location, <d>=0,1,2,3,4,5,6,7 to indicate direction in multiples of 45 degrees
\NewDocumentCommand\dynkinPutLabelInDirection{smm}%
{%
	\dynkin@drpo=\the\dynkin@nodes\relax%
	\advance\dynkin@drpo by 1\relax%
	\dynkin@where=#2\relax%
	\IfBooleanTF{#1}%
	{%
		\StrMid{\dynkin@label@directions@star}%
			{1}{\the\dynkin@where}[\dynkin@start]%
		\advance\dynkin@where by 2\relax%
		\StrMid{\dynkin@label@directions@star}%
			{\the\dynkin@where}{\the\dynkin@drpo}[\dynkin@end]%
		\IfStrEqCase{#3}{%
			{right}%
			{%
				\xdef\dynkin@label@directions@star%
					{\dynkin@start 0\dynkin@end}%
			}%
			{above right}%
			{%
				\xdef\dynkin@label@directions@star%
					{\dynkin@start 1\dynkin@end}%
			}%
			{above}%
			{%
				\xdef\dynkin@label@directions@star%
					{\dynkin@start 2\dynkin@end}%
			}%
			{above left}%
			{%
				\xdef\dynkin@label@directions@star%
					{\dynkin@start 3\dynkin@end}%
			}%
			{left}%
			{%
				\xdef\dynkin@label@directions@star%
					{\dynkin@start 4\dynkin@end}%
			}%
			{below left}%
			{%
				\xdef\dynkin@label@directions@star%
					{\dynkin@start 5\dynkin@end}%
			}%
			{below}%
			{%
				\xdef\dynkin@label@directions@star%
					{\dynkin@start 6\dynkin@end}%
			}%
			{below right}%
			{%
				\xdef\dynkin@label@directions@star%
					{\dynkin@start 7\dynkin@end}%
			}%
		}%
		[\ClassError{Dynkin diagrams}%
			{Unrecognized direction: ``#2'' in Dynkin diagram \dynkin@user@series{\dynkin@user@string}}{}]%
	}%
	{%
		\StrMid{\dynkin@label@directions}{1}%
			{\the\dynkin@where}[\dynkin@start]%
		\advance\dynkin@where by 2\relax%
		\StrMid{\dynkin@label@directions}{\the\dynkin@where}%
			{\the\dynkin@drpo}[\dynkin@end]%
		\IfStrEqCase{#3}{%
			{right}%
			{%
				\xdef\dynkin@label@directions%
					{\dynkin@start 0\dynkin@end}%
			}%
			{above right}%
			{%
				\xdef\dynkin@label@directions%
					{\dynkin@start 1\dynkin@end}%
			}%
			{above}%
			{%
				\xdef\dynkin@label@directions%
					{\dynkin@start 2\dynkin@end}%
			}%
			{above left}%
			{%
				\xdef\dynkin@label@directions%
					{\dynkin@start 3\dynkin@end}%
			}%
			{left}%
			{%
				\xdef\dynkin@label@directions%
					{\dynkin@start 4\dynkin@end}%
			}%
			{below left}%
			{%
				\xdef\dynkin@label@directions%
					{\dynkin@start 5\dynkin@end}%
			}%
			{below}%
			{%
				\xdef\dynkin@label@directions%
					{\dynkin@start 6\dynkin@end}%
			}%
			{below right}%
			{%
				\xdef\dynkin@label@directions%
					{\dynkin@start 7\dynkin@end}%
			}%
		}%
		[\ClassError{Dynkin diagrams}%
			{Unrecognized direction: ``#2'' in Dynkin diagram \dynkin@user@series{\dynkin@user@string}}{}]%
	}%
}%
% \expand@Dynkin@Roots@By@Char{<c>}, 
% for example if <c> is the letter x, expands out any expression like 
% x7 in \dynkin@string into 7 copies of the letter x.
\NewDocumentCommand\expand@Dynkin@Roots@By@Char{m}%
{%
	\xdef\replace@DR{}%
	\foreach \i in {0,...,9}%
	{%
		\StrSubstitute[0]{\dynkin@string}{#1\i}{\replace@DR}[\temp@DR]%
		\xdef\dynkin@string{\temp@DR}%
		\xdef\replace@DR{\replace@DR #1}%
	}%
}%
% \expand@Dynkin@Roots@Digits{} expands out any expression like x7 in \dynkin@roots into 7 copies of the letter x, and so on for any letter which is not a digit.
\NewDocumentCommand\expand@Dynkin@Roots@Digits{}%
{%
	\edef\current@string{\dynkin@string}%
	\StrLen{\current@string}[\string@len]
	\foreach \j in {1,...,\string@len}%
	{%
		\StrChar{\current@string}{\j}[\cccc]%
		\IfInteger{\cccc}%
		{}%
		{%
			\expand@Dynkin@Roots@By@Char{\cccc}%	
		}%
	}%
}%
% \dynkin@integer@rank{} expands a \dynkin@string 3 into ***, i.e.
% writes the given number <n> of copies of the default root mark into the string \dynkin@string.
\NewDocumentCommand\dynkin@integer@rank{}%
{%
	\global\dynkin@rank=\dynkin@string\relax%
	\global\dynkin@nodes=\dynkin@string\relax%
	\ifdynkin@is@twisted%
		\IfStrEqCase{\dynkin@series}%
		{%
			{A}%
			{%
				\divide\dynkin@nodes by 2\relax%
				\ifodd\dynkin@rank%
					\global\dynkin@oddtrue%
					\advance\dynkin@nodes by 1\relax%
				\else%
					\global\dynkin@oddfalse%
				\fi%
			}%
			{D}%
			{%
				\IfStrEqCase{\dynkin@twisted@series}%
				{%
					{2}%
					{%
						\global\advance\dynkin@nodes by -1\relax%
					}%
					{3}%
					{%
						\IfStrEq{\dynkin@string}{4}%
						{%
							\global\dynkin@nodes=2\relax%
						}%
						{%
							\dynkin@error@series%
						}%
					}%
				}%
				[\dynkin@error@series]%
			}%
			{E}%
			{%
				\IfStrEq{\dynkin@twisted@series}{2}%
				{%
					\IfStrEq{\dynkin@string}{6}%
					{%
						\global\dynkin@nodes=4\relax%
					}%
					{%
						\dynkin@error@series%
					}%
				}%
				{%
					\dynkin@error@series%
				}%
			}%
		}%
	\fi%
	\xdef\dynkin@string{\repeatCharacter{\the\dynkin@nodes}{\dynkin@root@mark}}%
}%
\NewDocumentCommand\dynkin@clear@indefinite@edge@list{}%
{%
	\xdef\dynkin@indefinite@edge@list{}%
}%
%
\newcount\dynkin@first@root@no%
\newcount\dynkin@second@root@no%
\NewDocumentCommand\dynkin@set@edge@indefinite{mm}%
{%
	\dynkin@first@root@no=#1\relax%
	\dynkin@second@root@no=#2\relax%
	\ifnum\the\dynkin@first@root@no<\the\dynkin@second@root@no\relax%
		\listxadd\dynkin@indefinite@edge@list{\the\dynkin@first@root@no,\the\dynkin@second@root@no}%
	\else%
		\listxadd\dynkin@indefinite@edge@list{\the\dynkin@second@root@no,\the\dynkin@first@root@no}%
	\fi%
}%

\NewDocumentCommand\dynkin@set@edge@indefinite@pair%
{>{\SplitArgument{1}{-}}m}%
{%
\dynkin@set@edge@indefinite#1%
}%
\newif\ifdynkin@is@indefinite@edge%
\NewDocumentCommand\dynkin@typeout@indefinite@edge@list{}%
{%
\providecommand\do{}%
\renewcommand*{\do}[1]{\typeout{##1}}%
\typeout{Indefinite edges: [}\dolistloop{\dynkin@indefinite@edge@list}\typeout{]}%
}%


%% \dynkin@is@edge@indefinite{<p>}{<q>} sets the global if \ifdynkin@is@indefinite@edge to true or false 
%% depending on whether there is an indefinite edge between roots <p> and <q>. 
%% The starred form uses Bourbaki ordering.
\NewDocumentCommand\dynkin@is@edge@indefinite{smm}%
{%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#2}{#3}%
	}%
	{%
		\@dynkin@from@root=#2\relax%
		\@dynkin@to@root=#3\relax%
	}%
	% Next we sort the order, since edges are stored as undirected edges.
	\global\dynkin@first@root@no=\@dynkin@from@root\relax%
	\global\dynkin@second@root@no=\@dynkin@to@root\relax%
	\ifnum\the\dynkin@second@root@no<\the\dynkin@first@root@no\relax%
		\global\dynkin@first@root@no=\@dynkin@to@root\relax%
		\global\dynkin@second@root@no=\@dynkin@from@root\relax%
	\fi%
	\global\dynkin@is@indefinite@edgefalse\relax%
\providecommand\do{}%
\renewcommand*{\do}[1]{%
\IfStrEq{##1}{\the\dynkin@first@root@no,\the\dynkin@second@root@no}%
		{\global\dynkin@is@indefinite@edgetrue\listbreak}%
		{}}%
	\dolistloop{\dynkin@indefinite@edge@list}%
}%
\newcount\dynkin@Root@Numbr%
\newcount\dynkin@string@length%
\newcount\dynkin@Root@Numbrpo%
% \dynkin@grok@indefinite@edges{} reads the input string <s> found when you write \dynkin{<c>}{<s>}, and
% interprets it to say which edges are indefinite edges.
\NewDocumentCommand\dynkin@grok@indefinite@edges{}%
{%
	\dynkin@Root@Numbr=1\relax
	\StrLen{\dynkin@string}[\temp]%
	\dynkin@string@length=\temp\relax%
	\foreach \i in {2,...,\the\dynkin@string@length}%
	{%
		\StrChar{\dynkin@string}{\i}[\c]%
		\IfStrEq{\c}{.}%
		{%
			\dynkin@Root@Numbrpo=\dynkin@Root@Numbr\relax%
			\advance\dynkin@Root@Numbrpo by 1\relax%
			\ifnum\the\dynkin@Root@Numbr<\the\dynkin@nodes\relax%
				\dynkin@set@edge@indefinite{\dynkin@Root@Numbr}{\dynkin@Root@Numbrpo}%
			\fi%
		}%
		{%
			\global\advance\dynkin@Root@Numbr by 1\relax%
		}%
	}%
}%
\xdef\dynkin@spacy{ }
\NewDocumentCommand\dynkin@clear@label@directions{}%
{%
	\xdef\dynkin@label@directions{}%
	\xdef\dynkin@label@directions@star{}%
}%
\NewDocumentCommand\dynkin@set@default@label@directions{}%
{%
	\dynkin@drpo=\the\dynkin@nodes\relax%
	\advance\dynkin@drpo by 1\relax%
	\xdef\dynkin@label@directions{\repeatCharacter{\the\dynkin@drpo}{?}}%
	\xdef\dynkin@label@directions@star{\repeatCharacter{\the\dynkin@drpo}{?}}%
}%
\newlength{\defaultpgflinewidth}%
%
%
%% \@dynkin[<s>]{<X>}[<sb>]{<Y>}
%% Draws a complete Dynkin diagram of 
%% series <X> and 
%% subseries <sb>, 
%% described by the string <Y> 
%% with TikZ options specified by <s>.
\NewDocumentCommand\@dynkin{O{}mO{0}m}%
{%
	\setcounter{dynkinRootNo}{0}%
	\setlength{\defaultpgflinewidth}{\pgflinewidth}%
	\global\defaultpgflinewidth=\defaultpgflinewidth\relax%
	\dynkin@clear@indefinite@edge@list%
	\xdef\dynkin@parabolic{0}%
	\pgfkeys{/Dynkin diagram, #1}%
	\ifdynkin@is@backwards%
		\tikzset{xscale=-1}%
	\fi%
	\ifdynkin@is@upsidedown%
		\tikzset{yscale=-1}%
	\fi%
	\ifx\dynkin@label@list\empty\relax\else\global\dynkin@label@the@rootstrue\fi%
\ifx\dynkin@label@list@star\empty\relax\else\global\dynkin@label@star@the@rootstrue\fi%
	\xdef\dynkin@user@series{#2}%
	\xdef\dynkin@twisted@series{#3}%
	\xdef\dynkin@user@string{#4}%
	\global\dynkin@ply=\dynkin@ply@value\relax%
\xdef\dynkin@indefinite@edge@length{(\dynkin@edge@length*\dynkin@indefinite@edge@ratio)}\relax%
	\xdef\dynkin@series{#2}%
	\IfStrEq{\dynkin@diagram@name}{anonymous}%
	{%
		\xdef\dynkin@root@name{root\dynkin@spacy}%
	}%
	{%
		\xdef\dynkin@root@name{\dynkin@diagram@name\dynkin@spacy root\dynkin@spacy}%
	}%
	\dynkin@grok@series%
	\IfSubStr{ABCDEFGHI}{\dynkin@series}{}{\dynkin@error@series}%
	\xdef\dynkin@string{#4}%
	\IfInteger{\dynkin@string}%
	{%
		\dynkin@integer@rank%
	}%
	{%
		% Turn Satake codes into Dynkin diagram expressions in \dynkin@string.
		\dynkin@grok@Satake@codes%
	}%

	% Expand out any digits in \dynkin@string into multiples of the various root marks.
	\expand@Dynkin@Roots@Digits%
	% Assign to \dynkin@roots the input string \dynkin@string with all . symbols removed,
	% so we only get the symbols representing the marks for the various roots.
	\StrDel{\dynkin@string}{.}[\temp]%
	\xdef\dynkin@roots{\temp}%
	\StrLen{\dynkin@roots}[\temp]%
	\global\dynkin@nodes=\temp\relax%
	\dynkin@grok@indefinite@edges%
	\dynkin@find@rank{}%
	\dynkin@cross@out@parabolics{}%
	\dynkin@set@default@label@directions{}%
	\check@Dynkin@diagram{}%
	\ifdefined\initialize@roots@as@sums@table%
		\initialize@roots@as@sums@table%
	\fi%
	\node[anchor=base,inner sep=0pt,outer sep=0pt] 
		(origin) 
		at 
		\dynkin@current@location 
		{};%
	\node 
		(Dynkin current) 
		at 
		($(origin)+(\dynkin@horizontal@shift,\dynkin@vertical@shift)$)%
		{};%
	\ifdynkin@is@twisted%
		\csname twisted\dynkin@series dynkin\endcsname%
	\else%
		\ifdynkin@is@extended%
			\csname extended\dynkin@series dynkin\endcsname%
		\else%
			\csname\dynkin@series dynkin\endcsname%
		\fi%
	\fi%
	\dynkin@draw@involutions%
	\dynkinRefreshRoots%
}%
%
%% We know the number of nodes; lets find the rank.
\NewDocumentCommand\dynkin@find@rank{}%
{%
	\global\dynkin@rank=\the\dynkin@nodes\relax%
	\ifdynkin@is@twisted%
		\IfStrEqCase{\dynkin@series}%
		{%
			{A}%
			{%
				\global\multiply\dynkin@rank by 2%
				\ifdynkin@odd%
					\global\advance\dynkin@rank by -1\relax%
				\fi%
			}%
			{D}%
			{%
				\IfStrEqCase{\dynkin@twisted@series}%
				{%
					{2}
					{%
						\global\advance\dynkin@rank by 1\relax%
					}%
					{3}
					{%
						\global\advance\dynkin@rank by 2\relax%
					}%
				}%
			}%
			{E}%
			{%
				\global\advance\dynkin@rank by 2\relax%
			}%
		}%
	\fi%
	\global\dynkin@rank@minus@one\the\dynkin@rank\relax%
	\global\advance\dynkin@rank@minus@one by -1\relax%
	\global\dynkin@rank@minus@two\the\dynkin@rank@minus@one\relax%
	\global\advance\dynkin@rank@minus@two by -1\relax%
	\global\dynkin@rank@minus@three\the\dynkin@rank@minus@two\relax%
	\global\advance\dynkin@rank@minus@three by -1\relax%
}%
\newcount\dynkin@lenny%
%% \dynkin@grok@series
%% Interprets the dynkin@series, to see if it is extended, twisted, and what twisted series it is.
\NewDocumentCommand\dynkin@grok@series{}%
{%
	\StrLen{\dynkin@series}[\dynkin@lenny]
	\ifnum\dynkin@lenny>1\relax%
		\dynkin@error@series%
	\fi%
	\edef\series{\dynkin@series}%
	\IfStrEqCase{\dynkin@twisted@series}%
	{%
		{0}{}%
		{1}{ \global\dynkin@is@extendedtrue}%
		{2}{%
			\IfSubStr{ADE}{\dynkin@series}%
			{%
				\global\dynkin@is@twistedtrue%
			}%
			{%
				\dynkin@error@series%
			}%	
		}%
		{3}{%
			\IfStrEq{\dynkin@series}{D}%
			{%
				\global\dynkin@is@twistedtrue%
			}%
			{%
				\dynkin@error@series%
			}%
		}%
	}%
	[\dynkin@error@series]%
}%
\newif\ifdynkin@Satake@diagram%
\NewDocumentCommand\dynkin@grok@Satake@codes{}%
{%
	\ifdynkin@is@extended%
	\else%
		\ifdynkin@is@twisted%
		\else%
			\global\dynkin@Satake@diagramtrue%
		\fi%
	\fi%
	\IfStrEqCase{\dynkin@series}%
	{%
		{A}%
		{%
			\IfStrEqCase{\dynkin@string}%
			{%
				{even}%
				{%
					\gdef\dynkin@string{ddd.ddd}%
					\global\dynkin@oddfalse%
					\global\dynkin@Satake@diagramfalse%
				}%
				{odd}%
				{%
					\gdef\dynkin@string{dddd.ddd}%
					\global\dynkin@oddtrue%
					\global\dynkin@Satake@diagramfalse%
				}%
				{}%
				{%
					\gdef\dynkin@string{dd.dd}%
					\global\dynkin@Satake@diagramfalse%
				}%
				{I}
				{%
					\gdef\dynkin@string{oo.oo}%
				}%
				{II}%
				{%
					\gdef\dynkin@string{*o*.o*}%
				}%
				{IIIa}%
				{%
					\global\dynkin@ply=2\relax%
					\gdef\dynkin@string{oo.o**.**o.oo}%
				}%
				{IIIb}%
				{%
					\global\dynkin@ply=2\relax%
					\gdef\dynkin@string{oo.ooo.oo}%
				}%
				{IV}%
				{%
					\global\dynkin@ply=2\relax%
					\gdef\dynkin@string{o*.*o}%
				}%
			}%
			[\global\dynkin@Satake@diagramfalse]%
		}%
		{B}%
		{%
			\IfStrEqCase{\dynkin@string}%
			{%
				{}{%
					\global\dynkin@Satake@diagramfalse%
					\ifdynkin@Coxeter%
						\gdef\dynkin@string{ddd.ddd}%
					\else%
						\ifdynkin@is@extended%
							\gdef\dynkin@string{ddd.ddd}%
						\else%
							\gdef\dynkin@string{dd.ddd}%
						\fi%
					\fi%
					}%
				{I}{\gdef\dynkin@string{oo.o*.**}}%
				{II}{\gdef\dynkin@string{o*.**}}%
			}%
			[\global\dynkin@Satake@diagramfalse]%
		}%
		{C}%
		{%
			\IfStrEqCase{\dynkin@string}%
			{%
				{}{%
					\global\dynkin@Satake@diagramfalse%
					\ifdynkin@Coxeter%
						\gdef\dynkin@string{ddd.ddd}%
					\else%
						\gdef\dynkin@string{dd.ddd}%
					\fi%
					}%
				{I}{\gdef\dynkin@string{oo.oo}}%
				{IIa}{\gdef\dynkin@string{*o*.o*.**}}%
				{IIb}{\gdef\dynkin@string{*o*.o*o}}%
			}%
			[\global\dynkin@Satake@diagramfalse]%
		}%
		{D}%
		{%
			\IfStrEqCase{\dynkin@string}%
			{%
				{}{%
					\global\dynkin@Satake@diagramfalse%
					\ifdynkin@is@extended%
							\ifnum\dynkin@ply=4\relax%
								\gdef\dynkin@string{dddd.d.ddddd}
							\else%
								\gdef\dynkin@string{ddd.dddd}%
							\fi%
					\else%
						\ifdynkin@is@twisted%
							\IfStrEqCase{\dynkin@twisted@series}%
							{%
								{2}{	\gdef\dynkin@string{dd.ddd}}%
								{3}{\gdef\dynkin@string{ddd}}%
							}%
							[\dynkin@error@series]%
						\else%
							\gdef\dynkin@string{dd.dddd}%
						\fi%
					\fi%
				}%
				{Ia}{\gdef\dynkin@string{oo.o*.***}}%
				{Ib}{\global\dynkin@ply=2\relax\gdef\dynkin@string{o.ooo}}%
				{Ic}{\gdef\dynkin@string{o.ooo}}%
				{II}	{\gdef\dynkin@string{o*.***}}%
				{IIIa}{\gdef\dynkin@string{*o*.o*o}}%
				{IIIb}{\global\dynkin@ply=2\relax\gdef\dynkin@string{*o*.o*oo}}%
			}%
			[\global\dynkin@Satake@diagramfalse]%
		}%
		{E}%
		{%
			\IfStrEqCase{\dynkin@string}%
			{%
				{}%
				{%
					\global\dynkin@Satake@diagramfalse%
					\IfStrEq{\dynkin@twisted@series}{2}%
					{%
						\gdef\dynkin@string{ddddd}%
					}%
					{%
						\dynkin@error@series%
					}%
				}%
				{I}{	\global\dynkin@rank=6\relax\gdef\dynkin@string{oooooo}}%
				{II}	{\global\dynkin@ply=2\relax\gdef\dynkin@string{oooooo}}%
				{III}{\global\dynkin@ply=2\relax\gdef\dynkin@string{oo***o}}%
				{IV}	{\gdef\dynkin@string{o****o}}%
				{V}{	\gdef\dynkin@string{ooooooo}}%
				{VI}	{\gdef\dynkin@string{o*oo*o*}	}%
				{VII}{\gdef\dynkin@string{o****oo}}%
				{VIII}{\gdef\dynkin@string{oooooooo}}%
				{IX}	{\gdef\dynkin@string{o****ooo}}%
			}%
			[\global\dynkin@Satake@diagramfalse]%
		}%
		{F}%
		{%
			\global\dynkin@rank=4\relax%
			\IfStrEqCase{\dynkin@string}%
			{%
				{I}{	\gdef\dynkin@string{oooo}}%
				{II}	{\gdef\dynkin@string{***o}}%
			}%
			[\global\dynkin@Satake@diagramfalse]%
		}%
		{G}%
		{%
			\IfStrEqCase{\dynkin@string}%
			{%
				{I}{\gdef\dynkin@string{oo}}%
			}%
			[\global\dynkin@Satake@diagramfalse]%
		}%
		{H}%
		{%
			\IfStrEqCase{\dynkin@string}%
			{%
				{}{\gdef\dynkin@string{**}}%
			}%
			[\global\dynkin@Satake@diagramfalse]%
		}%
		{I}%
		{%
			\IfStrEqCase{\dynkin@string}%
			{%
				{}{\gdef\dynkin@string{**}}%
				{%
				}%
			}%
			[\global\dynkin@Satake@diagramfalse]%
		}%
	}%
	[\dynkin@error@series]%
	\ifdynkin@Satake@diagram%
	\else%
		\StrSubstitute{\dynkin@string}{d}{\dynkin@root@mark}[\temp]%
		\xdef\dynkin@string{\temp}%
	\fi%
}%
\NewDocumentCommand\dynkin@error@not@in@tikz{}
{%
	\ClassError%
		{Dynkin diagrams}%
		{Dynkin diagram macros called outside of tikz environment}%
		{}%
}%
\NewDocumentCommand\dynkin@error@root@ordering{}
{%
	\ClassError%
		{Dynkin diagrams}%
		{Unrecognized root ordering: ``\dynkin@ordering'' 
		in Dynkin diagram \dynkin@user@series{\dynkin@user@string}}%
		{}%
}%
\NewDocumentCommand\dynkin@error@rank{}%
{%
	\ClassError%
		{Dynkin diagrams}%
		{Unrecognized \dynkin@user@series\dynkin@spacy series rank: 
		``\the\dynkin@rank'' in Dynkin diagram \dynkin@user@series{\dynkin@user@string}}%
		{}%
}%
\NewDocumentCommand\dynkin@error@series{}%
{%
	\ClassError%
		{Dynkin diagrams}%
		{Unrecognized series ``\dynkin@user@series'' 
		in Dynkin diagram \dynkin@user@series{\dynkin@user@string}}%
		{}%
}%
\NewDocumentCommand\dynkin@error@ply{}
{%
	\ClassError%
		{Dynkin diagrams}%
		{Unrecognized ply: ``\the\dynkin@ply'' 
		in Dynkin diagram \dynkin@user@series{\dynkin@user@string}}%
		{}%
}%
%% \check@Dynkin@Roots
%% Raises error messages for erroneous input in the list of Dynkin roots.
\NewDocumentCommand\check@Dynkin@Roots{}%
{%
	\foreach \i in {1,...,\the\dynkin@nodes}%
	{%
		\StrChar{\dynkin@roots}{\i}[\cccc]%
		\IfSubStr{*OXotx}{\cccc}%
		{%
		}%
		{%else
			\ClassError%
				{Dynkin diagrams}%
				{Unrecognized Dynkin diagram root mark: 
				``\cccc'' in Dynkin diagram  \dynkin@user@series{\dynkin@user@string}}%
				{}%
		}%
	}%
}%

%% \check@Dynkin@root@order
\NewDocumentCommand\check@Dynkin@root@order{m}%
{%
	\IfStrEqCase{#1}%
	{%
		{Adams}{}%
		{Bourbaki}{}%
		{Carter}{}%
		{Dynkin}{}%
		{Kac}{}%
		{TestOrder}{}%
	}%
	[\ClassError%
		{Dynkin diagrams}%
		{Unrecognized label ordering: ``#1'' }%
		{}]%
}%
%% \check@Dynkin@diagram
%% Raises error messages for erroneous inputs.
\NewDocumentCommand\check@Dynkin@diagram{}%
{%
	\IfSubStr{1234}{\the\dynkin@ply}{}{\dynkin@error@ply}%
	\check@Dynkin@Roots%
	\check@Dynkin@root@order{\dynkin@ordering}%
	\IfStrEqCase{\dynkin@series}%
	{%
		{A}{}%
		{B}{}%
		{C}{}%
		{D}{}%
		{E}%
		{%
			\ifnum\dynkin@nodes=5\relax%
				\ifnum\dynkin@rank=6\relax%
					\IfStrEq{\dynkin@twisted@series}{2}%
					{%
					}%
					{%
						\dynkin@error@rank%
					}%
				\else%
					\dynkin@error@rank%
				\fi%
			\else
				\ifnum\dynkin@rank=6\relax%
				\else%
					\ifnum\dynkin@rank=7\relax%
					\else%
						\ifnum\dynkin@rank=8\relax%
						\else%
							\IfStrEq{\dynkin@ordering}{Kac}{}{\dynkin@error@rank}%
						\fi%
					\fi%
				\fi%
			\fi%
		}%
		{F}%
		{%
			\ifnum\dynkin@rank=4\relax%
			\else%
				\dynkin@error@rank%
			\fi%
		}%
		{G}%
		{%
			\ifnum\dynkin@rank=2\relax%
			\else%
				\dynkin@error@rank%
			\fi%
		}%
		{H}{}%
		{I}{}%
	}%
	[\dynkin@error@series]%
}%


%% A slight headache: all of the routines that draw Dynkin diagrams are written 
%% in Bourbaki ordering. We store the roots in the current ordering.
%% So when we draw edges, we need to convert from the Bourbaki ordering each time.
%% We store the conversions here.
\newcount\dynkin@Root@Number%
\newcount\@dynkin@from@root%
\newcount\@dynkin@to@root%
%% \swapRootIfInLastTwoRoots{<r>}
%% If the input root <r> is one of the last two roots, then put the other in \dynkin@Root@Number, otherwise
%% let \dynkin@Root@Number be <r>.
\NewDocumentCommand\swapRootIfInLastTwoRoots{m}%
{%
	\ifnum\dynkin@rank>1\relax%
		\ifnum\dynkin@rank=#1\relax%
			\global\dynkin@Root@Number=\the\dynkin@rank@minus@one\relax%
		\else%
			\ifnum\dynkin@rank@minus@one=#1\relax%
				\global\dynkin@Root@Number=\the\dynkin@rank\relax%
			\else%
				\global\dynkin@Root@Number=#1\relax%
			\fi%
		\fi%
	\else%
		\global\dynkin@Root@Number=#1\relax%
	\fi%
}%
\newcount\dynkin@r%
\NewDocumentCommand\swap@if@in@last@two{mm}%
{%
	\global\dynkin@r=#2\relax%
	\ifnum\dynkin@r=#1\relax%
		\global\advance \dynkin@r by -1\relax%
	\else%
		\global\advance \dynkin@r by 1\relax%
		\ifnum\dynkin@r=#1\relax%
		\else%
			\global\advance \dynkin@r by -1\relax%
		\fi%
	\fi%
	\the\dynkin@r%
}%
\newcount\dynkin@root@no%
\NewDocumentCommand\dynkinOrderToBourbaki{mmmmm}%
%% \dynkinOrderToBourbaki{series}{rank}{from order}{root}{counter to store result}
%% Stores the number of root in Bourbaki order which corresponds to
%% the root <number> in <from order>, for the series of simple Lie algebra 
%% <series>, rank <rank>.
%% Example: \dynkinOrderToBourbaki{E}{8}{Carter}{7}
%% yields 3, because the 7th root in E8 according  to Carter's ordering is the
%% 3rd in Bourbaki's.
{%
%	\check@Dynkin@root@order{#3}%
	\IfStrEq{#4}{0}%
	{%
		% The affine root is often labelled as root 0, and it is the same in all orderings.
		\global#5=0%
	}%
	{%
		\IfStrEqCase{#1}%
		{%
			{A}%
			{%
				\global#5=#4\relax%
			}%
			{D}%
			{%
				\IfStrEqCase{#3}%
				{%
					{Adams}{%
						\global#5=%
						\swap@if@in@last@two{#2}{#4}%
						\relax%
					}%
					{Dynkin}{%
						\global#5=%
						\swap@if@in@last@two{#2}{#4}%
						\relax%
					}%
					{Kac}{%
						\global#5=%
						\swap@if@in@last@two{#2}{#4}%
						\relax%
						}%
				}%
				[\global#5=#4\relax]%
			}%
			{E}%
			{%
					\ifnum#2=6\relax%
							\IfStrEqCase{#3}%
							{%
								{Adams}%
								{%
									\global#5=%
									\stringCharacterInPosition%
									{135426}{#4}%
									\relax%
								}%
								{Carter}%
								{%
									\global#5=%
									\stringCharacterInPosition%
									{134256}{#4}%
									\relax%
								}%
								{Dynkin}%
								{%
									\global#5=%
									\stringCharacterInPosition{134562}{#4}%
									\relax%
								}%
								{Kac}%
								{%
									\global#5=%
									\stringCharacterInPosition%
									{134562}{#4}%
									\relax%
								}%
							}%
							[\global#5=#4\relax]%
					\else%
						\ifnum#2=7\relax%
							\IfStrEqCase{#3}%
							{%
								{Adams}%
								{%
									\global#5=%
									\stringCharacterInPosition%
									{6524317}{#4}%
									\relax%
								}%
								{Carter}%
								{%
									\global#5=%
									\stringCharacterInPosition%
									{7654231}{#4}%
									\relax%
								}%
								{Dynkin}%
								{%
									\global#5=%
									\stringCharacterInPosition%
									{1345672}{#4}%
									\relax%
								}%
								{Kac}%
								{%
									\global#5=%
									\stringCharacterInPosition%
									{1245672}{#4}%
									\relax%
								}%
							}%
							[\global#5=#4\relax]%
						\else%
							\ifnum#2=8\relax%
								\IfStrEqCase{#3}%
								{%
									{Adams}%
									{%
										\global#5=%
										\stringCharacterInPosition%
										{13245678}{#4}%
										\relax%
									}%
									{Carter}%
									{%
										\global#5=%
										\stringCharacterInPosition%
										{87654231}{#4}%
										\relax%
									}%
									{Dynkin}%
									{%
										\global#5=%
										\stringCharacterInPosition%
										{13456782}{#4}%
										\relax%
									}%
									{Kac}%
									{%
										\global#5=%
										\stringCharacterInPosition%
										{87654312}{#4}%
										\relax%
									}%
								}%
								[\global#5=#4\relax]%
							\else%
								\global#5=#4\relax%
							\fi%
						\fi%
					\fi%
			}%
			{F}%
			{%
				\IfStrEqCase{#3}%
				{%
					{Adams}{\global#5=%
							\stringCharacterInPosition{4321}{#4}%
							\relax}%
				}%
				[\global#5=#4\relax]%
			}%
			{G}%
			{%
				\IfStrEqCase{#3}%
				{%
					{Carter}{\global#5=%
							\stringCharacterInPosition{21}{#4}%
							\relax}%
					{Dynkin}{\global#5=%
							\stringCharacterInPosition{21}{#4}%
							\relax}%
				}%
				[\global#5=#4\relax]%
			}%
		}%
		[\global#5=#4\relax]%
	}%
}%
\NewDocumentCommand\dynkinOrderFromBourbaki{mmmmm}%
%% \dynkinOrderFromBourbaki{series}{rank}{root}{to order}{count to store result}
%% Stores the number of root in <from order> which corresponds to
%% the root <number> in Bourbaki ordering, for the series of simple Lie algebra 
%% <series>, rank <rank>.
%% Example: \dynkinOrderFromBourbaki{E}{8}{7}{Carter}
%% yields 2, because the 7th root in E8 according  to Bourbaki's ordering is the
%% 2nd in Carter's.
{%
%	\check@Dynkin@root@order{#4}%
	\IfStrEq{#3}{0}%
	{%
		% The affine root is often labelled as root 0, and it is the same in all orderings.
		\global#5=0\relax%
	}%
	{%
	\IfStrEqCase{#1}%
	{%
		{A}%
		{%
			\global#5=#3\relax%
		}%
		{D}%
		{%
			\IfStrEqCase{#4}%
			{%
				{Adams}{%
					\global#5=%
					\swap@if@in@last@two{#2}{#3}%
					\relax%
				}%
				{Dynkin}{%
					\global#5=%
					\swap@if@in@last@two{#2}{#3}%
					\relax%
				}%
				{Kac}{%
					\global#5=%
					\swap@if@in@last@two{#2}{#3}%
					\relax%
					}%
			}%
			[\global#5=#3\relax]%
		}%
		{E}%
		{%
				\ifnum#2=6\relax%
						\IfStrEqCase{#4}%
						{%
							{Adams}%
							{%
								\global#5=%
								\stringCharacterInPosition%
								{152436}{#3}%
								\relax%
							}%
							{Carter}%
							{%
								\global#5=%
								\stringCharacterInPosition%
								{142356}{#3}%
								\relax%
							}%
							{Dynkin}%
							{%
								\global#5=%
								\stringCharacterInPosition%
								{162345}{#3}%
								\relax%
							}%
							{Kac}%
							{%
								\global#5=%
								\stringCharacterInPosition%
								{162345}{#3}%
								\relax%
							}%
						}%
						[\global#5=#3\relax]%
				\else%
					\ifnum#2=7\relax%
						\IfStrEqCase{#4}%
						{%
							{Adams}%
							{%
								\global#5=%
								\stringCharacterInPosition{6354217}{#3}%
								\relax%
							}%
							{Carter}%
							{%
								\global#5=%
								\stringCharacterInPosition{7564321}{#3}%
								\relax%
							}%
							{Dynkin}%
							{%
								\global#5=%
								\stringCharacterInPosition{1723456}{#3}%
								\relax%
							}%
							{Kac}%
							{%
								\global#5=%
								\stringCharacterInPosition{1723456}{#3}%
								\relax%
							}%
						}%
						[\global#5=#3\relax]%
					\else%
						\ifnum#2=8\relax%
							\IfStrEqCase{#4}%
							{%
								{Adams}%
								{%
									\global#5=%
									\stringCharacterInPosition%
										{13245678}{#3}%
									\relax%
								}%
								{Carter}%
								{%
									\global#5=%
									\stringCharacterInPosition%
									{86754321}{#3}%
									\relax%
								}%
								{Dynkin}%
								{%
									\global#5=%
									\stringCharacterInPosition%
									{18234567}{#3}%
									\relax%
								}%
								{Kac}%
								{%
									\global#5=%
									\stringCharacterInPosition%
									{78654321}{#3}%
									\relax%
								}%
							}%
							[\global#5=#3\relax]%
						\else%
							\global#5=#3\relax%
						\fi%
					\fi%
				\fi%
			%\fi%
		}%
		{F}%
		{%
			\IfStrEqCase{#4}%
			{%
				{Adams}%
				{%
					\global#5=%
					\stringCharacterInPosition%
					{4321}{#3}%
					\relax%
				}%
			}%
			[\global#5=#3\relax]%
		}%
		{G}%
		{%
			\IfStrEqCase{#4}%
			{%
				{Carter}%
				{%
					\global#5=%
					\stringCharacterInPosition{21}{#3}%
					\relax%
				}%
				{Dynkin}%
				{%
					\global#5=%
					\stringCharacterInPosition{21}{#3}%
					\relax%
				}%
			}%
			[\global#5=#3\relax]%
		}%
	}%
	[\global#5=#3\relax]%
	}%
}%
\newcount\dynkin@order@temp%
\newcount\dynkin@order@temp@b%
\NewDocumentCommand\dynkinOrder{mmD.:{Bourbaki}r:-D>.{Bourbaki}m}%
%% \dynkinOrder <series><rank>.<from order>::<from root number>-><to order>.<storage counter>
%% Example: \newcount\r\dynkinOrder D7.Carter::7->Bourbaki.{\r}
{%
	\dynkinOrderToBourbaki{#1}{#2}{#3}{#4}{\dynkin@order@temp}%
	\dynkinOrderFromBourbaki{#1}{#2}{\the\dynkin@order@temp}{#5}{#6}%
}%


%% \typeDynkinOrder <series><rank>.<from order>::<from root number>-><to order>.
%% Example: \typeDynkinOrder D7.Carter::7->Bourbaki.
\newcount\tempDynkinReorder%
\NewDocumentCommand\typeDynkinOrder{mmD.:{Bourbaki}r:-D>.{Bourbaki}}%
{%
\dynkinOrder{#1}{#2}.#3::#4->#5.{\tempDynkinReorder}\the\tempDynkinReorder%
}%
%% \convertRootNumber{<n>}
%% Converts <n> from Bourbaki ordering to the current ordering, storing the result in a count called \dynkin@Root@Number.
\NewDocumentCommand\convertRootNumber{m}%
{%
	\IfStrEq{#1}{0}%
	{%
		\global\dynkin@Root@Number=0\relax%
	}%
	{%
	\IfStrEqCase{\dynkin@series}%
	{%
		{A}%
		{%
			\IfStrEqCase{\dynkin@ordering}%
			{%
				{TestOrder}%
				{%
					\global\dynkin@Root@Number=#1\relax%
					\global\advance\dynkin@Root@Number by 1\relax%
					\ifnum\dynkin@Root@Number>\the\dynkin@rank\relax%
						\global\dynkin@Root@Number=1\relax%
					\fi%
				}%
			}%
			[\global\dynkin@Root@Number=#1\relax]%
		}%
		{D}%
		{%
			\IfStrEqCase{\dynkin@ordering}%
			{%
				{Adams}{\swapRootIfInLastTwoRoots{#1}}%
				{Dynkin}{\swapRootIfInLastTwoRoots{#1}}%
				{Kac}{%
					\ifdynkin@is@twisted
						\global\dynkin@Root@Number=#1\relax%
					\else
						\ifdynkin@is@extended
							\global\dynkin@Root@Number=#1\relax%
						\else
							\swapRootIfInLastTwoRoots{#1}
						\fi
					\fi}%
			}%
			[\global\dynkin@Root@Number=#1\relax]%
		}%
		{E}%
		{%
			\ifdynkin@is@twisted%
				\global\dynkin@Root@Number=#1\relax%
			\else%
				\ifnum\dynkin@rank=6\relax%
						\IfStrEqCase{\dynkin@ordering}%
						{%
							{Adams}{\global\dynkin@Root@Number=\stringCharacterInPosition{152436}{#1}\relax}%
							{Carter}{\global\dynkin@Root@Number=\stringCharacterInPosition{142356}{#1}\relax}%
							{Dynkin}{\global\dynkin@Root@Number=\stringCharacterInPosition{162345}{#1}\relax}%
							{Kac}{\global\dynkin@Root@Number=\stringCharacterInPosition{162345}{#1}\relax}%
						}%
						[\global\dynkin@Root@Number=#1\relax]%
				\else%
					\ifnum\dynkin@rank=7\relax%
						\IfStrEqCase{\dynkin@ordering}%
						{%
							{Adams}{\global\dynkin@Root@Number=\stringCharacterInPosition{6354217}{#1}\relax}%
							{Carter}{\global\dynkin@Root@Number=\stringCharacterInPosition{7564321}{#1}\relax}%
							{Dynkin}{\global\dynkin@Root@Number=\stringCharacterInPosition{1723456}{#1}\relax}%
							{Kac}{\global\dynkin@Root@Number=\stringCharacterInPosition{1723456}{#1}\relax}%
						}%
						[\global\dynkin@Root@Number=#1\relax]%			
					\else%
						\ifnum\dynkin@rank=8\relax%
							\IfStrEqCase{\dynkin@ordering}%
							{%
								{Adams}{\global\dynkin@Root@Number=\stringCharacterInPosition{13245678}{#1}\relax}%
								{Carter}{\global\dynkin@Root@Number=\stringCharacterInPosition{86754321}{#1}\relax}%
								{Dynkin}{\global\dynkin@Root@Number=\stringCharacterInPosition{18234567}{#1}\relax}%
								{Kac}{\global\dynkin@Root@Number=\stringCharacterInPosition{78654321}{#1}\relax}%
							}%
							[\global\dynkin@Root@Number=#1\relax]%
						\else%
							\global\dynkin@Root@Number=#1\relax%
						\fi%
					\fi%
				\fi%
			\fi%
		}%
		{F}%
		{%
			\IfStrEqCase{\dynkin@ordering}%
			{%
				{Adams}{\global\dynkin@Root@Number=\stringCharacterInPosition{4321}{#1}\relax}%
			}%
			[\global\dynkin@Root@Number=#1\relax]%
		}%
		{G}%
		{%
			\IfStrEqCase{\dynkin@ordering}%
			{%
				{Carter}{\global\dynkin@Root@Number=\stringCharacterInPosition{21}{#1}\relax}%
				{Dynkin}{\global\dynkin@Root@Number=\stringCharacterInPosition{21}{#1}\relax}%
			}%
			[\global\dynkin@Root@Number=#1\relax]%
		}%
	}%
	[\global\dynkin@Root@Number=#1\relax]%
	}%
}%

%% \convertRootPair{<p>}{<q>}
%% Stores conversions in \@dynkin@from@root and \@dynkin@to@root.
\NewDocumentCommand\convertRootPair{mm}
{%
	\convertRootNumber{#1}%
	\global\@dynkin@from@root=\dynkin@Root@Number\relax%
	\convertRootNumber{#2}%
	\global\@dynkin@to@root=\dynkin@Root@Number\relax%
}%
%% \testbit{<n>}{<b>}
%% If bit number <b> of <n> is 1 then set bittrue else set bitfalse
\newif\ifdynkin@bit
\newcount\test@bit@a
\newcount\test@bit@b
\newif\iftest@bit@more
\NewDocumentCommand\testbit{mm}%
{%
	\test@bit@a#1\relax%
	\test@bit@b#2\relax%
	\ifnum\test@bit@a=0\relax%
		\global\bitfalse%
	\else%
		\global\test@bit@moretrue%
		\loop%
			\ifnum\test@bit@b=0\relax%
				\global\test@bit@morefalse%
				\ifodd\test@bit@a\empty%
					\global\dynkin@bittrue%
				\else%
					\global\dynkin@bitfalse%
				\fi%
			\else%
				\divide\test@bit@a by 2\relax%
				\advance\test@bit@b by -1\relax%
			\fi%
		\iftest@bit@more\repeat%
	\fi%
}%
%% \replaceNthChar{<string>}{<N>}{<char>}
%% redefines the string <string>, a name of a macro returning a character string,
%% to be the same as its original output, but with character <N> replaced by <char>.
\newcount\replaceNthCounter
\newcount\replacementN
\xdef\replacementLeftString{}
\xdef\replacementRightString{}
\NewDocumentCommand\replaceNthChar{mmm}%
{%
	\ifnum#2<1\relax%
	\else%
		\StrLen{#1}[\thatreplaceNthCounter]%
		\replaceNthCounter\thatreplaceNthCounter\relax%
		\ifnum\replaceNthCounter<#2\relax%
		\else%
			\replacementN#2\relax%
			\advance\replacementN by -1\relax%
			\StrLeft{#1}{\the\replacementN}[\replacementLeftString]%
			\advance\replacementN by 1\relax%
			\StrGobbleLeft{#1}{\the\replacementN}[\replacementRightString]%
			\xdef#1{\replacementLeftString#3\replacementRightString}%
		\fi%
	\fi%
}%
\newcount\dynkin@where%
\NewDocumentCommand\dynkin@put@cross{m}%
{%
	\dynkin@where#1\relax%
	\advance\dynkin@where by 1\relax%
	\replaceNthChar{\dynkin@roots}{\the\dynkin@where}{x}%
}%
\newcount\dynkin@nodes@minus@one%
\NewDocumentCommand\dynkin@cross@out@parabolics{}%
{%
	\IfInteger{\dynkin@parabolic}%
	{%
		\IfStrEq{\dynkin@parabolic}{0}%
		{%
		}%
		{%
			\dynkin@nodes@minus@one=\the\dynkin@nodes\relax%
			\advance\dynkin@nodes@minus@one by -1\relax%
			\foreach \b in {0,...,\the\dynkin@nodes@minus@one}%
			{%
				\testbit{\dynkin@parabolic}{\b}%
				\ifdynkin@bit\dynkin@put@cross{\b}\fi%
			}%
		}%
	}%
	{%
	}%
}%
\NewDocumentCommand\dynkinMoveToRoot{sm}%
{%
	\IfBooleanTF{#1}%
	{%
		\convertRootNumber{#2}%
	}%
	{%
		\global\dynkin@Root@Number=#2\relax%
	}%
	\node (Dynkin current) at (\dynkin@root@name \the\dynkin@Root@Number){};%
}%
%% \dynkinPlaceRootHere{<n>}{<L>}{<L*>}
%% \dynkinPlaceRootHere*{<n>}{<L>}{<L*>}
%% Tell TikZ to place node <n> for a root of a Dynkin diagram at the current
%% cursor location. Draws nothing.
%% <L>=label positioning: above, below, left, right, above left, above right, below left, below right.
%% <L*> similarly, the alternate label position.
%% Starred form converts <n> from Bourbaki ordering to default ordering.
\NewDocumentCommand\dynkinPlaceRootHere{smmm}%
{%
\xdef\yyyy{#2}
	\IfBooleanTF{#1}%
	{%
		\convertRootNumber{#2}%
	}%
	{%
		\global\dynkin@Root@Number=#2\relax%
	}%
	\node (\dynkin@root@name \the\dynkin@Root@Number) at (Dynkin current) {};%
	\dynkinPutLabelInDirection{\the\dynkin@Root@Number}{#3}%
	\dynkinPutLabelInDirection*{\the\dynkin@Root@Number}{#4}%
}%
\newif\ifdynkin@hex@grid
\dynkin@hex@gridtrue
%% \dynkinPlaceRootRelativeTo{<p>}{<q>}{<d>}{<L>}{<L*>}
%% \dynkinPlaceRootRelativeTo*{<p>}{<q>}{<d>}{<L>}{<L*>}
%% Tell TikZ to place node <p> for a root of a Dynkin diagram at a location
%% in direction <d> from root <q>. Draws nothing.
%% <L> is the label position: above, below, left, right, above left, above right, below left, below right.
%% <L*> is the position of the alternate label similarly.
%% <d> is the direction from <q>: 
%% west,east,south,north,
%% northeast,northwest,southeast,southwest,
%% southfold,northfold,
%% southeastfold,southwestfold,northeastfold,northwestfold.
%% Starred form is in Bourbaki root ordering; otherwise default ordering.
\NewDocumentCommand\dynkinPlaceRootRelativeTo{smmmmm}%
{%
	\IfBooleanTF{#1}%
	{%
		\convertRootPair{#3}{#2}%
	}%
	{%
		\global\@dynkin@from@root=#3\relax%
		\global\@dynkin@to@root=#2\relax%
	}%
	\dynkin@is@edge@indefinite{\@dynkin@from@root}{\@dynkin@to@root}%
	\ifdynkin@is@indefinite@edge%
		\xdef\dynkin@distance{\dynkin@indefinite@edge@length}
	\else
		\xdef\dynkin@distance{\dynkin@edge@length}
	\fi
	\ifdynkin@hex@grid
		\IfStrEqCase{#4}%
		{%
			{west}{\xdef\xd{-\dynkin@distance}\xdef\yd{0}}%
			{east}{\xdef\xd{\dynkin@distance}\xdef\yd{0}}%
			{south}{\xdef\xd{0}\xdef\yd{-\dynkin@distance}}%
			{north}{\xdef\xd{0}\xdef\yd{\dynkin@distance}}%
			{southeast}%
			{%
				\xdef\xd{cos(-60)*\dynkin@distance}%
				\xdef\yd{sin(-60)*\dynkin@distance}%
			}%
			{southwest}%
			{%
				\xdef\xd{cos(240)*\dynkin@distance}%
				\xdef\yd{sin(240)*\dynkin@distance}%
			}%
			{northeast}%
			{%
				\xdef\xd{cos(60)*\dynkin@distance}%
				\xdef\yd{sin(60)*\dynkin@distance}%
			}%
			{northwest}%
			{%
				\xdef\xd{cos(120)*\dynkin@distance}%
				\xdef\yd{sin(120)*\dynkin@distance}%
			}%
			{southeastfold}%
			{%
				\xdef\xd{\dynkin@fold@radius}%
				\xdef\yd{-\dynkin@fold@radius}%
			}%
			{southwestfold}%
			{%
				\xdef\xd{-\dynkin@fold@radius}%
				\xdef\yd{-\dynkin@fold@radius}%
			}%
			{northeastfold}%
			{%
				\xdef\xd{\dynkin@fold@radius}%
				\xdef\yd{\dynkin@fold@radius}%
			}%
			{northwestfold}%
			{%
				\xdef\xd{-\dynkin@fold@radius}%
				\xdef\yd{\dynkin@fold@radius}%
			}%
			{northfold}%
			{%
				\xdef\xd{0}%
				\xdef\yd{2*\dynkin@fold@radius}%
			}%
			{southfold}%
			{%
				\xdef\xd{0}%
				\xdef\yd{-2*\dynkin@fold@radius}%
			}%
		}%
	\else%
		\IfStrEqCase{#4}%
		{%
			{west}{\xdef\xd{-\dynkin@distance}\xdef\yd{0}}%
			{east}{\xdef\xd{\dynkin@distance}\xdef\yd{0}}%
			{south}{\xdef\xd{0}\xdef\yd{-\dynkin@distance}}%
			{north}{\xdef\xd{0}\xdef\yd{\dynkin@distance}}%
			{southeast}%
			{%
				\xdef\xd{cos(-45)*\dynkin@distance}%
				\xdef\yd{sin(-45)*\dynkin@distance}%
			}%
			{southwest}%
			{%
				\xdef\xd{cos(225)*\dynkin@distance}%
				\xdef\yd{sin(225)*\dynkin@distance}%
			}%
			{northeast}%
			{%
				\xdef\xd{cos(45)*\dynkin@distance}%
				\xdef\yd{sin(45)*\dynkin@distance}%
			}%
			{northwest}%
			{%
				\xdef\xd{cos(135)*\dynkin@distance}%
				\xdef\yd{sin(135)*\dynkin@distance}%
			}%
			{southeastfold}%
			{%
				\xdef\xd{\dynkin@fold@radius}%
				\xdef\yd{-\dynkin@fold@radius}%
			}%
			{southwestfold}%
			{%
				\xdef\xd{-\dynkin@fold@radius}%
				\xdef\yd{-\dynkin@fold@radius}%
			}%
			{northeastfold}%
			{%
				\xdef\xd{\dynkin@fold@radius}%
				\xdef\yd{\dynkin@fold@radius}%
			}%
			{northwestfold}%
			{%
				\xdef\xd{-\dynkin@fold@radius}%
				\xdef\yd{\dynkin@fold@radius}%
			}%
			{northfold}%
			{%
				\xdef\xd{0}%
				\xdef\yd{2*\dynkin@fold@radius}%
			}%
			{southfold}%
			{%
				\xdef\xd{0}%
				\xdef\yd{-2*\dynkin@fold@radius}%
			}%
		}%
	\fi
	\node (Dynkin current) 
		at 
		($(\dynkin@root@name \the\@dynkin@from@root)%
		+({\xd},{\yd})$){};
	\dynkinPlaceRootHere{\the\@dynkin@to@root}{#5}{#6}%
}%

% Jump the current location by a certain multiple of the fold radius.
\NewDocumentCommand\dynkin@jump{m}%
{%
\xdef\yj{#1*\dynkin@fold@radius}%
\node (Dynkin current) at ($(Dynkin current)+(0,{\yj})$){};%
}%

% Jump the current location by a certain multiple of the edge radius multiplied by sin(60).
\NewDocumentCommand\dynkin@hop{m}%
{%
\xdef\yjj{#1*\dynkin@edge@length*sin(60)}%
\node (Dynkin current) at ($(Dynkin current)+(0,{\yjj})$){};%
}%
%% \dynkinEast
%% Moves the TikZ cursor one edge to the right.
%% Starred form for an indefinite edge.
\NewDocumentCommand\dynkinEast{s}%
{%
	\xdef\distance{\IfBooleanTF{#1}{\dynkin@indefinite@edge@length}{\dynkin@edge@length}}
	\node (Dynkin current) at ($(Dynkin current)+({\distance},0)$) {};%
}%
%% \dynkinWest
%% Moves the TikZ cursor one edge to the left.
%% Starred form for an indefinite edge.
\NewDocumentCommand\dynkinWest{s}%
{%
	\xdef\distance{\IfBooleanTF{#1}{\dynkin@indefinite@edge@length}{\dynkin@edge@length}}%
	\node (Dynkin current) at ($(Dynkin current)+({-\distance},0)$) {};%
}%
%% \dynkinNorth
%% Moves the TikZ cursor one edge up.
%% Starred form for an indefinite edge.
\NewDocumentCommand\dynkinNorth{s}%
{%
	\xdef\distance{\IfBooleanTF{#1}{\dynkin@indefinite@edge@length}{\dynkin@edge@length}}%
	\node (Dynkin current) at ($(Dynkin current)+(0,{\distance})$) {};%
}%
%% \dynkinSouth
%% Moves the TikZ cursor one edge to the left.
%% Starred form for an indefinite edge.
\NewDocumentCommand\dynkinSouth{s}%
{%
	\xdef\distance{\IfBooleanTF{#1}{\dynkin@indefinite@edge@length}{\dynkin@edge@length}}%
	\node (Dynkin current) at ($(Dynkin current)+(0,{-\distance})$) {};%
}%
%% \dynkinNorthEast
%% Moves the TikZ cursor one edge to the north east.
%% Starred form for an indefinite edge.
\NewDocumentCommand\dynkinNorthEast{s}%
{%
	\xdef\distance{\IfBooleanTF{#1}{\dynkin@indefinite@edge@length}{\dynkin@edge@length}}%
	\node (Dynkin current) at 
		($(Dynkin current)+
			({cos(60)*\distance},{sin(60)*\distance})$) {};%
}%
%% \dynkinSouthEast
%% Moves the TikZ cursor one edge to the south east.
%% Starred form for an indefinite edge.
\NewDocumentCommand\dynkinSouthEast{s}%
{%
	\xdef\distance{\IfBooleanTF{#1}{\dynkin@indefinite@edge@length}{\dynkin@edge@length}}%
	\node (Dynkin current) at 
		($(Dynkin current)+
			({cos(-60)*\distance},{sin(-60)*\distance})$) {};%
}%
%% \dynkinNorthWest
%% Moves the TikZ cursor one edge to the north west.
%% Starred form for an indefinite edge.
\NewDocumentCommand\dynkinNorthWest{s}%
{%
	\xdef\distance{\IfBooleanTF{#1}{\dynkin@indefinite@edge@length}{\dynkin@edge@length}}%
	\node (Dynkin current) at 
		($(Dynkin current)+
			({cos(120)*\distance},{sin(120)*\distance})$) {};%
}%
%% \dynkinSouthWest
%% Moves the TikZ cursor one edge to the south west.
%% Starred form for an indefinite edge.
\NewDocumentCommand\dynkinSouthWest{s}%
{%
	\xdef\distance{\IfBooleanTF{#1}{\dynkin@indefinite@edge@length}{\dynkin@edge@length}}%
	\node (Dynkin current) at 
		($(Dynkin current)+
			({cos(240)*\distance},{sin(240)*\distance})$) {};%
}%
%% \dynkinSouthEastFold
%% Moves the TikZ cursor one edge to the south east in the middle of a fold.
\NewDocumentCommand\dynkinSouthEastFold{}%
{%
	\node (Dynkin current) at ($(Dynkin current)+({\dynkin@fold@radius},{-\dynkin@fold@radius})$) {};%
}%
%% \dynkinSouthWestFold
%% Moves the TikZ cursor one edge to the south west in the middle of a fold.
\NewDocumentCommand\dynkinSouthWestFold{}%
{%
	\node (Dynkin current) at ($(Dynkin current)+({-\dynkin@fold@radius},{-\dynkin@fold@radius})$) {};%
}%
%% \dynkinSouthFold
%% Moves the TikZ cursor one edge to the south in the middle of a fold.
\NewDocumentCommand\dynkinSouthFold{}%
{%
	\node (Dynkin current) at ($(Dynkin current)+(0,{-2*\dynkin@fold@radius})$) {};%
}%

\NewDocumentCommand\find@mark@of@root{m}%
{%
	\StrChar{\dynkin@roots}{#1}[\my@root@marker]%
	\my@root@marker
}%
\NewDocumentCommand\dynkin@draw@all@roots{}%
{%
	\foreach \b in {1,...,\the\dynkin@nodes}%
	{%
		\StrChar{\dynkin@roots}{\b}[\c]%
		\dynkinRootMark{\c}{\b}%
	}%
	\ifdynkin@is@extended%
		\dynkinRootMark*{\dynkin@affine@root@mark}{0}%
	\else%
		\ifdynkin@is@twisted%
			\dynkinRootMark*{\dynkin@affine@root@mark}{0}%
		\fi%
	\fi%
}%
%% \dynkin@fold@arrow@if@oo{<p>}{<q>}
%% Inputs are roots (in Bourbaki ordering).
%% If we are working on a Satake diagram, and both roots are 
%% marked with hollow circles o, then draws a fold arrow between them.
\NewDocumentCommand\dynkin@fold@arrow@if@oo{mm}%
{%
	\convertRootPair{#1}{#2}%
	\ifdynkin@Satake@diagram%
		\StrChar{\dynkin@roots}%
			{\the\@dynkin@from@root}%
			[\my@root@marker]%
		\IfStrEq{\my@root@marker}{o}%
		{%
				\StrChar{\dynkin@roots}%
					{\the\@dynkin@to@root}%
					[\my@other@root@marker]%
				\IfStrEq{\my@other@root@marker}{o}%
				{%				
					\dynkinFold%
						{\the\@dynkin@from@root}%
						{\the\@dynkin@to@root}%
				}%
				{}%
		}{}%
	\else%
		\dynkinFold{\the\@dynkin@from@root}{\the\@dynkin@to@root}%
	\fi%
}%
\newcount\pipebmo
\newcount\pipefpo
\newcount\pipe@end
\newcount\start@pipe
%% \dynkin@pipe{<f>}{<t>}{<D>}{<L>}{<L*>}
%% Layout the roots (as TikZ nodes) <f>, <f>+1, \dots, <t> in the Bourbaki ordering, in a straight line, 
%% starting at the current position (Dynkin current), moving in the direction <D>=east, west, north, south, with labels placed according to <L>=left,right,above,below.
%% Assumes that the root <f> is already created as a node in TikZ, but the others are not.
\NewDocumentCommand\dynkin@pipe{mmmmm}%
{%
	\start@pipe=#1\relax%
	\pipe@end=#2\relax%
	\ifnum\start@pipe<\the\pipe@end\relax%
		\global\pipebmo=\the\start@pipe\relax%
		\global\pipefpo=\the\start@pipe\relax%
		\global\advance\pipefpo by 1\relax%
		\foreach \bpipe in {\the\pipefpo,...,\the\pipe@end}%
		{%
			\dynkinPlaceRootRelativeTo*{\bpipe}{\the\pipebmo}{#3}{#4}{#5}%
			\dynkinEdge*{SingleEdge}{\the\pipebmo}{\bpipe}%
			\global\advance\pipebmo by 1\relax%
		}%
	\fi%
}%
\newcount\dynkin@h%
\newcount\dynkin@hpo%
\newcount\dynkin@afterfold%
\newcount\dynkin@nrts%
\newcount\dynkin@countdown%
%% \dynkin@fold{<f>}{<t>}
%% Layout the roots (as TikZ nodes) <f>, <f>+1, \dots, <t> in the Bourbaki ordering, in a folded arrangement, 
%% moving first east, then down, then west, starting at the current position (Dynkin current).
%% Assumes that the root <f> is already created as a node in TikZ, but the others are not.
\NewDocumentCommand\dynkin@fold{mm}%
{%
	\dynkin@h=#1\relax%
	\advance\dynkin@h by #2\relax%
	\advance\dynkin@h by -1\relax%
	\divide\dynkin@h by 2\relax%
	\dynkin@pipe{#1}{\the\dynkin@h}{east}{above}{below right}
	\dynkin@hpo=\the\dynkin@h\relax%
	\advance\dynkin@hpo by 1\relax%
	\global\dynkin@afterfold=\the\dynkin@hpo\relax%
	\dynkin@nrts=#2\relax%
	\advance\dynkin@nrts by 1\relax%
	\advance\dynkin@nrts by -#1\relax%
	\ifodd\dynkin@nrts%
		\global\advance\dynkin@afterfold by 1\relax%
		\dynkinPlaceRootRelativeTo*%
			{\the\dynkin@hpo}%
			{\the\dynkin@h}%
			{southeastfold}{right}{left}%
		\dynkinEdge*{RightDownArc}%
			{\the\dynkin@h}%
			{\the\dynkin@hpo}%
		\dynkinPlaceRootRelativeTo*%
			{\the\dynkin@afterfold}%
			{\the\dynkin@hpo}%
			{southwestfold}%
			{below}{above right}%
		\dynkinEdge*{RightUpArc}%
			{\the\dynkin@afterfold}%
			{\the\dynkin@hpo}%
	\else
		\dynkinPlaceRootRelativeTo*%
			{\the\dynkin@afterfold}%
			{\the\dynkin@h}%
			{southfold}{below}{above right}%
		\dynkinEdge*{SemiCircle}%
			{\the\dynkin@h}%
			{\the\dynkin@afterfold}%
	\fi
	\dynkin@pipe{\the\dynkin@afterfold}%
		{#2}{west}{below}{above right}
	\ifodd\dynkin@nrts%
		\dynkinMoveToRoot{\the\dynkin@hpo}%
	\else%
		\dynkinMoveToRoot{\the\dynkin@h}%
		\dynkinSouthEastFold{}%
	\fi%
	\ifdynkin@arrows%
		\dynkin@countdown=#2\relax%
		\foreach \dynkin@b in {#1,...,\the\dynkin@h}%
		{%
			\dynkin@fold@arrow@if@oo{\dynkin@b}{\the\dynkin@countdown}%
			\global\advance\dynkin@countdown by -1\relax%
		}%
	\fi%
}%
%% \Adynkin
%% Draws an A series Dynkin diagram.
\NewDocumentCommand\Adynkin{}%
{%
	\ifnum\dynkin@rank=1\relax%
		\global\dynkin@ply=1\relax%
	\fi%
%	% Create the roots.
	\ifnum\dynkin@ply>1\relax%
		\ifnum\dynkin@ply=2\relax%
			\dynkin@jump{1}%
		\fi%
		\dynkinPlaceRootHere*{1}{above}{below right}%
		\dynkin@fold{1}{\the\dynkin@rank}%
	\else%
		\dynkinPlaceRootHere*{1}{below}{above}%
		\ifnum\dynkin@rank>1\relax%
			\dynkin@pipe{1}%
				{\the\dynkin@rank}%
				{east}{below}{above}%
		\fi%
	\fi%
}%
%% \Bdynkin 
%% Draw a B series Dynkin diagram.
\NewDocumentCommand\Bdynkin{}%
{%
	\ifnum\dynkin@rank<2\relax%
		\Adynkin%
	\else%
		\ifdynkin@Coxeter%
			\Adynkin%
			\dynkinEdgeLabel%
				{\the\dynkin@rank@minus@one}%
				{\the\dynkin@rank}{4}%
		\else
			% Create the roots.
			\ifnum\dynkin@ply>1\relax%
				\ifnum\dynkin@rank>3\relax%
					\dynkin@jump{1}%
					\dynkinPlaceRootHere*{1}{above}{below right}%
					\dynkinPlaceRootRelativeTo*%
						{2}{1}%
						{east}{above}{below right}%
					\dynkin@fold{2}{\the\dynkin@rank@minus@one}%
					\dynkinPlaceRootRelativeTo*%
						{\the\dynkin@rank}{\the\dynkin@rank@minus@one}%
						{west}{below}{above right}%
					\dynkinEdge*{DoubleEdge}%
						{\the\dynkin@rank@minus@one}{\the\dynkin@rank}%
					\dynkinEdge*{SingleEdge}{1}{2}%
				\else%
					\ifnum\dynkin@rank=2\relax%
						\dynkin@jump{1}%
						\dynkinPlaceRootHere*{1}{above}{below right}%
						\dynkinPlaceRootRelativeTo*{2}{1}%
							{southfold}{below}{above right}%
						\dynkinEdge*{DoubleDownRightSemiCircle}{1}{2}%
					\else%
						\dynkin@jump{1}%
						\dynkinPlaceRootHere*{1}{above}{below right}%
						\dynkinPlaceRootRelativeTo*{2}{1}%
							{southeastfold}{right}{left}%
						\dynkinPlaceRootRelativeTo*{3}{2}%
							{southwestfold}{below}{above right}%
						\dynkinEdge*{RightDownArc}{1}{2}%
						\dynkinEdge*{DoubleDownLeftArc}{2}{3}%
					\fi%
				\fi%
			\else%
				\dynkinPlaceRootHere*{1}{below}{above}
				\dynkin@pipe{1}{\the\dynkin@rank@minus@one}{east}{below}{above}
				\dynkinPlaceRootRelativeTo*%
					{\the\dynkin@rank}%
					{\the\dynkin@rank@minus@one}%
					{east}{below}{above}
				\dynkinEdge*{DoubleEdge}%
					{\the\dynkin@rank@minus@one}%
					{\the\dynkin@rank}%
			\fi%
			\ifdynkin@arrows%
				\ifnum\dynkin@ply>1\relax%
					\dynkinLeftFold*{1}{\the\dynkin@rank}%
				\fi%
			\fi%
		\fi%
	\fi%
}
%% \Cdynkin 
%% Draws a C series Dynkin diagram.
\newcommand*{\Cdynkin}
{
	\ifdynkin@reverse@arrows%
		\global\dynkin@reverse@arrowsfalse%
	\else%
		\global\dynkin@reverse@arrowstrue%
	\fi%
	\Bdynkin%
	\ifdynkin@reverse@arrows%
		\global\dynkin@reverse@arrowsfalse%
	\else%
		\global\dynkin@reverse@arrowstrue%
	\fi%
}
%% \Ddynkin@roots
%% Tell TikZ where to place the @roots for a D series Dynkin diagram. Draws nothing.
\newcommand*{\Ddynkin@roots}
{
	% Create the roots.
	\ifdynkin@is@extended%
		\ifnum\dynkin@ply>1\relax%
			\ifnum\dynkin@rank=4\relax%
				\dynkinPlaceRootRelativeTo*%
					{2}{0}%
					{southeastfold}%
					{left}{right}%
			\else%
				\dynkinPlaceRootRelativeTo*%
					{2}{0}%
					{southeastfold}%
					{below right}{above right}%
			\fi%
			\dynkinPlaceRootRelativeTo*%
				{1}{2}%
				{southwestfold}%
				{left}{above left}%
		\else%	
			\ifdynkin@left@fold%	
				\ifnum\dynkin@rank=4\relax%
					\dynkinPlaceRootRelativeTo*%
						{2}{0}%
						{southeastfold}%
						{left}{right}%
				\else%
					\dynkinPlaceRootRelativeTo*%
						{2}{0}%
						{southeastfold}%
						{below right}{above right}%
				\fi%
				\dynkinPlaceRootRelativeTo*%
					{1}{2}%
					{southwestfold}%
					{left}{above left}%
			\else%
				\ifnum\dynkin@rank=4\relax%
					\ifdynkin@right@fold%
						\dynkinPlaceRootRelativeTo*%
							{2}{0}%
							{southeast}%
							{left}{right}%
					\else%
						\dynkinPlaceRootRelativeTo*%
							{2}{0}%
							{southeast}%
							{below}{above}%
					\fi%
				\else%
					\dynkinPlaceRootRelativeTo*%
						{2}{0}%
						{southeast}%
						{below right}{above right}%
				\fi%
				\dynkinPlaceRootRelativeTo*%
					{1}{2}%
					{southwest}%
					{left}{above left}%
			\fi%
		\fi%
		\dynkinMoveToRoot*{2}%
	\else
		\dynkinPlaceRootHere*{1}{below}{above}
		\ifnum\dynkin@rank=4\relax%
			\ifdynkin@right@fold%
				\dynkinPlaceRootRelativeTo*%
					{2}{1}%
					{east}{below}{above}%
			\else%			
				\ifnum\dynkin@ply>1\relax%
					\dynkinPlaceRootRelativeTo*%
						{2}{1}%
						{east}%
						{below left}{above left}%
				\else%
					\dynkinPlaceRootRelativeTo*%
						{2}{1}%
						{east}%
						{below left}{above left}%
				\fi%
			\fi%
		\else%
			\dynkinPlaceRootRelativeTo*%
				{2}{1}%
				{east}%
				{below}{above}%
		\fi%
	\fi
	\ifnum\dynkin@rank>2\relax%
		\ifnum\dynkin@rank>5\relax%
			\dynkinPlaceRootRelativeTo*{3}{2}{east}{below}{above}%
		\else%
			\ifnum\dynkin@ply>1\relax%
				\dynkinPlaceRootRelativeTo*%
					{3}{2}%
					{east}%
					{below left}{above left}%
			\else%
					\ifnum\dynkin@rank=5\relax%
						\ifdynkin@right@fold%	
							\dynkinPlaceRootRelativeTo*%
								{3}{2}%
								{east}%
								{below left}{above left}%
						\else%
							\dynkinPlaceRootRelativeTo*%
								{3}{2}%
								{east}%
								{below left}{above left}%
						\fi%
					\else%
						\dynkinPlaceRootRelativeTo*%
							{3}{2}%
							{east}%
							{below right}{above left}%
					\fi%
			\fi%
		\fi%
		\ifnum\dynkin@rank@minus@three>3\relax%
			\dynkin@pipe%
				{3}{\the\dynkin@rank@minus@three}%
				{east}%
				{below}{above}%
		\fi%
		\ifnum\dynkin@rank@minus@two>3\relax%
			\ifnum\dynkin@ply>1\relax%
				\dynkinPlaceRootRelativeTo*%
					{\dynkin@rank@minus@two}%
					{\dynkin@rank@minus@three}%
					{east}%
					{below left}{above left}%
			\else%
				\ifdynkin@right@fold%
					\dynkinPlaceRootRelativeTo*%
						{\dynkin@rank@minus@two}%
						{\dynkin@rank@minus@three}%
						{east}%
						{below left}{above left}%
				\else%
					\dynkinPlaceRootRelativeTo*%
						{\dynkin@rank@minus@two}%
						{\dynkin@rank@minus@three}%
						{east}%
						{below left}{above left}%
				\fi%
			\fi%
			\dynkinEdge*{SingleEdge}%
				{\dynkin@rank@minus@two}%
				{\dynkin@rank@minus@three}%
		\fi%
		\ifnum\dynkin@ply=1\relax%
			\ifdynkin@right@fold%
				\dynkinPlaceRootRelativeTo*%
					{\the\dynkin@rank@minus@one}%
					{\the\dynkin@rank@minus@two}%
					{northeastfold}{right}{above right}%
				\dynkinPlaceRootRelativeTo*%
					{\the\dynkin@rank}%
					{\the\dynkin@rank@minus@two}%
					{southeastfold}{right}{above right}%
			\else%
				\dynkinPlaceRootRelativeTo*%
					{\the\dynkin@rank@minus@one}%
					{\the\dynkin@rank@minus@two}%
					{northeast}{right}{above right}%
				\dynkinPlaceRootRelativeTo*%
					{\the\dynkin@rank}{\the\dynkin@rank@minus@two}%
					{southeast}{right}{above right}%
			\fi%
		\else%
			\dynkinPlaceRootRelativeTo*%
				{\the\dynkin@rank@minus@one}%
				{\the\dynkin@rank@minus@two}%
				{northeastfold}%
				{right}{above right}%
			\dynkinPlaceRootRelativeTo*%
				{\the\dynkin@rank}%
				{\the\dynkin@rank@minus@two}%
				{southeastfold}%
				{right}{above right}%
		\fi%
	\fi%
}%
%% \Ddynkin@edges
%% Draws edges on a D series Dynkin diagram.
\NewDocumentCommand\Ddynkin@edges{}%
{%
	% Draw the edges.
	\ifnum\dynkin@ply>1\relax%
		\ifdynkin@is@extended%
			\dynkinEdge*{RightUpArc}{1}{2}%
		\else%
			\dynkinEdge*{SingleEdge}{1}{2}%
		\fi%
		\ifnum\dynkin@rank>4\relax%
			\dynkinEdge*{SingleEdge}{2}{3}%
		\fi%
		\dynkinEdge*{LeftDownArc}%
			{\the\dynkin@rank@minus@one}%
			{\the\dynkin@rank@minus@two}%
		\dynkinEdge*{LeftUpArc}%
			{\the\dynkin@rank}%
			{\the\dynkin@rank@minus@two}%
		\ifdynkin@arrows%
			\dynkinRightFold*%
				{\the\dynkin@rank@minus@one}%
				{\the\dynkin@rank}%
			\ifdynkin@is@extended%
				\dynkinLeftFold*{0}{1}%
			\fi%
		\fi%
	\else%
		\ifnum\dynkin@rank=4\relax%
		\else%
			\dynkinEdge*{SingleEdge}{2}{3}%
		\fi%
		\ifdynkin@is@extended%
			\ifdynkin@left@fold%	
				\dynkinEdge*{RightUpArc}{1}{2}%
				\ifdynkin@arrows%
					\ifdynkin@is@extended%
						\dynkinLeftFold*{0}{1}%
					\fi%
				\fi%
			\else%
				\dynkinEdge*{SingleEdge}{1}{2}%
			\fi%
		\else%
			\dynkinEdge*{SingleEdge}{1}{2}%
		\fi%
		\ifdynkin@right@fold%	
				\dynkinEdge*{LeftDownArc}%
					{\the\dynkin@rank@minus@one}%
					{\the\dynkin@rank@minus@two}%
				\dynkinEdge*{LeftUpArc}%
					{\the\dynkin@rank}%
					{\the\dynkin@rank@minus@two}%
				\dynkinRightFold*%
					{\the\dynkin@rank@minus@one}%
					{\the\dynkin@rank}%
		\else%
			\dynkinEdge*{SingleEdge}%
				{\the\dynkin@rank@minus@two}%
				{\the\dynkin@rank@minus@one}%
			\dynkinEdge*{SingleEdge}%
				{\the\dynkin@rank@minus@two}%
				{\the\dynkin@rank}%
		\fi%
	\fi%
}%
\def\centerarc[#1](#2)(#3:#4:#5);%
%Syntax: [draw options] (center) (initial angle:final angle:radius)
    {
    \draw[#1]([shift=(#3:#5)]#2) arc (#3:#4:#5);
    }
%% \DthreePly
%% Draws a D series Dynkin diagram of rank 4, folded over a G2.
\NewDocumentCommand\DthreePly{}%
{%
\ifdynkin@right@fold%
	\dynkinPlaceRootHere*%
		{1}%
		{below left}{above right}%
	\dynkinPlaceRootRelativeTo*%
		{3}{1}%
		{east}%
		{below left}{above right}%
	\dynkinPlaceRootRelativeTo*%
		{2}{3}%
		{north}%
		{below left}{above right}%
	\dynkinPlaceRootRelativeTo*%
		{4}{3}%
		{south}%
		{below}{above right}%
	\edef\old@fold@radius{\dynkin@fold@radius}%
	\xdef\dynkin@fold@radius{\dynkin@edge@length}%
	\dynkinEdge*{SingleEdge}{1}{3}%
	\dynkinEdge*{LeftDownArc}{2}{1}%
	\dynkinEdge*{LeftUpArc}{4}{1}%
	\xdef\dynkin@fold@radius{\old@fold@radius}%
	\ifdynkin@arrows%
		\dynkin@fold@arrow@if@oo{2}{3}%
		\dynkin@fold@arrow@if@oo{3}{4}%
	\fi%
\else%
	\dynkinPlaceRootHere*{1}{left}{above right}%
	\dynkinPlaceRootRelativeTo*%
		{2}{1}%
		{east}%
		{below left}{above left}%
	\dynkinPlaceRootRelativeTo*%
		{3}{2}%
		{northeast}%
		{above right}{below}%
	\dynkinPlaceRootRelativeTo*%
		{4}{2}%
		{southeast}%
		{below right}{left}%
	\dynkinEdge*{SingleEdge}{1}{2}%
	\dynkinEdge*{SingleEdge}{2}{3}%
	\dynkinEdge*{SingleEdge}{2}{4}%
	\begin{pgfonlayer}{Dynkin behind}%%
		\centerarc[/Dynkin diagram/fold style]%
		(\dynkin@root@name 2)(-60:60:\dynkin@edge@length);
		\centerarc[/Dynkin diagram/fold style]%
		(\dynkin@root@name 2)(60:180:\dynkin@edge@length);
		\centerarc[/Dynkin diagram/fold style]%
		(\dynkin@root@name 2)(180:300:\dynkin@edge@length);
	\end{pgfonlayer}%%
\fi%
}%
%% \Ddynkin 
%% Draws a D series Dynkin diagram.
\NewDocumentCommand\Ddynkin{}%
{%
	\ifnum\dynkin@rank>3\relax%
		\ifnum\dynkin@rank=4\relax%
			\ifnum\dynkin@ply=3\relax%
				\DthreePly%
			\else%
				\Ddynkin@roots%
				\Ddynkin@edges%
			\fi%
		\else%
			\Ddynkin@roots%
			\Ddynkin@edges%
		\fi%
		\dynkinMoveToRoot{\the\dynkin@rank@minus@two}%
		\ifnum\dynkin@ply>1\relax%
			\dynkinMoveToRoot{\the\dynkin@rank@minus@two}%
			\dynkinEast%
		\fi%
	\else%
		\gdef\dynkin@series{A}%
		\Adynkin%
		\ifnum\dynkin@ply>1\relax%
			\ifdynkin@arrows%
				\ifnum\dynkin@rank=1\relax%
				\else%
					\dynkinLeftFold*{1}{\the\dynkin@rank}%
				\fi%
			\fi%
		\fi%
		\gdef\dynkin@series{D}%
	\fi%
}%
\newcount\dynkin@bmo%
\newcommand*{\Edynkin@unfolded@rank@up@to@eight}%
{%
	% Create the @roots.
	\dynkinPlaceRootHere*{1}{below}{above}%
	\dynkinPlaceRootRelativeTo*%
		{3}{1}%
		{east}%
		{below}{above}%
	\dynkinPlaceRootRelativeTo*%
		{4}{3}%
		{east}%
		{below}{above right}%
	\ifdynkin@is@extended%
		\ifnum\dynkin@rank=6\relax%
			\dynkinPlaceRootRelativeTo*%
				{2}{4}%
				{north}%
				{right}{above right}%
		\else
			\dynkinPlaceRootRelativeTo*%
				{2}{4}%
				{north}%
				{right}{above}%
		\fi%
	\else%
		\dynkinPlaceRootRelativeTo*%
			{2}{4}%
			{north}%
			{right}{above}%
	\fi%
	\dynkin@bmo=4\relax%
	\foreach \dynkin@b in {5,...,\dynkin@rank}%
	{%
		\dynkinPlaceRootRelativeTo*%
			{\dynkin@b}{\the\dynkin@bmo}%
			{east}{below}{above}%
		\dynkinEdge*{SingleEdge}{\the\dynkin@bmo}{\dynkin@b}%
		\global\advance\dynkin@bmo by 1\relax%
	}%
%	% Draw the remaining edges.
	\dynkinEdge*{SingleEdge}{1}{3}
	\dynkinEdge*{SingleEdge}{3}{4}
	\dynkinEdge*{SingleEdge}{4}{2}
	\ifdynkin@is@extended%
		\ifnum\dynkin@rank=6\relax%
			\dynkinPlaceRootRelativeTo*{0}{2}{north}{right}{above}%
			\dynkinEdge*{SingleEdge}{0}{2}%
		\else%
			\ifnum\dynkin@rank=7\relax%
				\dynkinPlaceRootRelativeTo*%
					{0}{1}%
					{west}%
					{below}{above}%
				\dynkinEdge*{SingleEdge}{0}{1}%
			\else%
				\dynkinPlaceRootRelativeTo*%
					{0}{8}%
					{east}%
					{below}{above}%
				\dynkinEdge*{SingleEdge}{0}{8}%
			\fi%
		\fi%
	\fi%
	\dynkinMoveToRoot{\the\dynkin@rank}%
}%
%% \Edynkin@unfolded
%% Draws an E series Dynkin diagram not folded.
\newcommand*{\Edynkin@unfolded}%
{
	\ifnum\dynkin@rank>8\relax%
		% We have to work in Kac ordering directly.
		\dynkinPlaceRootHere*{1}{below}{above}%
		\ifnum\dynkin@rank>1\relax%
			\dynkin@pipe%
				{1}{\the\dynkin@rank@minus@one}%
				{east}{below}%
				{above}%
			\dynkinPlaceRootRelativeTo*%
				{\the\dynkin@rank}{\dynkin@rank@minus@three}%
				{north}{right}{above}%
			\dynkinEdge*{SingleEdge}%
				{\the\dynkin@rank}{\dynkin@rank@minus@three}%
		\fi%
	\else%
		\Edynkin@unfolded@rank@up@to@eight%
	\fi
}%
%% \Edynkin@folded
%% Draws a folded E6, affine E6 or affine E7 Dynkin diagram.
\NewDocumentCommand\Edynkin@folded{}%
{%
	\ifnum\dynkin@rank=6\relax%
		\ifnum\dynkin@ply=2\relax\ESixTwoPly\else\ESixThreePly\fi%
	\else%
		\extendedESevenFolded%
	\fi%
}%
\NewDocumentCommand\ESixTwoPly{}%
{%
	\dynkin@jump{1}%
	\dynkinPlaceRootHere*{1}{above}{below right}%
	\dynkinPlaceRootRelativeTo*%
		{3}{1}%
		{east}%
		{above}{below right}%
	\dynkinPlaceRootRelativeTo*%
		{4}{3}%
		{southeastfold}%
		{below right}{above right}%
	\dynkinPlaceRootRelativeTo*%
		{5}{4}%
		{southwestfold}%
		{below}{above right}%
	\dynkinPlaceRootRelativeTo*%
		{6}{5}%
		{west}%
		{below}{above right}%
	\ifdynkin@is@extended%
		\dynkinPlaceRootRelativeTo*{2}{4}{east}{below}{above}%
		\dynkinPlaceRootRelativeTo*{0}{2}{east}{below}{above}%
		\dynkinEdge*{SingleEdge}{0}{2}%
	\else%
		\dynkinPlaceRootRelativeTo*{2}{4}{east}{below}{above}%
	\fi%
	\dynkinEdge*{SingleEdge}{1}{3}%
	\dynkinEdge*{SingleEdge}{2}{4}%
	\dynkinEdge*{SingleEdge}{5}{6}%
	\dynkinEdge*{RightDownArc}{3}{4}%
	\dynkinEdge*{RightUpArc}{5}{4}%
	\ifdynkin@arrows%
		\dynkin@fold@arrow@if@oo{1}{6}%
		\dynkin@fold@arrow@if@oo{3}{5}%
	\fi%
}%
\NewDocumentCommand\ESixThreePly{}%
{%
	\dynkin@is@extendedtrue
	\node (Dynkin current) at ($(Dynkin current)+(0,%1.5*
	\dynkin@edge@length)$){};%
	\dynkinPlaceRootHere*{3}{below left}{above}%
	\dynkinPlaceRootRelativeTo*{2}{3}{south}{below left}{above right}%
	\dynkinPlaceRootRelativeTo*{5}{2}{south}{below}{above right}%
	\dynkinPlaceRootRelativeTo*{1}{3}{west}{below left}{above right}%
	\dynkinPlaceRootRelativeTo*{0}{2}{west}{below left}{above right}%
	\dynkinPlaceRootRelativeTo*{6}{5}{west}{below}{above right}%
	\edef\old@fold@radius{\dynkin@fold@radius}%
	\xdef\dynkin@fold@radius{\dynkin@edge@length}%
	\dynkinPlaceRootRelativeTo*{4}{2}{east}{below left}{above right}%
	\dynkinEdge*{SingleEdge}{4}{2}%
	\dynkinEdge*{SingleEdge}{3}{1}%
	\dynkinEdge*{SingleEdge}{2}{0}%
	\dynkinEdge*{SingleEdge}{5}{6}%
	\dynkinEdge*{RightDownArc}{3}{4}%
	\dynkinEdge*{RightUpArc}{5}{4}%
	\xdef\dynkin@fold@radius{\old@fold@radius}%
	\ifdynkin@arrows%
		\dynkin@fold@arrow@if@oo{1}{0}%
		\dynkin@fold@arrow@if@oo{6}{0}%
		\dynkin@fold@arrow@if@oo{3}{2}%
		\dynkin@fold@arrow@if@oo{2}{5}%
	\fi%
}%
\NewDocumentCommand\extendedESevenFolded{}%
{%
	\dynkin@jump{1}%
	\dynkinPlaceRootHere*{0}{above}{below}%
	\dynkinPlaceRootRelativeTo*{1}{0}{east}{above}{below}%
	\dynkinPlaceRootRelativeTo*{3}{1}{east}{above}{below}%
	\dynkinPlaceRootRelativeTo*{4}{3}{southeastfold}{left}{right}%
	\dynkinPlaceRootRelativeTo*{5}{4}{southwestfold}{below}{above}%
	\dynkinPlaceRootRelativeTo*{6}{5}{west}{below}{above}%
	\dynkinPlaceRootRelativeTo*{7}{6}{west}{below}{above}%
	\dynkinPlaceRootRelativeTo*{2}{4}{east}{below}{above}%
	\dynkinEdge*{SingleEdge}{0}{1}%
	\dynkinEdge*{SingleEdge}{1}{3}%
	\dynkinEdge*{SingleEdge}{2}{4}%
	\dynkinEdge*{SingleEdge}{5}{6}%
	\dynkinEdge*{SingleEdge}{6}{7}%
	\dynkinEdge*{RightDownArc}{3}{4}%
	\dynkinEdge*{RightUpArc}{5}{4}%
	\ifdynkin@arrows%
		\dynkin@fold@arrow@if@oo{0}{7}%
		\dynkin@fold@arrow@if@oo{1}{6}%
		\dynkin@fold@arrow@if@oo{3}{5}%
	\fi%
}%
%% \Edynkin
%% Draws an E6 Dynkin diagram.
\NewDocumentCommand\Edynkin{}%
{%
	\ifnum\dynkin@ply>1\relax%
		\ifnum\dynkin@rank=6\relax%
			\Edynkin@folded%
		\else%
			\ifnum\dynkin@rank=7\relax
				\ifdynkin@is@extended
					\Edynkin@folded%
				\else%
					\ClassError{Dynkin diagrams}%
						{Can not fold a diagram of type \dynkin@user@series{} \the\dynkin@rank.}{}%
				\fi%
			\fi%
		\fi%
	\else%
		\Edynkin@unfolded%
	\fi%
}%
%% \Fdynkin 
%% Draws an F series Dynkin diagram.
\newcommand*{\Fdynkin}%
{%
	\ifnum\dynkin@ply>1\relax%
		\dynkin@jump{1}%
		\dynkinPlaceRootHere*{1}{left}{above}%
		\dynkinPlaceRootRelativeTo*{2}{1}{east}{below}{above}%
		\dynkinPlaceRootRelativeTo*{3}{2}{southfold}{left}{below}%
		\dynkinEdge*{DoubleDownRightSemiCircle}{2}{3}%
		\dynkinPlaceRootRelativeTo*{4}{3}{west}{below}{above}%
		\ifdynkin@arrows%
			\dynkinLeftFold*{1}{4}%
		\fi%
		\dynkinEdge*{SingleEdge}{1}{2}%
		\dynkinEdge*{SingleEdge}{3}{4}%
	\else%
		\dynkinPlaceRootHere*{1}{below}{above}%
		\dynkinPlaceRootRelativeTo*{2}{1}{east}{below}{above}%
		\dynkinPlaceRootRelativeTo*{3}{2}{east}{below}{above}%
		\dynkinPlaceRootRelativeTo*{4}{3}{east}{below}{above}%
		\ifdynkin@Coxeter%
			\dynkinEdge*{SingleEdge}{1}{2}%
			\dynkinEdge*{SingleEdge}{2}{3}%
			\dynkinEdge*{SingleEdge}{3}{4}%
			\dynkinEdgeLabel{2}{3}{4}%
		\else%
			\dynkinEdge*{SingleEdge}{1}{2}%
			\dynkinEdge*{SingleEdge}{3}{4}%
			\dynkinEdge*{DoubleEdge}{2}{3}%
		\fi%
	\fi%
}%
%% \Gdynkin 
%% Draws a G series Dynkin diagram.
\NewDocumentCommand\Gdynkin{}%
{%
	\ifdynkin@Coxeter%
		\Idynkin%
	\else%
		\ifnum\dynkin@ply>1\relax%
			\dynkin@jump{1}%
			\dynkinPlaceRootHere*{1}{left}{above}%
			\dynkinPlaceRootRelativeTo*{2}{1}{southfold}{left}{below}%
			\dynkinEdge*{TripleDownRightSemiCircle}{1}{2}%
			\ifdynkin@arrows%
				\dynkinLeftFold*{1}{2}%
			\fi%
		\else%
			\dynkinPlaceRootHere*{1}{below}{above}%
			\dynkinPlaceRootRelativeTo*{2}{1}{east}{below}{above}%
			\dynkinTripleEdge*{1}{2}%
		\fi%
	\fi%
}%

%% \Hdynkin 
%% Draws an H series Coxeter diagram.
\newcommand*{\Hdynkin}%
{%
	\Adynkin%
	\dynkinEdgeLabel{1}{2}{5}%
}%
%% \Idynkin 
%% Draws an I series Coxeter diagram.
\newcommand*{\Idynkin}%
{%
	\dynkin@rank=2\relax%
	\Adynkin%
	\dynkinEdgeLabel{1}{2}{\dynkin@gonality}%
}%

%% \extendedAdynkin
%% Draws an A series affine Dynkin/Coxeter diagram.
\NewDocumentCommand\extendedAdynkin{}%
{%
	\ifnum\dynkin@rank=1\relax%
		\dynkinPlaceRootHere{0}{below}{above}%
		\dynkinPlaceRootRelativeTo*{1}{0}{east}{below}{above}%
		\convertRootNumber{1}%
		\begin{pgfonlayer}{Dynkin behind}%
			\draw[/Dynkin diagram/t,double,
				{Classical TikZ Rightarrow[length={2*\dynkin@root@radius}]}%
				-{Classical TikZ Rightarrow[length={2*\dynkin@root@radius}]}%
			]%
			($(\dynkin@root@name 0)+(\dynkin@root@radius,0)$) 
			-- 
			($(\dynkin@root@name \the\dynkin@Root@Number)-(\dynkin@root@radius,0)$);%
		\end{pgfonlayer}%%
	\else%
		\ifnum\dynkin@ply=4\relax%
			\node (Dynkin current) at ($(Dynkin current)+(0,\dynkin@edge@length)$){};%
			\dynkinPlaceRootHere*{0}{left}{above}%
			\dynkinPlaceRootRelativeTo*{1}{0}{east}{right}{above}%
			\dynkinPlaceRootRelativeTo*{2}{0}{south}{below}{left}%
			\dynkinPlaceRootRelativeTo*{3}{1}{south}{below}{right}%
			\dynkinEdge*{SingleEdge}{0}{1}%
			\dynkinEdge*{SingleEdge}{1}{2}%
			\dynkinEdge*{SingleEdge}{2}{3}%
			\dynkinEdge*{SingleEdge}{3}{0}%
			\dynkinFold*{0}{2}%
			\dynkinFold*{1}{3}%
		\else%
			\Adynkin{}%
			\ifnum\dynkin@ply>1\relax%
				\dynkinPlaceRootRelativeTo*{0}{1}{southwestfold}{left}{right}%
				\dynkinEdge*{LeftDownArc}{1}{0}%
				\dynkinEdge*{LeftUpArc}{\the\dynkin@rank}{0}%
			\else%
				\node (Dynkin current) 
					at
					($.5*(\dynkin@root@name 1)%
					+.5*(\dynkin@root@name \the\dynkin@rank)$)%
					{};%
				\dynkinNorth%
				\dynkinPlaceRootHere*{0}{above}{below}%
				\dynkinEdge*{SingleEdge}{0}{1}%
				\dynkinEdge*{SingleEdge}{\the\dynkin@rank}{0}%
			\fi%
			\dynkinRootMark*{}{0}%
		\fi%
	\fi%
	\dynkinMoveToRoot{\the\dynkin@rank}%
}%

\NewDocumentCommand\extendedBthreePly{}%
{%
	\ifnum\dynkin@rank=3\relax%
	\else%
		\ClassError%
			{Dynkin diagrams}%
			{B series extended 3-ply diagrams must have rank 3, so cannot have rank \the\dynkin@rank}{}%
	\fi%
	\dynkinPlaceRootHere*{1}{right}{above left}%
	\dynkinPlaceRootRelativeTo*{0}{1}{north}{above}{below left}%
	\dynkinPlaceRootRelativeTo*{3}{1}{south}{below}{above left}%
	\edef\old@fold@radius{\dynkin@fold@radius}%
	\xdef\dynkin@fold@radius{\dynkin@edge@length}%
	\dynkinPlaceRootRelativeTo*{2}{1}{west}{left}{above right}%
	\dynkinEdge*{LeftDownArc}{0}{2}%
	\dynkinFold*{0}{1}%
	\dynkinFold*{1}{3}%
	\dynkinEdge*{SingleEdge}{1}{2}%
	\dynkinEdge*{DoubleDownRightArc}{2}{3}%
	\xdef\dynkin@fold@radius{\old@fold@radius}%
}%
\newcount\dynkin@bmo%
%% \extendedBdynkin
%% Draws a B series affine Dynkin/Coxeter diagram.
\newcommand*{\extendedBdynkin}%
{%
	\ifnum\the\dynkin@rank=1\relax%
		\extendedAdynkin%
	\else%
		\ifnum\the\dynkin@rank=2\relax%
				\dynkinPlaceRootHere*{0}{below}{above}%
				\dynkinPlaceRootRelativeTo*{1}{0}{east}{below}{above}%
				\dynkinPlaceRootRelativeTo*{2}{1}{east}{below}{above}%
				\dynkinEdge*{SingleEdge}{0}{1}%
				\dynkinEdge*{DoubleEdge}{1}{2}%
		\else%
			\ifnum\dynkin@ply=3\relax%
				\extendedBthreePly%
			\else%
				\ifnum\dynkin@ply=2\relax%
					\dynkin@jump{1}%
					\dynkinPlaceRootHere*{0}{left}{above left}%
					\dynkinPlaceRootRelativeTo*%
						{2}{0}%
						{southeastfold}%
						{below right}{above right}%
					\dynkinPlaceRootRelativeTo*%
						{1}{2}%
						{southwestfold}%
						{left}{above left}%
					\dynkinLeftFold*{0}{1}%
					\dynkinEdge*{RightDownArc}{0}{2}%
					\dynkinEdge*{RightUpArc}{1}{2}%
				\else%
					\dynkin@hop{1}%
					\dynkinPlaceRootHere*{0}{left}{above left}%
					\dynkinPlaceRootRelativeTo*%
						{2}{0}%
						{southeast}%
						{below right}{above right}%
					\dynkinPlaceRootRelativeTo*%
						{1}{2}%
						{southwest}%
						{left}{above left}%
					\dynkinEdge*{SingleEdge}{0}{2}%
					\dynkinEdge*{SingleEdge}{1}{2}%
				\fi%
				\dynkin@bmo=2\relax%
				\ifnum\dynkin@rank>3\relax%
					\foreach \dynkin@b in {3,...,\the\dynkin@rank@minus@one}%
					{%
						\dynkinPlaceRootRelativeTo*%
							{\dynkin@b}{\the\dynkin@bmo}%
							{east}{below}{above}%
						\dynkinEdge*{SingleEdge}%
							{\dynkin@b}{\the\dynkin@bmo}%
						\global\advance\dynkin@bmo by 1\relax%
					}%
				\fi%
				\ifnum\dynkin@ply<3\relax%
					\dynkinPlaceRootRelativeTo*%
						{\the\dynkin@rank}%
						{\the\dynkin@rank@minus@one}%
						{east}{below}{above}%
				\fi%
				\ifdynkin@Coxeter%
					\dynkinEdge*{SingleEdge}%
						{\the\dynkin@rank@minus@one}%
						{\the\dynkin@rank}%
					\dynkinEdgeLabel%
						{\the\dynkin@rank@minus@one}%
						{\the\dynkin@rank}{4}%
				\else%
					\ifnum\dynkin@ply<3\relax%
						\dynkinEdge*{DoubleEdge}%
							{\the\dynkin@rank@minus@one}%
							{\the\dynkin@rank}%
					\else%
						\dynkinEdge*{DoubleDownRightArc}%
							{\the\dynkin@rank@minus@one}%
							{\the\dynkin@rank}%
					\fi%							
				\fi%
			\fi%
		\fi%
	\fi%
}%

%% \extendedCdynkin
%% Draws an C series affine Dynkin/Coxeter diagram.
\newcommand*{\extendedCdynkin}%
{%
	\dynkinPlaceRootHere*{0}{below}{above}%
	\dynkinEast%
	\Cdynkin{}%
	\ifdynkin@Coxeter%
		\dynkinEdge*{SingleEdge}{0}{1}%
		\dynkinEdgeLabel{0}{1}{4}%
	\else%
		\dynkinEdge*{DoubleEdge}{0}{1}%
	\fi%	
}%
%% \DOneFourFourPly
%% Draws a D^1_4 series affine Dynkin diagram folded about an A^2_2.
\NewDocumentCommand\DOneFourFourPly{}%
{%
	\dynkin@hop{2.25}%
	\dynkinPlaceRootHere*{0}{right}{left}%
	\edef\old@edge@length{\dynkin@edge@length}%
	\dynkinPlaceRootRelativeTo*{1}{0}{south}{right}{left}%
	\dynkinPlaceRootRelativeTo*{3}{1}{south}{right}{left}%
	\dynkinPlaceRootRelativeTo*{4}{3}{south}{right}{left}%
	\convertRootPair{0}{4}%
	\node 
		(Dynkin current) 
		at 
		($.5*(\dynkin@root@name \the\@dynkin@from@root)%
		+.5*(\dynkin@root@name \the\@dynkin@to@root)$)%
		{};%
	\dynkinWest%
	\dynkinPlaceRootHere*{2}{right}{left}%
	\dynkinEdge*{SingleEdge}{0}{2}%
	\dynkinEdge*{SingleEdge}{1}{2}%
	\dynkinEdge*{SingleEdge}{3}{2}%
	\dynkinEdge*{SingleEdge}{4}{2}%
	\dynkinFold*{0}{1}%
	\dynkinFold*{1}{3}%
	\dynkinFold*{3}{4}%
}%
%% \DfourPly
%% Draws a D series affine Dynkin diagram folded about its middle.
\NewDocumentCommand\DfourPly{}%
{%
	\xdef\yfp{2*\dynkin@fold@radius+2*cos(60)*\dynkin@edge@length}%
	\node (Dynkin current) at ($(Dynkin current)+(0,{\yfp})$){};%
	\dynkinPlaceRootHere*{0}{left}{above left}%
	\dynkinPlaceRootRelativeTo*%
		{2}{0}%
		{southeastfold}%
		{above right}{below right}%
	\dynkinPlaceRootRelativeTo*%
		{1}{2}%
		{southwestfold}%
		{left}{above left}%
	\dynkinMoveToRoot*{2}%
	\xdef\old@fold{\dynkin@fold@radius}%
	\pgfmathparse{\dynkin@fold@radius+2*cos(60)*\dynkin@edge@length}%
	\xdef\dynkin@fold@radius{\pgfmathresult pt}%
	\dynkin@fold{2}{\the\dynkin@rank@minus@two}%
	% We place the root number rank-2 once again (it is already placed in the \dynkin@fold):
	\dynkinMoveToRoot*{\the\dynkin@rank@minus@two}% 
	\dynkinPlaceRootHere*%
		{\the\dynkin@rank@minus@two}%
		{below right}{above right}%
	\xdef\dynkin@fold@radius{\old@fold}%
	\dynkinPlaceRootRelativeTo*%
		{\the\dynkin@rank@minus@one}%
		{\the\dynkin@rank@minus@two}%
		{northwestfold}%
		{left}%
		{above left}%
	\dynkinPlaceRootRelativeTo*%
		{\the\dynkin@rank}%
		{\the\dynkin@rank@minus@two}%
		{southwestfold}%
		{left}%
		{above left}%
	\dynkinEdge*{RightDownArc}{0}{2}%
	\dynkinEdge*{RightUpArc}{1}{2}%
	\dynkinEdge*{RightDownArc}%
		{\the\dynkin@rank@minus@one}%
		{\the\dynkin@rank@minus@two}%
	\dynkinEdge*{RightUpArc}%
		{\the\dynkin@rank}%
		{\the\dynkin@rank@minus@two}%
}%

%% \extendedDthreePly
%% Draws a D^1_4 series Dynkin diagram, folded over a B^1_3.
\NewDocumentCommand\extendedDthreePly{}%
{%
	\dynkinPlaceRootHere*{0}{below}{above}%
	\dynkinPlaceRootRelativeTo*{1}{0}{east}{below left}{above right}%
	\dynkinPlaceRootRelativeTo*{3}{1}{east}{below left}{above right}%
	\dynkinPlaceRootRelativeTo*{2}{3}{north}{below left}{above right}%
	\dynkinPlaceRootRelativeTo*{4}{3}{south}{below}{above right}%
	\dynkinEdge*{SingleEdge}{1}{3}%
	\edef\old@fold@radius{\dynkin@fold@radius}%
	\xdef\dynkin@fold@radius{\dynkin@edge@length}%
	\dynkinEdge*{LeftDownArc}{2}{1}%
	\dynkinEdge*{LeftUpArc}{4}{1}%
	\xdef\dynkin@fold@radius{\old@fold@radius}%
	\ifdynkin@arrows%
		\dynkin@fold@arrow@if@oo{2}{3}%
		\dynkin@fold@arrow@if@oo{3}{4}%
	\fi%
	\dynkinEdge*{SingleEdge}{0}{1}%
}%
%% \extendedDdynkin
%% Draws an D series affine Dynkin/Coxeter diagram.
\NewDocumentCommand\extendedDdynkin{}%
{%
	\ifnum\dynkin@ply=4\relax%
		\ifnum\dynkin@rank=4\relax%
			\DOneFourFourPly%
		\else%
			\DfourPly%
		\fi%
	\else%
		\ifnum\dynkin@ply=3\relax%
			\extendedDthreePly%
		\else%
			\ifnum\the\dynkin@rank=1\relax%
				\extendedAdynkin%
			\else%
				\ifnum\the\dynkin@rank=4\relax%
					\global\dynkin@hex@gridfalse
				\fi
				\dynkin@hop{1}%
				\dynkinPlaceRootHere*{0}{left}{above left}%
				\Ddynkin%
				\ifnum\dynkin@ply=2\relax%
					\dynkinEdge*{RightDownArc}{0}{2}%
				\else%
					\ifdynkin@left@fold%
						\dynkinEdge*{RightDownArc}{0}{2}%
					\else%
						\dynkinEdge*{SingleEdge}{0}{2}%
					\fi%
				\fi%
				\ifnum\the\dynkin@rank=4\relax%
					\global\dynkin@hex@gridtrue
				\fi
			\fi%
		\fi%
	\fi%
}%
%% \extendedEdynkin 
%% Draws an E series affine Dynkin/Coxeter diagram.
\newcommand*{\extendedEdynkin}%
{%
	\Edynkin%
}%
%% \extendedFdynkin 
%% Draws an F series affine Dynkin/Coxeter diagram.
\newcommand*{\extendedFdynkin}%
{%
	\ifnum\dynkin@ply=1\relax%
		\dynkinPlaceRootHere*{0}{below}{above}%
		\dynkinEast%
		\Fdynkin%
		\dynkinEdge*{SingleEdge}{0}{1}%
	\else%
		\dynkin@jump{1}%
		\dynkinPlaceRootHere*{0}{above}{below}%
		\dynkinPlaceRootRelativeTo*{1}{0}{east}{above}{below}%
		\dynkinEdge*{SingleEdge}{0}{1}%
		\dynkinPlaceRootRelativeTo*{2}{1}{southeastfold}{right}{left}%
		\dynkinDefiniteRightDownArc*{1}{2}%
		\dynkinPlaceRootRelativeTo*{3}{2}{southwestfold}{below}{above}%
		\dynkinDefiniteDoubleDownLeftArc*{2}{3}%
		\dynkinPlaceRootRelativeTo*{4}{3}{west}{below}{above}%
		\dynkinEdge*{SingleEdge}{3}{4}%
		\ifdynkin@arrows%
			\dynkinFold*{0}{4}%
			\dynkinFold*{1}{3}%
		\fi%
	\fi%
}%

%% \extendedGdynkin 
%% Draws an G series affine Dynkin/Coxeter diagram.
\newcommand*{\extendedGdynkin}%
{%
	\xdef\dynkin@gonality{6}%
	\dynkinPlaceRootHere*{0}{below}{above}%
	\dynkinEast%
	\Gdynkin%
	\dynkinEdge*{SingleEdge}{0}{1}%
}%

%% \extendedHdynkin 
%% Draws an H series affine Coxeter diagram.
\newcommand*{\extendedHdynkin}%
{%
	\dynkinPlaceRootHere*{0}{below}{above}%
	\dynkinEast%
	\Adynkin%
	\dynkinEdge*{SingleEdge}{0}{1}%
	\ifnum\dynkin@rank=3\relax%
		\convertRootPair{1}{2}%
	\else%
		\convertRootPair{0}{1}%
	\fi%
	\node[/Dynkin diagram/text style,above] 
		at 
		($.5*(\dynkin@root@name \the\@dynkin@from@root)%
		+.5*(\dynkin@root@name \the\@dynkin@to@root)$)%
		{\(5\)};%
}%
%% \extendedIdynkin 
%% Draws an I series affine Coxeter diagram.
\newcommand*{\extendedIdynkin}%
{%
	\dynkinPlaceRootHere*{0}{below}{above}%
	\dynkinEast%
	\dynkin@rank=1\relax%
	\Adynkin%
	\dynkinEdge*{SingleEdge}{0}{1}%
	\dynkinEdgeLabel{0}{1}{\infty}%
}%
\newcount\dynkin@height@minus@one%
%% \twistedAdynkin 
%% Draws a twisted A series affine Dynkin diagram.
\NewDocumentCommand\twistedAdynkin{}%
{%
	\ifnum\dynkin@rank=3\relax%
		\ClassError{Dynkin diagrams}{A2 series twisted diagrams cannot have rank \the\dynkin@rank}{}%
	\fi%
	\ifnum\dynkin@rank=2\relax%
		\dynkinPlaceRootHere*{0}{below}{above}%
		\dynkinPlaceRootRelativeTo*{1}{0}{east}{below}{above}%
		\dynkinQuadrupleEdge*{1}{0}%
	\else%
		\dynkin@height@minus@one=\the\dynkin@nodes\relax%
		\advance\dynkin@height@minus@one by -1\relax%
		\ifodd\dynkin@rank%
			\ifnum\dynkin@ply>1\relax%
				\dynkinPlaceRootHere*{2}{below right}{above right}%
				\dynkinPlaceRootRelativeTo*%
					{0}{2}%
					{northwestfold}%
					{left}{above left}%
				\dynkinPlaceRootRelativeTo*%
					{1}{2}%
					{southwestfold}%
					{left}{above left}%
				\dynkinEdge*{RightDownArc}{0}{2}%
				\dynkinEdge*{RightUpArc}{1}{2}%
			\else%
				\dynkin@hop{1}%
				\dynkinPlaceRootHere*{0}{left}{right}%
				\dynkinPlaceRootRelativeTo*{2}{0}{southeast}{left}{right}%
				\dynkinPlaceRootRelativeTo*{1}{2}{southwest}{left}{right}%
				\dynkinEdge*{SingleEdge}{0}{2}%
				\dynkinEdge*{SingleEdge}{1}{2}%
			\fi%
			\dynkinMoveToRoot*{2}%
			\dynkin@pipe%
				{2}{\the\dynkin@height@minus@one}%
				{east}{below}%
				{above}%
			\dynkinPlaceRootRelativeTo*%
				{\the\dynkin@nodes}%
				{\the\dynkin@height@minus@one}%
				{east}%
				{below}%
				{above}%
			\dynkinEdge*{DoubleEdge}%
				{\the\dynkin@nodes}%
				{\the\dynkin@height@minus@one}%
			\ifnum\dynkin@ply>1\relax%
				\dynkinLeftFold*{0}{1}%
			\fi%			
		\else%
			\ifnum\dynkin@nodes>1\relax%
				\ifnum\dynkin@ply>1\relax%
					\ifnum\dynkin@height@minus@one>1\relax%
						\dynkin@jump{1}%
					\fi%
					\dynkinPlaceRootHere*{0}{below}{above}%
					\dynkinPlaceRootRelativeTo*%
						{1}{0}%
						{east}%
						{below left}{above}%
					\dynkinEdge*{DoubleEdge}{1}{0}%
					\ifnum\dynkin@height@minus@one>1\relax%
						\dynkin@fold{1}{\the\dynkin@height@minus@one}%
					\fi%
					\dynkinPlaceRootRelativeTo*%
						{\the\dynkin@nodes}%
						{\the\dynkin@height@minus@one}%
						{west}%
						{below}%
						{above}%
				\else%
					\dynkinPlaceRootHere*{0}{below}{above}%
					\dynkinPlaceRootRelativeTo*%
						{1}{0}%
						{east}%
						{below right}{above}%
					\dynkinEdge*{DoubleEdge}{1}{0}%
					\ifnum\dynkin@height@minus@one>1\relax%
						\dynkin@pipe{1}{\the\dynkin@height@minus@one}%
						{east}{below}{above}%
					\fi%
					\dynkinPlaceRootRelativeTo*%
						{\the\dynkin@nodes}%
						{\the\dynkin@height@minus@one}%
						{east}%
						{below}%
						{above}%
				\fi%
				\dynkinEdge*{DoubleEdge}%
					{\the\dynkin@nodes}%
					{\the\dynkin@height@minus@one}%
			\else%
				\dynkinPlaceRootHere*{0}{below}{above}%
				\dynkinPlaceRootRelativeTo*%
					{1}{0}%
					{east}%
					{below right}{above}%
				\dynkinEdge*{DoubleEdge}{1}{0}%				
			\fi%
		\fi%
	\fi%
}%
%% \twistedDdynkin 
%% Draws a twisted D series affine Dynkin diagram.
\NewDocumentCommand\twistedDdynkin{}%
{%
	\IfStrEqCase{\dynkin@twisted@series}%
	{%
		{1}{\extendedDdynkin}%
		{2}{\twistedDTwo}%
		{3}%
		{%
			\ifnum\dynkin@rank=4\relax%
				\dynkinPlaceRootHere*{0}{below}{above}%
				\dynkinPlaceRootRelativeTo*{1}{0}{east}{below}{above}%
				\dynkinPlaceRootRelativeTo*{2}{1}{east}{below}{above}%
				\dynkinEdge*{SingleEdge}{0}{1}%
				\dynkinTripleEdge*{2}{1}%
			\else%
				\ClassError%
					{Dynkin diagrams}%
					{D3 series twisted diagrams must have rank 2 and cannot have rank \the\dynkin@rank}%
					{}%
			\fi%
		}%
	}%
}%
\newcount\dynkin@nodes@minus@one%
\NewDocumentCommand\twistedDTwo{}%
{%
	\dynkin@nodes@minus@one\dynkin@nodes\relax%
	\advance\dynkin@nodes@minus@one by -1\relax%
	\ifnum\dynkin@rank<3\relax%
		\ClassError{Dynkin diagrams}{D2 series twisted diagrams cannot have rank \the\dynkin@rank}{}%
	\fi%
	\ifnum\dynkin@ply=1\relax%
		\dynkinPlaceRootHere*{0}{below}{above}%
		\dynkinPlaceRootRelativeTo*{1}{0}{east}{below}{above}%
	\else%
		\ifnum\dynkin@rank=3\relax%
			\dynkin@jump{1}%
			\dynkinPlaceRootHere*{0}{above}{right}%
			\dynkinPlaceRootRelativeTo*{1}{0}{southwestfold}{left}{right}%
			\dynkinPlaceRootRelativeTo*{2}{1}{southeastfold}{below}{right}%
		\else%
			\dynkinPlaceRootHere*{0}{above}{below}%
			\dynkinPlaceRootRelativeTo*{1}{0}{east}{above}{below}%
		\fi%
	\fi%
	\ifnum\dynkin@ply=2\relax%
		\dynkinEdge*{DoubleUpRightArc}{1}{0}%
	\else
		\dynkinEdge*{DoubleEdge}{1}{0}%
	\fi%
	\ifnum\dynkin@ply>1\relax%	
		\ifnum\dynkin@rank>3\relax%
			\dynkin@fold{1}{\the\dynkin@nodes@minus@one}%
			\dynkinPlaceRootRelativeTo*%
				{\the\dynkin@nodes}%
				{\the\dynkin@nodes@minus@one}%
				{west}{below}{above}%
			\dynkinFold*{0}{\the\dynkin@nodes}%
		\else%
			\dynkinFold*{0}{2}%
		\fi%
	\else%
		\ifnum\dynkin@rank>2\relax%
			\dynkin@pipe{1}{\the\dynkin@nodes@minus@one}{east}{below}{above}%
		\fi%
		\dynkinPlaceRootRelativeTo*%
			{\the\dynkin@nodes}%
			{\the\dynkin@nodes@minus@one}%
			{east}{below}{above}%
	\fi%
	\ifnum\dynkin@ply=2\relax%
		\dynkinEdge*{DoubleDownRightArc}%
		{\the\dynkin@nodes@minus@one}%
		{\the\dynkin@nodes}%
	\else
		\dynkinEdge*{DoubleEdge}%
			{\the\dynkin@nodes@minus@one}%
			{\the\dynkin@nodes}%
	\fi%
}%
%% \twistedEdynkin 
%% Draws a twisted E series affine Dynkin diagram.
\NewDocumentCommand\twistedEdynkin{}%
{%
	\IfStrEqCase{\dynkin@twisted@series}%
	{%
		{0}{\Edynkin}%
		{1}{\extendedEdynkin}%
		{2}%
		{%
			\dynkinPlaceRootHere*{0}{below}{above}%
			\dynkin@pipe{0}{2}{east}{below}{above}%
			\dynkinPlaceRootRelativeTo*{3}{2}{east}{below}{above}%
			\dynkinPlaceRootRelativeTo*{4}{3}{east}{below}{above}%
			\dynkinEdge*{SingleEdge}{3}{4}%
			\dynkinEdge*{DoubleEdge}{3}{2}%
		}%
	}%
	[\dynkin@error@series]%
}%

%% An arrow type for drawing arrows in G2 and F4 diagrams:
\pgfdeclarearrow{
name = Bourbaki,
parameters = { \the\pgfarrowlength },
setup code = {},
drawing code = {
  \pgfsetdash{}{0pt} % do not dash
  \pgfsetroundjoin   % fix join
  \pgfsetroundcap    % fix cap
  \pgfsetlinewidth{4\pgflinewidth}
  \pgfsetstrokecolor{white}
  \pgfpathmoveto{\pgfpoint{-.75\pgfarrowlength}{.75\pgfarrowlength}}
  \pgfpathlineto{\pgfpoint{0}{0}}
  \pgfpathlineto{\pgfpoint{-.75\pgfarrowlength}{-.75\pgfarrowlength}}
  \pgfusepathqstroke
  \pgfsetlinewidth{.25\pgflinewidth}
  \pgfsetstrokecolor{black}
  \pgfpathmoveto{\pgfpoint{-.75\pgfarrowlength}{.75\pgfarrowlength}}
  \pgfpathlineto{\pgfpoint{0}{0}}
  \pgfpathlineto{\pgfpoint{-.75\pgfarrowlength}{-.75\pgfarrowlength}}
  \pgfusepathqstroke
},
defaults = { length = 2*\dynkin@root@radius }
}

%% An arrow type for drawing arrows in G2 and F4 diagrams:
\pgfdeclarearrow{
name = bird,
parameters = { \the\pgfarrowlength },
setup code = {},
drawing code = {
  \pgfsetdash{}{0pt} % do not dash
  \pgfsetroundjoin   % fix join
  \pgfsetroundcap    % fix cap
\begin{pgfscope}
  \pgfpathmoveto{\pgfpoint{-1.25\pgfarrowlength}{-2.5\pgfarrowlength}}
  \pgfpathlineto{\pgfpoint{0}{-2.5\pgfarrowlength}}
  \pgfpathlineto{\pgfpoint{0}{2.5\pgfarrowlength}}
  \pgfpathlineto{\pgfpoint{-1.25\pgfarrowlength}{2.5\pgfarrowlength}}
  \pgfpathlineto{\pgfpoint{-1.25\pgfarrowlength}{-2.5\pgfarrowlength}}
\pgfusepathqclip
  \pgfsetlinewidth{4\pgflinewidth}
  \pgfsetstrokecolor{white}
%  \pgfsetstrokeopacity{.75}
  \pgfpathmoveto{\pgfpoint{0}{0}}
  \pgfpatharc{250}{190}{1.4\pgfarrowlength}
  \pgfpathmoveto{\pgfpoint{0}{0}}
  \pgfpatharc{110}{170}{1.4\pgfarrowlength}
  \pgfusepathqstroke
\end{pgfscope}
  \pgfsetstrokecolor{black}
  \pgfpathmoveto{\pgfpoint{0}{0}}
  \pgfpatharc{250}{190}{1.4\pgfarrowlength}
  \pgfpathmoveto{\pgfpoint{0}{0}}
  \pgfpatharc{110}{170}{1.4\pgfarrowlength}
  \pgfusepathqstroke
},
defaults = { length = 1.25*\dynkin@root@radius }
}


%% Here are the changes I made in May 2023 to accommodate Dynkin diagrams of products of Lie algebras:

\newcommand{\dynkinSkip}
{
\node (current) at ($(Dynkin current)+(\dynkin@separator@length,0)$) {};
}
\NewDocumentCommand\next@dynkin{O{}mO{0}m}%
{%
\dynkinSkip
\dynkin[at=(current),#1]{#2}[#3]{#4}
}%
\newcount\dynkin@diagram@list@item@number
\providecommand\do@dynkin@diagram@list@item{}
\renewcommand*{\do@dynkin@diagram@list@item}[1]{
	\ifnum\dynkin@diagram@list@item@number<2\relax%
		{\dynkin #1}%
	\else%
		{\next@dynkin #1}%
	\fi%
	\advance\dynkin@diagram@list@item@number by 1\relax%
}
\DeclareListParser*{\for@dynkin@diagram@list}{|}%
\NewDocumentCommand\dynkin@diagram@reducible{m}%
{%
\dynkin@diagram@list@item@number1\relax%
\for@dynkin@diagram@list{\do@dynkin@diagram@list@item}{#1}%
}%
\NewDocumentEnvironment{DynkinDiagrams}{m}%
{%
\dynkin@save{}%
\begin{tikzpicture}
\dynkin@diagram@reducible{#1}%
}%
{%
\end{tikzpicture}%
\dynkin@restore{}%
}%
\NewDocumentCommand\dynkins{m}%
{%
%\dynkin@save{}%
\ifdefined\filldraw\relax%
\dynkin@diagram@reducible{#1}%
\else%
\tikz[anchor=base]{\dynkin@diagram@reducible{#1}}%
\fi%
%\dynkin@restore{}%
}%

\endinput
