1010from sphinx .builders .html import HTMLTranslator
1111from docutils import nodes
1212from docutils .nodes import Node
13+ from sphinx .writers .latex import LaTeXTranslator
1314
15+ CR = '\n '
1416
1517class proof_node (nodes .Admonition , nodes .Element ):
1618 pass
@@ -25,35 +27,55 @@ class unenumerable_node(nodes.Admonition, nodes.Element):
2527
2628
2729def visit_enumerable_node (self , node : Node ) -> None :
28- self .body .append (self .starttag (node , "div" , CLASS = "admonition" ))
30+ if isinstance (self , LaTeXTranslator ):
31+ self .body .append (CR + '\\ begin{sphinxadmonition}{note}' )
32+ else :
33+ self .body .append (self .starttag (node , "div" , CLASS = "admonition" ))
2934
3035
3136def depart_enumerable_node (self , node : Node ) -> None :
3237 typ = node .attributes .get ("type" , "" )
33-
34- # Find index in list of 'Proof #'
35- number = get_node_number (self , node )
36- idx = self .body .index (f"Proof { number } " )
37- self .body [idx ] = f"{ typ .title ()} { number } "
38- self .body .append ("</div>" )
38+ if isinstance (self , LaTeXTranslator ):
39+ number = get_node_number_latex (self , node )
40+ text = node .children [0 ].astext ()
41+ idx = list_rindex (self .body ,CR + '\\ begin{sphinxadmonition}{note}' ) + 2
42+ self .body .insert (idx , f"{ typ .title ()} { number } " )
43+ self .body .append ('\\ end{sphinxadmonition}' + CR )
44+ else :
45+ # Find index in list of 'Proof #'
46+ number = get_node_number (self , node )
47+ idx = self .body .index (f"Proof { number } " )
48+ self .body [idx ] = f"{ typ .title ()} { number } "
49+ self .body .append ("</div>" )
3950
4051
4152def visit_unenumerable_node (self , node : Node ) -> None :
42- self .body .append (self .starttag (node , "div" , CLASS = "admonition" ))
53+ if isinstance (self , LaTeXTranslator ):
54+ self .body .append (CR + '\\ begin{sphinxadmonition}{note}' )
55+ else :
56+ self .body .append (self .starttag (node , "div" , CLASS = "admonition" ))
4357
4458
4559def depart_unenumerable_node (self , node : Node ) -> None :
4660 typ = node .attributes .get ("type" , "" )
4761 title = node .attributes .get ("title" , "" )
48-
49- if title == "" :
50- idx = len (self .body ) - self .body [- 1 ::- 1 ].index ('<p class="admonition-title">' )
62+ if isinstance (self , LaTeXTranslator ):
63+ if title == "" :
64+ idx = (len (self .body ) - self .body [- 1 ::- 1 ].index (CR + '\\ begin{sphinxadmonition}{note}' )) + 1
65+ else :
66+ text = node .children [0 ].astext ()
67+ idx = list_rindex (self .body ,CR + '\\ begin{sphinxadmonition}{note}' ) + 2
68+ self .body .insert (idx , f"{ typ .title ()} " )
69+ self .body .append ('\\ end{sphinxadmonition}' + CR )
5170 else :
52- idx = self .body .index (title )
71+ if title == "" :
72+ idx = len (self .body ) - self .body [- 1 ::- 1 ].index ('<p class="admonition-title">' )
73+ else :
74+ idx = list_rindex (self .body ,title )
5375
54- element = f"<span>{ typ .title ()} </span>"
55- self .body .insert (idx , element )
56- self .body .append ("</div>" )
76+ element = f"<span>{ typ .title ()} </span>"
77+ self .body .insert (idx , element )
78+ self .body .append ("</div>" )
5779
5880
5981def visit_proof_node (self , node : Node ) -> None :
@@ -69,3 +91,36 @@ def get_node_number(self: HTMLTranslator, node: Node) -> str:
6991 ids = node .attributes .get ("ids" , [])[0 ]
7092 number = self .builder .fignumbers .get (key , {}).get (ids , ())
7193 return "." .join (map (str , number ))
94+
95+ def find_parent (env , node , parent_tag ):
96+ """Find the parent node."""
97+ while True :
98+ node = node .parent
99+ if node is None :
100+ return None
101+ # parent should be a document in toc
102+ if (
103+ "docname" in node .attributes
104+ and env .titles [node .attributes ["docname" ]].astext ().lower ()
105+ in node .attributes ["names" ]
106+ ):
107+ return node .attributes ['docname' ]
108+
109+ if node .tagname == parent_tag :
110+ return node .attributes ['docname' ]
111+
112+ return None
113+
114+ def get_node_number_latex (self , node : Node ) -> str :
115+ key = "proof"
116+ docname = find_parent (self .builder .env , node , "section" )
117+ ids = node .attributes .get ("ids" , [])[0 ]
118+ fignumbers = self .builder .env .toc_fignumbers .get (docname , {})
119+ number = fignumbers .get (key , {}).get (ids , ())
120+ return "." .join (map (str , number ))
121+
122+ def list_rindex (li , x ):
123+ for i in reversed (range (len (li ))):
124+ if li [i ] == x :
125+ return i
126+ raise ValueError ("{} is not in list" .format (x ))
0 commit comments