Sphinx 8.0.2__py3-none-any.whl → 8.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of Sphinx might be problematic. Click here for more details.

Files changed (424) hide show
  1. sphinx/__init__.py +6 -3
  2. sphinx/_cli/__init__.py +40 -20
  3. sphinx/_cli/util/colour.py +5 -4
  4. sphinx/_cli/util/errors.py +28 -11
  5. sphinx/application.py +361 -38
  6. sphinx/builders/__init__.py +229 -83
  7. sphinx/builders/_epub_base.py +118 -71
  8. sphinx/builders/changes.py +39 -21
  9. sphinx/builders/dirhtml.py +4 -4
  10. sphinx/builders/dummy.py +2 -5
  11. sphinx/builders/epub3.py +43 -22
  12. sphinx/builders/gettext.py +43 -25
  13. sphinx/builders/html/__init__.py +284 -218
  14. sphinx/builders/html/_assets.py +62 -26
  15. sphinx/builders/html/_build_info.py +76 -0
  16. sphinx/builders/html/transforms.py +11 -9
  17. sphinx/builders/latex/__init__.py +139 -81
  18. sphinx/builders/latex/constants.py +7 -7
  19. sphinx/builders/latex/nodes.py +3 -2
  20. sphinx/builders/latex/theming.py +7 -5
  21. sphinx/builders/latex/transforms.py +27 -19
  22. sphinx/builders/linkcheck.py +146 -72
  23. sphinx/builders/manpage.py +30 -13
  24. sphinx/builders/singlehtml.py +22 -14
  25. sphinx/builders/texinfo.py +67 -37
  26. sphinx/builders/text.py +5 -5
  27. sphinx/builders/xml.py +6 -9
  28. sphinx/cmd/build.py +282 -103
  29. sphinx/cmd/make_mode.py +106 -63
  30. sphinx/cmd/quickstart.py +341 -145
  31. sphinx/config.py +45 -12
  32. sphinx/deprecation.py +8 -2
  33. sphinx/directives/__init__.py +28 -19
  34. sphinx/directives/code.py +86 -56
  35. sphinx/directives/other.py +50 -36
  36. sphinx/directives/patches.py +29 -19
  37. sphinx/domains/__init__.py +20 -120
  38. sphinx/domains/_domains_container.py +281 -0
  39. sphinx/domains/_index.py +110 -0
  40. sphinx/domains/c/__init__.py +3 -3
  41. sphinx/domains/c/_parser.py +10 -6
  42. sphinx/domains/changeset.py +5 -3
  43. sphinx/domains/citation.py +5 -3
  44. sphinx/domains/cpp/__init__.py +9 -11
  45. sphinx/domains/cpp/_parser.py +8 -7
  46. sphinx/domains/index.py +3 -3
  47. sphinx/domains/javascript.py +12 -7
  48. sphinx/domains/math.py +2 -2
  49. sphinx/domains/python/__init__.py +10 -5
  50. sphinx/domains/python/_object.py +1 -1
  51. sphinx/domains/rst.py +5 -5
  52. sphinx/domains/std/__init__.py +16 -11
  53. sphinx/environment/__init__.py +206 -146
  54. sphinx/environment/adapters/asset.py +3 -2
  55. sphinx/environment/adapters/indexentries.py +74 -33
  56. sphinx/environment/adapters/toctree.py +100 -43
  57. sphinx/environment/collectors/__init__.py +19 -8
  58. sphinx/environment/collectors/asset.py +47 -15
  59. sphinx/environment/collectors/dependencies.py +8 -4
  60. sphinx/environment/collectors/metadata.py +7 -2
  61. sphinx/environment/collectors/title.py +7 -2
  62. sphinx/environment/collectors/toctree.py +54 -22
  63. sphinx/errors.py +4 -1
  64. sphinx/events.py +314 -7
  65. sphinx/ext/apidoc.py +42 -18
  66. sphinx/ext/autodoc/__init__.py +52 -24
  67. sphinx/ext/autodoc/importer.py +6 -9
  68. sphinx/ext/autosectionlabel.py +1 -2
  69. sphinx/ext/autosummary/__init__.py +3 -1
  70. sphinx/ext/autosummary/generate.py +28 -14
  71. sphinx/ext/coverage.py +7 -7
  72. sphinx/ext/doctest.py +4 -8
  73. sphinx/ext/duration.py +6 -5
  74. sphinx/ext/inheritance_diagram.py +1 -1
  75. sphinx/ext/intersphinx/_cli.py +6 -4
  76. sphinx/ext/intersphinx/_load.py +77 -32
  77. sphinx/ext/intersphinx/_resolve.py +173 -79
  78. sphinx/ext/intersphinx/_shared.py +7 -5
  79. sphinx/ext/linkcode.py +7 -1
  80. sphinx/ext/mathjax.py +1 -2
  81. sphinx/ext/napoleon/__init__.py +37 -24
  82. sphinx/ext/napoleon/docstring.py +202 -134
  83. sphinx/ext/todo.py +5 -3
  84. sphinx/highlighting.py +9 -2
  85. sphinx/io.py +1 -1
  86. sphinx/jinja2glue.py +27 -6
  87. sphinx/locale/__init__.py +6 -2
  88. sphinx/locale/ar/LC_MESSAGES/sphinx.js +8 -1
  89. sphinx/locale/ar/LC_MESSAGES/sphinx.mo +0 -0
  90. sphinx/locale/ar/LC_MESSAGES/sphinx.po +2246 -2288
  91. sphinx/locale/bg/LC_MESSAGES/sphinx.js +4 -1
  92. sphinx/locale/bg/LC_MESSAGES/sphinx.mo +0 -0
  93. sphinx/locale/bg/LC_MESSAGES/sphinx.po +2113 -2159
  94. sphinx/locale/bn/LC_MESSAGES/sphinx.js +4 -1
  95. sphinx/locale/bn/LC_MESSAGES/sphinx.mo +0 -0
  96. sphinx/locale/bn/LC_MESSAGES/sphinx.po +2349 -2395
  97. sphinx/locale/ca/LC_MESSAGES/sphinx.js +4 -1
  98. sphinx/locale/ca/LC_MESSAGES/sphinx.mo +0 -0
  99. sphinx/locale/ca/LC_MESSAGES/sphinx.po +2846 -2892
  100. sphinx/locale/cak/LC_MESSAGES/sphinx.js +4 -1
  101. sphinx/locale/cak/LC_MESSAGES/sphinx.mo +0 -0
  102. sphinx/locale/cak/LC_MESSAGES/sphinx.po +2213 -2259
  103. sphinx/locale/cs/LC_MESSAGES/sphinx.js +6 -1
  104. sphinx/locale/cs/LC_MESSAGES/sphinx.mo +0 -0
  105. sphinx/locale/cs/LC_MESSAGES/sphinx.po +2225 -2269
  106. sphinx/locale/cy/LC_MESSAGES/sphinx.js +6 -1
  107. sphinx/locale/cy/LC_MESSAGES/sphinx.mo +0 -0
  108. sphinx/locale/cy/LC_MESSAGES/sphinx.po +2403 -2447
  109. sphinx/locale/da/LC_MESSAGES/sphinx.js +4 -1
  110. sphinx/locale/da/LC_MESSAGES/sphinx.mo +0 -0
  111. sphinx/locale/da/LC_MESSAGES/sphinx.po +2214 -2260
  112. sphinx/locale/de/LC_MESSAGES/sphinx.js +4 -1
  113. sphinx/locale/de/LC_MESSAGES/sphinx.mo +0 -0
  114. sphinx/locale/de/LC_MESSAGES/sphinx.po +2230 -2276
  115. sphinx/locale/de_DE/LC_MESSAGES/sphinx.js +4 -1
  116. sphinx/locale/de_DE/LC_MESSAGES/sphinx.mo +0 -0
  117. sphinx/locale/de_DE/LC_MESSAGES/sphinx.po +2113 -2159
  118. sphinx/locale/el/LC_MESSAGES/sphinx.js +4 -1
  119. sphinx/locale/el/LC_MESSAGES/sphinx.mo +0 -0
  120. sphinx/locale/el/LC_MESSAGES/sphinx.po +2619 -2665
  121. sphinx/locale/en_DE/LC_MESSAGES/sphinx.js +4 -1
  122. sphinx/locale/en_DE/LC_MESSAGES/sphinx.mo +0 -0
  123. sphinx/locale/en_DE/LC_MESSAGES/sphinx.po +2113 -2159
  124. sphinx/locale/en_FR/LC_MESSAGES/sphinx.js +4 -1
  125. sphinx/locale/en_FR/LC_MESSAGES/sphinx.mo +0 -0
  126. sphinx/locale/en_FR/LC_MESSAGES/sphinx.po +2113 -2159
  127. sphinx/locale/en_GB/LC_MESSAGES/sphinx.js +4 -1
  128. sphinx/locale/en_GB/LC_MESSAGES/sphinx.mo +0 -0
  129. sphinx/locale/en_GB/LC_MESSAGES/sphinx.po +2519 -2565
  130. sphinx/locale/en_HK/LC_MESSAGES/sphinx.js +4 -1
  131. sphinx/locale/en_HK/LC_MESSAGES/sphinx.mo +0 -0
  132. sphinx/locale/en_HK/LC_MESSAGES/sphinx.po +2113 -2159
  133. sphinx/locale/eo/LC_MESSAGES/sphinx.js +4 -1
  134. sphinx/locale/eo/LC_MESSAGES/sphinx.mo +0 -0
  135. sphinx/locale/eo/LC_MESSAGES/sphinx.po +2232 -2278
  136. sphinx/locale/es/LC_MESSAGES/sphinx.js +5 -1
  137. sphinx/locale/es/LC_MESSAGES/sphinx.mo +0 -0
  138. sphinx/locale/es/LC_MESSAGES/sphinx.po +2516 -2561
  139. sphinx/locale/es_CO/LC_MESSAGES/sphinx.js +5 -1
  140. sphinx/locale/es_CO/LC_MESSAGES/sphinx.mo +0 -0
  141. sphinx/locale/es_CO/LC_MESSAGES/sphinx.po +2114 -2159
  142. sphinx/locale/et/LC_MESSAGES/sphinx.js +4 -1
  143. sphinx/locale/et/LC_MESSAGES/sphinx.mo +0 -0
  144. sphinx/locale/et/LC_MESSAGES/sphinx.po +2317 -2363
  145. sphinx/locale/eu/LC_MESSAGES/sphinx.js +4 -1
  146. sphinx/locale/eu/LC_MESSAGES/sphinx.mo +0 -0
  147. sphinx/locale/eu/LC_MESSAGES/sphinx.po +2218 -2264
  148. sphinx/locale/fa/LC_MESSAGES/sphinx.js +4 -1
  149. sphinx/locale/fa/LC_MESSAGES/sphinx.mo +0 -0
  150. sphinx/locale/fa/LC_MESSAGES/sphinx.po +2505 -2551
  151. sphinx/locale/fi/LC_MESSAGES/sphinx.js +4 -1
  152. sphinx/locale/fi/LC_MESSAGES/sphinx.mo +0 -0
  153. sphinx/locale/fi/LC_MESSAGES/sphinx.po +2303 -2349
  154. sphinx/locale/fr/LC_MESSAGES/sphinx.js +6 -2
  155. sphinx/locale/fr/LC_MESSAGES/sphinx.mo +0 -0
  156. sphinx/locale/fr/LC_MESSAGES/sphinx.po +2863 -2908
  157. sphinx/locale/fr_FR/LC_MESSAGES/sphinx.js +5 -1
  158. sphinx/locale/fr_FR/LC_MESSAGES/sphinx.mo +0 -0
  159. sphinx/locale/fr_FR/LC_MESSAGES/sphinx.po +2114 -2159
  160. sphinx/locale/gl/LC_MESSAGES/sphinx.js +4 -1
  161. sphinx/locale/gl/LC_MESSAGES/sphinx.mo +0 -0
  162. sphinx/locale/gl/LC_MESSAGES/sphinx.po +2571 -2617
  163. sphinx/locale/he/LC_MESSAGES/sphinx.js +5 -1
  164. sphinx/locale/he/LC_MESSAGES/sphinx.mo +0 -0
  165. sphinx/locale/he/LC_MESSAGES/sphinx.po +2307 -2352
  166. sphinx/locale/hi/LC_MESSAGES/sphinx.js +4 -1
  167. sphinx/locale/hi/LC_MESSAGES/sphinx.mo +0 -0
  168. sphinx/locale/hi/LC_MESSAGES/sphinx.po +2580 -2626
  169. sphinx/locale/hi_IN/LC_MESSAGES/sphinx.js +4 -1
  170. sphinx/locale/hi_IN/LC_MESSAGES/sphinx.mo +0 -0
  171. sphinx/locale/hi_IN/LC_MESSAGES/sphinx.po +2113 -2159
  172. sphinx/locale/hr/LC_MESSAGES/sphinx.js +5 -1
  173. sphinx/locale/hr/LC_MESSAGES/sphinx.mo +0 -0
  174. sphinx/locale/hr/LC_MESSAGES/sphinx.po +2238 -2283
  175. sphinx/locale/hu/LC_MESSAGES/sphinx.js +4 -1
  176. sphinx/locale/hu/LC_MESSAGES/sphinx.mo +0 -0
  177. sphinx/locale/hu/LC_MESSAGES/sphinx.po +2228 -2274
  178. sphinx/locale/id/LC_MESSAGES/sphinx.js +3 -1
  179. sphinx/locale/id/LC_MESSAGES/sphinx.mo +0 -0
  180. sphinx/locale/id/LC_MESSAGES/sphinx.po +2787 -2834
  181. sphinx/locale/is/LC_MESSAGES/sphinx.js +4 -1
  182. sphinx/locale/is/LC_MESSAGES/sphinx.mo +0 -0
  183. sphinx/locale/is/LC_MESSAGES/sphinx.po +2224 -2270
  184. sphinx/locale/it/LC_MESSAGES/sphinx.js +5 -1
  185. sphinx/locale/it/LC_MESSAGES/sphinx.mo +0 -0
  186. sphinx/locale/it/LC_MESSAGES/sphinx.po +2231 -2276
  187. sphinx/locale/ja/LC_MESSAGES/sphinx.js +3 -1
  188. sphinx/locale/ja/LC_MESSAGES/sphinx.mo +0 -0
  189. sphinx/locale/ja/LC_MESSAGES/sphinx.po +2507 -2554
  190. sphinx/locale/ka/LC_MESSAGES/sphinx.js +4 -1
  191. sphinx/locale/ka/LC_MESSAGES/sphinx.mo +0 -0
  192. sphinx/locale/ka/LC_MESSAGES/sphinx.po +2428 -2474
  193. sphinx/locale/ko/LC_MESSAGES/sphinx.js +3 -1
  194. sphinx/locale/ko/LC_MESSAGES/sphinx.mo +0 -0
  195. sphinx/locale/ko/LC_MESSAGES/sphinx.po +2516 -2563
  196. sphinx/locale/lt/LC_MESSAGES/sphinx.js +6 -1
  197. sphinx/locale/lt/LC_MESSAGES/sphinx.mo +0 -0
  198. sphinx/locale/lt/LC_MESSAGES/sphinx.po +2425 -2469
  199. sphinx/locale/lv/LC_MESSAGES/sphinx.js +5 -1
  200. sphinx/locale/lv/LC_MESSAGES/sphinx.mo +0 -0
  201. sphinx/locale/lv/LC_MESSAGES/sphinx.po +2362 -2407
  202. sphinx/locale/mk/LC_MESSAGES/sphinx.js +4 -1
  203. sphinx/locale/mk/LC_MESSAGES/sphinx.mo +0 -0
  204. sphinx/locale/mk/LC_MESSAGES/sphinx.po +2121 -2167
  205. sphinx/locale/nb_NO/LC_MESSAGES/sphinx.js +4 -1
  206. sphinx/locale/nb_NO/LC_MESSAGES/sphinx.mo +0 -0
  207. sphinx/locale/nb_NO/LC_MESSAGES/sphinx.po +2220 -2266
  208. sphinx/locale/ne/LC_MESSAGES/sphinx.js +4 -1
  209. sphinx/locale/ne/LC_MESSAGES/sphinx.mo +0 -0
  210. sphinx/locale/ne/LC_MESSAGES/sphinx.po +2221 -2267
  211. sphinx/locale/nl/LC_MESSAGES/sphinx.js +4 -1
  212. sphinx/locale/nl/LC_MESSAGES/sphinx.mo +0 -0
  213. sphinx/locale/nl/LC_MESSAGES/sphinx.po +2240 -2286
  214. sphinx/locale/pl/LC_MESSAGES/sphinx.js +6 -1
  215. sphinx/locale/pl/LC_MESSAGES/sphinx.mo +0 -0
  216. sphinx/locale/pl/LC_MESSAGES/sphinx.po +2319 -2363
  217. sphinx/locale/pt/LC_MESSAGES/sphinx.js +5 -1
  218. sphinx/locale/pt/LC_MESSAGES/sphinx.mo +0 -0
  219. sphinx/locale/pt/LC_MESSAGES/sphinx.po +2114 -2159
  220. sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js +5 -1
  221. sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo +0 -0
  222. sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po +2854 -2899
  223. sphinx/locale/pt_PT/LC_MESSAGES/sphinx.js +5 -1
  224. sphinx/locale/pt_PT/LC_MESSAGES/sphinx.mo +0 -0
  225. sphinx/locale/pt_PT/LC_MESSAGES/sphinx.po +2224 -2269
  226. sphinx/locale/ro/LC_MESSAGES/sphinx.js +5 -1
  227. sphinx/locale/ro/LC_MESSAGES/sphinx.mo +0 -0
  228. sphinx/locale/ro/LC_MESSAGES/sphinx.po +2226 -2271
  229. sphinx/locale/ru/LC_MESSAGES/sphinx.js +8 -3
  230. sphinx/locale/ru/LC_MESSAGES/sphinx.mo +0 -0
  231. sphinx/locale/ru/LC_MESSAGES/sphinx.po +2841 -2885
  232. sphinx/locale/si/LC_MESSAGES/sphinx.js +4 -1
  233. sphinx/locale/si/LC_MESSAGES/sphinx.mo +0 -0
  234. sphinx/locale/si/LC_MESSAGES/sphinx.po +2294 -2340
  235. sphinx/locale/sk/LC_MESSAGES/sphinx.js +6 -1
  236. sphinx/locale/sk/LC_MESSAGES/sphinx.mo +0 -0
  237. sphinx/locale/sk/LC_MESSAGES/sphinx.po +2497 -2541
  238. sphinx/locale/sl/LC_MESSAGES/sphinx.js +6 -1
  239. sphinx/locale/sl/LC_MESSAGES/sphinx.mo +0 -0
  240. sphinx/locale/sl/LC_MESSAGES/sphinx.po +2331 -2375
  241. sphinx/locale/sphinx.pot +2121 -2167
  242. sphinx/locale/sq/LC_MESSAGES/sphinx.js +4 -1
  243. sphinx/locale/sq/LC_MESSAGES/sphinx.mo +0 -0
  244. sphinx/locale/sq/LC_MESSAGES/sphinx.po +2855 -2901
  245. sphinx/locale/sr/LC_MESSAGES/sphinx.js +5 -1
  246. sphinx/locale/sr/LC_MESSAGES/sphinx.mo +0 -0
  247. sphinx/locale/sr/LC_MESSAGES/sphinx.po +2203 -2248
  248. sphinx/locale/sr@latin/LC_MESSAGES/sphinx.mo +0 -0
  249. sphinx/locale/sr_RS/LC_MESSAGES/sphinx.mo +0 -0
  250. sphinx/locale/sv/LC_MESSAGES/sphinx.js +4 -1
  251. sphinx/locale/sv/LC_MESSAGES/sphinx.mo +0 -0
  252. sphinx/locale/sv/LC_MESSAGES/sphinx.po +2423 -2469
  253. sphinx/locale/te/LC_MESSAGES/sphinx.js +4 -1
  254. sphinx/locale/te/LC_MESSAGES/sphinx.mo +0 -0
  255. sphinx/locale/te/LC_MESSAGES/sphinx.po +2113 -2159
  256. sphinx/locale/tr/LC_MESSAGES/sphinx.js +4 -1
  257. sphinx/locale/tr/LC_MESSAGES/sphinx.mo +0 -0
  258. sphinx/locale/tr/LC_MESSAGES/sphinx.po +2443 -2489
  259. sphinx/locale/uk_UA/LC_MESSAGES/sphinx.js +6 -1
  260. sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo +0 -0
  261. sphinx/locale/uk_UA/LC_MESSAGES/sphinx.po +2329 -2373
  262. sphinx/locale/ur/LC_MESSAGES/sphinx.js +4 -1
  263. sphinx/locale/ur/LC_MESSAGES/sphinx.mo +0 -0
  264. sphinx/locale/ur/LC_MESSAGES/sphinx.po +2113 -2159
  265. sphinx/locale/vi/LC_MESSAGES/sphinx.js +3 -1
  266. sphinx/locale/vi/LC_MESSAGES/sphinx.mo +0 -0
  267. sphinx/locale/vi/LC_MESSAGES/sphinx.po +2199 -2246
  268. sphinx/locale/yue/LC_MESSAGES/sphinx.js +3 -1
  269. sphinx/locale/yue/LC_MESSAGES/sphinx.mo +0 -0
  270. sphinx/locale/yue/LC_MESSAGES/sphinx.po +2112 -2159
  271. sphinx/locale/zh_HK/LC_MESSAGES/sphinx.js +3 -1
  272. sphinx/locale/zh_HK/LC_MESSAGES/sphinx.mo +0 -0
  273. sphinx/locale/zh_HK/LC_MESSAGES/sphinx.po +2112 -2159
  274. sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js +3 -1
  275. sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo +0 -0
  276. sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po +2845 -2892
  277. sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.js +3 -1
  278. sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.mo +0 -0
  279. sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.po +2112 -2159
  280. sphinx/parsers.py +3 -1
  281. sphinx/project.py +6 -2
  282. sphinx/pycode/__init__.py +11 -4
  283. sphinx/pycode/ast.py +58 -58
  284. sphinx/pycode/parser.py +49 -28
  285. sphinx/pygments_styles.py +49 -49
  286. sphinx/registry.py +8 -3
  287. sphinx/roles.py +133 -13
  288. sphinx/search/__init__.py +146 -87
  289. sphinx/search/da.py +2 -4
  290. sphinx/search/de.py +2 -4
  291. sphinx/search/en.py +4 -4
  292. sphinx/search/es.py +2 -4
  293. sphinx/search/fi.py +2 -4
  294. sphinx/search/fr.py +2 -4
  295. sphinx/search/hu.py +2 -4
  296. sphinx/search/it.py +2 -4
  297. sphinx/search/ja.py +55 -32
  298. sphinx/search/nl.py +2 -4
  299. sphinx/search/no.py +2 -4
  300. sphinx/search/pt.py +2 -4
  301. sphinx/search/ro.py +0 -2
  302. sphinx/search/ru.py +2 -4
  303. sphinx/search/sv.py +2 -4
  304. sphinx/search/tr.py +0 -2
  305. sphinx/search/zh.py +18 -13
  306. sphinx/templates/graphviz/graphviz.css +0 -7
  307. sphinx/testing/fixtures.py +6 -5
  308. sphinx/testing/path.py +7 -5
  309. sphinx/testing/util.py +63 -29
  310. sphinx/texinputs/sphinx.sty +107 -39
  311. sphinx/texinputs/sphinxlatexadmonitions.sty +51 -35
  312. sphinx/texinputs/sphinxlatexcontainers.sty +1 -1
  313. sphinx/texinputs/sphinxlatexgraphics.sty +3 -2
  314. sphinx/texinputs/sphinxlatexindbibtoc.sty +1 -1
  315. sphinx/texinputs/sphinxlatexlists.sty +1 -1
  316. sphinx/texinputs/sphinxlatexliterals.sty +4 -1
  317. sphinx/texinputs/sphinxlatexnumfig.sty +22 -9
  318. sphinx/texinputs/sphinxlatexobjects.sty +1 -1
  319. sphinx/texinputs/sphinxlatexshadowbox.sty +72 -10
  320. sphinx/texinputs/sphinxlatexstyleheadings.sty +7 -2
  321. sphinx/texinputs/sphinxlatexstylepage.sty +2 -8
  322. sphinx/texinputs/sphinxlatexstyletext.sty +2 -4
  323. sphinx/texinputs/sphinxlatextables.sty +1 -1
  324. sphinx/texinputs/sphinxoptionsgeometry.sty +1 -1
  325. sphinx/texinputs/sphinxoptionshyperref.sty +1 -1
  326. sphinx/themes/agogo/layout.html +1 -10
  327. sphinx/themes/agogo/static/agogo.css.jinja +0 -7
  328. sphinx/themes/basic/defindex.html +1 -8
  329. sphinx/themes/basic/domainindex.html +1 -9
  330. sphinx/themes/basic/genindex-single.html +1 -9
  331. sphinx/themes/basic/genindex-split.html +1 -9
  332. sphinx/themes/basic/genindex.html +1 -9
  333. sphinx/themes/basic/globaltoc.html +1 -9
  334. sphinx/themes/basic/layout.html +1 -9
  335. sphinx/themes/basic/localtoc.html +1 -9
  336. sphinx/themes/basic/page.html +1 -9
  337. sphinx/themes/basic/relations.html +1 -9
  338. sphinx/themes/basic/search.html +1 -9
  339. sphinx/themes/basic/searchbox.html +1 -9
  340. sphinx/themes/basic/searchfield.html +4 -10
  341. sphinx/themes/basic/sourcelink.html +1 -9
  342. sphinx/themes/basic/static/basic.css.jinja +2 -13
  343. sphinx/themes/basic/static/doctools.js +0 -7
  344. sphinx/themes/basic/static/language_data.js.jinja +0 -7
  345. sphinx/themes/basic/static/searchtools.js +25 -13
  346. sphinx/themes/bizstyle/layout.html +1 -9
  347. sphinx/themes/bizstyle/static/bizstyle.css.jinja +0 -7
  348. sphinx/themes/bizstyle/static/bizstyle.js.jinja +5 -11
  349. sphinx/themes/classic/layout.html +1 -9
  350. sphinx/themes/classic/static/classic.css.jinja +0 -7
  351. sphinx/themes/classic/static/sidebar.js.jinja +0 -6
  352. sphinx/themes/epub/epub-cover.html +1 -9
  353. sphinx/themes/epub/layout.html +1 -9
  354. sphinx/themes/epub/static/epub.css.jinja +0 -7
  355. sphinx/themes/haiku/layout.html +1 -9
  356. sphinx/themes/haiku/static/haiku.css.jinja +0 -6
  357. sphinx/themes/nature/static/nature.css.jinja +0 -7
  358. sphinx/themes/nonav/layout.html +1 -9
  359. sphinx/themes/nonav/static/nonav.css.jinja +0 -7
  360. sphinx/themes/pyramid/static/epub.css.jinja +0 -7
  361. sphinx/themes/pyramid/static/pyramid.css.jinja +0 -7
  362. sphinx/themes/scrolls/layout.html +1 -10
  363. sphinx/themes/scrolls/static/scrolls.css.jinja +0 -7
  364. sphinx/themes/sphinxdoc/static/sphinxdoc.css.jinja +2 -7
  365. sphinx/themes/traditional/static/traditional.css.jinja +0 -7
  366. sphinx/theming.py +18 -6
  367. sphinx/transforms/__init__.py +56 -35
  368. sphinx/transforms/compact_bullet_list.py +3 -2
  369. sphinx/transforms/i18n.py +132 -50
  370. sphinx/transforms/post_transforms/__init__.py +94 -43
  371. sphinx/transforms/post_transforms/code.py +7 -6
  372. sphinx/transforms/post_transforms/images.py +71 -54
  373. sphinx/transforms/references.py +1 -2
  374. sphinx/util/__init__.py +23 -194
  375. sphinx/util/_files.py +80 -0
  376. sphinx/util/_importer.py +27 -0
  377. sphinx/util/_io.py +1 -2
  378. sphinx/util/_lines.py +26 -0
  379. sphinx/util/_pathlib.py +5 -2
  380. sphinx/util/_serialise.py +53 -0
  381. sphinx/util/_timestamps.py +2 -1
  382. sphinx/util/_uri.py +16 -0
  383. sphinx/util/cfamily.py +48 -25
  384. sphinx/util/console.py +1 -0
  385. sphinx/util/display.py +1 -1
  386. sphinx/util/docfields.py +125 -45
  387. sphinx/util/docstrings.py +1 -1
  388. sphinx/util/docutils.py +118 -44
  389. sphinx/util/exceptions.py +11 -5
  390. sphinx/util/fileutil.py +53 -32
  391. sphinx/util/http_date.py +9 -7
  392. sphinx/util/i18n.py +49 -16
  393. sphinx/util/images.py +7 -6
  394. sphinx/util/inspect.py +29 -12
  395. sphinx/util/inventory.py +47 -29
  396. sphinx/util/logging.py +58 -85
  397. sphinx/util/matching.py +3 -3
  398. sphinx/util/math.py +1 -1
  399. sphinx/util/nodes.py +176 -108
  400. sphinx/util/osutil.py +13 -10
  401. sphinx/util/parallel.py +5 -4
  402. sphinx/util/parsing.py +5 -3
  403. sphinx/util/png.py +3 -3
  404. sphinx/util/requests.py +8 -4
  405. sphinx/util/rst.py +5 -3
  406. sphinx/util/tags.py +5 -2
  407. sphinx/util/template.py +26 -11
  408. sphinx/util/texescape.py +2 -2
  409. sphinx/util/typing.py +89 -38
  410. sphinx/versioning.py +3 -1
  411. sphinx/writers/html.py +22 -7
  412. sphinx/writers/html5.py +113 -64
  413. sphinx/writers/latex.py +408 -221
  414. sphinx/writers/manpage.py +25 -15
  415. sphinx/writers/texinfo.py +94 -82
  416. sphinx/writers/text.py +87 -53
  417. sphinx/writers/xml.py +5 -4
  418. sphinx-8.1.0.dist-info/LICENSE.rst +31 -0
  419. {sphinx-8.0.2.dist-info → sphinx-8.1.0.dist-info}/METADATA +13 -11
  420. sphinx-8.1.0.dist-info/RECORD +598 -0
  421. sphinx-8.0.2.dist-info/LICENSE.rst +0 -67
  422. sphinx-8.0.2.dist-info/RECORD +0 -590
  423. {sphinx-8.0.2.dist-info → sphinx-8.1.0.dist-info}/WHEEL +0 -0
  424. {sphinx-8.0.2.dist-info → sphinx-8.1.0.dist-info}/entry_points.txt +0 -0
