77:copyright: Copyright 2020 by the QuantEcon team, see AUTHORS
88:licences: see LICENSE for details
99"""
10- from sphinx .builders .html import HTMLTranslator
1110from docutils import nodes
1211from docutils .nodes import Node
12+ from sphinx .writers .latex import LaTeXTranslator
13+
14+ CR = "\n "
15+ latex_admonition_start = CR + "\\ begin{sphinxadmonition}{note}"
16+ latex_admonition_end = "\\ end{sphinxadmonition}" + CR
1317
1418
1519class proof_node (nodes .Admonition , nodes .Element ):
@@ -25,35 +29,53 @@ class unenumerable_node(nodes.Admonition, nodes.Element):
2529
2630
2731def visit_enumerable_node (self , node : Node ) -> None :
28- self .body .append (self .starttag (node , "div" , CLASS = "admonition" ))
32+ if isinstance (self , LaTeXTranslator ):
33+ docname = find_parent (self .builder .env , node , "section" )
34+ self .body .append ("\\ label{" + f"{ docname } :{ node .attributes ['label' ]} " + "}" )
35+ self .body .append (latex_admonition_start )
36+ else :
37+ self .body .append (self .starttag (node , "div" , CLASS = "admonition" ))
2938
3039
3140def depart_enumerable_node (self , node : Node ) -> None :
3241 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>" )
42+ if isinstance (self , LaTeXTranslator ):
43+ number = get_node_number (self , node )
44+ idx = list_rindex (self .body , latex_admonition_start ) + 2
45+ self .body .insert (idx , f"{ typ .title ()} { number } " )
46+ self .body .append (latex_admonition_end )
47+ else :
48+ # Find index in list of 'Proof #'
49+ number = get_node_number (self , node )
50+ idx = self .body .index (f"Proof { number } " )
51+ self .body [idx ] = f"{ typ .title ()} { number } "
52+ self .body .append ("</div>" )
3953
4054
4155def visit_unenumerable_node (self , node : Node ) -> None :
42- self .body .append (self .starttag (node , "div" , CLASS = "admonition" ))
56+ if isinstance (self , LaTeXTranslator ):
57+ docname = find_parent (self .builder .env , node , "section" )
58+ self .body .append ("\\ label{" + f"{ docname } :{ node .attributes ['label' ]} " + "}" )
59+ self .body .append (latex_admonition_start )
60+ else :
61+ self .body .append (self .starttag (node , "div" , CLASS = "admonition" ))
4362
4463
4564def depart_unenumerable_node (self , node : Node ) -> None :
4665 typ = node .attributes .get ("type" , "" )
4766 title = node .attributes .get ("title" , "" )
48-
49- if title == "" :
50- idx = len (self .body ) - self .body [- 1 ::- 1 ].index ('<p class="admonition-title">' )
67+ if isinstance (self , LaTeXTranslator ):
68+ idx = list_rindex (self .body , latex_admonition_start ) + 2
69+ self .body .insert (idx , f"{ typ .title ()} " )
70+ self .body .append (latex_admonition_end )
5171 else :
52- idx = self .body .index (title )
53-
54- element = f"<span>{ typ .title ()} </span>"
55- self .body .insert (idx , element )
56- self .body .append ("</div>" )
72+ if title == "" :
73+ idx = list_rindex (self .body , '<p class="admonition-title">' ) + 1
74+ else :
75+ idx = list_rindex (self .body , title )
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 :
@@ -64,8 +86,44 @@ def depart_proof_node(self, node: Node) -> None:
6486 pass
6587
6688
67- def get_node_number (self : HTMLTranslator , node : Node ) -> str :
89+ def get_node_number (self , node : Node ) -> str :
90+ """Get the number for the directive node for HTML."""
6891 key = "proof"
6992 ids = node .attributes .get ("ids" , [])[0 ]
70- number = self .builder .fignumbers .get (key , {}).get (ids , ())
93+ if isinstance (self , LaTeXTranslator ):
94+ docname = find_parent (self .builder .env , node , "section" )
95+ fignumbers = self .builder .env .toc_fignumbers .get (
96+ docname , {}
97+ ) # Latex does not have builder.fignumbers
98+ else :
99+ fignumbers = self .builder .fignumbers
100+ number = fignumbers .get (key , {}).get (ids , ())
71101 return "." .join (map (str , number ))
102+
103+
104+ def find_parent (env , node , parent_tag ):
105+ """Find the nearest parent node with the given tagname."""
106+ while True :
107+ node = node .parent
108+ if node is None :
109+ return None
110+ # parent should be a document in toc
111+ if (
112+ "docname" in node .attributes
113+ and env .titles [node .attributes ["docname" ]].astext ().lower ()
114+ in node .attributes ["names" ]
115+ ):
116+ return node .attributes ["docname" ]
117+
118+ if node .tagname == parent_tag :
119+ return node .attributes ["docname" ]
120+
121+ return None
122+
123+
124+ def list_rindex (li , x ) -> int :
125+ """Getting the last occurence of an item in a list."""
126+ for i in reversed (range (len (li ))):
127+ if li [i ] == x :
128+ return i
129+ raise ValueError ("{} is not in list" .format (x ))
0 commit comments