def _latex_dynkin_diagram(self, label=lambda x: x, node_dist=2, dual=False): r""" Return a latex representation of the Dynkin diagram. EXAMPLES:: sage: print CartanType(['B',4,1])._latex_dynkin_diagram() \draw (0,0.7 cm) -- (2 cm,0); \draw (0,-0.7 cm) -- (2 cm,0); \draw (2 cm,0) -- (4 cm,0); \draw (4 cm, 0.1 cm) -- +(2 cm,0); \draw (4 cm, -0.1 cm) -- +(2 cm,0); \draw[shift={(5.2, 0)}, rotate=0] (135 : 0.45cm) -- (0,0) -- (-135 : 0.45cm); \draw[fill=white] (0, 0.7 cm) circle (.25cm) node[left=3pt]{$0$}; \draw[fill=white] (0, -0.7 cm) circle (.25cm) node[left=3pt]{$1$}; \draw[fill=white] (2 cm, 0) circle (.25cm) node[below=4pt]{$2$}; \draw[fill=white] (4 cm, 0) circle (.25cm) node[below=4pt]{$3$}; \draw[fill=white] (6 cm, 0) circle (.25cm) node[below=4pt]{$4$}; sage: print CartanType(['B',4,1]).dual()._latex_dynkin_diagram() \draw (0,0.7 cm) -- (2 cm,0); \draw (0,-0.7 cm) -- (2 cm,0); \draw (2 cm,0) -- (4 cm,0); \draw (4 cm, 0.1 cm) -- +(2 cm,0); \draw (4 cm, -0.1 cm) -- +(2 cm,0); \draw[shift={(4.8, 0)}, rotate=180] (135 : 0.45cm) -- (0,0) -- (-135 : 0.45cm); \draw[fill=white] (0, 0.7 cm) circle (.25cm) node[left=3pt]{$0$}; \draw[fill=white] (0, -0.7 cm) circle (.25cm) node[left=3pt]{$1$}; \draw[fill=white] (2 cm, 0) circle (.25cm) node[below=4pt]{$2$}; \draw[fill=white] (4 cm, 0) circle (.25cm) node[below=4pt]{$3$}; \draw[fill=white] (6 cm, 0) circle (.25cm) node[below=4pt]{$4$}; """ if self.n == 1: import cartan_type return cartan_type.CartanType(["A",1,1])._latex_dynkin_diagram(label, node_dist) elif self.n == 2: import cartan_type return cartan_type.CartanType(["C",2,1])._latex_dynkin_diagram(label, node_dist, dual) if self.global_options('mark_special_node') in ['latex', 'both']: special_fill = 'black' else: special_fill = 'white' n = self.n single_end = (n-2)*node_dist # Where the single line ends ret = "\\draw (0,0.7 cm) -- (%s cm,0);\n"%node_dist ret += "\\draw (0,-0.7 cm) -- (%s cm,0);\n"%node_dist ret += "\\draw (%s cm,0) -- (%s cm,0);\n"%(node_dist, single_end) ret += "\\draw (%s cm, 0.1 cm) -- +(%s cm,0);\n"%(single_end, node_dist) ret += "\\draw (%s cm, -0.1 cm) -- +(%s cm,0);\n"%(single_end, node_dist) if dual: ret += self._latex_draw_arrow_tip(single_end+0.5*node_dist-0.2, 0, 180) else: ret += self._latex_draw_arrow_tip(single_end+0.5*node_dist+0.2, 0, 0) ret += "\\draw[fill=%s] (0, 0.7 cm) circle (.25cm) node[left=3pt]{$%s$};\n"%(special_fill, label(0)) ret += "\\draw[fill=white] (0, -0.7 cm) circle (.25cm) node[left=3pt]{$%s$};\n"%label(1) for i in range(1, n-1): ret += "\\draw[fill=white] (%s cm, 0) circle (.25cm) node[below=4pt]{$%s$};\n"%(i*node_dist, label(i+1)) ret += "\\draw[fill=white] (%s cm, 0) circle (.25cm) node[below=4pt]{$%s$};"%((n-1)*node_dist, label(n)) return ret
def dynkin_diagram(self): """ Returns the extended Dynkin diagram for affine type B. EXAMPLES:: sage: b = CartanType(['B',3,1]).dynkin_diagram() sage: b O 0 | | O---O=>=O 1 2 3 B3~ sage: sorted(b.edges()) [(0, 2, 1), (1, 2, 1), (2, 0, 1), (2, 1, 1), (2, 3, 2), (3, 2, 1)] sage: b = CartanType(['B',2,1]).dynkin_diagram(); b O=>=O=<=O 0 2 1 B2~ sage: sorted(b.edges()) [(0, 2, 2), (1, 2, 2), (2, 0, 1), (2, 1, 1)] sage: b = CartanType(['B',1,1]).dynkin_diagram(); b O<=>O 0 1 B1~ sage: sorted(b.edges()) [(0, 1, 2), (1, 0, 2)] """ import cartan_type n = self.n if n == 1: res = cartan_type.CartanType(["A", 1, 1]).dynkin_diagram() res._cartan_type = self return res if n == 2: res = cartan_type.CartanType(["C", 2, 1]).relabel({ 0: 0, 1: 2, 2: 1 }).dynkin_diagram() res._cartan_type = self return res from dynkin_diagram import DynkinDiagram_class g = DynkinDiagram_class(self) for i in range(1, n): g.add_edge(i, i + 1) g.set_edge_label(n - 1, n, 2) g.add_edge(0, 2) return g
def dynkin_diagram(self): """ Returns the extended Dynkin diagram for affine type C. EXAMPLES:: sage: c = CartanType(['C',3,1]).dynkin_diagram() sage: c O=>=O---O=<=O 0 1 2 3 C3~ sage: sorted(c.edges()) [(0, 1, 2), (1, 0, 1), (1, 2, 1), (2, 1, 1), (2, 3, 1), (3, 2, 2)] """ n = self.n if n == 1: import cartan_type res = cartan_type.CartanType(["A",1,1]).dynkin_diagram() res._cartan_type = self return res from dynkin_diagram import DynkinDiagram_class g = DynkinDiagram_class(self) for i in range(1, n): g.add_edge(i, i+1) g.set_edge_label(n,n-1,2) g.add_edge(0,1,2) return g
def ascii_art(self, label=lambda i: i, node=None): """ Return an ascii art representation of the extended Dynkin diagram. TESTS:: sage: print CartanType(['D',6,1]).ascii_art(label = lambda x: x+2) 2 O O 8 | | | | O---O---O---O---O 3 4 5 6 7 sage: print CartanType(['D',4,1]).ascii_art(label = lambda x: x+2) O 6 | | O---O---O 3 |4 5 | O 2 sage: print CartanType(['D',3,1]).ascii_art(label = lambda x: x+2) 2 O-------+ | | | | O---O---O 5 3 4 """ if node is None: node = self._ascii_art_node n = self.n if n == 3: import cartan_type return cartan_type.CartanType(["A", 3, 1]).relabel({ 0: 0, 1: 3, 2: 1, 3: 2 }).ascii_art(label, node) if n == 4: ret = " {} {}\n".format(node(label(4)), label(4)) + " |\n |\n" ret += "{}---{}---{}\n".format(node(label(1)), node(label(2)), node(label(3))) ret += "{!s:4}|{!s:3}{!s:4}\n".format(label(1), label(2), label(3)) ret += " |\n {} {}".format(node(label(0)), label(0)) return ret ret = "{!s:>3} {}".format(label(0), node(label(0))) ret += (4 * (n - 4) - 1) * " " + "{} {}\n".format(node(label(n)), label(n)) ret += " |" + (4 * (n - 4) - 1) * " " + "|\n" ret += " |" + (4 * (n - 4) - 1) * " " + "|\n" ret += "---".join(node(label(i)) for i in range(1, n)) ret += '\n' + "".join("{!s:4}".format(label(i)) for i in range(1, n)) return ret
def classical(self): """ Returns the classical Cartan type associated with self sage: CartanType(["BC", 3, 2]).classical() ['C', 3] """ import cartan_type return cartan_type.CartanType(["C", self.n])
def _latex_dynkin_diagram(self, label=lambda x: x, node_dist=2, dual=False): r""" Return a latex representation of the Dynkin diagram. EXAMPLES:: sage: print CartanType(['C',4,1])._latex_dynkin_diagram() \draw (0, 0.1 cm) -- +(2 cm,0); \draw (0, -0.1 cm) -- +(2 cm,0); \draw[shift={(1.2, 0)}, rotate=0] (135 : 0.45cm) -- (0,0) -- (-135 : 0.45cm); { \pgftransformxshift{2 cm} \draw (0 cm,0) -- (4 cm,0); \draw (4 cm, 0.1 cm) -- +(2 cm,0); \draw (4 cm, -0.1 cm) -- +(2 cm,0); \draw[shift={(4.8, 0)}, rotate=180] (135 : 0.45cm) -- (0,0) -- (-135 : 0.45cm); \draw[fill=white] (0 cm, 0) circle (.25cm) node[below=4pt]{$1$}; \draw[fill=white] (2 cm, 0) circle (.25cm) node[below=4pt]{$2$}; \draw[fill=white] (4 cm, 0) circle (.25cm) node[below=4pt]{$3$}; \draw[fill=white] (6 cm, 0) circle (.25cm) node[below=4pt]{$4$}; } \draw[fill=white] (0, 0) circle (.25cm) node[below=4pt]{$0$}; sage: print CartanType(['C',4,1]).dual()._latex_dynkin_diagram() \draw (0, 0.1 cm) -- +(2 cm,0); \draw (0, -0.1 cm) -- +(2 cm,0); \draw[shift={(0.8, 0)}, rotate=180] (135 : 0.45cm) -- (0,0) -- (-135 : 0.45cm); { \pgftransformxshift{2 cm} \draw (0 cm,0) -- (4 cm,0); \draw (4 cm, 0.1 cm) -- +(2 cm,0); \draw (4 cm, -0.1 cm) -- +(2 cm,0); \draw[shift={(5.2, 0)}, rotate=0] (135 : 0.45cm) -- (0,0) -- (-135 : 0.45cm); \draw[fill=white] (0 cm, 0) circle (.25cm) node[below=4pt]{$1$}; \draw[fill=white] (2 cm, 0) circle (.25cm) node[below=4pt]{$2$}; \draw[fill=white] (4 cm, 0) circle (.25cm) node[below=4pt]{$3$}; \draw[fill=white] (6 cm, 0) circle (.25cm) node[below=4pt]{$4$}; } \draw[fill=white] (0, 0) circle (.25cm) node[below=4pt]{$0$}; """ if self.n == 1: import cartan_type return cartan_type.CartanType(["A",1,1])._latex_dynkin_diagram(label, node_dist) if self.global_options('mark_special_node') in ['latex', 'both']: special_fill = 'black' else: special_fill = 'white' ret = "\\draw (0, 0.1 cm) -- +(%s cm,0);\n"%node_dist ret += "\\draw (0, -0.1 cm) -- +(%s cm,0);\n"%node_dist if dual: ret += self._latex_draw_arrow_tip(0.5*node_dist-0.2, 0, 180) else: ret += self._latex_draw_arrow_tip(0.5*node_dist+0.2, 0, 0) ret += "{\n\\pgftransformxshift{%s cm}\n"%node_dist ret += self.classical()._latex_dynkin_diagram(label, node_dist, dual) ret += "\n}\n\\draw[fill=%s] (0, 0) circle (.25cm) node[below=4pt]{$%s$};"%(special_fill, label(0)) return ret
def dual(self): """ Types B and C are in duality: EXAMPLES:: sage: CartanType(["C", 3]).dual() ['B', 3] """ import cartan_type return cartan_type.CartanType(["B", self.n])
def ascii_art(self, label=lambda x: x): """ Returns a ascii art representation of the extended Dynkin diagram TESTS:: sage: print CartanType(['D',6,1]).ascii_art(label = lambda x: x+2) 2 O O 8 | | | | O---O---O---O---O 3 4 5 6 7 sage: print CartanType(['D',4,1]).ascii_art(label = lambda x: x+2) O 6 | | O---O---O 3 |4 5 | O 2 sage: print CartanType(['D',3,1]).ascii_art(label = lambda x: x+2) 2 O-------+ | | | | O---O---O 5 3 4 """ n = self.n if n == 3: import cartan_type return cartan_type.CartanType(["A", 3, 1]).relabel({ 0: 0, 1: 3, 2: 1, 3: 2 }).ascii_art(label) if self.global_options('mark_special_node') in ['printing', 'both']: special_str = self.global_options('special_node_str') else: special_str = 'O' if n == 4: return " " + special_str + " %s\n |\n |\nO---O---O\n%s |%s %s\n |\n O %s" % tuple( label(i) for i in (4, 1, 2, 3, 0)) ret = " %s O" % label(0) + (4 * (n - 4) - 1) * " " + "O %s" % label(n) + "\n" ret += " |" + (4 * (n - 4) - 1) * " " + "|\n" ret += " |" + (4 * (n - 4) - 1) * " " + "|\n" ret += (n - 2) * "O---" + "O\n" ret += " ".join("%s" % label(i) for i in range(1, n)) return ret
def _latex_dynkin_diagram(self, label=lambda x: x, node_dist=2, dual=False): r""" Return a latex representation of the Dynkin diagram. EXAMPLES:: sage: print CartanType(['D',4,1])._latex_dynkin_diagram() \draw (0,0.7 cm) -- (2 cm,0); \draw (0,-0.7 cm) -- (2 cm,0); \draw (2 cm,0) -- (2 cm,0); \draw (2 cm,0) -- (4 cm,0.7 cm); \draw (2 cm,0) -- (4 cm,-0.7 cm); \draw[fill=white] (0, 0.7 cm) circle (.25cm) node[left=3pt]{$0$}; \draw[fill=white] (0, -0.7 cm) circle (.25cm) node[left=3pt]{$1$}; \draw[fill=white] (2 cm, 0) circle (.25cm) node[below=4pt]{$2$}; \draw[fill=white] (4 cm, 0.7 cm) circle (.25cm) node[right=3pt]{$4$}; \draw[fill=white] (4 cm, -0.7 cm) circle (.25cm) node[right=3pt]{$3$}; """ n = self.n if n == 3: import cartan_type relabel = {0: label(0), 1: label(3), 2: label(1), 3: label(2)} return cartan_type.CartanType([ "A", 3, 1 ]).relabel(relabel)._latex_dynkin_diagram(node_dist=node_dist) if self.global_options('mark_special_node') in ['latex', 'both']: special_fill = 'black' else: special_fill = 'white' rt_most = (n - 2) * node_dist center_point = rt_most - node_dist ret = "\\draw (0,0.7 cm) -- (%s cm,0);\n" % node_dist ret += "\\draw (0,-0.7 cm) -- (%s cm,0);\n" % node_dist ret += "\\draw (%s cm,0) -- (%s cm,0);\n" % (node_dist, center_point) ret += "\\draw (%s cm,0) -- (%s cm,0.7 cm);\n" % (center_point, rt_most) ret += "\\draw (%s cm,0) -- (%s cm,-0.7 cm);\n" % (center_point, rt_most) ret += "\\draw[fill=%s] (0, 0.7 cm) circle (.25cm) node[left=3pt]{$%s$};\n" % ( special_fill, label(0)) ret += "\\draw[fill=white] (0, -0.7 cm) circle (.25cm) node[left=3pt]{$%s$};\n" % label( 1) for i in range(1, self.n - 2): ret += "\\draw[fill=white] (%s cm, 0) circle (.25cm) node[below=4pt]{$%s$};\n" % ( i * node_dist, label(i + 1)) ret += "\\draw[fill=white] (%s cm, 0.7 cm) circle (.25cm) node[right=3pt]{$%s$};\n" % ( rt_most, label(n)) ret += "\\draw[fill=white] (%s cm, -0.7 cm) circle (.25cm) node[right=3pt]{$%s$};" % ( rt_most, label(n - 1)) return ret
def basic_untwisted(self): r""" Return the basic untwisted Cartan type associated with this affine Cartan type. Given an affine type `X_n^{(r)}`, the basic untwisted type is `X_n`. In other words, it is the classical Cartan type that is twisted to obtain ``self``. EXAMPLES:: sage: CartanType(['A', 2, 2]).basic_untwisted() ['A', 2] sage: CartanType(['A', 4, 2]).basic_untwisted() ['A', 4] sage: CartanType(['BC', 4, 2]).basic_untwisted() ['A', 8] """ import cartan_type return cartan_type.CartanType(["A", 2 * self.n])
def cartan_matrix(t): """ Returns the Cartan matrix corresponding to type t. EXAMPLES:: sage: cartan_matrix(['A', 4]) [ 2 -1 0 0] [-1 2 -1 0] [ 0 -1 2 -1] [ 0 0 -1 2] sage: cartan_matrix(['B', 6]) [ 2 -1 0 0 0 0] [-1 2 -1 0 0 0] [ 0 -1 2 -1 0 0] [ 0 0 -1 2 -1 0] [ 0 0 0 -1 2 -1] [ 0 0 0 0 -2 2] sage: cartan_matrix(['C', 4]) [ 2 -1 0 0] [-1 2 -1 0] [ 0 -1 2 -2] [ 0 0 -1 2] sage: cartan_matrix(['D', 6]) [ 2 -1 0 0 0 0] [-1 2 -1 0 0 0] [ 0 -1 2 -1 0 0] [ 0 0 -1 2 -1 -1] [ 0 0 0 -1 2 0] [ 0 0 0 -1 0 2] sage: cartan_matrix(['E',6]) [ 2 0 -1 0 0 0] [ 0 2 0 -1 0 0] [-1 0 2 -1 0 0] [ 0 -1 -1 2 -1 0] [ 0 0 0 -1 2 -1] [ 0 0 0 0 -1 2] sage: cartan_matrix(['E',7]) [ 2 0 -1 0 0 0 0] [ 0 2 0 -1 0 0 0] [-1 0 2 -1 0 0 0] [ 0 -1 -1 2 -1 0 0] [ 0 0 0 -1 2 -1 0] [ 0 0 0 0 -1 2 -1] [ 0 0 0 0 0 -1 2] sage: cartan_matrix(['E', 8]) [ 2 0 -1 0 0 0 0 0] [ 0 2 0 -1 0 0 0 0] [-1 0 2 -1 0 0 0 0] [ 0 -1 -1 2 -1 0 0 0] [ 0 0 0 -1 2 -1 0 0] [ 0 0 0 0 -1 2 -1 0] [ 0 0 0 0 0 -1 2 -1] [ 0 0 0 0 0 0 -1 2] sage: cartan_matrix(['F', 4]) [ 2 -1 0 0] [-1 2 -1 0] [ 0 -2 2 -1] [ 0 0 -1 2] This is different from MuPAD-Combinat, due to different node convention? :: sage: cartan_matrix(['G', 2]) [ 2 -3] [-1 2] sage: cartan_matrix(['A',1,1]) [ 2 -2] [-2 2] sage: cartan_matrix(['A', 3, 1]) [ 2 -1 0 -1] [-1 2 -1 0] [ 0 -1 2 -1] [-1 0 -1 2] sage: cartan_matrix(['B', 3, 1]) [ 2 0 -1 0] [ 0 2 -1 0] [-1 -1 2 -1] [ 0 0 -2 2] sage: cartan_matrix(['C', 3, 1]) [ 2 -1 0 0] [-2 2 -1 0] [ 0 -1 2 -2] [ 0 0 -1 2] sage: cartan_matrix(['D', 4, 1]) [ 2 0 -1 0 0] [ 0 2 -1 0 0] [-1 -1 2 -1 -1] [ 0 0 -1 2 0] [ 0 0 -1 0 2] sage: cartan_matrix(['E', 6, 1]) [ 2 0 -1 0 0 0 0] [ 0 2 0 -1 0 0 0] [-1 0 2 0 -1 0 0] [ 0 -1 0 2 -1 0 0] [ 0 0 -1 -1 2 -1 0] [ 0 0 0 0 -1 2 -1] [ 0 0 0 0 0 -1 2] sage: cartan_matrix(['E', 7, 1]) [ 2 -1 0 0 0 0 0 0] [-1 2 0 -1 0 0 0 0] [ 0 0 2 0 -1 0 0 0] [ 0 -1 0 2 -1 0 0 0] [ 0 0 -1 -1 2 -1 0 0] [ 0 0 0 0 -1 2 -1 0] [ 0 0 0 0 0 -1 2 -1] [ 0 0 0 0 0 0 -1 2] sage: cartan_matrix(['E', 8, 1]) [ 2 0 0 0 0 0 0 0 -1] [ 0 2 0 -1 0 0 0 0 0] [ 0 0 2 0 -1 0 0 0 0] [ 0 -1 0 2 -1 0 0 0 0] [ 0 0 -1 -1 2 -1 0 0 0] [ 0 0 0 0 -1 2 -1 0 0] [ 0 0 0 0 0 -1 2 -1 0] [ 0 0 0 0 0 0 -1 2 -1] [-1 0 0 0 0 0 0 -1 2] sage: cartan_matrix(['F', 4, 1]) [ 2 -1 0 0 0] [-1 2 -1 0 0] [ 0 -1 2 -1 0] [ 0 0 -2 2 -1] [ 0 0 0 -1 2] sage: cartan_matrix(['G', 2, 1]) [ 2 0 -1] [ 0 2 -3] [-1 -1 2] """ t = cartan_type.CartanType(t) dynkin_diagram = t.dynkin_diagram() index_set = t.index_set() MS = MatrixSpace(ZZ, len(index_set), sparse=True) m = MS(0) for i in range(len(index_set)): for j in range(len(index_set)): m[i, j] = dynkin_diagram[index_set[i], index_set[j]] return m
def dynkin_diagram(self): """ Returns the extended Dynkin diagram for affine type D. EXAMPLES:: sage: d = CartanType(['D', 6, 1]).dynkin_diagram() sage: d 0 O O 6 | | | | O---O---O---O---O 1 2 3 4 5 D6~ sage: sorted(d.edges()) [(0, 2, 1), (1, 2, 1), (2, 0, 1), (2, 1, 1), (2, 3, 1), (3, 2, 1), (3, 4, 1), (4, 3, 1), (4, 5, 1), (4, 6, 1), (5, 4, 1), (6, 4, 1)] sage: d = CartanType(['D', 4, 1]).dynkin_diagram() sage: d O 4 | | O---O---O 1 |2 3 | O 0 D4~ sage: sorted(d.edges()) [(0, 2, 1), (1, 2, 1), (2, 0, 1), (2, 1, 1), (2, 3, 1), (2, 4, 1), (3, 2, 1), (4, 2, 1)] sage: d = CartanType(['D', 3, 1]).dynkin_diagram() sage: d 0 O-------+ | | | | O---O---O 3 1 2 D3~ sage: sorted(d.edges()) [(0, 2, 1), (0, 3, 1), (1, 2, 1), (1, 3, 1), (2, 0, 1), (2, 1, 1), (3, 0, 1), (3, 1, 1)] """ from dynkin_diagram import DynkinDiagram_class n = self.n if n == 3: import cartan_type res = cartan_type.CartanType(["A", 3, 1]).relabel({ 0: 0, 1: 3, 2: 1, 3: 2 }).dynkin_diagram() res._cartan_type = self return res g = DynkinDiagram_class(self) for i in range(1, n - 1): g.add_edge(i, i + 1) g.add_edge(n - 2, n) g.add_edge(0, 2) return g
def _latex_dynkin_diagram(self, label=lambda i: i, node=None, node_dist=2, dual=False): r""" Return a latex representation of the Dynkin diagram. EXAMPLES:: sage: print CartanType(['C',4,1])._latex_dynkin_diagram() \draw (0, 0.1 cm) -- +(2 cm,0); \draw (0, -0.1 cm) -- +(2 cm,0); \draw[shift={(1.2, 0)}, rotate=0] (135 : 0.45cm) -- (0,0) -- (-135 : 0.45cm); { \pgftransformxshift{2 cm} \draw (0 cm,0) -- (4 cm,0); \draw (4 cm, 0.1 cm) -- +(2 cm,0); \draw (4 cm, -0.1 cm) -- +(2 cm,0); \draw[shift={(4.8, 0)}, rotate=180] (135 : 0.45cm) -- (0,0) -- (-135 : 0.45cm); \draw[fill=white] (0 cm, 0 cm) circle (.25cm) node[below=4pt]{$1$}; \draw[fill=white] (2 cm, 0 cm) circle (.25cm) node[below=4pt]{$2$}; \draw[fill=white] (4 cm, 0 cm) circle (.25cm) node[below=4pt]{$3$}; \draw[fill=white] (6 cm, 0 cm) circle (.25cm) node[below=4pt]{$4$}; } \draw[fill=white] (0 cm, 0 cm) circle (.25cm) node[below=4pt]{$0$}; sage: print CartanType(['C',4,1]).dual()._latex_dynkin_diagram() \draw (0, 0.1 cm) -- +(2 cm,0); \draw (0, -0.1 cm) -- +(2 cm,0); \draw[shift={(0.8, 0)}, rotate=180] (135 : 0.45cm) -- (0,0) -- (-135 : 0.45cm); { \pgftransformxshift{2 cm} \draw (0 cm,0) -- (4 cm,0); \draw (4 cm, 0.1 cm) -- +(2 cm,0); \draw (4 cm, -0.1 cm) -- +(2 cm,0); \draw[shift={(5.2, 0)}, rotate=0] (135 : 0.45cm) -- (0,0) -- (-135 : 0.45cm); \draw[fill=white] (0 cm, 0 cm) circle (.25cm) node[below=4pt]{$1$}; \draw[fill=white] (2 cm, 0 cm) circle (.25cm) node[below=4pt]{$2$}; \draw[fill=white] (4 cm, 0 cm) circle (.25cm) node[below=4pt]{$3$}; \draw[fill=white] (6 cm, 0 cm) circle (.25cm) node[below=4pt]{$4$}; } \draw[fill=white] (0 cm, 0 cm) circle (.25cm) node[below=4pt]{$0$}; <BLANKLINE> """ if node is None: node = self._latex_draw_node if self.n == 1: import cartan_type return cartan_type.CartanType(["A", 1, 1])._latex_dynkin_diagram( label, node, node_dist) ret = "\\draw (0, 0.1 cm) -- +(%s cm,0);\n" % node_dist ret += "\\draw (0, -0.1 cm) -- +(%s cm,0);\n" % node_dist if dual: ret += self._latex_draw_arrow_tip(0.5 * node_dist - 0.2, 0, 180) else: ret += self._latex_draw_arrow_tip(0.5 * node_dist + 0.2, 0, 0) ret += "{\n\\pgftransformxshift{%s cm}\n" % node_dist ret += self.classical()._latex_dynkin_diagram(label, node, node_dist, dual) ret += "}\n" + node(0, 0, label(0)) return ret