@@ -12,7 +12,11 @@ from docutils.frontend import OptionParser
12
12
  import sphinx.builders.latex.nodes # NoQA: F401,E501 # Workaround: import this before writer to avoid ImportError
13
13
  from sphinx import addnodes, highlighting, package_dir
14
14
  from sphinx.builders import Builder
15
- from sphinx.builders.latex.constants import ADDITIONAL_SETTINGS, DEFAULT_SETTINGS, SHORTHANDOFF
15
+ from sphinx.builders.latex.constants import (
16
+ ADDITIONAL_SETTINGS,
17
+ DEFAULT_SETTINGS,
18
+ SHORTHANDOFF,
19
+ )
16
20
  from sphinx.builders.latex.theming import Theme, ThemeFactory
17
21
  from sphinx.builders.latex.util import ExtBabel
18
22
  from sphinx.config import ENUM, Config
@@ -34,7 +38,7 @@ from sphinx.writers.latex import LaTeXTranslator, LaTeXWriter
34
38
  from docutils import nodes # isort:skip
35
39
 
36
40
  if TYPE_CHECKING:
37
- from collections.abc import Iterable
41
+ from collections.abc import Iterable, Set
38
42
 
39
43
  from docutils.nodes import Node
40
44
 
@@ -96,11 +100,9 @@ XINDY_LANG_OPTIONS = {
96
100
  'el': '-L greek -C utf8 ',
97
101
  # FIXME, not compatible with [:2] slice but does Sphinx support Greek ?
98
102
  'el-polyton': '-L greek-polytonic -C utf8 ',
99
- }
103
+ } # fmt: skip
100
104
 
