from docutils import nodes
from sphinx.writers.latex import LaTeXTranslator
from sphinx import addnodes
from sphinx.environment.collectors import EnvironmentCollector
def depart_title(self, node):
if not node['foobar']:
raise ValueError('Why?')
class TitleCollector(EnvironmentCollector):
def get_updated_docs(self, app, env):
def traverse_all(app, env, docname):
doctree = env.get_doctree(docname)
for toc in doctree.traverse(addnodes.toctree):
for _, subdocname in toc['entries']:
traverse_all(app, env, subdocname)
for node in doctree.traverse(nodes.title):
node['foobar'] = 42
traverse_all(app, env, env.config.master_doc)
return []
def clear_doc(self, app, env, docname):
pass
def process_doc(self, app, doctree):
pass
def merge_other(self, app, env, docnames, other):
pass
def setup(app):
app.add_env_collector(TitleCollector)
LaTeXTranslator.depart_title = depart_title
return {
'version': '0.1',
'parallel_read_safe': True,
'parallel_write_safe': True,
}
```