% The Dynkin Diagrams package.
%
% Version 3.141 592 653 589 793 238 462
%
% 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
%
[email protected]
%
% 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}[2024/12/04 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@Coxeter@above
% Should we draw Coxeter diagram extra labels above or below?
\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,
Coxeter above/.is if = dynkin@Coxeter@above,
Coxeter above=true,
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%
\ifWitt@symbol%
\global\advance\dynkin@rank by -1\relax%
\global\advance\dynkin@nodes by -1\relax%
\fi
\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%
}%
\newif\ifWitt@symbol
\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]\relax%
\ifnum\dynkin@lenny>1\relax%
\dynkin@error@series%
\fi%
% We need to check if the series is a Witt symbol.
\IfSubStr{PSRQTUVW}{\dynkin@series}%
{%
\global\Witt@symboltrue%
\IfStrEqCase{\dynkin@series}%
{%
{P}{\global\xdef\dynkin@series{A}}%
{S}{\global\xdef\dynkin@series{B}}%
{R}{\global\xdef\dynkin@series{C}}%
{Q}{\global\xdef\dynkin@series{D}}%
{T}{\global\xdef\dynkin@series{E}}%
{U}{\global\xdef\dynkin@series{F}}%
{V}{\global\xdef\dynkin@series{G}}%
{W}{\global\xdef\dynkin@series{I}}%
}%
}%
{%
\global\Witt@symbolfalse%
}%
\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%
{87654312}{#4}%
%% {13456782}{#4}% <-- Old error!
\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]%
}%
}%
[\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%
{78654321}{#3}%
% {18234567}{#3}% <<--- Old error.
\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]%
}%
}%
[\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{78654321%%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}%
{%
\global\dynkin@Root@Number=#1\relax%
% \IfStrEqCase{\dynkin@ordering}%
% {%
% {Carter}{\global\dynkin@Root@Number=\stringCharacterInPosition{21}{#1}\relax}%
% {Dynkin}{\global\dynkin@Root@Number=\stringCharacterInPosition{21}{#1}\relax}%
% {Kac}{\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%
\ifdynkin@Coxeter@above%
\dynkinEdgeLabel%
{\the\dynkin@rank@minus@one}%
{\the\dynkin@rank}{4}%
\else%
\dynkinEdgeLabel*%
{\the\dynkin@rank@minus@one}%
{\the\dynkin@rank}{4}%
\fi%
\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}%
\ifdynkin@Coxeter@above%
\dynkinEdgeLabel{2}{3}{4}%
\else%
\dynkinEdgeLabel*{2}{3}{4}%
\fi%
\else%
\dynkinEdge*{SingleEdge}{1}{2}%
\dynkinEdge*{SingleEdge}{3}{4}%
\dynkinEdge*{DoubleEdge}{2}{3}%
\fi%
\fi%
}%
\newif\ifGtwo@old@dynkin@reverse@arrows
%% \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}%
\ifdynkin@reverse@arrows%
\global\Gtwo@old@dynkin@reverse@arrowstrue\relax%
\else%
\global\Gtwo@old@dynkin@reverse@arrowsfalse\relax%
\fi%
\IfStrEqCase{\dynkin@ordering}%
{%
{Adams}{%
\ifdynkin@reverse@arrows%
\global\dynkin@reverse@arrowsfalse\relax%
\else%
\global\dynkin@reverse@arrowstrue\relax%
\fi\relax}%
{Bourbaki}{%
\ifdynkin@reverse@arrows%
\global\dynkin@reverse@arrowsfalse\relax%
\else%
\global\dynkin@reverse@arrowstrue\relax%
\fi\relax}%
% {Carter}{%
% \ifdynkin@reverse@arrows%
% \global\dynkin@reverse@arrowsfalse\relax%
% \else%
% \global\dynkin@reverse@arrowstrue\relax%
% \fi\relax}%
{Carter}{\relax}%
{Dynkin}{\relax}%
{Kac}{\relax}%
}%
[\relax]%
\dynkinEdge*{TripleDownRightSemiCircle}{1}{2}%
\ifGtwo@old@dynkin@reverse@arrows%
\global\dynkin@reverse@arrowstrue\relax%
\else%
\global\dynkin@reverse@arrowsfalse\relax%
\fi%
\ifdynkin@arrows%
\dynkinLeftFold*{1}{2}%
\fi%
\else%
\dynkinPlaceRootHere*{1}{below}{above}%
\dynkinPlaceRootRelativeTo*{2}{1}{east}{below}{above}%
\ifdynkin@reverse@arrows%
\global\Gtwo@old@dynkin@reverse@arrowstrue\relax%
\else%
\global\Gtwo@old@dynkin@reverse@arrowsfalse\relax%
\fi%
\IfStrEqCase{\dynkin@ordering}%
{%
{Adams}{%
\ifdynkin@reverse@arrows%
\global\dynkin@reverse@arrowsfalse\relax%
\else%
\global\dynkin@reverse@arrowstrue\relax%
\fi\relax}%
{Bourbaki}{%
\ifdynkin@reverse@arrows%
\global\dynkin@reverse@arrowsfalse\relax%
\else%
\global\dynkin@reverse@arrowstrue\relax%
\fi\relax}%
% {Carter}{%
% \ifdynkin@reverse@arrows%
% \global\dynkin@reverse@arrowsfalse\relax%
% \else%
% \global\dynkin@reverse@arrowstrue\relax%
% \fi\relax}%
{Carter}{\relax}% <<--- This was wrong for a long time!
{Dynkin}{\relax}%
{Kac}{\relax}%
}%
[\relax]%
\dynkinTripleEdge*{1}{2}\relax%
\ifGtwo@old@dynkin@reverse@arrows%
\global\dynkin@reverse@arrowstrue\relax%
\else%
\global\dynkin@reverse@arrowsfalse\relax%
\fi%
\fi%
\fi%
}%
%% \Hdynkin
%% Draws an H series Coxeter diagram.
\newcommand*{\Hdynkin}%
{%
\Adynkin%
\ifdynkin@Coxeter@above%
\dynkinEdgeLabel{1}{2}{5}%
\else%
\dynkinEdgeLabel*{1}{2}{5}%
\fi%
}%
%% \Idynkin
%% Draws an I series Coxeter diagram.
\newcommand*{\Idynkin}%
{%
\dynkin@rank=2\relax%
\Adynkin%
\ifdynkin@Coxeter@above%
\dynkinEdgeLabel{1}{2}{\dynkin@gonality}%
\else%
\dynkinEdgeLabel*{1}{2}{\dynkin@gonality}%
\fi%
}%
%% \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}%
\ifdynkin@Coxeter@above%
\dynkinEdgeLabel%
{\the\dynkin@rank@minus@one}%
{\the\dynkin@rank}{4}%
\else%
\dynkinEdgeLabel*%
{\the\dynkin@rank@minus@one}%
{\the\dynkin@rank}{4}%
\fi%
\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}%
\ifdynkin@Coxeter@above%
\dynkinEdgeLabel{0}{1}{4}%
\else%
\dynkinEdgeLabel*{0}{1}{4}%
\fi%
\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%
\let\extended@G@old@order\dynkin@ordering%
\xdef\dynkin@ordering{Carter}%
\Gdynkin%
\dynkinEdge*{SingleEdge}{0}{1}%
\xdef\dynkin@ordering{\extended@G@old@order}%
}%
%% \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}%
\ifdynkin@Coxeter@above%
\dynkinEdgeLabel{0}{1}{\infty}%
\else%
\dynkinEdgeLabel*{0}{1}{\infty}%
\fi%
}%
\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%
}%
\newif\iftwisted@D@old@dynkin@reverse@arrows
%% \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}%
\ifdynkin@reverse@arrows%
\global\dynkin@reverse@arrowsfalse\relax%
\else%
\global\dynkin@reverse@arrowstrue\relax%
\fi%
\dynkinTripleEdge*{1}{2}%
\ifdynkin@reverse@arrows%
\global\dynkin@reverse@arrowsfalse\relax%
\else%
\global\dynkin@reverse@arrowstrue\relax%
\fi%
\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