101
- XINDY_CYRILLIC_SCRIPTS = [
102
- 'be', 'bg', 'mk', 'mn', 'ru', 'sr', 'sh', 'uk',
103
- ]
105
+ XINDY_CYRILLIC_SCRIPTS = ['be', 'bg', 'mk', 'mn', 'ru', 'sr', 'sh', 'uk']
104
106
 
105
107
  logger = logging.getLogger(__name__)
106
108
 
@@ -114,9 +116,11 @@ class LaTeXBuilder(Builder):
114
116
  format = 'latex'
115
117
  epilog = __('The LaTeX files are in %(outdir)s.')
116
118
  if os.name == 'posix':
117
- epilog += __("\nRun 'make' in that directory to run these through "
118
- "(pdf)latex\n"
119
- "(use `make latexpdf' here to do that automatically).")
119
+ epilog += __(
120
+ "\nRun 'make' in that directory to run these through "
121
+ '(pdf)latex\n'
122
+ "(use `make latexpdf' here to do that automatically)."
123
+ )
120
124
 
121
125
  supported_image_types = ['application/pdf', 'image/png', 'image/jpeg']
122
126
  supported_remote_images = False
@@ -149,20 +153,28 @@ class LaTeXBuilder(Builder):
149
153
  def init_document_data(self) -> None:
150
154
  preliminary_document_data = [list(x) for x in self.config.latex_documents]
151
155
  if not preliminary_document_data:
152
- logger.warning(__('no "latex_documents" config value found; no documents '
153
- 'will be written'))
156
+ logger.warning(
157
+ __(
158
+ 'no "latex_documents" config value found; no documents '
159
+ 'will be written'
160
+ )
161
+ )
154
162
  return
155
163
  # assign subdirs to titles
156
164
  self.titles: list[tuple[str, str]] = []
157
165
  for entry in preliminary_document_data:
158
166
  docname = entry[0]
159
167
  if docname not in self.env.all_docs:
160
- logger.warning(__('"latex_documents" config value references unknown '
161
- 'document %s'), docname)
168
+ logger.warning(
169
+ __(
170
+ '"latex_documents" config value references unknown '
171
+ 'document %s'
172
+ ),
173
+ docname,
174
+ )
162
175
  continue
163
176
  self.document_data.append(entry) # type: ignore[arg-type]
164
- if docname.endswith(SEP + 'index'):
165
- docname = docname[:-5]
177
+ docname = docname.removesuffix(SEP + 'index')
166
178
  self.titles.append((docname, entry[2]))
167
179
 
168
180
  def init_context(self) -> None:
@@ -186,8 +198,8 @@ class LaTeXBuilder(Builder):
186
198
  if self.config.today:
187
199
  self.context['date'] = self.config.today
188
200
  else:
189
- self.context['date'] = format_date(self.config.today_fmt or _('%b %d, %Y'),
190
- language=self.config.language)
201
+ today_fmt = self.config.today_fmt or _('%b %d, %Y')
202
+ self.context['date'] = format_date(today_fmt, language=self.config.language)
191
203
 
192
204
  if self.config.latex_logo:
193
205
  self.context['logofilename'] = path.basename(self.config.latex_logo)
@@ -210,25 +222,31 @@ class LaTeXBuilder(Builder):
210
222
  if not self.babel.is_supported_language():
211
223
  # emit warning if specified language is invalid
212
224
  # (only emitting, nothing changed to processing)
213
- logger.warning(__('no Babel option known for language %r'),
214
- self.config.language)
225
+ logger.warning(
226
+ __('no Babel option known for language %r'), self.config.language
227
+ )
215
228
 
216
229
  def init_multilingual(self) -> None:
217
230
  if self.context['latex_engine'] == 'pdflatex':
218
231
  if not self.babel.uses_cyrillic():
219
232
  if 'X2' in self.context['fontenc']:
220
- self.context['substitutefont'] = ('\\usepackage'
221
- '{sphinxpackagesubstitutefont}')
222
- self.context['textcyrillic'] = ('\\usepackage[Xtwo]'
223
- '{sphinxpackagecyrillic}')
233
+ self.context['substitutefont'] = (
234
+ '\\usepackage{sphinxpackagesubstitutefont}'
235
+ )
236
+ self.context['textcyrillic'] = (
237
+ '\\usepackage[Xtwo]{sphinxpackagecyrillic}'
238
+ )
224
239
  elif 'T2A' in self.context['fontenc']:
225
- self.context['substitutefont'] = ('\\usepackage'
226
- '{sphinxpackagesubstitutefont}')
227
- self.context['textcyrillic'] = ('\\usepackage[TtwoA]'
228
- '{sphinxpackagecyrillic}')
240
+ self.context['substitutefont'] = (
241
+ '\\usepackage{sphinxpackagesubstitutefont}'
242
+ )
243
+ self.context['textcyrillic'] = (
244
+ '\\usepackage[TtwoA]{sphinxpackagecyrillic}'
245
+ )
229
246
  if 'LGR' in self.context['fontenc']:
230
- self.context['substitutefont'] = ('\\usepackage'
231
- '{sphinxpackagesubstitutefont}')
247
+ self.context['substitutefont'] = (
248
+ '\\usepackage{sphinxpackagesubstitutefont}'
249
+ )
232
250
  else:
233
251
  self.context['textgreek'] = ''
234
252
  if self.context['substitutefont'] == '':
@@ -242,13 +260,18 @@ class LaTeXBuilder(Builder):
242
260
  self.context['shorthandoff'] = SHORTHANDOFF
243
261
 
244
262
  # Times fonts don't work with Cyrillic languages
245
- if self.babel.uses_cyrillic() and 'fontpkg' not in self.config.latex_elements:
263
+ if (
264
+ self.babel.uses_cyrillic()
265
+ and 'fontpkg' not in self.config.latex_elements
266
+ ):
246
267
  self.context['fontpkg'] = ''
247
268
  elif self.context['polyglossia']:
248
269
  self.context['classoptions'] += ',' + self.babel.get_language()
249
270
  options = self.babel.get_mainlanguage_options()
250
271
  if options:
251
- language = fr'\setmainlanguage[{options}]{{{self.babel.get_language()}}}'
272
+ language = (
273
+ rf'\setmainlanguage[{options}]{{{self.babel.get_language()}}}'
274
+ )
252
275
  else:
253
276
  language = r'\setmainlanguage{%s}' % self.babel.get_language()
254
277
 
@@ -257,20 +280,28 @@ class LaTeXBuilder(Builder):
257
280
  def write_stylesheet(self) -> None:
258
281
  highlighter = highlighting.PygmentsBridge('latex', self.config.pygments_style)
259
282
  stylesheet = path.join(self.outdir, 'sphinxhighlight.sty')
260
- with open(stylesheet, 'w', encoding="utf-8") as f:
283
+ with open(stylesheet, 'w', encoding='utf-8') as f:
261
284
  f.write('\\NeedsTeXFormat{LaTeX2e}[1995/12/01]\n')
262
- f.write('\\ProvidesPackage{sphinxhighlight}'
263
- '[2022/06/30 stylesheet for highlighting with pygments]\n')
264
- f.write('% Its contents depend on pygments_style configuration variable.\n\n')
285
+ f.write(
286
+ '\\ProvidesPackage{sphinxhighlight}'
287
+ '[2022/06/30 stylesheet for highlighting with pygments]\n'
288
+ )
289
+ f.write(
290
+ '% Its contents depend on pygments_style configuration variable.\n\n'
291
+ )
265
292
  f.write(highlighter.get_stylesheet())
266
293
 
294
+ def prepare_writing(self, docnames: Set[str]) -> None:
295
+ self.init_document_data()
296
+ self.write_stylesheet()
297
+
267
298
  def copy_assets(self) -> None:
268
299
  self.copy_support_files()
269
300
 
270
301
  if self.config.latex_additional_files:
271
302
  self.copy_latex_additional_files()
272
303
 
273
- def write(self, *ignored: Any) -> None:
304
+ def write_documents(self, _docnames: Set[str]) -> None:
274
305
  docwriter = LaTeXWriter(self)
275
306
  with warnings.catch_warnings():
276
307
  warnings.filterwarnings('ignore', category=DeprecationWarning)
@@ -279,11 +310,8 @@ class LaTeXBuilder(Builder):
279
310
  docsettings: Any = OptionParser(
280
311
  defaults=self.env.settings,
281
312
  components=(docwriter,),
282
- read_config_files=True).get_default_values()
283
-
284
- self.init_document_data()
285
- self.write_stylesheet()
286
- self.copy_assets()
313
+ read_config_files=True,
314
+ ).get_default_values()
287
315
 
288
316
  for entry in self.document_data:
289
317
  docname, targetname, title, author, themename = entry[:5]
@@ -291,9 +319,12 @@ class LaTeXBuilder(Builder):
291
319
  toctree_only = False
292
320
  if len(entry) > 5:
293
321
  toctree_only = entry[5]
294
- destination = SphinxFileOutput(destination_path=path.join(self.outdir, targetname),
295
- encoding='utf-8', overwrite_if_changed=True)
296
- with progress_message(__("processing %s") % targetname):
322
+ destination = SphinxFileOutput(
323
+ destination_path=path.join(self.outdir, targetname),
324
+ encoding='utf-8',
325
+ overwrite_if_changed=True,
326
+ )
327
+ with progress_message(__('processing %s') % targetname, nonl=False):
297
328
  doctree = self.env.get_doctree(docname)
298
329
  toctree = next(doctree.findall(addnodes.toctree), None)
299
330
  if toctree and toctree.get('maxdepth') > 0:
@@ -302,8 +333,12 @@ class LaTeXBuilder(Builder):
302
333
  tocdepth = None
303
334
 
304
335
  doctree = self.assemble_doctree(
305
- docname, toctree_only,
306
- appendices=(self.config.latex_appendices if theme.name != 'howto' else []))
336
+ docname,
337
+ toctree_only,
338
+ appendices=(
339
+ self.config.latex_appendices if theme.name != 'howto' else []
340
+ ),
341
+ )
307
342
  doctree['docclass'] = theme.docclass
308
343
  doctree['contentsname'] = self.get_contentsname(docname)
309
344
  doctree['tocdepth'] = tocdepth
@@ -311,7 +346,7 @@ class LaTeXBuilder(Builder):
311
346
  self.update_doc_context(title, author, theme)
312
347
  self.update_context()
313
348
 
314
- with progress_message(__("writing")):
349
+ with progress_message(__('writing')):
315
350
  docsettings._author = author
316
351
  docsettings._title = title
317
352
  docsettings._contentsname = doctree['contentsname']
@@ -341,10 +376,13 @@ class LaTeXBuilder(Builder):
341
376
  self.context['wrapperclass'] = theme.wrapperclass
342
377
 
343
378
  def assemble_doctree(
344
- self, indexfile: str, toctree_only: bool, appendices: list[str],
379
+ self,
380
+ indexfile: str,
381
+ toctree_only: bool,
382
+ appendices: list[str],
345
383
  ) -> nodes.document:
346
384
  self.docnames = {indexfile, *appendices}
347
- logger.info(darkgreen(indexfile) + " ", nonl=True)
385
+ logger.info(darkgreen(indexfile))
348
386
  tree = self.env.get_doctree(indexfile)
349
387
  tree['docname'] = indexfile
350
388
  if toctree_only:
@@ -352,21 +390,21 @@ class LaTeXBuilder(Builder):
352
390
  # fresh document
353
391
  new_tree = new_document('<latex output>')
354
392
  new_sect = nodes.section()
355
- new_sect += nodes.title('<Set title in conf.py>',
356
- '<Set title in conf.py>')
393
+ new_sect += nodes.title('<Set title in conf.py>', '<Set title in conf.py>')
357
394
  new_tree += new_sect
358
395
  for node in tree.findall(addnodes.toctree):
359
396
  new_sect += node
360
397
  tree = new_tree
361
- largetree = inline_all_toctrees(self, self.docnames, indexfile, tree,
362
- darkgreen, [indexfile])
398
+ largetree = inline_all_toctrees(
399
+ self, self.docnames, indexfile, tree, darkgreen, [indexfile]
400
+ )
363
401
  largetree['docname'] = indexfile
364
402
  for docname in appendices:
365
403
  appendix = self.env.get_doctree(docname)
366
404
  appendix['docname'] = docname
367
405
  largetree.append(appendix)
368
406
  logger.info('')
369
- logger.info(__("resolving references..."))
407
+ logger.info(__('resolving references...'))
370
408
  self.env.resolve_references(largetree, indexfile, self)
371
409
  # resolve :ref:s to distant tex files -- we can't add a cross-reference,
372
410
  # but append the document name
@@ -397,15 +435,16 @@ class LaTeXBuilder(Builder):
397
435
  # configure usage of xindy (impacts Makefile and latexmkrc)
398
436
  # FIXME: convert this rather to a confval with suitable default
399
437
  # according to language ? but would require extra documentation
400
- xindy_lang_option = XINDY_LANG_OPTIONS.get(self.config.language[:2],
401
- '-L general -C utf8 ')
438
+ xindy_lang_option = XINDY_LANG_OPTIONS.get(
439
+ self.config.language[:2], '-L general -C utf8 '
440
+ )
402
441
  xindy_cyrillic = self.config.language[:2] in XINDY_CYRILLIC_SCRIPTS
403
442
 
404
443
  context = {
405
- 'latex_engine': self.config.latex_engine,
406
- 'xindy_use': self.config.latex_use_xindy,
444
+ 'latex_engine': self.config.latex_engine,
445
+ 'xindy_use': self.config.latex_use_xindy,
407
446
  'xindy_lang_option': xindy_lang_option,
408
- 'xindy_cyrillic': xindy_cyrillic,
447
+ 'xindy_cyrillic': xindy_cyrillic,
409
448
  }
410
449
  staticdirname = path.join(package_dir, 'texinputs')
411
450
  for filename in os.listdir(staticdirname):
@@ -441,9 +480,14 @@ class LaTeXBuilder(Builder):
441
480
  def copy_image_files(self) -> None:
442
481
  if self.images:
443
482
  stringify_func = ImageAdapter(self.app.env).get_original_image_uri
444
- for src in status_iterator(self.images, __('copying images... '), "brown",
445
- len(self.images), self.app.verbosity,
446
- stringify_func=stringify_func):
483
+ for src in status_iterator(
484
+ self.images,
485
+ __('copying images... '),
486
+ 'brown',
487
+ len(self.images),
488
+ self.app.verbosity,
489
+ stringify_func=stringify_func,
490
+ ):
447
491
  dest = self.images[src]
448
492
  try:
449
493
  copyfile(
@@ -452,11 +496,16 @@ class LaTeXBuilder(Builder):
452
496
  force=True,
453
497
  )
454
498
  except Exception as err:
455
- logger.warning(__('cannot copy image file %r: %s'),
456
- path.join(self.srcdir, src), err)
499
+ logger.warning(
500
+ __('cannot copy image file %r: %s'),
501
+ path.join(self.srcdir, src),
502
+ err,
503
+ )
457
504
  if self.config.latex_logo:
458
505
  if not path.isfile(path.join(self.confdir, self.config.latex_logo)):
459
- raise SphinxError(__('logo file %r does not exist') % self.config.latex_logo)
506
+ raise SphinxError(
507
+ __('logo file %r does not exist') % self.config.latex_logo
508
+ )
460
509
  source = self.confdir / self.config.latex_logo
461
510
  copyfile(
462
511
  source,
@@ -476,7 +525,9 @@ class LaTeXBuilder(Builder):
476
525
  if self.context['babel'] or self.context['polyglossia']:
477
526
  context['addtocaptions'] = r'\addto\captions%s' % self.babel.get_language()
478
527
 
479
- filename = path.join(package_dir, 'templates', 'latex', 'sphinxmessages.sty.jinja')
528
+ filename = path.join(
529
+ package_dir, 'templates', 'latex', 'sphinxmessages.sty.jinja'
530
+ )
480
531
  copy_asset_file(
481
532
  filename,
482
533
  self.outdir,
@@ -489,7 +540,7 @@ class LaTeXBuilder(Builder):
489
540
  def validate_config_values(app: Sphinx, config: Config) -> None:
490
541
  for key in list(config.latex_elements):
491
542
  if key not in DEFAULT_SETTINGS:
492
- msg = __("Unknown configure key: latex_elements[%r], ignored.")
543
+ msg = __('Unknown configure key: latex_elements[%r], ignored.')
493
544
  logger.warning(msg, key)
494
545
  config.latex_elements.pop(key)
495
546
 
@@ -497,7 +548,7 @@ def validate_config_values(app: Sphinx, config: Config) -> None:
497
548
  def validate_latex_theme_options(app: Sphinx, config: Config) -> None:
498
549
  for key in list(config.latex_theme_options):
499
550
  if key not in Theme.UPDATABLE_KEYS:
500
- msg = __("Unknown theme option: latex_theme_options[%r], ignored.")
551
+ msg = __('Unknown theme option: latex_theme_options[%r], ignored.')
501
552
  logger.warning(msg, key)
502
553
  config.latex_theme_options.pop(key)
503
554
 
@@ -523,11 +574,9 @@ def default_latex_docclass(config: Config) -> dict[str, str]:
523
574
  """Better default latex_docclass settings for specific languages."""
524
575
  if config.language == 'ja':
525
576
  if config.latex_engine == 'uplatex':
526
- return {'manual': 'ujbook',
527
- 'howto': 'ujreport'}
577
+ return {'manual': 'ujbook', 'howto': 'ujreport'}
528
578
  else:
529
- return {'manual': 'jsbook',
530
- 'howto': 'jreport'}
579
+ return {'manual': 'jsbook', 'howto': 'jreport'}
531
580
  else:
532
581
  return {}
533
582
 
@@ -541,11 +590,15 @@ def default_latex_documents(config: Config) -> list[tuple[str, str, str, str, st
541
590
  """Better default latex_documents settings."""
542
591
  project = texescape.escape(config.project, config.latex_engine)
543
592
  author = texescape.escape(config.author, config.latex_engine)
544
- return [(config.root_doc,
545
- make_filename_from_project(config.project) + '.tex',
546
- texescape.escape_abbr(project),
547
- texescape.escape_abbr(author),
548
- config.latex_theme)]
593
+ return [
594
+ (
595
+ config.root_doc,
596
+ make_filename_from_project(config.project) + '.tex',
597
+ texescape.escape_abbr(project),
598
+ texescape.escape_abbr(author),
599
+ config.latex_theme,
600
+ )
601
+ ]
549
602
 
550
603
 
551
604
  def setup(app: Sphinx) -> ExtensionMetadata:
@@ -556,15 +609,20 @@ def setup(app: Sphinx) -> ExtensionMetadata:
556
609
  app.connect('config-inited', validate_latex_theme_options, priority=800)
557
610
  app.connect('builder-inited', install_packages_for_ja)
558
611
 
559
- app.add_config_value('latex_engine', default_latex_engine, '',
560
- ENUM('pdflatex', 'xelatex', 'lualatex', 'platex', 'uplatex'))
612
+ app.add_config_value(
613
+ 'latex_engine',
614
+ default_latex_engine,
615
+ '',
616
+ ENUM('pdflatex', 'xelatex', 'lualatex', 'platex', 'uplatex'),
617
+ )
561
618
  app.add_config_value('latex_documents', default_latex_documents, '')
562
619
  app.add_config_value('latex_logo', None, '', str)
563
620
  app.add_config_value('latex_appendices', [], '')
564
621
  app.add_config_value('latex_use_latex_multicolumn', False, '')
565
622
  app.add_config_value('latex_use_xindy', default_latex_use_xindy, '', bool)
566
- app.add_config_value('latex_toplevel_sectioning', None, '',
567
- ENUM(None, 'part', 'chapter', 'section'))
623
+ app.add_config_value(
624
+ 'latex_toplevel_sectioning', None, '', ENUM(None, 'part', 'chapter', 'section')
625
+ )
568
626
  app.add_config_value('latex_domain_indices', True, '', types={set, list})
569
627
  app.add_config_value('latex_show_urls', 'no', '')
570
628
  app.add_config_value('latex_show_pagerefs', False, '')
@@ -49,7 +49,7 @@ XELATEX_DEFAULT_FONTPKG = r'''
49
49
  BoldFont = *Bold,
50
50
  BoldItalicFont = *BoldOblique,
51
51
  ]
52
- \setmonofont{FreeMono}[
52
+ \setmonofont{FreeMono}[Scale=0.9,
53
53
  Extension = .otf,
54
54
  UprightFont = *,
55
55
  ItalicFont = *Oblique,
@@ -58,10 +58,12 @@ XELATEX_DEFAULT_FONTPKG = r'''
58
58
  ]
59
59
  '''
60
60
 
61
- XELATEX_GREEK_DEFAULT_FONTPKG = (XELATEX_DEFAULT_FONTPKG +
62
- '\n\\newfontfamily\\greekfont{FreeSerif}' +
63
- '\n\\newfontfamily\\greekfontsf{FreeSans}' +
64
- '\n\\newfontfamily\\greekfonttt{FreeMono}')
61
+ XELATEX_GREEK_DEFAULT_FONTPKG = (
62
+ XELATEX_DEFAULT_FONTPKG
63
+ + '\n\\newfontfamily\\greekfont{FreeSerif}'
64
+ + '\n\\newfontfamily\\greekfontsf{FreeSans}'
65
+ + '\n\\newfontfamily\\greekfonttt{FreeMono}'
66
+ )
65
67
 
66
68
  LUALATEX_DEFAULT_FONTPKG = XELATEX_DEFAULT_FONTPKG
67
69
 
@@ -142,7 +144,6 @@ ADDITIONAL_SETTINGS: dict[Any, dict[str, Any]] = {
142
144
  'fontenc': ('\\usepackage{fontspec}\n'
143
145
  '\\defaultfontfeatures[\\rmfamily,\\sffamily,\\ttfamily]{}'),
144
146
  'fontpkg': XELATEX_DEFAULT_FONTPKG,
145
- 'fvset': '\\fvset{fontsize=\\small}',
146
147
  'fontsubstitution': '',
147
148
  'textgreek': '',
148
149
  'utf8extra': ('\\catcode`^^^^00a0\\active\\protected\\def^^^^00a0'
@@ -155,7 +156,6 @@ ADDITIONAL_SETTINGS: dict[Any, dict[str, Any]] = {
155
156
  'fontenc': ('\\usepackage{fontspec}\n'
156
157
  '\\defaultfontfeatures[\\rmfamily,\\sffamily,\\ttfamily]{}'),
157
158
  'fontpkg': LUALATEX_DEFAULT_FONTPKG,
158
- 'fvset': '\\fvset{fontsize=\\small}',
159
159
  'fontsubstitution': '',
160
160
  'textgreek': '',
161
161
  'utf8extra': ('\\catcode`^^^^00a0\\active\\protected\\def^^^^00a0'
@@ -15,8 +15,9 @@ class footnotemark(nodes.Inline, nodes.Referential, nodes.TextElement):
15
15
  pass
16
16
 
17
17
 
18
- class footnotetext(nodes.General, nodes.BackLinkable, nodes.Element,
19
- nodes.Labeled, nodes.Targetable):
18
+ class footnotetext(
19
+ nodes.General, nodes.BackLinkable, nodes.Element, nodes.Labeled, nodes.Targetable
20
+ ):
20
21
  r"""A node represents ``\footnotetext``."""
21
22
 
22
23
 
@@ -84,11 +84,11 @@ class UserTheme(Theme):
84
84
  value = self.config.get('theme', key)
85
85
  setattr(self, key, value)
86
86
  except configparser.NoSectionError as exc:
87
- raise ThemeError(__('%r doesn\'t have "theme" setting') %
88
- filename) from exc
87
+ msg = __('%r doesn\'t have "theme" setting') % filename
88
+ raise ThemeError(msg) from exc
89
89
  except configparser.NoOptionError as exc:
90
- raise ThemeError(__('%r doesn\'t have "%s" setting') %
91
- (filename, exc.args[0])) from exc
90
+ msg = __('%r doesn\'t have "%s" setting') % (filename, exc.args[0])
91
+ raise ThemeError(msg) from exc
92
92
 
93
93
  for key in self.OPTIONAL_CONFIG_KEYS:
94
94
  try:
@@ -103,7 +103,9 @@ class ThemeFactory:
103
103
 
104
104
  def __init__(self, app: Sphinx) -> None:
105
105
  self.themes: dict[str, Theme] = {}
106
- self.theme_paths = [path.join(app.srcdir, p) for p in app.config.latex_theme_path]
106
+ self.theme_paths = [
107
+ path.join(app.srcdir, p) for p in app.config.latex_theme_path
108
+ ]
107
109
  self.config = app.config
108
110
  self.load_builtin_themes(app.config)
109
111
 
@@ -15,7 +15,6 @@ from sphinx.builders.latex.nodes import (
15
15
  math_reference,
16
16
  thebibliography,
17
17
  )
18
- from sphinx.domains.citation import CitationDomain
19
18
  from sphinx.locale import __
20
19
  from sphinx.transforms import SphinxTransform
21
20
  from sphinx.transforms.post_transforms import SphinxPostTransform
@@ -90,8 +89,7 @@ class ShowUrlsTransform(SphinxPostTransform):
90
89
  for node in list(self.document.findall(nodes.reference)):
91
90
  uri = node.get('refuri', '')
92
91
  if uri.startswith(URI_SCHEMES):
93
- if uri.startswith('mailto:'):
94
- uri = uri[7:]
92
+ uri = uri.removeprefix('mailto:')
95
93
  if node.astext() != uri:
96
94
  index = node.parent.index(node)
97
95
  docname = self.get_docname_for_node(node)
@@ -102,7 +100,7 @@ class ShowUrlsTransform(SphinxPostTransform):
102
100
 
103
101
  self.expanded = True
104
102
  else: # all other true values (b/w compat)
105
- textnode = nodes.Text(" (%s)" % uri)
103
+ textnode = nodes.Text(' (%s)' % uri)
106
104
  node.parent.insert(index + 1, textnode)
107
105
 
108
106
  def get_docname_for_node(self, node: Node) -> str:
@@ -118,11 +116,11 @@ class ShowUrlsTransform(SphinxPostTransform):
118
116
  source = node['source']
119
117
  except TypeError:
120
118
  raise ValueError(__('Failed to get a docname!')) from None
121
- raise ValueError(__('Failed to get a docname '
122
- 'for source {source!r}!').format(source=source))
119
+ msg = __('Failed to get a docname for source %r!') % source
120
+ raise ValueError(msg)
123
121
 
124
122
  def create_footnote(
125
- self, uri: str, docname: str,
123
+ self, uri: str, docname: str
126
124
  ) -> tuple[nodes.footnote, nodes.footnote_reference]:
127
125
  reference = nodes.reference('', nodes.Text(uri), refuri=uri, nolinkurl=True)
128
126
  footnote = nodes.footnote(uri, auto=1, docname=docname)
@@ -131,8 +129,9 @@ class ShowUrlsTransform(SphinxPostTransform):
131
129
  footnote += nodes.paragraph('', '', reference)
132
130
  self.document.note_autofootnote(footnote)
133
131
 
134
- footnote_ref = nodes.footnote_reference('[#]_', auto=1,
135
- refid=footnote['ids'][0], docname=docname)
132
+ footnote_ref = nodes.footnote_reference(
133
+ '[#]_', auto=1, refid=footnote['ids'][0], docname=docname
134
+ )
136
135
  footnote_ref += nodes.Text('#')
137
136
  self.document.note_autofootnote_ref(footnote_ref)
138
137
  footnote.add_backref(footnote_ref['ids'][0])
@@ -371,7 +370,9 @@ class LaTeXFootnoteTransform(SphinxPostTransform):
371
370
 
372
371
 
373
372
  class LaTeXFootnoteVisitor(nodes.NodeVisitor):
374
- def __init__(self, document: nodes.document, footnotes: list[nodes.footnote]) -> None:
373
+ def __init__(
374
+ self, document: nodes.document, footnotes: list[nodes.footnote]
375
+ ) -> None:
375
376
  self.appeared: dict[tuple[str, str], nodes.footnote] = {}
376
377
  self.footnotes: list[nodes.footnote] = footnotes
377
378
  self.pendings: list[nodes.footnote] = []
@@ -393,7 +394,7 @@ class LaTeXFootnoteVisitor(nodes.NodeVisitor):
393
394
  if self.restricted == node:
394
395
  self.restricted = None
395
396
  pos = node.parent.index(node)
396
- for i, footnote, in enumerate(self.pendings):
397
+ for i, footnote in enumerate(self.pendings):
397
398
  fntext = footnotetext('', *footnote.children, ids=footnote['ids'])
398
399
  node.parent.insert(pos + i + 1, fntext)
399
400
  self.pendings = []
@@ -455,7 +456,7 @@ class LaTeXFootnoteVisitor(nodes.NodeVisitor):
455
456
  docname = node['docname']
456
457
  if (docname, number) in self.appeared:
457
458
  footnote = self.appeared[(docname, number)]
458
- footnote["referred"] = True
459
+ footnote['referred'] = True
459
460
 
460
461
  mark = footnotemark('', number, refid=node['refid'])
461
462
  node.replace_self(mark)
@@ -473,7 +474,9 @@ class LaTeXFootnoteVisitor(nodes.NodeVisitor):
473
474
  self.appeared[(docname, number)] = footnote
474
475
  raise nodes.SkipNode
475
476
 
476
- def get_footnote_by_reference(self, node: nodes.footnote_reference) -> nodes.footnote:
477
+ def get_footnote_by_reference(
478
+ self, node: nodes.footnote_reference
479
+ ) -> nodes.footnote:
477
480
  docname = node['docname']
478
481
  for footnote in self.footnotes:
479
482
  if docname == footnote['docname'] and footnote['ids'][0] == node['refid']:
@@ -537,13 +540,16 @@ class CitationReferenceTransform(SphinxPostTransform):
537
540
  formats = ('latex',)
538
541
 
539
542
  def run(self, **kwargs: Any) -> None:
540
- domain = cast(CitationDomain, self.env.get_domain('citation'))
541
- matcher = NodeMatcher(addnodes.pending_xref, refdomain='citation', reftype='ref')
543
+ domain = self.env.domains.citation_domain
544
+ matcher = NodeMatcher(
545
+ addnodes.pending_xref, refdomain='citation', reftype='ref'
546
+ )
542
547
  for node in matcher.findall(self.document):
543
548
  docname, labelid, _ = domain.citations.get(node['reftarget'], ('', '', 0))
544
549
  if docname:
545
- citation_ref = nodes.citation_reference('', '', *node.children,
546
- docname=docname, refname=labelid)
550
+ citation_ref = nodes.citation_reference(
551
+ '', '', *node.children, docname=docname, refname=labelid
552
+ )
547
553
  node.replace_self(citation_ref)
548
554
 
549
555
 
@@ -558,12 +564,14 @@ class MathReferenceTransform(SphinxPostTransform):
558
564
  formats = ('latex',)
559
565
 
560
566
  def run(self, **kwargs: Any) -> None:
561
- equations = self.env.get_domain('math').data['objects']
567
+ equations = self.env.domains.math_domain.data['objects']
562
568
  for node in self.document.findall(addnodes.pending_xref):
563
569
  if node['refdomain'] == 'math' and node['reftype'] in ('eq', 'numref'):
564
570
  docname, _ = equations.get(node['reftarget'], (None, None))
565
571
  if docname:
566
- refnode = math_reference('', docname=docname, target=node['reftarget'])
572
+ refnode = math_reference(
573
+ '', docname=docname, target=node['reftarget']
574
+ )
567
575
  node.replace_self(refnode)
568
576
 
569
577