From c7c0b0483b16bbfed172c1b74cb6c8ee43053ae9 Mon Sep 17 00:00:00 2001 From: Alexander Bobkov Date: Tue, 15 Oct 2024 01:41:48 -0400 Subject: [PATCH] ESP32-S3 Uno --- build/latex/ESP32-Uno.png | Bin 0 -> 244211 bytes build/latex/LICRcyr2utf8.xdy | 101 ++ build/latex/LICRlatin2utf8.xdy | 239 ++++ build/latex/LatinRules.xdy | 611 +++++++++ build/latex/Makefile | 65 + build/latex/esp32-s3arduinouno.aux | 9 + build/latex/esp32-s3arduinouno.fdb_latexmk | 41 + build/latex/esp32-s3arduinouno.fls | 62 + build/latex/esp32-s3arduinouno.idx | 0 build/latex/esp32-s3arduinouno.ilg | 5 + build/latex/esp32-s3arduinouno.ind | 0 build/latex/esp32-s3arduinouno.log | 203 +++ build/latex/esp32-s3arduinouno.out | 0 build/latex/esp32-s3arduinouno.tex | 99 ++ build/latex/esp32-s3arduinouno.toc | 1 + build/latex/latexmkjarc | 22 + build/latex/latexmkrc | 9 + build/latex/make.bat | 31 + build/latex/python.ist | 16 + build/latex/sphinx.sty | 1130 +++++++++++++++++ build/latex/sphinx.xdy | 230 ++++ build/latex/sphinxhighlight.sty | 130 ++ build/latex/sphinxhowto.cls | 102 ++ build/latex/sphinxlatexadmonitions.sty | 385 ++++++ build/latex/sphinxlatexcontainers.sty | 22 + build/latex/sphinxlatexgraphics.sty | 122 ++ build/latex/sphinxlatexindbibtoc.sty | 69 ++ build/latex/sphinxlatexlists.sty | 131 ++ build/latex/sphinxlatexliterals.sty | 997 +++++++++++++++ build/latex/sphinxlatexnumfig.sty | 122 ++ build/latex/sphinxlatexobjects.sty | 365 ++++++ build/latex/sphinxlatexshadowbox.sty | 116 ++ build/latex/sphinxlatexstyleheadings.sty | 86 ++ build/latex/sphinxlatexstylepage.sty | 79 ++ build/latex/sphinxlatexstyletext.sty | 147 +++ build/latex/sphinxlatextables.sty | 1241 +++++++++++++++++++ build/latex/sphinxmanual.cls | 128 ++ build/latex/sphinxmessages.sty | 21 + build/latex/sphinxoptionsgeometry.sty | 54 + build/latex/sphinxoptionshyperref.sty | 35 + build/latex/sphinxpackageboxes.sty | 827 ++++++++++++ build/latex/sphinxpackagecyrillic.sty | 55 + build/latex/sphinxpackagefootnote.sty | 434 +++++++ build/latex/sphinxpackagesubstitutefont.sty | 21 + 44 files changed, 8563 insertions(+) create mode 100644 build/latex/ESP32-Uno.png create mode 100644 build/latex/LICRcyr2utf8.xdy create mode 100644 build/latex/LICRlatin2utf8.xdy create mode 100644 build/latex/LatinRules.xdy create mode 100644 build/latex/Makefile create mode 100644 build/latex/esp32-s3arduinouno.aux create mode 100644 build/latex/esp32-s3arduinouno.fdb_latexmk create mode 100644 build/latex/esp32-s3arduinouno.fls create mode 100644 build/latex/esp32-s3arduinouno.idx create mode 100644 build/latex/esp32-s3arduinouno.ilg create mode 100644 build/latex/esp32-s3arduinouno.ind create mode 100644 build/latex/esp32-s3arduinouno.log create mode 100644 build/latex/esp32-s3arduinouno.out create mode 100644 build/latex/esp32-s3arduinouno.tex create mode 100644 build/latex/esp32-s3arduinouno.toc create mode 100644 build/latex/latexmkjarc create mode 100644 build/latex/latexmkrc create mode 100644 build/latex/make.bat create mode 100644 build/latex/python.ist create mode 100644 build/latex/sphinx.sty create mode 100644 build/latex/sphinx.xdy create mode 100644 build/latex/sphinxhighlight.sty create mode 100644 build/latex/sphinxhowto.cls create mode 100644 build/latex/sphinxlatexadmonitions.sty create mode 100644 build/latex/sphinxlatexcontainers.sty create mode 100644 build/latex/sphinxlatexgraphics.sty create mode 100644 build/latex/sphinxlatexindbibtoc.sty create mode 100644 build/latex/sphinxlatexlists.sty create mode 100644 build/latex/sphinxlatexliterals.sty create mode 100644 build/latex/sphinxlatexnumfig.sty create mode 100644 build/latex/sphinxlatexobjects.sty create mode 100644 build/latex/sphinxlatexshadowbox.sty create mode 100644 build/latex/sphinxlatexstyleheadings.sty create mode 100644 build/latex/sphinxlatexstylepage.sty create mode 100644 build/latex/sphinxlatexstyletext.sty create mode 100644 build/latex/sphinxlatextables.sty create mode 100644 build/latex/sphinxmanual.cls create mode 100644 build/latex/sphinxmessages.sty create mode 100644 build/latex/sphinxoptionsgeometry.sty create mode 100644 build/latex/sphinxoptionshyperref.sty create mode 100644 build/latex/sphinxpackageboxes.sty create mode 100644 build/latex/sphinxpackagecyrillic.sty create mode 100644 build/latex/sphinxpackagefootnote.sty create mode 100644 build/latex/sphinxpackagesubstitutefont.sty diff --git a/build/latex/ESP32-Uno.png b/build/latex/ESP32-Uno.png new file mode 100644 index 0000000000000000000000000000000000000000..3aedfe491a63d77556efef4b69bf12f9d2e05296 GIT binary patch literal 244211 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 literal 0 HcmV?d00001 diff --git a/build/latex/LICRcyr2utf8.xdy b/build/latex/LICRcyr2utf8.xdy new file mode 100644 index 0000000..a9ca1c8 --- /dev/null +++ b/build/latex/LICRcyr2utf8.xdy @@ -0,0 +1,101 @@ +;; -*- coding: utf-8; mode: Lisp; -*- +;; style file for xindy +;; filename: LICRcyr2utf8.xdy +;; description: style file for xindy which maps back LaTeX Internal +;; Character Representation of Cyrillic to utf-8 +;; usage: for use with pdflatex produced .idx files. +;; Contributed by the Sphinx team, July 2018. +(merge-rule "\IeC {\'\CYRG }" "Ѓ" :string) +(merge-rule "\IeC {\'\CYRK }" "Ќ" :string) +(merge-rule "\IeC {\'\cyrg }" "ѓ" :string) +(merge-rule "\IeC {\'\cyrk }" "ќ" :string) +(merge-rule "\IeC {\CYRA }" "А" :string) +(merge-rule "\IeC {\CYRB }" "Б" :string) +(merge-rule "\IeC {\CYRC }" "Ц" :string) +(merge-rule "\IeC {\CYRCH }" "Ч" :string) +(merge-rule "\IeC {\CYRD }" "Д" :string) +(merge-rule "\IeC {\CYRDJE }" "Ђ" :string) +(merge-rule "\IeC {\CYRDZE }" "Ѕ" :string) +(merge-rule "\IeC {\CYRDZHE }" "Џ" :string) +(merge-rule "\IeC {\CYRE }" "Е" :string) +(merge-rule "\IeC {\CYREREV }" "Э" :string) +(merge-rule "\IeC {\CYRERY }" "Ы" :string) +(merge-rule "\IeC {\CYRF }" "Ф" :string) +(merge-rule "\IeC {\CYRG }" "Г" :string) +(merge-rule "\IeC {\CYRGUP }" "Ґ" :string) +(merge-rule "\IeC {\CYRH }" "Х" :string) +(merge-rule "\IeC {\CYRHRDSN }" "Ъ" :string) +(merge-rule "\IeC {\CYRI }" "И" :string) +(merge-rule "\IeC {\CYRIE }" "Є" :string) +(merge-rule "\IeC {\CYRII }" "І" :string) +(merge-rule "\IeC {\CYRISHRT }" "Й" :string) +(merge-rule "\IeC {\CYRJE }" "Ј" :string) +(merge-rule "\IeC {\CYRK }" "К" :string) +(merge-rule "\IeC {\CYRL }" "Л" :string) +(merge-rule "\IeC {\CYRLJE }" "Љ" :string) +(merge-rule "\IeC {\CYRM }" "М" :string) +(merge-rule "\IeC {\CYRN }" "Н" :string) +(merge-rule "\IeC {\CYRNJE }" "Њ" :string) +(merge-rule "\IeC {\CYRO }" "О" :string) +(merge-rule "\IeC {\CYRP }" "П" :string) +(merge-rule "\IeC {\CYRR }" "Р" :string) +(merge-rule "\IeC {\CYRS }" "С" :string) +(merge-rule "\IeC {\CYRSFTSN }" "Ь" :string) +(merge-rule "\IeC {\CYRSH }" "Ш" :string) +(merge-rule "\IeC {\CYRSHCH }" "Щ" :string) +(merge-rule "\IeC {\CYRT }" "Т" :string) +(merge-rule "\IeC {\CYRTSHE }" "Ћ" :string) +(merge-rule "\IeC {\CYRU }" "У" :string) +(merge-rule "\IeC {\CYRUSHRT }" "Ў" :string) +(merge-rule "\IeC {\CYRV }" "В" :string) +(merge-rule "\IeC {\CYRYA }" "Я" :string) +(merge-rule "\IeC {\CYRYI }" "Ї" :string) +(merge-rule "\IeC {\CYRYO }" "Ё" :string) +(merge-rule "\IeC {\CYRYU }" "Ю" :string) +(merge-rule "\IeC {\CYRZ }" "З" :string) +(merge-rule "\IeC {\CYRZH }" "Ж" :string) +(merge-rule "\IeC {\cyra }" "а" :string) +(merge-rule "\IeC {\cyrb }" "б" :string) +(merge-rule "\IeC {\cyrc }" "ц" :string) +(merge-rule "\IeC {\cyrch }" "ч" :string) +(merge-rule "\IeC {\cyrd }" "д" :string) +(merge-rule "\IeC {\cyrdje }" "ђ" :string) +(merge-rule "\IeC {\cyrdze }" "ѕ" :string) +(merge-rule "\IeC {\cyrdzhe }" "џ" :string) +(merge-rule "\IeC {\cyre }" "е" :string) +(merge-rule "\IeC {\cyrerev }" "э" :string) +(merge-rule "\IeC {\cyrery }" "ы" :string) +(merge-rule "\IeC {\cyrf }" "ф" :string) +(merge-rule "\IeC {\cyrg }" "г" :string) +(merge-rule "\IeC {\cyrgup }" "ґ" :string) +(merge-rule "\IeC {\cyrh }" "х" :string) +(merge-rule "\IeC {\cyrhrdsn }" "ъ" :string) +(merge-rule "\IeC {\cyri }" "и" :string) +(merge-rule "\IeC {\cyrie }" "є" :string) +(merge-rule "\IeC {\cyrii }" "і" :string) +(merge-rule "\IeC {\cyrishrt }" "й" :string) +(merge-rule "\IeC {\cyrje }" "ј" :string) +(merge-rule "\IeC {\cyrk }" "к" :string) +(merge-rule "\IeC {\cyrl }" "л" :string) +(merge-rule "\IeC {\cyrlje }" "љ" :string) +(merge-rule "\IeC {\cyrm }" "м" :string) +(merge-rule "\IeC {\cyrn }" "н" :string) +(merge-rule "\IeC {\cyrnje }" "њ" :string) +(merge-rule "\IeC {\cyro }" "о" :string) +(merge-rule "\IeC {\cyrp }" "п" :string) +(merge-rule "\IeC {\cyrr }" "р" :string) +(merge-rule "\IeC {\cyrs }" "с" :string) +(merge-rule "\IeC {\cyrsftsn }" "ь" :string) +(merge-rule "\IeC {\cyrsh }" "ш" :string) +(merge-rule "\IeC {\cyrshch }" "щ" :string) +(merge-rule "\IeC {\cyrt }" "т" :string) +(merge-rule "\IeC {\cyrtshe }" "ћ" :string) +(merge-rule "\IeC {\cyru }" "у" :string) +(merge-rule "\IeC {\cyrushrt }" "ў" :string) +(merge-rule "\IeC {\cyrv }" "в" :string) +(merge-rule "\IeC {\cyrya }" "я" :string) +(merge-rule "\IeC {\cyryi }" "ї" :string) +(merge-rule "\IeC {\cyryo }" "ё" :string) +(merge-rule "\IeC {\cyryu }" "ю" :string) +(merge-rule "\IeC {\cyrz }" "з" :string) +(merge-rule "\IeC {\cyrzh }" "ж" :string) diff --git a/build/latex/LICRlatin2utf8.xdy b/build/latex/LICRlatin2utf8.xdy new file mode 100644 index 0000000..1d76825 --- /dev/null +++ b/build/latex/LICRlatin2utf8.xdy @@ -0,0 +1,239 @@ +;; style file for xindy +;; filename: LICRlatin2utf8.xdy +;; description: style file for xindy which maps back LaTeX Internal +;; Character Representation of letters (as arising in .idx index +;; file) to UTF-8 encoding for correct sorting by xindy. +;; usage: for use with the pdflatex engine, +;; *not* for use with xelatex or lualatex. +;; +;; This is based upon xindy's distributed file tex/inputenc/utf8.xdy. +;; The modifications include: +;; +;; - Updates for compatibility with current LaTeX macro encoding. +;; +;; - Systematic usage of the \IeC {...} mark-up, because mark-up in +;; tex/inputenc/utf8.xdy was using it on seemingly random basis, and +;; Sphinx coercing of xindy usability for both Latin and Cyrillic scripts +;; with pdflatex requires its systematic presence here. +;; +;; - Support for some extra letters: Ÿ, Ŋ, ŋ, Œ, œ, IJ, ij, ȷ and ẞ. +;; +;; Indeed Sphinx needs to support for pdflatex engine all Unicode letters +;; available in TeX T1 font encoding. The above letters are found in +;; that encoding but not in the Latin1, 2, 3 charsets which are those +;; covered by original tex/inputenc/utf8.xdy. +;; +;; - There is a problem that ȷ is not supported out-of-the box by LaTeX +;; with inputenc, one must add explicitly +;; \DeclareUnicodeCharacter{0237}{\j} +;; to preamble of LaTeX document. However this character is not supported +;; by the TeX "times" font used by default by Sphinx for pdflatex engine. +;; +;; **Update**: since LaTeX 2018/12/01, the \j as well as \SS, \k{} and +;; \.{} need no extra user declaration anymore. +;; +;; - ẞ needs \DeclareUnicodeCharacter{1E9E}{\SS} (but ß needs no extra set-up). +;; +;; - U+02DB (˛) and U+02D9 (˙) are also not supported by inputenc +;; out of the box and require +;; \DeclareUnicodeCharacter{02DB}{\k{}} +;; \DeclareUnicodeCharacter{02D9}{\.{}} +;; to be added to preamble. +;; +;; - U+0127 ħ and U+0126 Ħ are absent from TeX T1+TS1 font encodings. +;; +;; - Characters Ŋ and ŋ are not supported by TeX font "times" used by +;; default by Sphinx for pdflatex engine but they are supported by +;; some TeX fonts, in particular by the default LaTeX font for T1 +;; encoding. +;; +;; - " and ~ must be escaped as ~" and resp. ~~ in xindy merge rules. +;; +;; Contributed by the Sphinx team, July 2018. +;; +;; See sphinx.xdy for superior figures, as they are escaped by LaTeX writer. +(merge-rule "\IeC {\textonesuperior }" "¹" :string) +(merge-rule "\IeC {\texttwosuperior }" "²" :string) +(merge-rule "\IeC {\textthreesuperior }" "³" :string) +(merge-rule "\IeC {\'a}" "á" :string) +(merge-rule "\IeC {\'A}" "Á" :string) +(merge-rule "\IeC {\`a}" "à" :string) +(merge-rule "\IeC {\`A}" "À" :string) +(merge-rule "\IeC {\^a}" "â" :string) +(merge-rule "\IeC {\^A}" "Â" :string) +(merge-rule "\IeC {\~"a}" "ä" :string) +(merge-rule "\IeC {\~"A}" "Ä" :string) +(merge-rule "\IeC {\~~a}" "ã" :string) +(merge-rule "\IeC {\~~A}" "Ã" :string) +(merge-rule "\IeC {\c c}" "ç" :string) +(merge-rule "\IeC {\c C}" "Ç" :string) +(merge-rule "\IeC {\'c}" "ć" :string) +(merge-rule "\IeC {\'C}" "Ć" :string) +(merge-rule "\IeC {\^c}" "ĉ" :string) +(merge-rule "\IeC {\^C}" "Ĉ" :string) +(merge-rule "\IeC {\.c}" "ċ" :string) +(merge-rule "\IeC {\.C}" "Ċ" :string) +(merge-rule "\IeC {\c s}" "ş" :string) +(merge-rule "\IeC {\c S}" "Ş" :string) +(merge-rule "\IeC {\c t}" "ţ" :string) +(merge-rule "\IeC {\c T}" "Ţ" :string) +(merge-rule "\IeC {\-}" "­" :string); soft hyphen +(merge-rule "\IeC {\textdiv }" "÷" :string) +(merge-rule "\IeC {\'e}" "é" :string) +(merge-rule "\IeC {\'E}" "É" :string) +(merge-rule "\IeC {\`e}" "è" :string) +(merge-rule "\IeC {\`E}" "È" :string) +(merge-rule "\IeC {\^e}" "ê" :string) +(merge-rule "\IeC {\^E}" "Ê" :string) +(merge-rule "\IeC {\~"e}" "ë" :string) +(merge-rule "\IeC {\~"E}" "Ë" :string) +(merge-rule "\IeC {\^g}" "ĝ" :string) +(merge-rule "\IeC {\^G}" "Ĝ" :string) +(merge-rule "\IeC {\.g}" "ġ" :string) +(merge-rule "\IeC {\.G}" "Ġ" :string) +(merge-rule "\IeC {\^h}" "ĥ" :string) +(merge-rule "\IeC {\^H}" "Ĥ" :string) +(merge-rule "\IeC {\H o}" "ő" :string) +(merge-rule "\IeC {\H O}" "Ő" :string) +(merge-rule "\IeC {\textacutedbl }" "˝" :string) +(merge-rule "\IeC {\H u}" "ű" :string) +(merge-rule "\IeC {\H U}" "Ű" :string) +(merge-rule "\IeC {\ae }" "æ" :string) +(merge-rule "\IeC {\AE }" "Æ" :string) +(merge-rule "\IeC {\textcopyright }" "©" :string) +(merge-rule "\IeC {\c \ }" "¸" :string) +(merge-rule "\IeC {\dh }" "ð" :string) +(merge-rule "\IeC {\DH }" "Ð" :string) +(merge-rule "\IeC {\dj }" "đ" :string) +(merge-rule "\IeC {\DJ }" "Đ" :string) +(merge-rule "\IeC {\guillemotleft }" "«" :string) +(merge-rule "\IeC {\guillemotright }" "»" :string) +(merge-rule "\IeC {\'\i }" "í" :string) +(merge-rule "\IeC {\`\i }" "ì" :string) +(merge-rule "\IeC {\^\i }" "î" :string) +(merge-rule "\IeC {\~"\i }" "ï" :string) +(merge-rule "\IeC {\i }" "ı" :string) +(merge-rule "\IeC {\^\j }" "ĵ" :string) +(merge-rule "\IeC {\k {}}" "˛" :string) +(merge-rule "\IeC {\l }" "ł" :string) +(merge-rule "\IeC {\L }" "Ł" :string) +(merge-rule "\IeC {\nobreakspace }" " " :string) +(merge-rule "\IeC {\o }" "ø" :string) +(merge-rule "\IeC {\O }" "Ø" :string) +(merge-rule "\IeC {\textsterling }" "£" :string) +(merge-rule "\IeC {\textparagraph }" "¶" :string) +(merge-rule "\IeC {\ss }" "ß" :string) +(merge-rule "\IeC {\textsection }" "§" :string) +(merge-rule "\IeC {\textbrokenbar }" "¦" :string) +(merge-rule "\IeC {\textcent }" "¢" :string) +(merge-rule "\IeC {\textcurrency }" "¤" :string) +(merge-rule "\IeC {\textdegree }" "°" :string) +(merge-rule "\IeC {\textexclamdown }" "¡" :string) +(merge-rule "\IeC {\texthbar }" "ħ" :string) +(merge-rule "\IeC {\textHbar }" "Ħ" :string) +(merge-rule "\IeC {\textonehalf }" "½" :string) +(merge-rule "\IeC {\textonequarter }" "¼" :string) +(merge-rule "\IeC {\textordfeminine }" "ª" :string) +(merge-rule "\IeC {\textordmasculine }" "º" :string) +(merge-rule "\IeC {\textperiodcentered }" "·" :string) +(merge-rule "\IeC {\textquestiondown }" "¿" :string) +(merge-rule "\IeC {\textregistered }" "®" :string) +(merge-rule "\IeC {\textthreequarters }" "¾" :string) +(merge-rule "\IeC {\textyen }" "¥" :string) +(merge-rule "\IeC {\th }" "þ" :string) +(merge-rule "\IeC {\TH }" "Þ" :string) +(merge-rule "\IeC {\'I}" "Í" :string) +(merge-rule "\IeC {\`I}" "Ì" :string) +(merge-rule "\IeC {\^I}" "Î" :string) +(merge-rule "\IeC {\~"I}" "Ï" :string) +(merge-rule "\IeC {\.I}" "İ" :string) +(merge-rule "\IeC {\^J}" "Ĵ" :string) +(merge-rule "\IeC {\k a}" "ą" :string) +(merge-rule "\IeC {\k A}" "Ą" :string) +(merge-rule "\IeC {\k e}" "ę" :string) +(merge-rule "\IeC {\k E}" "Ę" :string) +(merge-rule "\IeC {\'l}" "ĺ" :string) +(merge-rule "\IeC {\'L}" "Ĺ" :string) +(merge-rule "\IeC {\textlnot }" "¬" :string) +(merge-rule "\IeC {\textmu }" "µ" :string) +(merge-rule "\IeC {\'n}" "ń" :string) +(merge-rule "\IeC {\'N}" "Ń" :string) +(merge-rule "\IeC {\~~n}" "ñ" :string) +(merge-rule "\IeC {\~~N}" "Ñ" :string) +(merge-rule "\IeC {\'o}" "ó" :string) +(merge-rule "\IeC {\'O}" "Ó" :string) +(merge-rule "\IeC {\`o}" "ò" :string) +(merge-rule "\IeC {\`O}" "Ò" :string) +(merge-rule "\IeC {\^o}" "ô" :string) +(merge-rule "\IeC {\^O}" "Ô" :string) +(merge-rule "\IeC {\~"o}" "ö" :string) +(merge-rule "\IeC {\~"O}" "Ö" :string) +(merge-rule "\IeC {\~~o}" "õ" :string) +(merge-rule "\IeC {\~~O}" "Õ" :string) +(merge-rule "\IeC {\textpm }" "±" :string) +(merge-rule "\IeC {\r a}" "å" :string) +(merge-rule "\IeC {\r A}" "Å" :string) +(merge-rule "\IeC {\'r}" "ŕ" :string) +(merge-rule "\IeC {\'R}" "Ŕ" :string) +(merge-rule "\IeC {\r u}" "ů" :string) +(merge-rule "\IeC {\r U}" "Ů" :string) +(merge-rule "\IeC {\'s}" "ś" :string) +(merge-rule "\IeC {\'S}" "Ś" :string) +(merge-rule "\IeC {\^s}" "ŝ" :string) +(merge-rule "\IeC {\^S}" "Ŝ" :string) +(merge-rule "\IeC {\textasciidieresis }" "¨" :string) +(merge-rule "\IeC {\textasciimacron }" "¯" :string) +(merge-rule "\IeC {\.{}}" "˙" :string) +(merge-rule "\IeC {\textasciiacute }" "´" :string) +(merge-rule "\IeC {\texttimes }" "×" :string) +(merge-rule "\IeC {\u a}" "ă" :string) +(merge-rule "\IeC {\u A}" "Ă" :string) +(merge-rule "\IeC {\u g}" "ğ" :string) +(merge-rule "\IeC {\u G}" "Ğ" :string) +(merge-rule "\IeC {\textasciibreve }" "˘" :string) +(merge-rule "\IeC {\'u}" "ú" :string) +(merge-rule "\IeC {\'U}" "Ú" :string) +(merge-rule "\IeC {\`u}" "ù" :string) +(merge-rule "\IeC {\`U}" "Ù" :string) +(merge-rule "\IeC {\^u}" "û" :string) +(merge-rule "\IeC {\^U}" "Û" :string) +(merge-rule "\IeC {\~"u}" "ü" :string) +(merge-rule "\IeC {\~"U}" "Ü" :string) +(merge-rule "\IeC {\u u}" "ŭ" :string) +(merge-rule "\IeC {\u U}" "Ŭ" :string) +(merge-rule "\IeC {\v c}" "č" :string) +(merge-rule "\IeC {\v C}" "Č" :string) +(merge-rule "\IeC {\v d}" "ď" :string) +(merge-rule "\IeC {\v D}" "Ď" :string) +(merge-rule "\IeC {\v e}" "ě" :string) +(merge-rule "\IeC {\v E}" "Ě" :string) +(merge-rule "\IeC {\v l}" "ľ" :string) +(merge-rule "\IeC {\v L}" "Ľ" :string) +(merge-rule "\IeC {\v n}" "ň" :string) +(merge-rule "\IeC {\v N}" "Ň" :string) +(merge-rule "\IeC {\v r}" "ř" :string) +(merge-rule "\IeC {\v R}" "Ř" :string) +(merge-rule "\IeC {\v s}" "š" :string) +(merge-rule "\IeC {\v S}" "Š" :string) +(merge-rule "\IeC {\textasciicaron }" "ˇ" :string) +(merge-rule "\IeC {\v t}" "ť" :string) +(merge-rule "\IeC {\v T}" "Ť" :string) +(merge-rule "\IeC {\v z}" "ž" :string) +(merge-rule "\IeC {\v Z}" "Ž" :string) +(merge-rule "\IeC {\'y}" "ý" :string) +(merge-rule "\IeC {\'Y}" "Ý" :string) +(merge-rule "\IeC {\~"y}" "ÿ" :string) +(merge-rule "\IeC {\'z}" "ź" :string) +(merge-rule "\IeC {\'Z}" "Ź" :string) +(merge-rule "\IeC {\.z}" "ż" :string) +(merge-rule "\IeC {\.Z}" "Ż" :string) +;; letters not in Latin1, 2, 3 but available in TeX T1 font encoding +(merge-rule "\IeC {\~"Y}" "Ÿ" :string) +(merge-rule "\IeC {\NG }" "Ŋ" :string) +(merge-rule "\IeC {\ng }" "ŋ" :string) +(merge-rule "\IeC {\OE }" "Œ" :string) +(merge-rule "\IeC {\oe }" "œ" :string) +(merge-rule "\IeC {\IJ }" "IJ" :string) +(merge-rule "\IeC {\ij }" "ij" :string) +(merge-rule "\IeC {\j }" "ȷ" :string) +(merge-rule "\IeC {\SS }" "ẞ" :string) diff --git a/build/latex/LatinRules.xdy b/build/latex/LatinRules.xdy new file mode 100644 index 0000000..b20fbbb --- /dev/null +++ b/build/latex/LatinRules.xdy @@ -0,0 +1,611 @@ +;; Common Lisp style file for xindy +;; filename: LatinRules.xdy +;; +;; Please note that this data file deliberately uses strings +;; with single non-ascii bytes. This is intentional and +;; follows the usage observed in similar xindy support files. +;; +;; It is based upon xindy's files lang/general/utf8.xdy and +;; lang/general/utf8-lang.xdy which implement +;; "a general sorting order for Western European languages". +;; +;; The aim for Sphinx is to be able to index in a Cyrillic document +;; also terms using the Latin alphabets, inclusive of letters +;; with diacritics. To this effect the xindy rules from lang/general +;; got manually re-coded to avoid collisions with the encoding +;; done by xindy for sorting words in Cyrillic languages, which was +;; observed not to use bytes with octal encoding 0o266 or higher. +;; +;; So here we use only 0o266 or higher bytes. +;; (Ŋ, ŋ, IJ, and ij are absent from +;; lang/general/utf8.xdy and not included here.) +;; Contributed by the Sphinx team, 2018. + +(define-letter-group "A" :prefixes ("")) +(define-letter-group "B" :after "A" :prefixes ("")) +(define-letter-group "C" :after "B" :prefixes ("")) +(define-letter-group "D" :after "C" :prefixes ("")) +(define-letter-group "E" :after "D" :prefixes ("")) +(define-letter-group "F" :after "E" :prefixes ("")) +(define-letter-group "G" :after "F" :prefixes ("")) +(define-letter-group "H" :after "G" :prefixes ("")) +(define-letter-group "I" :after "H" :prefixes ("")) +(define-letter-group "J" :after "I" :prefixes ("")) +(define-letter-group "K" :after "J" :prefixes ("")) +(define-letter-group "L" :after "K" :prefixes ("")) +(define-letter-group "M" :after "L" :prefixes ("")) +(define-letter-group "N" :after "M" :prefixes ("")) +(define-letter-group "O" :after "N" :prefixes ("")) +(define-letter-group "P" :after "O" :prefixes ("")) +(define-letter-group "Q" :after "P" :prefixes ("")) +(define-letter-group "R" :after "Q" :prefixes ("")) +(define-letter-group "S" :after "R" :prefixes ("")) +(define-letter-group "T" :after "S" :prefixes ("")) +(define-letter-group "U" :after "T" :prefixes ("")) +(define-letter-group "V" :after "U" :prefixes ("")) +(define-letter-group "W" :after "V" :prefixes ("")) +(define-letter-group "X" :after "W" :prefixes ("")) +(define-letter-group "Y" :after "X" :prefixes ("")) +(define-letter-group "Z" :after "Y" :prefixes ("")) + +(define-rule-set "sphinx-xy-alphabetize" + + :rules (("À" "" :string) + ("Ă" "" :string) + ("â" "" :string) + ("Ä" "" :string) + ("à" "" :string) + ("Å" "" :string) + ("Ã" "" :string) + ("Á" "" :string) + ("á" "" :string) + ("ã" "" :string) + ("Â" "" :string) + ("ă" "" :string) + ("å" "" :string) + ("ą" "" :string) + ("ä" "" :string) + ("Ą" "" :string) + ("æ" "" :string) + ("Æ" "" :string) + ("ć" "" :string) + ("ĉ" "" :string) + ("ç" "" :string) + ("Č" "" :string) + ("č" "" :string) + ("Ĉ" "" :string) + ("Ç" "" :string) + ("Ć" "" :string) + ("ď" "" :string) + ("Đ" "" :string) + ("Ď" "" :string) + ("đ" "" :string) + ("ê" "" :string) + ("Ę" "" :string) + ("Ě" "" :string) + ("ë" "" :string) + ("ě" "" :string) + ("é" "" :string) + ("È" "" :string) + ("Ë" "" :string) + ("É" "" :string) + ("è" "" :string) + ("Ê" "" :string) + ("ę" "" :string) + ("ĝ" "" :string) + ("ğ" "" :string) + ("Ğ" "" :string) + ("Ĝ" "" :string) + ("ĥ" "" :string) + ("Ĥ" "" :string) + ("Ï" "" :string) + ("Í" "" :string) + ("ï" "" :string) + ("Î" "" :string) + ("î" "" :string) + ("ı" "" :string) + ("İ" "" :string) + ("í" "" :string) + ("Ì" "" :string) + ("ì" "" :string) + ("Ĵ" "" :string) + ("ĵ" "" :string) + ("ł" "" :string) + ("Ł" "" :string) + ("ľ" "" :string) + ("Ľ" "" :string) + ("ń" "" :string) + ("Ń" "" :string) + ("ñ" "" :string) + ("ň" "" :string) + ("Ñ" "" :string) + ("Ň" "" :string) + ("Õ" "" :string) + ("Ő" "" :string) + ("ó" "" :string) + ("ö" "" :string) + ("ô" "" :string) + ("ő" "" :string) + ("Ø" "" :string) + ("Ö" "" :string) + ("õ" "" :string) + ("Ô" "" :string) + ("ø" "" :string) + ("Ó" "" :string) + ("Ò" "" :string) + ("ò" "" :string) + ("œ" "ĺ" :string) + ("Œ" "ĺ" :string) + ("Ř" "" :string) + ("ř" "" :string) + ("Ŕ" "" :string) + ("ŕ" "" :string) + ("ŝ" "" :string) + ("Ś" "" :string) + ("ș" "" :string) + ("ş" "" :string) + ("Ŝ" "" :string) + ("ś" "" :string) + ("Ș" "" :string) + ("š" "" :string) + ("Ş" "" :string) + ("Š" "" :string) + ("ß" "" :string) + ("Ț" "" :string) + ("Ť" "" :string) + ("ț" "" :string) + ("ť" "" :string) + ("û" "" :string) + ("ŭ" "" :string) + ("ů" "" :string) + ("ű" "" :string) + ("ù" "" :string) + ("Ŭ" "" :string) + ("Ù" "" :string) + ("Ű" "" :string) + ("Ü" "" :string) + ("Ů" "" :string) + ("ú" "" :string) + ("Ú" "" :string) + ("Û" "" :string) + ("ü" "" :string) + ("ÿ" "" :string) + ("Ý" "" :string) + ("Ÿ" "" :string) + ("ý" "" :string) + ("Ż" "" :string) + ("Ž" "" :string) + ("Ź" "" :string) + ("ž" "" :string) + ("ż" "" :string) + ("ź" "" :string) + ("a" "" :string) + ("A" "" :string) + ("b" "" :string) + ("B" "" :string) + ("c" "" :string) + ("C" "" :string) + ("d" "" :string) + ("D" "" :string) + ("e" "" :string) + ("E" "" :string) + ("F" "" :string) + ("f" "" :string) + ("G" "" :string) + ("g" "" :string) + ("H" "" :string) + ("h" "" :string) + ("i" "" :string) + ("I" "" :string) + ("J" "" :string) + ("j" "" :string) + ("K" "" :string) + ("k" "" :string) + ("L" "" :string) + ("l" "" :string) + ("M" "" :string) + ("m" "" :string) + ("n" "" :string) + ("N" "" :string) + ("O" "" :string) + ("o" "" :string) + ("p" "" :string) + ("P" "" :string) + ("Q" "" :string) + ("q" "" :string) + ("r" "" :string) + ("R" "" :string) + ("S" "" :string) + ("s" "" :string) + ("t" "" :string) + ("T" "" :string) + ("u" "" :string) + ("U" "" :string) + ("v" "" :string) + ("V" "" :string) + ("W" "" :string) + ("w" "" :string) + ("x" "" :string) + ("X" "" :string) + ("Y" "" :string) + ("y" "" :string) + ("z" "" :string) + ("Z" "" :string) + )) + +(define-rule-set "sphinx-xy-resolve-diacritics" + + :rules (("Ĥ" "" :string) + ("ó" "" :string) + ("ľ" "" :string) + ("Ř" "" :string) + ("ĝ" "" :string) + ("ď" "" :string) + ("Ě" "" :string) + ("ĥ" "" :string) + ("Č" "" :string) + ("Ĵ" "" :string) + ("ě" "" :string) + ("ž" "" :string) + ("Ď" "" :string) + ("ř" "" :string) + ("Ž" "" :string) + ("ı" "" :string) + ("Ť" "" :string) + ("á" "" :string) + ("č" "" :string) + ("Á" "" :string) + ("ň" "" :string) + ("Š" "" :string) + ("Ň" "" :string) + ("ĵ" "" :string) + ("ť" "" :string) + ("Ó" "" :string) + ("ý" "" :string) + ("Ĝ" "" :string) + ("Ú" "" :string) + ("Ľ" "" :string) + ("š" "" :string) + ("Ý" "" :string) + ("ú" "" :string) + ("Ś" "" :string) + ("ć" "" :string) + ("Ł" "" :string) + ("ł" "" :string) + ("ń" "" :string) + ("À" "" :string) + ("Ź" "" :string) + ("à" "" :string) + ("Ń" "" :string) + ("Đ" "" :string) + ("ÿ" "" :string) + ("ś" "" :string) + ("Ğ" "" :string) + ("ğ" "" :string) + ("Ù" "" :string) + ("İ" "" :string) + ("đ" "" :string) + ("ù" "" :string) + ("Ț" "" :string) + ("é" "" :string) + ("ŕ" "" :string) + ("Ć" "" :string) + ("ț" "" :string) + ("ò" "" :string) + ("ź" "" :string) + ("Ò" "" :string) + ("Ÿ" "" :string) + ("Ŕ" "" :string) + ("É" "" :string) + ("ĉ" "" :string) + ("ô" "" :string) + ("Í" "" :string) + ("ŝ" "" :string) + ("Ż" "" :string) + ("Ă" "" :string) + ("Ŝ" "" :string) + ("ñ" "" :string) + ("ŭ" "" :string) + ("í" "" :string) + ("È" "" :string) + ("Ô" "" :string) + ("Ŭ" "" :string) + ("ż" "" :string) + ("Ñ" "" :string) + ("è" "" :string) + ("Ĉ" "" :string) + ("ă" "" :string) + ("â" "" :string) + ("û" "" :string) + ("ê" "" :string) + ("Õ" "" :string) + ("õ" "" :string) + ("ș" "" :string) + ("ç" "" :string) + ("Â" "" :string) + ("Ê" "" :string) + ("Û" "" :string) + ("Ç" "" :string) + ("ì" "" :string) + ("Ì" "" :string) + ("Ș" "" :string) + ("ö" "" :string) + ("Ö" "" :string) + ("ş" "" :string) + ("ů" "" :string) + ("ë" "" :string) + ("ã" "" :string) + ("î" "" :string) + ("Î" "" :string) + ("Ã" "" :string) + ("Ş" "" :string) + ("Ů" "" :string) + ("Ë" "" :string) + ("ï" "" :string) + ("Ő" "" :string) + ("Ï" "" :string) + ("Ę" "" :string) + ("ő" "" :string) + ("Ü" "" :string) + ("Å" "" :string) + ("ü" "" :string) + ("ę" "" :string) + ("å" "" :string) + ("Ä" "" :string) + ("ű" "" :string) + ("Ø" "" :string) + ("ø" "" :string) + ("Ű" "" :string) + ("ä" "" :string) + ("Ą" "" :string) + ("ą" "" :string) + ("œ" "" :string) + ("ß" "" :string) + ("Æ" "" :string) + ("Œ" "" :string) + ("æ" "" :string) + ("e" "" :string) + ("t" "" :string) + ("L" "" :string) + ("Y" "" :string) + ("J" "" :string) + ("a" "" :string) + ("p" "" :string) + ("u" "" :string) + ("j" "" :string) + ("b" "" :string) + ("G" "" :string) + ("U" "" :string) + ("F" "" :string) + ("H" "" :string) + ("i" "" :string) + ("z" "" :string) + ("c" "" :string) + ("l" "" :string) + ("A" "" :string) + ("Q" "" :string) + ("w" "" :string) + ("D" "" :string) + ("R" "" :string) + ("d" "" :string) + ("s" "" :string) + ("r" "" :string) + ("k" "" :string) + ("v" "" :string) + ("m" "" :string) + ("P" "" :string) + ("y" "" :string) + ("K" "" :string) + ("q" "" :string) + ("S" "" :string) + ("I" "" :string) + ("C" "" :string) + ("M" "" :string) + ("Z" "" :string) + ("T" "" :string) + ("W" "" :string) + ("B" "" :string) + ("h" "" :string) + ("x" "" :string) + ("X" "" :string) + ("f" "" :string) + ("E" "" :string) + ("V" "" :string) + ("N" "" :string) + ("O" "" :string) + ("o" "" :string) + ("g" "" :string) + ("n" "" :string) + )) + +(define-rule-set "sphinx-xy-resolve-case" + + :rules (("Ú" "8" :string) + ("Ÿ" "8" :string) + ("Ç" "8" :string) + ("Ĉ" "8" :string) + ("Ŕ" "8" :string) + ("Ľ" "8" :string) + ("Ů" "8" :string) + ("Ý" "8" :string) + ("É" "8" :string) + ("Ë" "8" :string) + ("Ș" "8" :string) + ("Ì" "8" :string) + ("Ê" "8" :string) + ("Ň" "8" :string) + ("Ą" "8" :string) + ("Š" "8" :string) + ("Û" "8" :string) + ("Ş" "8" :string) + ("Ć" "8" :string) + ("Ò" "8" :string) + ("Ĝ" "8" :string) + ("Ñ" "8" :string) + ("Ó" "8" :string) + ("Î" "8" :string) + ("Á" "8" :string) + ("Ã" "8" :string) + ("Ț" "8" :string) + ("Å" "8" :string) + ("Ğ" "8" :string) + ("Ü" "8" :string) + ("È" "8" :string) + ("Ô" "8" :string) + ("İ" "8" :string) + ("Ű" "8" :string) + ("Ù" "8" :string) + ("Ŭ" "8" :string) + ("Â" "8" :string) + ("Ť" "8" :string) + ("Ń" "8" :string) + ("Ď" "8" :string) + ("Ź" "8" :string) + ("Ž" "8" :string) + ("Đ" "8" :string) + ("Ŝ" "8" :string) + ("Č" "8" :string) + ("Ĵ" "8" :string) + ("Ö" "8" :string) + ("Ø" "8" :string) + ("Ż" "8" :string) + ("Ł" "8" :string) + ("Ă" "8" :string) + ("Ě" "8" :string) + ("Ő" "8" :string) + ("Õ" "8" :string) + ("Ę" "8" :string) + ("Ï" "8" :string) + ("À" "8" :string) + ("Ĥ" "8" :string) + ("Ä" "8" :string) + ("Ś" "8" :string) + ("Ř" "8" :string) + ("Í" "8" :string) + ("Œ" "89" :string) + ("Æ" "89" :string) + ("ì" "9" :string) + ("è" "9" :string) + ("ą" "9" :string) + ("š" "9" :string) + ("ú" "9" :string) + ("å" "9" :string) + ("ă" "9" :string) + ("ę" "9" :string) + ("ü" "9" :string) + ("ź" "9" :string) + ("ò" "9" :string) + ("ť" "9" :string) + ("ț" "9" :string) + ("ĵ" "9" :string) + ("ŕ" "9" :string) + ("ż" "9" :string) + ("ä" "9" :string) + ("ý" "9" :string) + ("ù" "9" :string) + ("á" "9" :string) + ("é" "9" :string) + ("č" "9" :string) + ("ň" "9" :string) + ("ś" "9" :string) + ("ø" "9" :string) + ("í" "9" :string) + ("đ" "9" :string) + ("ı" "9" :string) + ("ğ" "9" :string) + ("î" "9" :string) + ("ã" "9" :string) + ("à" "9" :string) + ("ř" "9" :string) + ("ő" "9" :string) + ("ů" "9" :string) + ("ș" "9" :string) + ("ÿ" "9" :string) + ("ë" "9" :string) + ("ŭ" "9" :string) + ("ç" "9" :string) + ("ű" "9" :string) + ("ñ" "9" :string) + ("õ" "9" :string) + ("ě" "9" :string) + ("ş" "9" :string) + ("ž" "9" :string) + ("ĝ" "9" :string) + ("ŝ" "9" :string) + ("ń" "9" :string) + ("û" "9" :string) + ("ł" "9" :string) + ("ď" "9" :string) + ("ĥ" "9" :string) + ("ê" "9" :string) + ("ô" "9" :string) + ("ĉ" "9" :string) + ("â" "9" :string) + ("ć" "9" :string) + ("ï" "9" :string) + ("ö" "9" :string) + ("ľ" "9" :string) + ("ó" "9" :string) + ("æ" "99" :string) + ("ß" "99" :string) + ("œ" "99" :string) + ("N" "8" :string) + ("V" "8" :string) + ("O" "8" :string) + ("X" "8" :string) + ("E" "8" :string) + ("P" "8" :string) + ("K" "8" :string) + ("T" "8" :string) + ("Z" "8" :string) + ("M" "8" :string) + ("C" "8" :string) + ("I" "8" :string) + ("S" "8" :string) + ("B" "8" :string) + ("W" "8" :string) + ("D" "8" :string) + ("R" "8" :string) + ("H" "8" :string) + ("F" "8" :string) + ("Q" "8" :string) + ("A" "8" :string) + ("G" "8" :string) + ("U" "8" :string) + ("J" "8" :string) + ("Y" "8" :string) + ("L" "8" :string) + ("o" "9" :string) + ("n" "9" :string) + ("g" "9" :string) + ("x" "9" :string) + ("f" "9" :string) + ("y" "9" :string) + ("q" "9" :string) + ("h" "9" :string) + ("w" "9" :string) + ("s" "9" :string) + ("d" "9" :string) + ("v" "9" :string) + ("k" "9" :string) + ("r" "9" :string) + ("m" "9" :string) + ("z" "9" :string) + ("c" "9" :string) + ("i" "9" :string) + ("l" "9" :string) + ("b" "9" :string) + ("j" "9" :string) + ("a" "9" :string) + ("p" "9" :string) + ("u" "9" :string) + ("t" "9" :string) + ("e" "9" :string) + )) + +(use-rule-set :run 0 + :rule-set ("sphinx-xy-alphabetize")) +(use-rule-set :run 1 + :rule-set ("sphinx-xy-resolve-diacritics")) +(use-rule-set :run 2 + :rule-set ("sphinx-xy-resolve-case")) diff --git a/build/latex/Makefile b/build/latex/Makefile new file mode 100644 index 0000000..3d4f1c9 --- /dev/null +++ b/build/latex/Makefile @@ -0,0 +1,65 @@ +# Makefile for Sphinx LaTeX output + +ALLDOCS = $(basename $(wildcard *.tex)) +ALLPDF = $(addsuffix .pdf,$(ALLDOCS)) +ALLDVI = $(addsuffix .dvi,$(ALLDOCS)) +ALLXDV = +ALLPS = $(addsuffix .ps,$(ALLDOCS)) + +# Prefix for archive names +ARCHIVEPREFIX = +# Additional LaTeX options (passed via variables in latexmkrc/latexmkjarc file) +export LATEXOPTS ?= +# Additional latexmk options +LATEXMKOPTS ?= +# format: pdf or dvi (used only by archive targets) +FMT = pdf + +LATEX = latexmk -dvi +PDFLATEX = latexmk -pdf -dvi- -ps- + + +%.dvi: %.tex FORCE_MAKE + $(LATEX) $(LATEXMKOPTS) '$<' + +%.ps: %.dvi + dvips '$<' + +%.pdf: %.tex FORCE_MAKE + $(PDFLATEX) $(LATEXMKOPTS) '$<' + +all: $(ALLPDF) + +all-dvi: $(ALLDVI) + +all-ps: $(ALLPS) + +all-pdf: $(ALLPDF) + +zip: all-$(FMT) + mkdir $(ARCHIVEPREFIX)docs-$(FMT) + cp $(ALLPDF) $(ARCHIVEPREFIX)docs-$(FMT) + zip -q -r -9 $(ARCHIVEPREFIX)docs-$(FMT).zip $(ARCHIVEPREFIX)docs-$(FMT) + rm -r $(ARCHIVEPREFIX)docs-$(FMT) + +tar: all-$(FMT) + mkdir $(ARCHIVEPREFIX)docs-$(FMT) + cp $(ALLPDF) $(ARCHIVEPREFIX)docs-$(FMT) + tar cf $(ARCHIVEPREFIX)docs-$(FMT).tar $(ARCHIVEPREFIX)docs-$(FMT) + rm -r $(ARCHIVEPREFIX)docs-$(FMT) + +gz: tar + # -n to omit mtime from gzip headers + gzip -n -9 < $(ARCHIVEPREFIX)docs-$(FMT).tar > $(ARCHIVEPREFIX)docs-$(FMT).tar.gz + +bz2: tar + bzip2 -9 -k $(ARCHIVEPREFIX)docs-$(FMT).tar + +xz: tar + xz -9 -k $(ARCHIVEPREFIX)docs-$(FMT).tar + +clean: + rm -f *.log *.ind *.aux *.toc *.syn *.idx *.out *.ilg *.pla *.ps *.tar *.tar.gz *.tar.bz2 *.tar.xz $(ALLPDF) $(ALLDVI) $(ALLXDV) *.fls *.fdb_latexmk + +.PHONY: all all-pdf all-dvi all-ps clean zip tar gz bz2 xz +.PHONY: FORCE_MAKE \ No newline at end of file diff --git a/build/latex/esp32-s3arduinouno.aux b/build/latex/esp32-s3arduinouno.aux new file mode 100644 index 0000000..1dbdb93 --- /dev/null +++ b/build/latex/esp32-s3arduinouno.aux @@ -0,0 +1,9 @@ +\relax +\providecommand\babel@aux[2]{} +\@nameuse{bbl@beforestart} +\providecommand\hyper@newdestlabel[2]{} +\providecommand\HyField@AuxAddToFields[1]{} +\providecommand\HyField@AuxAddToCoFields[2]{} +\babel@aux{english}{} +\newlabel{index::doc}{{}{1}{}{section*.2}{}} +\gdef \@abspage@last{6} diff --git a/build/latex/esp32-s3arduinouno.fdb_latexmk b/build/latex/esp32-s3arduinouno.fdb_latexmk new file mode 100644 index 0000000..0ca326d --- /dev/null +++ b/build/latex/esp32-s3arduinouno.fdb_latexmk @@ -0,0 +1,41 @@ +# Fdb version 4 +["pdflatex"] 1728970846.01925 "esp32-s3arduinouno.tex" "esp32-s3arduinouno.pdf" "esp32-s3arduinouno" 1728970853.29637 2 + "/usr/share/texmf-dist/fonts/tfm/jknappen/ec/ecrm1000.tfm" 1716849630 3584 adb004a0c8e7c46ee66cad73671f37b4 "" + "/usr/share/texmf-dist/tex/generic/babel-english/english.ldf" 1716849630 7008 9ff5fdcc865b01beca2b0fe4a46231d4 "" + "/usr/share/texmf-dist/tex/generic/babel/babel.sty" 1716849630 146276 10a40dabec03ce18494af0c3a51bcbdc "" + "/usr/share/texmf-dist/tex/generic/babel/locale/en/babel-en.ini" 1716849630 3966 caeee5a9e5771d4446aa1ca9015ba1b2 "" + "/usr/share/texmf-dist/tex/generic/babel/locale/en/babel-english.tex" 1716849630 336 ed676b5e7dfd862bc78d634f6a973f37 "" + "/usr/share/texmf-dist/tex/generic/babel/txtbabel.def" 1716849630 6948 df63e25be1d2bc35bbad5a0141f41348 "" + "/usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty" 1716849630 17865 1a9bd36b4f98178fa551aca822290953 "" + "/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty" 1716849630 5949 3f3fd50a8cc94c3d4cbf4fc66cd3df1c "" + "/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty" 1716849630 13829 94730e64147574077f8ecfea9bb69af4 "" + "/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty" 1716849630 2222 499d61426192c39efd8f410ee1a52b9c "" + "/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty" 1716849630 4173 82ac04dfb1256038fad068287fbb4fe6 "" + "/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty" 1716849630 88371 d84032c0f422c3d1e282266c01bef237 "" + "/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty" 1716849630 4474 b811654f4bf125f11506d13d13647efb "" + "/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty" 1716849630 2444 0d0c1ee65478277e8015d65b86983da2 "" + "/usr/share/texmf-dist/tex/latex/base/fontenc.sty" 1716849630 5119 a04a8b68ab4f6ce800a41f7f8012a10e "" + "/usr/share/texmf-dist/tex/latex/base/inputenc.sty" 1716849630 5048 425739d70251273bf93e3d51f3c40048 "" + "/usr/share/texmf-dist/tex/latex/base/report.cls" 1716849630 23203 f5d913095ece2233436f0e628619cd37 "" + "/usr/share/texmf-dist/tex/latex/base/size10.clo" 1716849630 8448 dbc0dbf4156c0bb9ba01a1c685d3bad0 "" + "/usr/share/texmf-dist/tex/latex/base/textcomp.sty" 1716849630 2894 fc64867f9d198785eabe71a88276a9cb "" + "/usr/share/texmf-dist/tex/latex/cmap/cmap.sty" 1716849630 3574 ddc11a0ae1c579d351ed20d2319ad422 "" + "/usr/share/texmf-dist/tex/latex/cmap/t1.cmap" 1716849630 1938 beaa4a8467aa0074076e0e19f2992e29 "" + "/usr/share/texmf-dist/tex/latex/graphics/keyval.sty" 1716849630 2671 7e67d78d9b88c845599a85b2d41f2e39 "" + "/usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty" 1716849630 220920 fd3cbb5f1a2bc9b8f451b8b7d8171264 "" + "/usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty" 1716849630 22555 6d8e155cfef6d82c3d5c742fea7c992e "" + "/usr/share/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty" 1716849630 13815 760b0c02f691ea230f5359c4e1de23a7 "" + "/usr/share/texmf-dist/tex/latex/tex-gyre/tgheros.sty" 1716849630 2130 2b41e80713f78d339e74c19d96fe70a1 "" + "/usr/share/texmf-dist/tex/latex/tex-gyre/tgtermes.sty" 1716849630 2211 af9b7d12507105a58a3e8e926996b827 "" + "/usr/share/texmf-dist/web2c/texmf.cnf" 1716849630 41588 b43d3e860a4f94167ee1e725ff526a72 "" + "/var/lib/texmf/web2c/pdftex/pdflatex.fmt" 1728647023 7113011 32ce5440ae508322d0b9b7d77562c7f6 "" + "esp32-s3arduinouno.aux" 1728970768.74 287 61bc2ecbcf986866032916e435499230 "pdflatex" + "esp32-s3arduinouno.tex" 1728970727.72329 2534 3ce9a95ba0db1b277ad51b3a829fb4b6 "" + "fncychap.sty" 0 -1 0 "" + "sphinx.sty" 1728119676.89811 50659 6d393be3f369a7862f0b19a359f1ab89 "" + "sphinxmanual.cls" 1728119676.90477 4241 7b0d7a37df7b5715fb0dbd585c52ecdb "" + (generated) + "esp32-s3arduinouno.aux" + "esp32-s3arduinouno.log" + "esp32-s3arduinouno.pdf" + (rewritten before read) diff --git a/build/latex/esp32-s3arduinouno.fls b/build/latex/esp32-s3arduinouno.fls new file mode 100644 index 0000000..1cee88d --- /dev/null +++ b/build/latex/esp32-s3arduinouno.fls @@ -0,0 +1,62 @@ +PWD /home/alex/Development/ESP32-S3_Arduino-Uno/build/latex +INPUT /usr/share/texmf-dist/web2c/texmf.cnf +INPUT /var/lib/texmf/web2c/pdftex/pdflatex.fmt +INPUT esp32-s3arduinouno.tex +OUTPUT esp32-s3arduinouno.log +INPUT ./sphinxmanual.cls +INPUT sphinxmanual.cls +INPUT /usr/share/texmf-dist/tex/latex/base/report.cls +INPUT /usr/share/texmf-dist/tex/latex/base/report.cls +INPUT /usr/share/texmf-dist/tex/latex/base/size10.clo +INPUT /usr/share/texmf-dist/tex/latex/base/size10.clo +INPUT /usr/share/texmf-dist/tex/latex/base/size10.clo +INPUT /usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty +INPUT ./sphinx.sty +INPUT /usr/share/texmf-dist/tex/latex/base/textcomp.sty +INPUT /usr/share/texmf-dist/tex/latex/base/inputenc.sty +INPUT /usr/share/texmf-dist/tex/latex/base/inputenc.sty +INPUT /usr/share/texmf-dist/tex/latex/cmap/cmap.sty +INPUT /usr/share/texmf-dist/tex/latex/cmap/cmap.sty +INPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty +INPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty +INPUT /usr/share/texmf-dist/fonts/tfm/jknappen/ec/ecrm1000.tfm +INPUT /usr/share/texmf-dist/tex/latex/cmap/t1.cmap +INPUT /usr/share/texmf-dist/tex/latex/cmap/t1.cmap +OUTPUT esp32-s3arduinouno.pdf +INPUT /usr/share/texmf-dist/tex/latex/cmap/t1.cmap +INPUT /usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty +INPUT /usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/share/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/share/texmf-dist/tex/latex/amsmath/amstext.sty +INPUT /usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty +INPUT /usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty +INPUT /usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty +INPUT /usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty +INPUT /usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty +INPUT /usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty +INPUT /usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty +INPUT /usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty +INPUT /usr/share/texmf-dist/tex/generic/babel/babel.sty +INPUT /usr/share/texmf-dist/tex/generic/babel/babel.sty +INPUT /usr/share/texmf-dist/tex/generic/babel/txtbabel.def +INPUT /usr/share/texmf-dist/tex/generic/babel-english/english.ldf +INPUT /usr/share/texmf-dist/tex/generic/babel-english/english.ldf +INPUT /usr/share/texmf-dist/tex/generic/babel-english/english.ldf +INPUT /usr/share/texmf-dist/tex/generic/babel/locale/en/babel-english.tex +INPUT /usr/share/texmf-dist/tex/generic/babel/locale/en/babel-english.tex +INPUT /usr/share/texmf-dist/tex/generic/babel/locale/en/babel-english.tex +INPUT /usr/share/texmf-dist/tex/generic/babel/locale/en/babel-en.ini +INPUT /usr/share/texmf-dist/tex/latex/tex-gyre/tgtermes.sty +INPUT /usr/share/texmf-dist/tex/latex/tex-gyre/tgtermes.sty +INPUT /usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty +INPUT /usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +INPUT /usr/share/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +INPUT /usr/share/texmf-dist/tex/latex/tex-gyre/tgheros.sty +INPUT /usr/share/texmf-dist/tex/latex/tex-gyre/tgheros.sty diff --git a/build/latex/esp32-s3arduinouno.idx b/build/latex/esp32-s3arduinouno.idx new file mode 100644 index 0000000..e69de29 diff --git a/build/latex/esp32-s3arduinouno.ilg b/build/latex/esp32-s3arduinouno.ilg new file mode 100644 index 0000000..3e41fcb --- /dev/null +++ b/build/latex/esp32-s3arduinouno.ilg @@ -0,0 +1,5 @@ +This is makeindex, version 2.17 [TeX Live 2024] (kpathsea + Thai support). +Scanning style file ./python.ist.......done (7 attributes redefined, 0 ignored). +Scanning input file esp32-s3arduinouno.idx...done (0 entries accepted, 0 rejected). +Nothing written in esp32-s3arduinouno.ind. +Transcript written in esp32-s3arduinouno.ilg. diff --git a/build/latex/esp32-s3arduinouno.ind b/build/latex/esp32-s3arduinouno.ind new file mode 100644 index 0000000..e69de29 diff --git a/build/latex/esp32-s3arduinouno.log b/build/latex/esp32-s3arduinouno.log new file mode 100644 index 0000000..c6bdc4a --- /dev/null +++ b/build/latex/esp32-s3arduinouno.log @@ -0,0 +1,203 @@ +This is pdfTeX, Version 3.141592653-2.6-1.40.26 (TeX Live 2024/Arch Linux) (preloaded format=pdflatex 2024.10.11) 15 OCT 2024 01:40 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**esp32-s3arduinouno.tex +(./esp32-s3arduinouno.tex +LaTeX2e <2023-11-01> patch level 1 +L3 programming layer <2024-02-20> +(./sphinxmanual.cls +Document Class: sphinxmanual 2019/12/01 v2.3.0 Document class (Sphinx manual) +(/usr/share/texmf-dist/tex/latex/base/report.cls +Document Class: report 2023/05/17 v1.4n Standard LaTeX document class +(/usr/share/texmf-dist/tex/latex/base/size10.clo +File: size10.clo 2023/05/17 v1.4n Standard LaTeX file (size option) +) +\c@part=\count188 +\c@chapter=\count189 +\c@section=\count190 +\c@subsection=\count191 +\c@subsubsection=\count192 +\c@paragraph=\count193 +\c@subparagraph=\count194 +\c@figure=\count195 +\c@table=\count196 +\abovecaptionskip=\skip48 +\belowcaptionskip=\skip49 +\bibindent=\dimen140 +) +LaTeX Info: Redefining \and on input line 35. +) +(/usr/share/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2021/02/14 v1.3d Input encoding file +\inpenc@prehook=\toks17 +\inpenc@posthook=\toks18 +) + defining Unicode char U+00A0 (decimal 160) + defining Unicode char U+2500 (decimal 9472) + defining Unicode char U+2502 (decimal 9474) + defining Unicode char U+2514 (decimal 9492) + defining Unicode char U+251C (decimal 9500) + defining Unicode char U+2572 (decimal 9586) + +(/usr/share/texmf-dist/tex/latex/cmap/cmap.sty +Package: cmap 2021/02/06 v1.0j CMap support: searchable PDF +) +(/usr/share/texmf-dist/tex/latex/base/fontenc.sty +Package: fontenc 2021/04/29 v2.0v Standard LaTeX package +<>) +(/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2023/05/13 v2.17o AMS math features +\@mathmargin=\skip50 + +For additional information on amsmath, use the `?' option. +(/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2021/08/26 v2.01 AMS text + +(/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks19 +\ex@=\dimen141 +)) +(/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen142 +) +(/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2022/04/08 v2.04 operator names +) +\inf@bad=\count197 +LaTeX Info: Redefining \frac on input line 234. +\uproot@=\count198 +\leftroot@=\count199 +LaTeX Info: Redefining \overline on input line 399. +LaTeX Info: Redefining \colon on input line 410. +\classnum@=\count266 +\DOTSCASE@=\count267 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box51 +\strutbox@=\box52 +LaTeX Info: Redefining \big on input line 722. +LaTeX Info: Redefining \Big on input line 723. +LaTeX Info: Redefining \bigg on input line 724. +LaTeX Info: Redefining \Bigg on input line 725. +\big@size=\dimen143 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count268 +LaTeX Info: Redefining \bmod on input line 905. +LaTeX Info: Redefining \pmod on input line 910. +LaTeX Info: Redefining \smash on input line 940. +LaTeX Info: Redefining \relbar on input line 970. +LaTeX Info: Redefining \Relbar on input line 971. +\c@MaxMatrixCols=\count269 +\dotsspace@=\muskip16 +\c@parentequation=\count270 +\dspbrk@lvl=\count271 +\tag@help=\toks20 +\row@=\count272 +\column@=\count273 +\maxfields@=\count274 +\andhelp@=\toks21 +\eqnshift@=\dimen144 +\alignsep@=\dimen145 +\tagshift@=\dimen146 +\tagwidth@=\dimen147 +\totwidth@=\dimen148 +\lineht@=\dimen149 +\@envbody=\toks22 +\multlinegap=\skip51 +\multlinetaggap=\skip52 +\mathdisplay@stack=\toks23 +LaTeX Info: Redefining \[ on input line 2953. +LaTeX Info: Redefining \] on input line 2954. +) +(/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/share/texmf-dist/tex/generic/babel/babel.sty +Package: babel 2024/02/07 v24.2 The Babel package +\babel@savecnt=\count275 +\U@D=\dimen150 +\l@unhyphenated=\language5 + +(/usr/share/texmf-dist/tex/generic/babel/txtbabel.def) +\bbl@readstream=\read2 +\bbl@dirlevel=\count276 + +(/usr/share/texmf-dist/tex/generic/babel-english/english.ldf +Language: english 2017/06/06 v3.3r English support from the babel system +Package babel Info: Hyphen rules for 'british' set to \l@english +(babel) (\language0). Reported on input line 82. +Package babel Info: Hyphen rules for 'UKenglish' set to \l@english +(babel) (\language0). Reported on input line 83. +Package babel Info: Hyphen rules for 'canadian' set to \l@english +(babel) (\language0). Reported on input line 102. +Package babel Info: Hyphen rules for 'australian' set to \l@english +(babel) (\language0). Reported on input line 105. +Package babel Info: Hyphen rules for 'newzealand' set to \l@english +(babel) (\language0). Reported on input line 108. +)) +(/usr/share/texmf-dist/tex/generic/babel/locale/en/babel-english.tex +Package babel Info: Importing font and identification data for english +(babel) from babel-en.ini. Reported on input line 11. +) +(/usr/share/texmf-dist/tex/latex/tex-gyre/tgtermes.sty +Package: tgtermes 2009/09/27 v1.2 TeX Gyre Termes as default roman family + +(/usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2022-06-15 v3.15 Key value format for package options (HO) + +(/usr/share/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2022/05/29 v1.15 key=value parser (DPC) +\KV@toks@=\toks24 +) +(/usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2023-12-04 v1.26 LaTeX kernel commands for general use (HO) +) +(/usr/share/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2022-10-05 v1.19 Key value parser (HO) +))) +(/usr/share/texmf-dist/tex/latex/tex-gyre/tgheros.sty +Package: tgheros 2009/09/27 v1.2 TeX Gyre Heros as default sans serif family +) + +! LaTeX Error: File `fncychap.sty' not found. + +Type X to quit or to proceed, +or enter new name. (Default extension: sty) + +Enter file name: ^^[[A +! Interruption. + + } +l.46 \usepackage + {sphinx}^^M +? +! Emergency stop. + + } +l.46 \usepackage + {sphinx}^^M +End of file on the terminal! + + +Here is how much of TeX's memory you used: + 3239 strings out of 476076 + 48124 string characters out of 5793774 + 1925187 words of memory out of 5000000 + 25358 multiletter control sequences out of 15000+600000 + 558832 words of font info for 37 fonts, out of 8000000 for 9000 + 14 hyphenation exceptions out of 8191 + 57i,0n,65p,232b,103s stack positions out of 10000i,1000n,20000p,200000b,200000s +! ==> Fatal error occurred, no output PDF file produced! diff --git a/build/latex/esp32-s3arduinouno.out b/build/latex/esp32-s3arduinouno.out new file mode 100644 index 0000000..e69de29 diff --git a/build/latex/esp32-s3arduinouno.tex b/build/latex/esp32-s3arduinouno.tex new file mode 100644 index 0000000..8aa0b41 --- /dev/null +++ b/build/latex/esp32-s3arduinouno.tex @@ -0,0 +1,99 @@ +%% Generated by Sphinx. +\def\sphinxdocclass{report} +\documentclass[letterpaper,10pt,english]{sphinxmanual} +\ifdefined\pdfpxdimen + \let\sphinxpxdimen\pdfpxdimen\else\newdimen\sphinxpxdimen +\fi \sphinxpxdimen=.75bp\relax +\ifdefined\pdfimageresolution + \pdfimageresolution= \numexpr \dimexpr1in\relax/\sphinxpxdimen\relax +\fi +%% let collapsible pdf bookmarks panel have high depth per default +\PassOptionsToPackage{bookmarksdepth=5}{hyperref} + +\PassOptionsToPackage{booktabs}{sphinx} +\PassOptionsToPackage{colorrows}{sphinx} + +\PassOptionsToPackage{warn}{textcomp} +\usepackage[utf8]{inputenc} +\ifdefined\DeclareUnicodeCharacter +% support both utf8 and utf8x syntaxes + \ifdefined\DeclareUnicodeCharacterAsOptional + \def\sphinxDUC#1{\DeclareUnicodeCharacter{"#1}} + \else + \let\sphinxDUC\DeclareUnicodeCharacter + \fi + \sphinxDUC{00A0}{\nobreakspace} + \sphinxDUC{2500}{\sphinxunichar{2500}} + \sphinxDUC{2502}{\sphinxunichar{2502}} + \sphinxDUC{2514}{\sphinxunichar{2514}} + \sphinxDUC{251C}{\sphinxunichar{251C}} + \sphinxDUC{2572}{\textbackslash} +\fi +\usepackage{cmap} +\usepackage[T1]{fontenc} +\usepackage{amsmath,amssymb,amstext} +\usepackage{babel} + + + +\usepackage{tgtermes} +\usepackage{tgheros} +\renewcommand{\ttdefault}{txtt} + + + +\usepackage[Bjarne]{fncychap} +\usepackage{sphinx} + +\fvset{fontsize=auto} +\usepackage{geometry} + + +% Include hyperref last. +\usepackage{hyperref} +% Fix anchor placement for figures with captions. +\usepackage{hypcap}% it must be loaded after hyperref. +% Set up styles of URL: it should be placed after hyperref. +\urlstyle{same} + +\addto\captionsenglish{\renewcommand{\contentsname}{Contents:}} + +\usepackage{sphinxmessages} +\setcounter{tocdepth}{1} + + + +\title{ESP32\sphinxhyphen{}S3 Arduino Uno} +\date{Oct 15, 2024} +\release{1.0} +\author{Alexander Bobkov} +\newcommand{\sphinxlogo}{\vbox{}} +\renewcommand{\releasename}{Release} +\makeindex +\begin{document} + +\ifdefined\shorthandoff + \ifnum\catcode`\=\string=\active\shorthandoff{=}\fi + \ifnum\catcode`\"=\active\shorthandoff{"}\fi +\fi + +\pagestyle{empty} +\sphinxmaketitle +\pagestyle{plain} +\sphinxtableofcontents +\pagestyle{normal} +\phantomsection\label{\detokenize{index::doc}} + + +\noindent\sphinxincludegraphics[width=600\sphinxpxdimen]{{ESP32-Uno}.png} + +\sphinxAtStartPar +Add your content using \sphinxcode{\sphinxupquote{reStructuredText}} syntax. See the +\sphinxhref{https://www.sphinx-doc.org/en/master/usage/restructuredtext/index.html}{reStructuredText} +documentation for details. + + + +\renewcommand{\indexname}{Index} +\printindex +\end{document} \ No newline at end of file diff --git a/build/latex/esp32-s3arduinouno.toc b/build/latex/esp32-s3arduinouno.toc new file mode 100644 index 0000000..9fbdd18 --- /dev/null +++ b/build/latex/esp32-s3arduinouno.toc @@ -0,0 +1 @@ +\babel@toc {english}{}\relax diff --git a/build/latex/latexmkjarc b/build/latex/latexmkjarc new file mode 100644 index 0000000..6e36b19 --- /dev/null +++ b/build/latex/latexmkjarc @@ -0,0 +1,22 @@ +$latex = 'pdflatex ' . $ENV{'LATEXOPTS'} . ' -kanji=utf8 %O %S'; +$dvipdf = 'dvipdfmx %O -o %D %S'; +$makeindex = 'internal mendex %S %B %D'; +sub mendex { + my ($source, $basename, $destination) = @_; + my $dictfile = $basename . ".dic"; + unlink($destination); + system("mendex", "-U", "-f", "-d", $dictfile, "-s", "python.ist", $source); + if ($? > 0) { + print("mendex exited with error code $? (ignored)\n"); + } + if (!-e $destination) { + # create an empty .ind file if nothing + open(FH, ">" . $destination); + close(FH); + } + return 0; +} +add_cus_dep( "glo", "gls", 0, "makeglo" ); +sub makeglo { + return system( "mendex -J -f -s gglo.ist -o '$_[0].gls' '$_[0].glo'" ); +} \ No newline at end of file diff --git a/build/latex/latexmkrc b/build/latex/latexmkrc new file mode 100644 index 0000000..bba17fa --- /dev/null +++ b/build/latex/latexmkrc @@ -0,0 +1,9 @@ +$latex = 'latex ' . $ENV{'LATEXOPTS'} . ' %O %S'; +$pdflatex = 'pdflatex ' . $ENV{'LATEXOPTS'} . ' %O %S'; +$lualatex = 'lualatex ' . $ENV{'LATEXOPTS'} . ' %O %S'; +$xelatex = 'xelatex --no-pdf ' . $ENV{'LATEXOPTS'} . ' %O %S'; +$makeindex = 'makeindex -s python.ist %O -o %D %S'; +add_cus_dep( "glo", "gls", 0, "makeglo" ); +sub makeglo { + return system( "makeindex -s gglo.ist -o '$_[0].gls' '$_[0].glo'" ); +} \ No newline at end of file diff --git a/build/latex/make.bat b/build/latex/make.bat new file mode 100644 index 0000000..94bda21 --- /dev/null +++ b/build/latex/make.bat @@ -0,0 +1,31 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +pushd %~dp0 + +set PDFLATEX=latexmk -pdf -dvi- -ps- + +set "LATEXOPTS= " + +if "%1" == "" goto all-pdf + +if "%1" == "all-pdf" ( + :all-pdf + for %%i in (*.tex) do ( + %PDFLATEX% %LATEXMKOPTS% %%i + ) + goto end +) + +if "%1" == "all-pdf-ja" ( + goto all-pdf +) + +if "%1" == "clean" ( + del /q /s *.dvi *.log *.ind *.aux *.toc *.syn *.idx *.out *.ilg *.pla *.ps *.tar *.tar.gz *.tar.bz2 *.tar.xz *.fls *.fdb_latexmk + goto end +) + +:end +popd \ No newline at end of file diff --git a/build/latex/python.ist b/build/latex/python.ist new file mode 100644 index 0000000..70536a6 --- /dev/null +++ b/build/latex/python.ist @@ -0,0 +1,16 @@ +line_max 100 +headings_flag 1 +heading_prefix " \\bigletter " + +preamble "\\begin{sphinxtheindex} +\\let\\bigletter\\sphinxstyleindexlettergroup +\\let\\spxpagem \\sphinxstyleindexpagemain +\\let\\spxentry \\sphinxstyleindexentry +\\let\\spxextra \\sphinxstyleindexextra + +" + +postamble "\n\n\\end{sphinxtheindex}\n" + +symhead_positive "{\\sphinxsymbolsname}" +numhead_positive "{\\sphinxnumbersname}" diff --git a/build/latex/sphinx.sty b/build/latex/sphinx.sty new file mode 100644 index 0000000..633b244 --- /dev/null +++ b/build/latex/sphinx.sty @@ -0,0 +1,1130 @@ +% +% sphinx.sty +% +% Adapted from the old python.sty, mostly written by Fred Drake, +% by Georg Brandl. +% This has now grown to become a full-fledged LaTeX support, split +% among multiple files, some of which provide features unavailable +% from usual LaTeX packages in interaction with the mark-up produced +% by the Sphinx LaTeX writer. + +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesPackage{sphinx}[2024/07/01 v7.4.0 Sphinx LaTeX package (sphinx-doc)] + +% provides \ltx@ifundefined +% (many packages load ltxcmds: graphicx does for pdftex and lualatex but +% not xelatex, and anyhow kvoptions does, but it may be needed in future to +% use \sphinxdeprecationwarning earlier, and it needs \ltx@ifundefined) +\RequirePackage{ltxcmds} + +%% for deprecation warnings +\newcommand\sphinxdeprecationwarning[4]{% #1 the deprecated macro or name, +% #2 = when deprecated, #3 = when removed, #4 = additional info + {% limit scope of \spx@tempa, \AtEndDocument works even if nested. + \edef\spx@tempa{\detokenize{#1}}% + \ltx@ifundefined{sphinx_depr_\spx@tempa}{% + \global\expandafter\let\csname sphinx_depr_\spx@tempa\endcsname\spx@tempa + \expandafter\AtEndDocument\expandafter{\expandafter\let\expandafter + \sphinxdeprecatedmacro\csname sphinx_depr_\spx@tempa\endcsname + \PackageWarningNoLine{sphinx}{^^J**** SPHINX DEPRECATION WARNING:^^J + \sphinxdeprecatedmacro^^J + \@spaces- is deprecated at Sphinx #2^^J + \@spaces- and removed at Sphinx #3.^^J + #4^^J****}}% + }{% warning already emitted (at end of latex log), don't repeat + }% + }% end of scope limiting group for \spx@tempa +} +%% important build warnings use an undefined reference to induce latexmk +%% into complaining (once per warning) at very end of console output +\newcommand\sphinxbuildwarning[2][]{% + \ifcsname sphinx_emitted_#2\endcsname + \else + \global\expandafter\let\csname sphinx_emitted_#2\endcsname\@empty + \AtEndDocument{\hbox{% should the printing of text be made conditional on + % some boolean? (7.4.0 answers this by adding an + % optional argument and testing it here for emptiness + % but no usage is made of this novelty yet.) + \if\relax\detokenize{#1}\relax + % No [], print a red warning text at very end of document + \bfseries\color{red}% + \@nameuse{sphinx_buildwarning_#2}% + \fi + % place an undefined reference deliberately + \let\nfss@text\@gobble % no ?? + \ref{!!\@nameuse{sphinx_buildwarning_#2}}% + }% + }% + \fi +} +\@namedef{sphinx_buildwarning_badtitlesec}{% + Your system has titlesec version 2.10.1 which causes disappearance + of section numbers; check the latex log warning for details} +\@namedef{sphinx_buildwarning_booktabs}{% + Some tables with booktabs class (check latex log) but booktabs + package not loaded; add its loading to the latex preamble}% +\@namedef{sphinx_buildwarning_badfootnotes}{% + Footnote rendering may have had problems, due to extra package or + document class; check latex log for instructions}% +\@namedef{sphinx_buildwarning_badiconpackage}{% + You have set iconpackage=\spx@opt@iconpackage, but this LaTeX package + is not found}% + +%% OPTION HANDLING +% +% We generally first handle options then load packages, but we need +% \definecolor and \colorlet from xcolor to handle the options. + +% Support for colour options +% -------------------------- +% At 7.4.0, package xcolor is required (which has allowed to get rid of +% annoying fall-back branches). Internals here got refactored to some extent. +% +% MEMO: xcolor \fcolorbox coloured boxes render better in some PDF viewers +% than with color package \fcolorbox. Since 1.6.3, Sphinx uses only its own +% custom variant of \fcolorbox when handling code-blocks. But \fcolorbox +% appears also in Pygmentize output mark-up. +% Should Sphinx load xcolor with its dvipsnames and svgnames options? +\RequirePackage{xcolor} + +% the \colorlet of xcolor is overkill for our internal usage here +\newcommand{\sphinxcolorlet}[2] + {\expandafter\let\csname\@backslashchar color@#1\expandafter\endcsname + \csname\@backslashchar color@#2\endcsname } + +% (5.3.0) Allow colour options to use both the \definecolor and the \colorlet +% syntaxes, for example VerbatimColor={gray}{0.9} or VerbatimColor=red!10 +% In the latter case we need the real \colorlet from xcolor package. +% Prior to 7.4.0 xcolor was not required and thus \spx@colorlet was configured +% to raise a warning in case of absence of xcolor. +\def\spx@defineorletcolor#1{% + \def\spx@definedcolor{{#1}}% + \futurelet\spx@token\spx@defineorlet} +\def\spx@defineorlet{% + \ifx\spx@token\bgroup + \expandafter\spx@definecolor\else\expandafter\spx@colorlet\fi} +\def\spx@colorlet#1\relax{\expandafter\colorlet\spx@definedcolor{#1}} +\def\spx@definecolor{\expandafter\definecolor\spx@definedcolor} +% These internals refactored at 7.4.0: +\newcommand*{\spx@DeclareColorOption}[3][]{% +% #1 = almost always "sphinx" but left empty for a few for legacy reasons +% #2 = option name, but internal colour name is #1#2 (i.e. with prefix) +% #3 = initial default colour with either \definecolor or \colorlet syntax + % Set the initial default + \spx@defineorletcolor{#1#2}#3\relax + % Set the key handler to accept both \definecolor and \colorlet syntax + % The key name does not have the #1 prefix from the colour name + \define@key{sphinx}{#2}{\spx@defineorletcolor{#1#2}##1\relax}% +}% + +% Handle options via "kvoptions" (later loaded by hyperref anyhow) +\RequirePackage{kvoptions} +\SetupKeyvalOptions{prefix=spx@opt@} % use \spx@opt@ prefix + +% Optional usage of booktabs package for tables +\DeclareBoolOption[false]{booktabs} +\DeclareBoolOption[false]{borderless} +\DeclareBoolOption[true]{booktabscolorgaps} +\DeclareVoidOption{booktabsnogaps}{% + \ifx\@nodocument\relax + % in body + \expandafter\@firstofone + \else + % in preamble, wait for at begin document + \expandafter\AtBeginDocument + \fi + {\ifdefined\abovetopsep % silently do nothing if booktabs not loaded + \abovetopsep\z@\belowrulesep\z@\aboverulesep\z@\belowbottomsep\z@ + \fi + }% +} +% Coloured table rows +\DeclareBoolOption[false]{colorrows} +% Sphinx legacy text layout: 1in margins on all four sides +\ifx\@jsc@uplatextrue\@undefined +\DeclareStringOption[1in]{hmargin} +\DeclareStringOption[1in]{vmargin} +\DeclareStringOption[.5in]{marginpar} +\else +% Japanese standard document classes handle \mag in a special way +\DeclareStringOption[\inv@mag in]{hmargin} +\DeclareStringOption[\inv@mag in]{vmargin} +\DeclareStringOption[.5\dimexpr\inv@mag in\relax]{marginpar} +\fi + +\DeclareStringOption[0]{maxlistdepth}% \newcommand*\spx@opt@maxlistdepth{0} +\DeclareStringOption[-1]{numfigreset} +\DeclareBoolOption[false]{nonumfigreset} +\DeclareBoolOption[false]{mathnumfig} +\define@key{sphinx}{bookmarksdepth}{\AtBeginDocument{\hypersetup{bookmarksdepth=#1}}} +\AtBeginDocument{\define@key{sphinx}{bookmarksdepth}{\hypersetup{bookmarksdepth=#1}}} +% \DeclareBoolOption[false]{usespart}% not used + +% Code-blocks +% ----------- +% +% INFO: the keys for padding and border widths were extended at 5.1.0, +% and legacy names for user interface were kept, but their definitions +% are delayed further down. The legacy internally used dimen registers +% \sphinxverbatimborder and \sphinxverbatimsep got removed at 6.2.0. +% More code-blocks related options are found in "CSS" part below. +\DeclareBoolOption[true]{verbatimwithframe} +\DeclareBoolOption[true]{verbatimwrapslines} +\DeclareBoolOption[false]{verbatimforcewraps} +\DeclareStringOption[3]{verbatimmaxoverfull} +\DeclareStringOption[100]{verbatimmaxunderfull} +\DeclareBoolOption[true]{verbatimhintsturnover} +\DeclareBoolOption[true]{inlineliteralwraps} +\DeclareStringOption[t]{literalblockcappos} +\DeclareStringOption[r]{verbatimcontinuedalign} +\DeclareStringOption[r]{verbatimcontinuesalign} +% parsed literal +\DeclareBoolOption[true]{parsedliteralwraps} +% \textvisiblespace for compatibility with fontspec+XeTeX/LuaTeX +\DeclareStringOption[\textcolor{red}{\textvisiblespace}]{verbatimvisiblespace} +\DeclareStringOption % must use braces to hide the brackets + [{\makebox[2\fontcharwd\font`\x][r]{\textcolor{red}{\tiny$\m@th\hookrightarrow$}}}]% + {verbatimcontinued} + +% Topic boxes +% ----------- +% +% 5.1.0 added new keys for configuration. The legacy keys shadowsep, +% shadowsize, shadowrule were kept for backward compatibility. +% 5.1.2 fixed some bugs. +% +% All configuration is now to be found in the "CSS" section below. +% +% 6.2.0 removed \sphinxshadowsep, \sphinxshadowsize, \sphinxshadowrule +% \dimen registers + +% Footnotes +% --------- +\DeclareStringOption[\mbox{ }]{AtStartFootnote} +% we need a public macro name for direct use in latex file +\newcommand*{\sphinxAtStartFootnote}{\spx@opt@AtStartFootnote} +% no such need for this one, as it is used inside other macros +\DeclareStringOption[\leavevmode\unskip]{BeforeFootnote} + +% Some font styling +% ----------------- +% TODO: the replacement of old syntax \py@HeaderFamily as used +% in sphinxlatexstyle{page,headings}.sty and sphinx{manual,howto}.cls +% has never been really put in place. Hence this isolated tidbit here. +\DeclareStringOption[\sffamily\bfseries]{HeaderFamily} + +% Some legacy colour options +% -------------------------- +% +\spx@DeclareColorOption{TitleColor}{{rgb}{0.126,0.263,0.361}} +\spx@DeclareColorOption{InnerLinkColor}{{rgb}{0.208,0.374,0.486}} +\spx@DeclareColorOption{OuterLinkColor}{{rgb}{0.216,0.439,0.388}} +% The Verbatim ones are "legacy" only since 5.1.0... call it "new-legacy" ;-) +\spx@DeclareColorOption{VerbatimColor}{{RGB}{242,242,242}}% same as {gray}{0.95} +\spx@DeclareColorOption{VerbatimBorderColor}{{RGB}{32,32,32}} +% All other colours will be internally assigned a "sphinx" prefix + +% Table row colors (since 6.0.0) +% ---------------- +\spx@DeclareColorOption[sphinx]{TableRowColorHeader}{{gray}{0.86}} +\spx@DeclareColorOption[sphinx]{TableRowColorOdd}{{gray}{0.92}} +\spx@DeclareColorOption[sphinx]{TableRowColorEven}{{gray}{0.98}} +% if not set, the "Merge" colour will keep in sync with the "Row" colour +\def\sphinxTableMergeColorHeader{sphinxTableRowColorHeader} +\define@key{sphinx}{TableMergeColorHeader}{% + \spx@defineorletcolor{sphinxTableMergeColorHeader}#1\relax + \def\sphinxTableMergeColorHeader{sphinxTableMergeColorHeader}% +}% +\def\sphinxTableMergeColorOdd{sphinxTableRowColorOdd} +\define@key{sphinx}{TableMergeColorOdd}{% + \spx@defineorletcolor{sphinxTableMergeColorOdd}#1\relax + \def\sphinxTableMergeColorOdd{sphinxTableMergeColorOdd}% +}% +\def\sphinxTableMergeColorEven{sphinxTableRowColorEven} +\define@key{sphinx}{TableMergeColorEven}{% + \spx@defineorletcolor{sphinxTableMergeColorEven}#1\relax + \def\sphinxTableMergeColorEven{sphinxTableMergeColorEven}% +}% +% Default color chosen to be as in minted.sty LaTeX package! +\spx@DeclareColorOption[sphinx]{VerbatimHighlightColor}{{rgb}{0.878,1,1}} + +% Notices/admonitions +% ------------------- +% +% 5.1.0 added much customizability to warning, caution, attention, danger and +% error types of notices via an enhanced sphinxheavybox environment. +% +% 6.2.0 added the possibility to use the same kind of rendering also for +% note, hint, important, and tip. +% +% Legacy user interface for options was kept working. All of it is handled in +% the "CSS" section below. +% +% 6.2.0 added booleans to serve internally as a record of whether the +% note, hint, important and tip admonitions used the legacy "lightbox" or +% the then enhanced "heavybox" environment. +% +% 7.4.0 uses "heavybox" environment from sphinxlatexadmonitions in all cases, +% hence the booleans mentioned above have been removed as well as the rather +% complex TeX code which was done so that these booleans were made true if +% and only if the CSS-named keys had been made usage of via 'sphinxsetup'. +% +% The "light style" implemented in sphinxlatexadmonitions.sty as +% "sphinxlightbox" is not used. Also, admonitions by default have a "title +% row", and the corresponding options are only named in the CSS style which is +% implemented further below. Here we define options having a legacy name. +% +% seealso directive is also using "heavybox" at 7.4.0 acquiring the same +% customizability as admonitions. +% todo directive also. +\definecolor{sphinx-admonition-bgcolor} {RGB}{247, 247, 247}% #F7F7F7 +\definecolor{sphinx-admonition-bordercolor} {RGB}{134, 152, 155}% #86989B +\definecolor{sphinx-warning-bordercolor} {RGB}{148, 0, 0}% #940000 +\definecolor{sphinx-error-bordercolor} {RGB}{180, 0, 0}% #B40000 +\spx@DeclareColorOption[sphinx]{noteBorderColor} {sphinx-admonition-bordercolor} +\spx@DeclareColorOption[sphinx]{hintBorderColor} {sphinx-admonition-bordercolor} +\spx@DeclareColorOption[sphinx]{importantBorderColor}{sphinx-admonition-bordercolor} +\spx@DeclareColorOption[sphinx]{tipBorderColor} {sphinx-admonition-bordercolor} +\spx@DeclareColorOption[sphinx]{seealsoBorderColor} {sphinx-admonition-bordercolor}% 7.4.0 +\spx@DeclareColorOption[sphinx]{todoBorderColor} {sphinx-admonition-bordercolor}% 7.4.0 +% +\spx@DeclareColorOption[sphinx]{noteBgColor} {sphinx-admonition-bgcolor} +\spx@DeclareColorOption[sphinx]{hintBgColor} {sphinx-admonition-bgcolor} +\spx@DeclareColorOption[sphinx]{importantBgColor}{sphinx-admonition-bgcolor} +\spx@DeclareColorOption[sphinx]{tipBgColor} {sphinx-admonition-bgcolor} +\spx@DeclareColorOption[sphinx]{seealsoBgColor} {sphinx-admonition-bgcolor}% 7.4.0 +\spx@DeclareColorOption[sphinx]{todoBgColor} {sphinx-admonition-bgcolor}% 7.4.0 +% +\spx@DeclareColorOption[sphinx]{warningBorderColor} {sphinx-warning-bordercolor} +\spx@DeclareColorOption[sphinx]{cautionBorderColor} {sphinx-warning-bordercolor} +\spx@DeclareColorOption[sphinx]{attentionBorderColor}{sphinx-warning-bordercolor} +\spx@DeclareColorOption[sphinx]{dangerBorderColor} {sphinx-warning-bordercolor} +\spx@DeclareColorOption[sphinx]{errorBorderColor} {sphinx-error-bordercolor} +% +\spx@DeclareColorOption[sphinx]{warningBgColor} {sphinx-admonition-bgcolor} +\spx@DeclareColorOption[sphinx]{cautionBgColor} {sphinx-admonition-bgcolor} +\spx@DeclareColorOption[sphinx]{attentionBgColor}{sphinx-admonition-bgcolor} +\spx@DeclareColorOption[sphinx]{dangerBgColor} {sphinx-admonition-bgcolor} +\spx@DeclareColorOption[sphinx]{errorBgColor} {sphinx-admonition-bgcolor} +% +%%%%%%%% +% +% Additions of CSS-like keys at 5.1.0 (and possibility of rounded boxes) +% ----------------------------------- +% +% These CSS-named alikes allow to configure 4 border widths, 4 padding seps, 4 +% corner radii, optional shadow, border color, background color, shadow color. +% +% In future, an alternative user interface will perhaps be provided to parse +% genuine CSS, but this will be easier to do in Python than in LaTeX. +% +% Refactoring (and extension) at 6.2.0 +% ------------------------------------ +% +% 6.2.0 batch defines in one go all auxiliaries for code-blocks, topics, and +% admonitions. The needed steps to maintain the legacy option names working +% and to set some specific defaults are handled in a second step. +% +% This allowed to: +% +% - associate these CSS-named options also to note, hint, important, and tip +% which thus can access the full customizability of sphinxheavybox if they use +% it. +% +% - provide a \sphinxbox command for boxing inline text elements with the same +% full customizability. +% +% The \dimen's \sphinxverbatimborder, \sphinxverbatimsep, \sphinxshadowsep, +% \sphinxshadowsize, and \sphinxshadowrule, which had been deprecated have +% finally been removed entirely. No more \dimen register is used here only +% storage in macros. +% +% Restyling at 7.4.0 with new defaults for all admonition types +% ------------------------------------------------------------- +% +% So far the 5.1.0 added possibilities for fancier boxes had been used by +% default only for code-blocks, and admonitions kept their old-fashioned +% legacy styles. At 7.4.0, as a follow-up to the revamped styles of +% admonitions in the HTML sphinx13 theme (PR #12439), it is decided to +% apply similar styling for PDF output. Also the seealso directive +% is handled as an admonition with the same customizability. And the +% todo directive. +% +\def\spxstring@none{none} +\def\spxstring@clone{clone} +% +% Border keys +% At 7.4.0 refactoring to avoid defining legacy \spx@@border +% macros which are (now) used nowhere, only @top, @right, @bottom, @left. +\def\spx@tempa#1{% #1 = macro prefix + \expandafter\spx@tempb + \csname #1border@top\expandafter\endcsname + \csname #1border@right\expandafter\endcsname + \csname #1border@bottom\expandafter\endcsname + \csname #1border@left\expandafter\endcsname + \csname if#1border@open\expandafter\endcsname + \csname #1border@opentrue\expandafter\endcsname + \csname #1border@openfalse\endcsname +}% +\def\spx@tempb #1#2#3#4#5#6#7#8#9{% #8 = option prefix + \define@key{sphinx}{#8border-top-width}{\def#1{##1}}% + \define@key{sphinx}{#8border-right-width}{\def#2{##1}}% + \define@key{sphinx}{#8border-bottom-width}{\def#3{##1}}% + \define@key{sphinx}{#8border-left-width}{\def#4{##1}}% + \define@key{sphinx}{#8border-width}{% + % MEMO: not immediately expanded, should this be changed? + \def#1{##1}\let#2#1\let#3#1\let#4#1% + }% + \newif#5% + % 6.2.0 has added support for box-decoration-break also to admonition + % directives, formerly the option setting was ignored for them. + \define@key{sphinx}{#8box-decoration-break}% + {\begingroup\edef\spx@tempa{##1}\expandafter\endgroup + \ifx\spx@tempa\spxstring@clone#7\else#6\fi}% + % 7.4.0 sets the default behaviour to "slice" not only for code-blocks but + % also for admonitions, as the latter now have a background colour each. + #6% + % #8 = option prefix (with underscore), #9 = legacy option name + % keep legacy option names as aliases to new-named options + \expandafter\let\csname KV@sphinx@#9\expandafter\endcsname + \csname KV@sphinx@#8border-width\endcsname + % init border-width (fetches next argument) + \csname KV@sphinx@#8border-width\endcsname +} +% MEMO: from 6.2.0 to 7.4.0 (excluive) \fboxrule was used in the first +% two, and was resolved only at location of use. At 7.4.0, we again +% use 0.4pt rather and not \fboxrule dimen register. +% macro prefix option prefix legacy option init value +\spx@tempa{spx@pre@} {pre_} {verbatimborder} {0.4pt} +\spx@tempa{spx@topic@} {div.topic_} {shadowrule} {0.5pt}% mod. at 7.4.0 +\spx@tempa{spx@note@} {div.note_} {noteborder} {0.5pt} +\spx@tempa{spx@hint@} {div.hint_} {hintborder} {0.5pt} +\spx@tempa{spx@important@}{div.important_}{importantborder}{0.5pt} +\spx@tempa{spx@tip@} {div.tip_} {tipborder} {0.5pt} +\spx@tempa{spx@seealso@} {div.seealso_} {seealsoborder} {0.5pt}% new at 7.4.0 +\spx@tempa{spx@todo@} {div.todo_} {todoborder} {0.5pt}% new at 7.4.0 +\spx@tempa{spx@warning@} {div.warning_} {warningborder} {1pt} +\spx@tempa{spx@caution@} {div.caution_} {cautionborder} {1pt} +\spx@tempa{spx@attention@}{div.attention_}{attentionborder}{1pt} +\spx@tempa{spx@danger@} {div.danger_} {dangerborder} {1pt} +\spx@tempa{spx@error@} {div.error_} {errorborder} {1.25pt}% mod. at 7.4.0 +% this one new at 6.2.0: (we do not create a "legacy name" for it) +\spx@tempa{spx@box@} {box_} {box_border-width}{0.4pt} +% Reset default box-decoration-break style to "clone" for \sphinxbox, +% but anyhow this is ignored as \sphinxbox produces unbreakable boxes. +\spx@box@border@openfalse + +% Padding keys +% At 7.4.0, \spx@@padding internal macros removed, only @top, @right, +% @bottom, @left are actually needed by sphinxpackageboxes.sty. +\def\spx@tempa#1{% + \expandafter\spx@tempb + \csname #1padding@top\expandafter\endcsname + \csname #1padding@right\expandafter\endcsname + \csname #1padding@bottom\expandafter\endcsname + \csname #1padding@left\endcsname +}% +\def\spx@tempb #1#2#3#4#5#6#7#8#9{% #5 = option prefix + \define@key{sphinx}{#5padding-top}{\def#1{##1}}% + \define@key{sphinx}{#5padding-right}{\def#2{##1}}% + \define@key{sphinx}{#5padding-bottom}{\def#3{##1}}% + \define@key{sphinx}{#5padding-left}{\def#4{##1}}% + \define@key{sphinx}{#5padding}{% + \def#1{##1}\let#2#1\let#3#1\let#4#1% + }% + % initial defaults + \def#1{#6}\def#2{#7}\def#3{#8}\def#4{#9}% +} +% MEMO: prior to 6.2.0 the \fboxsep value (3pt, a priori) was frozen here via +% a \dimen assignment done immediately. From 6.2.0 to 7.4.0 an unfrozen +% \fboxsep was used, and at 7.4.0 it is again explicit 3pt. +% The defaults for admonitions were all modified at 7.4.0. +% For topic/contents and all admonitions the horizontal padding plus borders +% are put inside the text area (i.e. do not go into the margins). +% In order for perfect exact same vertical alignment of contents from all such +% directives, the value of horizontal border-width+padding is kept constant +% (equal to 7.5pt since 7.4.0). +% #1 macro prefix #6 option prefix top right bottom left +\spx@tempa{spx@pre@} {pre_} {3pt}{3pt}{3pt}{3pt} +\spx@tempa{spx@topic@} {div.topic_} {10pt}{7pt}{12pt}{7pt} +% 7.4.0 drops legacy settings which linked strangely padding with border width +\spx@tempa{spx@note@} {div.note_} {6pt}{7pt}{6pt}{7pt} +\spx@tempa{spx@hint@} {div.hint_} {6pt}{7pt}{6pt}{7pt} +\spx@tempa{spx@important@}{div.important_} {6pt}{7pt}{6pt}{7pt} +\spx@tempa{spx@tip@} {div.tip_} {6pt}{7pt}{6pt}{7pt} +\spx@tempa{spx@seealso@} {div.seealso_} {6pt}{7pt}{6pt}{7pt} +\spx@tempa{spx@todo@} {div.todo_} {6pt}{7pt}{6pt}{7pt} +\spx@tempa{spx@warning@} {div.warning_} {6pt}{6.5pt}{6pt}{6.5pt} +\spx@tempa{spx@caution@} {div.caution_} {6pt}{6.5pt}{6pt}{6.5pt} +\spx@tempa{spx@attention@}{div.attention_} {6pt}{6.5pt}{6pt}{6.5pt} +\spx@tempa{spx@danger@} {div.danger_} {6pt}{6.5pt}{6pt}{6.5pt} +\spx@tempa{spx@error@} {div.error_} {6pt}{6.25pt}{6pt}{6.25pt} +\spx@tempa{spx@box@} {box_} {3pt}{3pt}{3pt}{3pt} +% define legacy verbatimsep key as alias of pre_padding key +\expandafter\let\expandafter\KV@sphinx@verbatimsep\csname KV@sphinx@pre_padding\endcsname +% define legacy shadowsep key as alias of div.topic_padding key +\expandafter\let\expandafter\KV@sphinx@shadowsep\csname KV@sphinx@div.topic_padding\endcsname + +% Corner radii keys +% +% Prior to 6.2.0, the "rounded box" branch obeyed the 4 radii but ignored +% the separate border widths and used only the border-width setting. +% Now, all 4 + 4 parameters are obeyed. +\def\spx@tempa#1{% #1 = macro prefix + \expandafter\spx@tempb + \csname #1radius@topleft\expandafter\endcsname + \csname #1radius@topright\expandafter\endcsname + \csname #1radius@bottomright\expandafter\endcsname + \csname #1radius@bottomleft\endcsname +}% +\def\spx@tempb #1#2#3#4#5#6#7#8#9{% #5 = option prefix + \define@key{sphinx}{#5border-top-left-radius}{\def#1{##1}}% + \define@key{sphinx}{#5border-top-right-radius}{\def#2{##1}}% + \define@key{sphinx}{#5border-bottom-right-radius}{\def#3{##1}}% + \define@key{sphinx}{#5border-bottom-left-radius}{\def#4{##1}}% + \define@key{sphinx}{#5border-radius}{\def#1{##1}\let#2#1\let#3#1\let#4#1}% + \def#1{#6}\def#2{#7}\def#3{#8}\def#4{#9}% +} +% The init value for corner radius in code-blocks was \z@ (i.e. 0pt) prior +% to 6.0.0., then 3pt, then \fboxsep at 6.2.0 as padding was also \fboxsep. +% At 7.4.0: +% - the 3pt is used (which is normal value of \fboxsep). +% - some admonitions use rounded corners as well. +% - topic boxed have only their bottom right corner rounded. +% macro prefix option prefix tl tr br bl +\spx@tempa{spx@pre@} {pre_} {3pt}{3pt}{3pt}{3pt} +\spx@tempa{spx@topic@} {div.topic_} \z@ \z@ {12pt} \z@ +\spx@tempa{spx@note@} {div.note_} {5pt}{5pt}{5pt}{5pt} +\spx@tempa{spx@hint@} {div.hint_} {5pt}{5pt}{5pt}{5pt} +\spx@tempa{spx@important@}{div.important_} \z@\z@\z@\z@ +\spx@tempa{spx@tip@} {div.tip_} {5pt}{5pt}{5pt}{5pt} +\spx@tempa{spx@seealso@} {div.seealso_} \z@\z@\z@\z@ +\spx@tempa{spx@todo@} {div.todo_} \z@\z@\z@\z@ +\spx@tempa{spx@warning@} {div.warning_} \z@\z@\z@\z@ +\spx@tempa{spx@caution@} {div.caution_} \z@\z@\z@\z@ +\spx@tempa{spx@attention@}{div.attention_} \z@\z@\z@\z@ +\spx@tempa{spx@danger@} {div.danger_} \z@\z@\z@\z@ +\spx@tempa{spx@error@} {div.error_} \z@\z@\z@\z@ +\spx@tempa{spx@box@} {box_} {3pt}{3pt}{3pt}{3pt} + +% Shadow keys +% +% Prior to 6.2.0, an "inset" shadow caused the rendering to ignore +% rounded corners. Starting with 6.2.0, an "inset" shadow is simply +% ignored (not implemented) if any of the corner radii is positive, +% rather than forcing a rectangle+inset shadow output. +\def\spx@tempa#1{% + \expandafter\spx@tempb + \csname if#1withshadow\expandafter\endcsname + \csname if#1insetshadow\endcsname +}% +\def\spx@tempb#1#2{\newif#1\newif#2}% +% macro prefix +\spx@tempa{spx@pre@} +\spx@tempa{spx@topic@} +\spx@tempa{spx@note@} +\spx@tempa{spx@hint@} +\spx@tempa{spx@important@} +\spx@tempa{spx@tip@} +\spx@tempa{spx@seealso@}% 7.4.0 +\spx@tempa{spx@todo@}% 7.4.0 +\spx@tempa{spx@warning@} +\spx@tempa{spx@caution@} +\spx@tempa{spx@attention@} +\spx@tempa{spx@danger@} +\spx@tempa{spx@error@} +\spx@tempa{spx@box@} +% +\def\spx@tempa#1{% #1 = macro prefix + \expandafter\spx@tempb + \csname #1withshadowtrue\expandafter\endcsname + \csname #1withshadowfalse\expandafter\endcsname + \csname #1insetshadowtrue\expandafter\endcsname + \csname #1insetshadowfalse\expandafter\endcsname + \csname #1shadow@setter\expandafter\endcsname + \csname #1shadow@xoffset\expandafter\endcsname + \csname #1shadow@yoffset\endcsname +}% +\def\spx@tempb#1#2#3#4#5#6#7#8{% #8 = option prefix + \define@key{sphinx}{#8box-shadow}{#5##1 {} {} \@nnil}% + \def#5##1 ##2 ##3 ##4\@nnil{% + \begingroup\edef\spx@tempa{##1}\expandafter\endgroup + \ifx\spx@tempa\spxstring@none + #2% + % MEMO: at 5.1.0 and up to 6.2.0, an \edef with \number\dimexpr was + % used here. Since 6.2.0, expansion is delayed to time of use as for + % the other dimensions handled above. This is synched with an added + % encapsulation in \dimexpr...\relax by the "setup" from + % sphinxpackageboxes.sty. An induced regression had to be fixed in + % the sphinxShadowBox environment as it was using in an \ifdim the + % \spx@topic@shadow@yoffset macro, now holding by default 4pt+\z@ + % rather than an already digested 262144sp. The +\z@ is in case ##2 + % is empty. + \else #1% + \def#6{##1}\def#7{##2+\z@}% + \if\relax\detokenize{##3}\relax#4\else#3\fi + \fi + }% + #5none {} {} \@nnil % no shadow by default (except for topic, see below) +} +\spx@tempa{spx@pre@} {pre_} +\spx@tempa{spx@topic@} {div.topic_} +% This corresponds to the legacy parameters of ShadowBox + \spx@topic@shadow@setter 4pt 4pt {} \@nnil +\spx@tempa{spx@note@} {div.note_} +\spx@tempa{spx@hint@} {div.hint_} +\spx@tempa{spx@important@}{div.important_} +\spx@tempa{spx@tip@} {div.tip_} +\spx@tempa{spx@seealso@} {div.seealso_} +\spx@tempa{spx@todo@} {div.todo_} +\spx@tempa{spx@warning@} {div.warning_} +\spx@tempa{spx@caution@} {div.caution_} +\spx@tempa{spx@attention@}{div.attention_} +\spx@tempa{spx@danger@} {div.danger_} +\spx@tempa{spx@error@} {div.error_} +\spx@tempa{spx@box@} {box_} + +% Support for legacy shadowsize (topic/contents) +% This definition was broken due to a typo at 5.1.0 and got fixed at 6.1.2 +% MEMO: at 6.2.0 this no longer does \number\dimexpr in an \edef. Reason is to +% keep in sync with div.topic_box-shadow handling of xoffset and yoffset. +\define@key{sphinx}{shadowsize}{% + \def\spx@topic@shadow@xoffset{#1}% + \let\spx@topic@shadow@yoffset\spx@topic@shadow@xoffset + \ifdim\dimexpr\spx@topic@shadow@xoffset=\z@ + \spx@topic@withshadowfalse + \else + \spx@topic@withshadowtrue + \spx@topic@insetshadowfalse + \fi +}% + +% Color keys, TeXextras key, keys for admonition titles with icon +% +% Historical remarks to be removed at some point: +% +% Some problems due to legacy naming scheme which had diverging conventions +% for code-blocks (VerbatimBorderColor, VerbatimColor) and admonitions +% (sphinxwarningBorderColor, sphinxwarningBgColor, etc...) regarding the +% internal names of the used colors. Unfortunately VerbatimColor and for +% example sphinxwarningBgColor are also documented at user level, they are not +% only internally used. +% +% For topic directive, "legacy" (around 2016-2017) had no interface for +% colours, so some internals could be changed with no breakage during 5.x up +% to 6.2.0. For example topic (shadowbox) could be unified with admonitions +% (sphinxheavybox), and the "setup" macros could all be moved into a single +% one in the sphinxpackageboxes.sty file, with only one argument holding the +% directive type. +% +% It was then needed only by sphinxlatexliterals.sty to let its emitted +% \spx@verb@boxes@fcolorbox@setup incorporate some extra adjustment. +% +% 7.4.0 removes usages of booleans relative to usage of a colour for +% background or border which were there to optimize the boxing code from +% sphinxpackageboxes.sty when colours where not needed. These were internal +% macros so their removal should not be considered breaking. +% We keep the infrastructure for "shadowcolor" and "textcolor" because the +% defaults for them remain not to have specific colour. +% +% 7.4.0 adds keys for admonition titles: for background and foreground colors, +% and for icons (whose defaults are picked from Free Fontawesome 5). +\def\spx@tempa#1{% + \expandafter\spx@tempb + \csname if#1withshadowcolor\expandafter\endcsname + \csname if#1withtextcolor\endcsname +}% +\def\spx@tempb#1#2{\newif#1\newif#2}% +% macro prefix +\spx@tempa{spx@pre@} +\spx@tempa{spx@topic@} +\spx@tempa{spx@note@} +\spx@tempa{spx@hint@} +\spx@tempa{spx@important@} +\spx@tempa{spx@tip@} +\spx@tempa{spx@seealso@} +\spx@tempa{spx@todo@} +\spx@tempa{spx@warning@} +\spx@tempa{spx@caution@} +\spx@tempa{spx@attention@} +\spx@tempa{spx@danger@} +\spx@tempa{spx@error@} +\spx@tempa{spx@box@} +% +\def\spx@tempa#1{% #1 = macro prefix + \expandafter\spx@tempb + \csname #1withshadowcolortrue\expandafter\endcsname + \csname #1withtextcolortrue\expandafter\endcsname + \csname #1TeXextras\endcsname +} +% 7.4.0 adds options for a title. They have an action only for admonitions, +% seealso and todo directives. +\def\spx@tempb#1#2#3#4#5{% #4 = option prefix, #5 = color name prefix + \define@key{sphinx}{#4border-TeXcolor}% + {\spx@defineorletcolor{#5BorderColor}##1\relax}% + \define@key{sphinx}{#4background-TeXcolor}% + {\spx@defineorletcolor{#5BgColor}##1\relax}% + \define@key{sphinx}{#4title-background-TeXcolor}% + {\spx@defineorletcolor{#5TtlBgColor}##1\relax}% + \define@key{sphinx}{#4title-foreground-TeXcolor}% + {\spx@defineorletcolor{#5TtlFgColor}##1\relax}% + \define@key{sphinx}{#4title-icon}% + {\@namedef{#5TtlIcon}{##1}}% + \define@key{sphinx}{#4box-shadow-TeXcolor}% + {#1\spx@defineorletcolor{#5ShadowColor}##1\relax}% + \define@key{sphinx}{#4TeXcolor}% + {#2\spx@defineorletcolor{#5TextColor}##1\relax}% + \define@key{sphinx}{#4TeXextras}% + {\def#3{##1}}% +} +% macro prefix option prefix color name prefix +\spx@tempa{spx@pre@} {pre_} {Verbatim} + % (memo: internal VerbatimShadowColor was formerly sphinxVerbatimShadowColor) + % internal legacy color name is VerbatimColor not VerbatimBgColor, so redefine: + \define@key{sphinx}{pre_background-TeXcolor}% + {\spx@defineorletcolor{VerbatimColor}#1\relax}% + % Keep legacy option names working + \expandafter\let\expandafter\KV@sphinx@VerbatimBorderColor + \csname KV@sphinx@pre_border-TeXcolor\endcsname + \expandafter\let\expandafter\KV@sphinx@VerbatimColor + \csname KV@sphinx@pre_background-TeXcolor\endcsname +% (6.2.0 modified some internal namings for the colors of topic boxes) +% macro prefix option prefix color name prefix +\spx@tempa{spx@topic@} {div.topic_} {sphinxtopic}% (no legacy interface) +\spx@tempa{spx@note@} {div.note_} {sphinxnote} +\spx@tempa{spx@hint@} {div.hint_} {sphinxhint} +\spx@tempa{spx@important@}{div.important_} {sphinximportant} +\spx@tempa{spx@tip@} {div.tip_} {sphinxtip} +\spx@tempa{spx@seealso@} {div.seealso_} {sphinxseealso} +\spx@tempa{spx@todo@} {div.todo_} {sphinxtodo} +\spx@tempa{spx@warning@} {div.warning_} {sphinxwarning} +\spx@tempa{spx@caution@} {div.caution_} {sphinxcaution} +\spx@tempa{spx@attention@}{div.attention_} {sphinxattention} +\spx@tempa{spx@danger@} {div.danger_} {sphinxdanger} +\spx@tempa{spx@error@} {div.error_} {sphinxerror} +\spx@tempa{spx@box@} {box_} {sphinxbox} + % Keep legacy sphinxsetup color options interface for "strong" admonitions + \def\spx@tempa#1#2{% #1 = option prefix, #2 = legacy option prefix + \expandafter\let\csname KV@sphinx@#2BorderColor\expandafter\endcsname + \csname KV@sphinx@#1border-TeXcolor\endcsname + \expandafter\let\csname KV@sphinx@#2BgColor\expandafter\endcsname + \csname KV@sphinx@#1background-TeXcolor\endcsname + } + \spx@tempa{div.warning_} {warning} + \spx@tempa{div.caution_} {caution} + \spx@tempa{div.attention_} {attention} + \spx@tempa{div.danger_} {danger} + \spx@tempa{div.error_} {error} + + % Keep legacy sphinxsetup BorderColor for =note, hint, ... + % Add "legacy" names BgColor (added at 7.4.0) and TextColor + \def\spx@tempa#1#2{% #1 = CSS like option prefix, #2 = legacy option prefix + \expandafter\let\csname KV@sphinx@#2BorderColor\expandafter\endcsname + \csname KV@sphinx@#1border-TeXcolor\endcsname + \expandafter\let\csname KV@sphinx@#2BgColor\expandafter\endcsname + \csname KV@sphinx@#1background-TeXcolor\endcsname + \expandafter\let\csname KV@sphinx@#2TextColor\expandafter\endcsname + \csname KV@sphinx@#1TeXcolor\endcsname + } + \spx@tempa{div.note_} {note} + \spx@tempa{div.hint_} {hint} + \spx@tempa{div.important_} {important} + \spx@tempa{div.tip_} {tip} + + % Add "legacy" hintTeXextras etc... + \def\spx@tempa#1#2{% #1 = CSS like option prefix, #2 = legacy option prefix + \expandafter\let\csname KV@sphinx@#2TeXextras\expandafter\endcsname + \csname KV@sphinx@#1TeXextras\endcsname + } + \spx@tempa{div.note_} {note} + \spx@tempa{div.hint_} {hint} + \spx@tempa{div.important_} {important} + \spx@tempa{div.tip_} {tip} + + % At 7.4.0, let topic/contents boxes acquire background and border colours + % and give the shadow some colour other than black + \setkeys{sphinx}{div.topic_border-TeXcolor=sphinx-admonition-bordercolor, + div.topic_background-TeXcolor=sphinx-admonition-bgcolor, + div.topic_box-shadow-TeXcolor={RGB}{108,108,108}, + } + + +% 7.4.0 lets all types of admonitions style especially their titlss. +% The Sphinx default colours for admonition titles are copied from PR #12486 +% which modified sphinx13.css (see also earlier #12439) +% The actual code using the colours and icons whose defaults are set here +% is to be found in sphinxlatexadmonitions.sty. +% +% MEMO: unfortunately xcolor does NOT implement HSL but only HSB! +% So the sphinx13.css colours specified via hsl() got converted to RGB here +\definecolor{sphinx-admonition-title-bgcolor}{RGB}{229,229,229} % hsl(0, 0%, 90%); +\definecolor{sphinx-admonition-title-fgcolor}{RGB}{127,127,127} % hsl(0, 0%, 50%); +\definecolor{sphinx-warning-title-bgcolor} {RGB}{248,228,210} % hsl(28.5, 74%, 90%); +\definecolor{sphinx-warning-title-fgcolor} {RGB}{221,122,33} % hsl(28.5, 74%, 50%); +\definecolor{sphinx-note-title-bgcolor} {RGB}{208,222,250} % hsl(219.5, 84%, 90%); +\definecolor{sphinx-note-title-fgcolor} {RGB}{20,93,234} % hsl(219.5, 84%, 50%); +\definecolor{sphinx-success-title-bgcolor} {RGB}{220,239,230} % hsl(150, 36.7%, 90%); +\definecolor{sphinx-success-title-fgcolor} {RGB}{81,174,128} % hsl(150, 36.7%, 50%); +\definecolor{sphinx-error-title-bgcolor} {RGB}{238,220,220} % hsl(0, 37%, 90%); +\definecolor{sphinx-error-title-fgcolor} {RGB}{174,80,80} % hsl(0, 37%, 50%); +\definecolor{sphinx-todo-title-bgcolor} {RGB}{226,204,254} % hsl(266.8, 100%, 90%); +\definecolor{sphinx-todo-title-fgcolor} {RGB}{113,0,255} % hsl(266.8, 100%, 50%); + +% Now use the above colours as default settings, following the choices +% done in sphinx13.css +\setkeys{sphinx}{ + div.note_title-background-TeXcolor=sphinx-note-title-bgcolor, + div.note_title-foreground-TeXcolor=sphinx-note-title-fgcolor, +% + div.hint_title-background-TeXcolor=sphinx-success-title-bgcolor, + div.hint_title-foreground-TeXcolor=sphinx-success-title-fgcolor, + div.tip_title-background-TeXcolor=sphinx-success-title-bgcolor, + div.tip_title-foreground-TeXcolor=sphinx-success-title-fgcolor, + div.seealso_title-background-TeXcolor=sphinx-success-title-bgcolor, + div.seealso_title-foreground-TeXcolor=sphinx-success-title-fgcolor, + div.todo_title-background-TeXcolor=sphinx-todo-title-bgcolor, + div.todo_title-foreground-TeXcolor=sphinx-todo-title-fgcolor, +% + div.important_title-background-TeXcolor=sphinx-warning-title-bgcolor, + div.important_title-foreground-TeXcolor=sphinx-warning-title-fgcolor, + div.caution_title-background-TeXcolor=sphinx-warning-title-bgcolor, + div.caution_title-foreground-TeXcolor=sphinx-warning-title-fgcolor, + div.warning_title-background-TeXcolor=sphinx-warning-title-bgcolor, + div.warning_title-foreground-TeXcolor=sphinx-warning-title-fgcolor, +% + div.attention_title-background-TeXcolor=sphinx-error-title-bgcolor, + div.attention_title-foreground-TeXcolor=sphinx-error-title-fgcolor, + div.danger_title-background-TeXcolor=sphinx-error-title-bgcolor, + div.danger_title-foreground-TeXcolor=sphinx-error-title-fgcolor, + div.error_title-background-TeXcolor=sphinx-error-title-bgcolor, + div.error_title-foreground-TeXcolor=sphinx-error-title-fgcolor, +% +% TODO: implement todo (sic) +% +} + +% 7.4.0 Support for icons in admonition titles +% We try to +% - get Sphinx PDF builds to process fine in absence of fontawesome5 +% - use fontawesome5 if present, but not if user prefers another package +% - provide an interface for using other LaTeX code for icons +% - provide an interface for using some other package than fontawesome5 +% Indeed we can't load fontawesome5 unconditionally even if available, +% as it proves incompatible with fontawesome package. +% We thus must delay its loading. +\IfFileExists{fontawesome5.sty}{% + \DeclareStringOption[fontawesome5]{iconpackage}% +}% +{% + \IfFileExists{fontawesome.sty} + {\DeclareStringOption[fontawesome]{iconpackage}} + {\DeclareStringOption[none]{iconpackage}}% +}% +\newcommand\spx@faIcon[3][]{}% +% The hacky definition of \spx@faIcon above is to let it by default swallow +% the icon macro and the \sphinxtitlerowaftericonspacecmd (see +% \sphinxdotitlerowwithicon in sphinxlatexadmonitions.sty) which inserts +% a space between it and title. See how \spx@faIcon is used below. +% +% If user sets a title-icon key to some LaTeX code of their own, of course +% \spx@faIcon is not executed and the inserted space will thus be there, as +% expected. +% +\def\spxstring@fontawesome{fontawesome} +\def\spxstring@fontawesomev{fontawesome5} +\AtBeginDocument{% + \ifx\spx@opt@iconpackage\spxstring@none + \else + \IfFileExists{\spx@opt@iconpackage.sty} + {\RequirePackage{\spx@opt@iconpackage}% + \ifx\spx@opt@iconpackage\spxstring@fontawesomev + \renewcommand\spx@faIcon{\faIcon}% + \else + \ifx\spx@opt@iconpackage\spxstring@fontawesome + \renewcommand\spx@faIcon[2][]{\faicon{##2}}% + % The \ifdefined's are a bit silly because we know that + % fontawesome.sty does not provide it, but perhaps + % there can be some new release of that package? + \ifdefined\faicon@lightbulb\else + \let\faicon@lightbulb\faLightbulbO + \fi + \ifdefined\faicon@radiation\else + \let\faicon@radiation\faBolt + \fi + \ifdefined\faicon@pen\else + \let\faicon@pen\faPencil + \fi + % if neither has been required, \spx@faIcon will simply swallow + % its argument (and follwing space macro) and it is up to user + % to set the keys appropriately. + \fi\fi % + }% + {% + \sphinxbuildwarning{badiconpackage}% + \PackageWarningNoLine{sphinx}{% + You have set iconpackage=\spx@opt@iconpackage\MessageBreak + But \spx@opt@iconpackage.sty is not found by LaTeX} + }% + \fi +} + +\setkeys{sphinx}{ +% Icon defaults. + div.note_title-icon = \spx@faIcon{info-circle}, + div.hint_title-icon = \spx@faIcon[regular]{lightbulb}, + div.tip_title-icon = \spx@faIcon[regular]{lightbulb}, + div.seealso_title-icon = \spx@faIcon{share}, + div.todo_title-icon = \spx@faIcon{pen}, + div.important_title-icon = \spx@faIcon{pause-circle}, + div.caution_title-icon = \spx@faIcon{radiation}, + div.warning_title-icon = \spx@faIcon{exclamation-triangle}, + div.attention_title-icon = \spx@faIcon{exclamation-triangle}, + div.danger_title-icon = \spx@faIcon{radiation}, + div.error_title-icon = \spx@faIcon{times-circle}, +} + +\newif\ifspx@opt@box@addstrut +\expandafter\def\csname KV@sphinx@box_addstrut\endcsname#1{% + \csname spx@opt@box@addstrut#1\endcsname +} +\expandafter\def\csname KV@sphinx@box_addstrut@default\endcsname{% + \spx@opt@box@addstruttrue +} + +\DeclareDefaultOption{\@unknownoptionerror} +\ProcessKeyvalOptions* +% don't allow use of maxlistdepth via \sphinxsetup. +\DisableKeyvalOption{sphinx}{maxlistdepth} +\DisableKeyvalOption{sphinx}{numfigreset} +\DisableKeyvalOption{sphinx}{nonumfigreset} +\DisableKeyvalOption{sphinx}{mathnumfig} +\DisableKeyvalOption{sphinx}{booktabs} +\DisableKeyvalOption{sphinx}{borderless} +\DisableKeyvalOption{sphinx}{rowcolors} +% FIXME: this is unrelated to an option, move this elsewhere +% To allow hyphenation of first word in narrow contexts; no option, +% customization to be done via 'preamble' key +\newcommand*\sphinxAtStartPar{\leavevmode\nobreak\hskip\z@skip} +% No need for the \hspace{0pt} trick (\hskip\z@skip) with luatex +\ifdefined\directlua\let\sphinxAtStartPar\@empty\fi +% user interface: options can be changed midway in a document! +\newcommand\sphinxsetup{\setkeys{sphinx}} + + +%% MISCELLANEOUS CONTEXT +% +% flag to be set in a framed environment +% (defined here as currently needed by three sphinxlatex....sty files and +% even if not needed if such files are replaced, the definition does no harm) +\newif\ifspx@inframed +% +% \spx@ifcaptionpackage (defined at begin document) +% is needed currently in macros from: +% sphinxlatexliterals.sty (sphinxVerbatim) +% sphinxlatextables.sty (for some macros used in the table templates) +% +% \sphinxcaption is mark-up injected by the tabular and tabulary templates +% it is defined in sphinxlatextables.sty +% +% store the original \caption macro for usage with figures inside longtable +% and tabulary cells. Make sure we get the final \caption in presence of +% caption package, whether the latter was loaded before or after sphinx. +\AtBeginDocument{% + \let\spx@originalcaption\caption + \@ifpackageloaded{caption} + {\let\spx@ifcaptionpackage\@firstoftwo + \caption@AtBeginDocument*{\let\spx@originalcaption\caption}% +% in presence of caption package, drop our own \sphinxcaption whose aim was to +% ensure same width of caption to all kinds of tables (tabular(y), longtable), +% because caption package has its own width (or margin) option + \def\sphinxcaption{\caption}% + }% + {\let\spx@ifcaptionpackage\@secondoftwo}% +} + +%% PASS OPTIONS +% +% pass options to hyperref; it must not have been loaded already +\input{sphinxoptionshyperref.sty} +% pass options to geometry; it must not have been loaded already +\input{sphinxoptionsgeometry.sty} + + +%% COLOR (general) +% +% FIXME: these two should be deprecated +% +% FIXME: \normalcolor should be used and \py@NormalColor never defined +\def\py@NormalColor{\color{black}} +% FIXME: \color{TitleColor} should be used directly and \py@TitleColor +% should never get defined. +\def\py@TitleColor{\color{TitleColor}} + + +%% PACKAGES +% +% as will be indicated below, secondary style files load some more packages +% +% For \text macro (sphinx.util.texescape) +% also for usage of \firstchoice@true(false) in sphinxlatexgraphics.sty +\RequirePackage{amstext} +% It was passed "warn" option from latex template in case it is already loaded +% via some other package before \usepackage{sphinx} in preamble +\RequirePackage{textcomp} +% For the H specifier. Do not \restylefloat{figure}, it breaks Sphinx code +% for allowing figures in tables. +\RequirePackage{float} +% For floating figures in the text. Better to load after float. +\RequirePackage{wrapfig} +% Provides \captionof, used once by latex writer (\captionof{figure}) +\RequirePackage{capt-of} +% Support hlist directive +\RequirePackage{multicol} + + +%% GRAPHICS +% +% It will always be needed, so let's load it here +\RequirePackage{graphicx} +\input{sphinxlatexgraphics.sty} + + +%% FRAMED ENVIRONMENTS +% +% \sphinxbox added at 6.2.0, its definition is in sphinxpackageboxes. +% +% Alias all \sphinxsetup "box_" keys to become \sphinxboxsetup no-prefix keys +\@tfor\x:={border-width}% + {border-top-width}{border-right-width}{border-bottom-width}{border-left-width}% + {box-decoration-break}% This one is actually useless, as \sphinxbox + % creates an unbreakable horizontal box, not a breakable vertical + % box. And as is well-known it is very complicated (not to say + % impossible) to create in LaTeX breakable horizontal boxes. No + % package offers them. See the complications for the support of + % verbatimforcewraps in sphinxlatexliterals.sty or see the source + % code of the soul or soulutf8 packages. + {padding}% + {padding-top}{padding-right}{padding-bottom}{padding-left}% + {border-radius}% + {border-top-left-radius}{border-top-right-radius}% + {border-bottom-right-radius}{border-bottom-left-radius}% + {box-shadow}% + {border-TeXcolor}{background-TeXcolor}{box-shadow-TeXcolor}{TeXcolor}% + {TeXextras}{addstrut}{addstrut@default}% +\do{\expandafter\let\csname KV@sphinxbox@\x\expandafter\endcsname + \csname KV@sphinx@box_\x\endcsname} +% Let \sphinxboxsetup also prepare a "reset", which will be used by nested +% boxes; currently and by laziness this is implemented simply by accumulating +% all passed options inside some storage, in the order they were given, rather +% than saving the box would-be parameters. Advantage is that this will not +% have to be modified if additional keys are added in future (e.g. for +% elliptic corners). Storing obeys TeX groups. (these details would be +% relevant only for some genuine independent LaTeX package and manual user +% authored mark-up, not Sphinx auto mark-up). +\newcommand\sphinxboxsetup[1]{% + \setkeys{sphinxbox}{#1}% + \expandafter\def\expandafter\spx@boxes@sphinxbox@defaults\expandafter + {\spx@boxes@sphinxbox@defaults,#1}% +} +\def\spx@boxes@sphinxbox@reset{% + \begingroup\def\x{\endgroup\setkeys{sphinxbox}}% + \expandafter\x\expandafter{\spx@boxes@sphinxbox@defaults}% +} +% Some of these defaults got already set. But we now list them all explicitly +% for a complete initial configuration of reset storage. +% At 7.4.0, \fboxrule and \fboxsep replaced by 0.4pt and 3pt which are anyhow +% the defaults for these LaTeX dimensions. +\let\spx@boxes@sphinxbox@defaults\@gobble +\sphinxboxsetup{% + border-width=0.4pt, + padding=3pt, + border-radius=0.4pt, + box-shadow=none, +% MEMO: as xcolor is loaded, \spx@defineorletcolor has a "\colorlet" branch +% which makes this syntax acceptable and avoids duplicating here the values. + border-TeXcolor=VerbatimBorderColor, + background-TeXcolor=VerbatimColor, +% 7.4.0 modified the color of the shadow (anyhow box-shadow is set above to none +% so no shadow is drawn), to be as the new shadow colour of topic boxes. + box-shadow-TeXcolor={RGB}{108,108,108}, + TeXextras={}, + addstrut=false, + }% +\RequirePackage{sphinxpackageboxes} +\input{sphinxlatexadmonitions.sty} +\input{sphinxlatexliterals.sty} +\input{sphinxlatexshadowbox.sty} + + +%% CONTAINERS +% +\input{sphinxlatexcontainers.sty} + + +%% PYGMENTS +% stylesheet for highlighting with pygments +\RequirePackage{sphinxhighlight} + + +%% TABLES +% +\input{sphinxlatextables.sty} + + +%% NUMBERING OF FIGURES, TABLES, AND LITERAL BLOCKS +% +\input{sphinxlatexnumfig.sty} + + +%% LISTS +% +\input{sphinxlatexlists.sty} + + +%% FOOTNOTES +% +% Support scopes for footnote numbering +% This is currently stepped at each input file +\newcounter{sphinxscope} +\newcommand{\sphinxstepscope}{\stepcounter{sphinxscope}} +% We ensure \thesphinxscope expands to digits tokens, independently of language +\renewcommand{\thesphinxscope}{\number\value{sphinxscope}} +\newcommand\sphinxthefootnotemark[2]{% + % this is used to make reference to an explicitly numbered footnote not on same page + % #1=label of footnote text, #2=page number where footnote text was printed + \ifdefined\pagename + \pagename\space#2, % <- space + \else + p. #2, % <- space + \fi #1% no space +} +% support large numbered footnotes in minipage; but this is now obsolete +% from systematic use of savenotes environment around minipages +\def\thempfootnote{\arabic{mpfootnote}} +% This package is needed to support hyperlinked footnotes in tables and +% framed contents, and to allow code-blocks in footnotes. +\RequirePackage{sphinxpackagefootnote} + + +%% INDEX, BIBLIOGRAPHY, APPENDIX, TABLE OF CONTENTS +% +\input{sphinxlatexindbibtoc.sty} + + +%% STYLING +% +\input{sphinxlatexstylepage.sty} +\input{sphinxlatexstyleheadings.sty} +\input{sphinxlatexstyletext.sty} + + +%% MODULE RELEASE DATA AND OBJECT DESCRIPTIONS +% +\input{sphinxlatexobjects.sty} + + +% FIXME: this line should be dropped, as "9" is default anyhow. +\ifdefined\pdfcompresslevel\pdfcompresslevel = 9 \fi + + +\endinput diff --git a/build/latex/sphinx.xdy b/build/latex/sphinx.xdy new file mode 100644 index 0000000..8df526e --- /dev/null +++ b/build/latex/sphinx.xdy @@ -0,0 +1,230 @@ +;;; -*- mode: lisp; coding: utf-8; -*- + +;; Unfortunately xindy is out-of-the-box hyperref-incompatible. This +;; configuration is a workaround, which requires to pass option +;; hyperindex=false to hyperref. +;; textit and emph not currently used, spxpagem replaces former textbf +(define-attributes (("textbf" "textit" "emph" "spxpagem" "default"))) +(markup-locref :open "\textbf{\hyperpage{" :close "}}" :attr "textbf") +(markup-locref :open "\textit{\hyperpage{" :close "}}" :attr "textit") +(markup-locref :open "\emph{\hyperpage{" :close "}}" :attr "emph") +(markup-locref :open "\spxpagem{\hyperpage{" :close "}}" :attr "spxpagem") +(markup-locref :open "\hyperpage{" :close "}" :attr "default") + +(require "numeric-sort.xdy") + +;; xindy base module latex.xdy loads tex.xdy and the latter instructs +;; xindy to ignore **all** TeX macros in .idx entries, except those +;; explicitly described in merge rule. But when after applying all +;; merge rules an empty string results, xindy raises an error: + +;; ERROR: CHAR: index 0 should be less than the length of the string + +;; For example when using pdflatex with utf-8 characters the index +;; file will contain \IeC macros and they will get ignored except if +;; suitable merge rules are loaded early. The texindy script coming +;; with xindy provides this, but only for Latin scripts. The texindy +;; man page says to use rather xelatex or lualatex in case of Cyrillic +;; scripts. + +;; Sphinx contributes LICRcyr2utf8.xdy to provide support for Cyrillic +;; scripts for the pdflatex engine. + +;; Another issue caused by xindy ignoring all TeX macros except those +;; explicitly declared reveals itself when attempting to index ">>>", +;; as the ">" is converted to "\textgreater{}" by Sphinx's LaTeX +;; escaping. + +;; To fix this, Sphinx does **not** use texindy, and does not even +;; load the xindy latex.xdy base module. + +;(require "latex.xdy") + +;; Rather it incorporates some suitable extracts from latex.xdy and +;; tex.xdy with additional Sphinx contributed rules. + +;; But, this means for pdflatex and Latin scripts that the xindy file +;; tex/inputenc/uf8.xdy is not usable because it refers to the macro +;; \IeC only sporadically, and as tex.xdy is not loaded, a rule such as +;; (merge-rule "\'e" "é" :string) +;; does not work, it must be +;; (merge-rule "\IeC {\'e}" "é" :string) +;; So Sphinx contributes LICRlatin2utf8.xdy to mitigate that problem. + +;;;;;;;; extracts from tex.xdy (discarding most original comments): + +;;; +;;; TeX conventions +;;; + +;; Discard leading and trailing white space. Collapse multiple white +;; space characters to blank. + +(merge-rule "^ +" "" :eregexp) +(merge-rule " +$" "" :eregexp) +(merge-rule " +" " " :eregexp) + +;; Handle TeX markup + +(merge-rule "\\([{}$%&#])" "\1" :eregexp) + +;;;;;;;; end of extracts from xindy's tex.xdy + +;;;;;;;; extracts from latex.xdy: + +;; Standard location classes: arabic and roman numbers, and alphabets. + +(define-location-class "arabic-page-numbers" ("arabic-numbers")) +(define-location-class "roman-page-numbers" ("roman-numbers-lowercase")) +(define-location-class "Roman-page-numbers" ("roman-numbers-uppercase")) +(define-location-class "alpha-page-numbers" ("alpha")) +(define-location-class "Alpha-page-numbers" ("ALPHA")) + +;; Output Markup + +(markup-letter-group-list :sep "~n~n \indexspace~n") + +(markup-indexentry :open "~n \item " :depth 0) +(markup-indexentry :open "~n \subitem " :depth 1) +(markup-indexentry :open "~n \subsubitem " :depth 2) + +(markup-locclass-list :open ", " :sep ", ") +(markup-locref-list :sep ", ") + +;;;;;;;; end of extracts from latex.xdy + +;; The LaTeX \index command turns \ into normal character so the TeX macros +;; written to .idx files are not followed by a blank. This is different +;; from non-ascii letters which end up (with pdflatex) as \IeC macros in .idx +;; file, with a blank space after \IeC + +;; Details of the syntax are explained at +;; https://xindy.sourceforge.net/doc/manual-3.html +;; In absence of :string, "xindy uses an auto-detection mechanism to decide, +;; if the pattern is a regular expression or not". But it is not obvious to +;; guess, for example "\\_" is not detected as RE but "\\P\{\}" is, so for +;; being sure we apply the :string switch everywhere and do not use \\ etc... + +;; Go back from sphinx.util.texescape TeX macros to UTF-8 + +(merge-rule "\sphinxleftcurlybrace{}" "{" :string) +(merge-rule "\sphinxrightcurlybrace{}" "}" :string) +(merge-rule "\_" "_" :string) +(merge-rule "{[}" "[" :string) +(merge-rule "{]}" "]" :string) +(merge-rule "\textbackslash{}" "\" :string) ; " for Emacs syntax highlighting +(merge-rule "\textasciitilde{}" "~~" :string); the ~~ escape is needed here +(merge-rule "\textasciicircum{}" "^" :string) +(merge-rule "\sphinxhyphen{}" "-" :string) +(merge-rule "\textquotesingle{}" "'" :string) +(merge-rule "\textasciigrave{}" "`" :string) +(merge-rule "\textless{}" "<" :string) +(merge-rule "\textgreater{}" ">" :string) +(merge-rule "\P{}" "¶" :string) +(merge-rule "\S{}" "§" :string) +(merge-rule "\texteuro{}" "€" :string) +(merge-rule "\(\infty\)" "∞" :string) +(merge-rule "\(\pm\)" "±" :string) +(merge-rule "\(\rightarrow\)" "→" :string) +(merge-rule "\(\checkmark\)" "✓" :string) +(merge-rule "\textendash{}" "–" :string) +(merge-rule "\textbar{}" "|" :string) +(merge-rule "\(\sp{\text{0}}\)" "⁰" :string) +(merge-rule "\(\sp{\text{1}}\)" "¹" :string) +(merge-rule "\(\sp{\text{2}}\)" "²" :string) +(merge-rule "\(\sp{\text{3}}\)" "³" :string) +(merge-rule "\(\sp{\text{4}}\)" "⁴" :string) +(merge-rule "\(\sp{\text{5}}\)" "⁵" :string) +(merge-rule "\(\sp{\text{6}}\)" "⁶" :string) +(merge-rule "\(\sp{\text{7}}\)" "⁷" :string) +(merge-rule "\(\sp{\text{8}}\)" "⁸" :string) +(merge-rule "\(\sp{\text{9}}\)" "⁹" :string) +(merge-rule "\(\sb{\text{0}}\)" "₀" :string) +(merge-rule "\(\sb{\text{1}}\)" "₁" :string) +(merge-rule "\(\sb{\text{2}}\)" "₂" :string) +(merge-rule "\(\sb{\text{3}}\)" "₃" :string) +(merge-rule "\(\sb{\text{4}}\)" "₄" :string) +(merge-rule "\(\sb{\text{5}}\)" "₅" :string) +(merge-rule "\(\sb{\text{6}}\)" "₆" :string) +(merge-rule "\(\sb{\text{7}}\)" "₇" :string) +(merge-rule "\(\sb{\text{8}}\)" "₈" :string) +(merge-rule "\(\sb{\text{9}}\)" "₉" :string) +(merge-rule "\IeC {\textalpha }" "α" :string) +(merge-rule "\IeC {\textbeta }" "β" :string) +(merge-rule "\IeC {\textgamma }" "γ" :string) +(merge-rule "\IeC {\textdelta }" "δ" :string) +(merge-rule "\IeC {\textepsilon }" "ε" :string) +(merge-rule "\IeC {\textzeta }" "ζ" :string) +(merge-rule "\IeC {\texteta }" "η" :string) +(merge-rule "\IeC {\texttheta }" "θ" :string) +(merge-rule "\IeC {\textiota }" "ι" :string) +(merge-rule "\IeC {\textkappa }" "κ" :string) +(merge-rule "\IeC {\textlambda }" "λ" :string) +(merge-rule "\IeC {\textmu }" "μ" :string) +(merge-rule "\IeC {\textnu }" "ν" :string) +(merge-rule "\IeC {\textxi }" "ξ" :string) +(merge-rule "\IeC {\textomicron }" "ο" :string) +(merge-rule "\IeC {\textpi }" "π" :string) +(merge-rule "\IeC {\textrho }" "ρ" :string) +(merge-rule "\IeC {\textsigma }" "σ" :string) +(merge-rule "\IeC {\texttau }" "τ" :string) +(merge-rule "\IeC {\textupsilon }" "υ" :string) +(merge-rule "\IeC {\textphi }" "φ" :string) +(merge-rule "\IeC {\textchi }" "χ" :string) +(merge-rule "\IeC {\textpsi }" "ψ" :string) +(merge-rule "\IeC {\textomega }" "ω" :string) +(merge-rule "\IeC {\textAlpha }" "Α" :string) +(merge-rule "\IeC {\textBeta }" "Β" :string) +(merge-rule "\IeC {\textGamma }" "Γ" :string) +(merge-rule "\IeC {\textDelta }" "Δ" :string) +(merge-rule "\IeC {\textEpsilon }" "Ε" :string) +(merge-rule "\IeC {\textZeta }" "Ζ" :string) +(merge-rule "\IeC {\textEta }" "Η" :string) +(merge-rule "\IeC {\textTheta }" "Θ" :string) +(merge-rule "\IeC {\textIota }" "Ι" :string) +(merge-rule "\IeC {\textKappa }" "Κ" :string) +(merge-rule "\IeC {\textLambda }" "Λ" :string) +(merge-rule "\IeC {\textMu }" "Μ" :string) +(merge-rule "\IeC {\textNu }" "Ν" :string) +(merge-rule "\IeC {\textTheta }" "Θ" :string) +(merge-rule "\IeC {\textIota }" "Ι" :string) +(merge-rule "\IeC {\textKappa }" "Κ" :string) +(merge-rule "\IeC {\textLambda }" "Λ" :string) +(merge-rule "\IeC {\textMu }" "Μ" :string) +(merge-rule "\IeC {\textNu }" "Ν" :string) +(merge-rule "\IeC {\textXi }" "Ξ" :string) +(merge-rule "\IeC {\textOmicron }" "Ο" :string) +(merge-rule "\IeC {\textPi }" "Π" :string) +(merge-rule "\IeC {\textRho }" "Ρ" :string) +(merge-rule "\IeC {\textSigma }" "Σ" :string) +(merge-rule "\IeC {\textTau }" "Τ" :string) +(merge-rule "\IeC {\textUpsilon }" "Υ" :string) +(merge-rule "\IeC {\textPhi }" "Φ" :string) +(merge-rule "\IeC {\textChi }" "Χ" :string) +(merge-rule "\IeC {\textPsi }" "Ψ" :string) +(merge-rule "\IeC {\textOmega }" "Ω" :string) +(merge-rule "\IeC {\textohm }" "Ω" :string) + +;; This xindy module provides some basic support for "see" +(require "makeindex.xdy") + +;; This creates one-letter headings and works fine with utf-8 letters. +;; For Cyrillic with pdflatex works thanks to LICRcyr2utf8.xdy +(require "latin-lettergroups.xdy") + +;; currently we don't (know how to easily) separate "Numbers" from +;; "Symbols" with xindy as is the case with makeindex. +(markup-index :open "\begin{sphinxtheindex} +\let\lettergroup\sphinxstyleindexlettergroup +\let\lettergroupDefault\sphinxstyleindexlettergroupDefault +\let\spxpagem\sphinxstyleindexpagemain +\let\spxentry\sphinxstyleindexentry +\let\spxextra\sphinxstyleindexextra + +" + :close " + +\end{sphinxtheindex} +" + :tree) + diff --git a/build/latex/sphinxhighlight.sty b/build/latex/sphinxhighlight.sty new file mode 100644 index 0000000..170f557 --- /dev/null +++ b/build/latex/sphinxhighlight.sty @@ -0,0 +1,130 @@ +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesPackage{sphinxhighlight}[2022/06/30 stylesheet for highlighting with pygments] +% Its contents depend on pygments_style configuration variable. + + +\makeatletter +\def\PYG@reset{\let\PYG@it=\relax \let\PYG@bf=\relax% + \let\PYG@ul=\relax \let\PYG@tc=\relax% + \let\PYG@bc=\relax \let\PYG@ff=\relax} +\def\PYG@tok#1{\csname PYG@tok@#1\endcsname} +\def\PYG@toks#1+{\ifx\relax#1\empty\else% + \PYG@tok{#1}\expandafter\PYG@toks\fi} +\def\PYG@do#1{\PYG@bc{\PYG@tc{\PYG@ul{% + \PYG@it{\PYG@bf{\PYG@ff{#1}}}}}}} +\def\PYG#1#2{\PYG@reset\PYG@toks#1+\relax+\PYG@do{#2}} + +\@namedef{PYG@tok@w}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}} +\@namedef{PYG@tok@c}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}} +\@namedef{PYG@tok@cp}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@cs}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}\def\PYG@bc##1{{\setlength{\fboxsep}{0pt}\colorbox[rgb]{1.00,0.94,0.94}{\strut ##1}}}} +\@namedef{PYG@tok@k}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@kp}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@kt}{\def\PYG@tc##1{\textcolor[rgb]{0.56,0.13,0.00}{##1}}} +\@namedef{PYG@tok@o}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\@namedef{PYG@tok@ow}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@nb}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@nf}{\def\PYG@tc##1{\textcolor[rgb]{0.02,0.16,0.49}{##1}}} +\@namedef{PYG@tok@nc}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.05,0.52,0.71}{##1}}} +\@namedef{PYG@tok@nn}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.05,0.52,0.71}{##1}}} +\@namedef{PYG@tok@ne}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@nv}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}} +\@namedef{PYG@tok@no}{\def\PYG@tc##1{\textcolor[rgb]{0.38,0.68,0.84}{##1}}} +\@namedef{PYG@tok@nl}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.13,0.44}{##1}}} +\@namedef{PYG@tok@ni}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.84,0.33,0.22}{##1}}} +\@namedef{PYG@tok@na}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@nt}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.02,0.16,0.45}{##1}}} +\@namedef{PYG@tok@nd}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.33,0.33,0.33}{##1}}} +\@namedef{PYG@tok@s}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@sd}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@si}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.44,0.63,0.82}{##1}}} +\@namedef{PYG@tok@se}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@sr}{\def\PYG@tc##1{\textcolor[rgb]{0.14,0.33,0.53}{##1}}} +\@namedef{PYG@tok@ss}{\def\PYG@tc##1{\textcolor[rgb]{0.32,0.47,0.09}{##1}}} +\@namedef{PYG@tok@sx}{\def\PYG@tc##1{\textcolor[rgb]{0.78,0.36,0.04}{##1}}} +\@namedef{PYG@tok@m}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} +\@namedef{PYG@tok@gh}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\@namedef{PYG@tok@gu}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}} +\@namedef{PYG@tok@gd}{\def\PYG@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}} +\@namedef{PYG@tok@gi}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.63,0.00}{##1}}} +\@namedef{PYG@tok@gr}{\def\PYG@tc##1{\textcolor[rgb]{1.00,0.00,0.00}{##1}}} +\@namedef{PYG@tok@ge}{\let\PYG@it=\textit} +\@namedef{PYG@tok@gs}{\let\PYG@bf=\textbf} +\@namedef{PYG@tok@ges}{\let\PYG@bf=\textbf\let\PYG@it=\textit} +\@namedef{PYG@tok@gp}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.78,0.36,0.04}{##1}}} +\@namedef{PYG@tok@go}{\def\PYG@tc##1{\textcolor[rgb]{0.20,0.20,0.20}{##1}}} +\@namedef{PYG@tok@gt}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}} +\@namedef{PYG@tok@err}{\def\PYG@bc##1{{\setlength{\fboxsep}{\string -\fboxrule}\fcolorbox[rgb]{1.00,0.00,0.00}{1,1,1}{\strut ##1}}}} +\@namedef{PYG@tok@kc}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@kd}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@kn}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@kr}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@bp}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}} +\@namedef{PYG@tok@fm}{\def\PYG@tc##1{\textcolor[rgb]{0.02,0.16,0.49}{##1}}} +\@namedef{PYG@tok@vc}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}} +\@namedef{PYG@tok@vg}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}} +\@namedef{PYG@tok@vi}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}} +\@namedef{PYG@tok@vm}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}} +\@namedef{PYG@tok@sa}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@sb}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@sc}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@dl}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@s2}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@sh}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@s1}{\def\PYG@tc##1{\textcolor[rgb]{0.25,0.44,0.63}{##1}}} +\@namedef{PYG@tok@mb}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} +\@namedef{PYG@tok@mf}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} +\@namedef{PYG@tok@mh}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} +\@namedef{PYG@tok@mi}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} +\@namedef{PYG@tok@il}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} +\@namedef{PYG@tok@mo}{\def\PYG@tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}} +\@namedef{PYG@tok@ch}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}} +\@namedef{PYG@tok@cm}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}} +\@namedef{PYG@tok@cpf}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}} +\@namedef{PYG@tok@c1}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}} + +\def\PYGZbs{\char`\\} +\def\PYGZus{\char`\_} +\def\PYGZob{\char`\{} +\def\PYGZcb{\char`\}} +\def\PYGZca{\char`\^} +\def\PYGZam{\char`\&} +\def\PYGZlt{\char`\<} +\def\PYGZgt{\char`\>} +\def\PYGZsh{\char`\#} +\def\PYGZpc{\char`\%} +\def\PYGZdl{\char`\$} +\def\PYGZhy{\char`\-} +\def\PYGZsq{\char`\'} +\def\PYGZdq{\char`\"} +\def\PYGZti{\char`\~} +% for compatibility with earlier versions +\def\PYGZat{@} +\def\PYGZlb{[} +\def\PYGZrb{]} +\makeatother + +% Sphinx redefinitions +% Originally to obtain a straight single quote via package textcomp, then +% to fix problems for the 5.0.0 inline code highlighting (captions!). +% The \text is from amstext, a dependency of sphinx.sty. It is here only +% to avoid build errors if for some reason expansion is in math mode. +\def\PYGZbs{\text\textbackslash} +\def\PYGZus{\_} +\def\PYGZob{\{} +\def\PYGZcb{\}} +\def\PYGZca{\text\textasciicircum} +\def\PYGZam{\&} +\def\PYGZlt{\text\textless} +\def\PYGZgt{\text\textgreater} +\def\PYGZsh{\#} +\def\PYGZpc{\%} +\def\PYGZdl{\$} +\def\PYGZhy{\sphinxhyphen}% defined in sphinxlatexstyletext.sty +\def\PYGZsq{\text\textquotesingle} +\def\PYGZdq{"} +\def\PYGZti{\text\textasciitilde} +\makeatletter +% use \protected to allow syntax highlighting in captions +\protected\def\PYG#1#2{\PYG@reset\PYG@toks#1+\relax+{\PYG@do{#2}}} +\makeatother diff --git a/build/latex/sphinxhowto.cls b/build/latex/sphinxhowto.cls new file mode 100644 index 0000000..8d7dd0e --- /dev/null +++ b/build/latex/sphinxhowto.cls @@ -0,0 +1,102 @@ +% +% sphinxhowto.cls for Sphinx (https://www.sphinx-doc.org/) +% + +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{sphinxhowto}[2019/12/01 v2.3.0 Document class (Sphinx howto)] + +% 'oneside' option overriding the 'twoside' default +\newif\if@oneside +\DeclareOption{oneside}{\@onesidetrue} +% Pass remaining document options to the parent class. +\DeclareOption*{\PassOptionsToClass{\CurrentOption}{\sphinxdocclass}} +\ProcessOptions\relax + +% Default to two-side document +\if@oneside +% nothing to do (oneside is the default) +\else +\PassOptionsToClass{twoside}{\sphinxdocclass} +\fi + +\LoadClass{\sphinxdocclass} + +% Set some sane defaults for section numbering depth and TOC depth. You can +% reset these counters in your preamble. +% +\setcounter{secnumdepth}{2} +\setcounter{tocdepth}{2}% i.e. section and subsection + +% Adapt \and command to the flushright context of \sphinxmaketitle, to +% avoid ragged line endings if author names do not fit all on one single line +\DeclareRobustCommand{\and}{% + \end{tabular}\kern-\tabcolsep + \allowbreak + \hskip\dimexpr1em+\tabcolsep\@plus.17fil\begin{tabular}[t]{c}% +}% +% If it is desired that each author name be on its own line, use in preamble: +%\DeclareRobustCommand{\and}{% +% \end{tabular}\kern-\tabcolsep\\\begin{tabular}[t]{c}% +%}% +% Change the title page to look a bit better, and fit in with the fncychap +% ``Bjarne'' style a bit better. +% +\newcommand{\sphinxmaketitle}{% + \noindent\rule{\linewidth}{1pt}\par + \begingroup % for PDF information dictionary + \def\endgraf{ }\def\and{\& }% + \pdfstringdefDisableCommands{\def\\{, }}% overwrite hyperref setup + \hypersetup{pdfauthor={\@author}, pdftitle={\@title}}% + \endgroup + \begin{flushright} + \sphinxlogo + \py@HeaderFamily + {\Huge \@title }\par + {\itshape\large \py@release \releaseinfo}\par + \vspace{25pt} + {\Large + \begin{tabular}[t]{c} + \@author + \end{tabular}\kern-\tabcolsep}\par + \vspace{25pt} + \@date \par + \py@authoraddress \par + \end{flushright} + \@thanks + \setcounter{footnote}{0} + \let\thanks\relax\let\maketitle\relax + %\gdef\@thanks{}\gdef\@author{}\gdef\@title{} +} + +\newcommand{\sphinxtableofcontents}{% + \begingroup + \parskip \z@skip + \sphinxtableofcontentshook + \tableofcontents + \endgroup + \noindent\rule{\linewidth}{1pt}\par + \vspace{12pt}% +} +\newcommand\sphinxtableofcontentshook{} +\pagenumbering{arabic} + +% Fix the bibliography environment to add an entry to the Table of +% Contents. +% For an article document class this environment is a section, +% so no page break before it. +% +\newenvironment{sphinxthebibliography}[1]{% + % \phantomsection % not needed here since TeXLive 2010's hyperref + \begin{thebibliography}{#1}% + \addcontentsline{toc}{section}{\ifdefined\refname\refname\else\ifdefined\bibname\bibname\fi\fi}}{\end{thebibliography}} + + +% Same for the indices. +% The memoir class already does this, so we don't duplicate it in that case. +% +\@ifclassloaded{memoir} + {\newenvironment{sphinxtheindex}{\begin{theindex}}{\end{theindex}}} + {\newenvironment{sphinxtheindex}{% + \phantomsection % needed because no chapter, section, ... is created by theindex + \begin{theindex}% + \addcontentsline{toc}{section}{\indexname}}{\end{theindex}}} diff --git a/build/latex/sphinxlatexadmonitions.sty b/build/latex/sphinxlatexadmonitions.sty new file mode 100644 index 0000000..c0f6578 --- /dev/null +++ b/build/latex/sphinxlatexadmonitions.sty @@ -0,0 +1,385 @@ +%% NOTICES AND ADMONITIONS +% +% change this info string if making any custom modification +\ProvidesFile{sphinxlatexadmonitions.sty}[2024/07/01 v7.4.0 admonitions] + +% Provides support for this output mark-up from Sphinx latex writer: +% +% - sphinxseealso environment added at 6.1.0. +% +% At 7.4.0 it too now uses sphinxheavybox, and has the same associated +% sphinxsetup CSS keys as admonitions do. +% +% - sphinxtodo environment added at 7.4.0. +% +% - sphinxadmonition (environment) +% This is a dispatch which formerly configured +% +% - note, hint, important, tip to use sphinxlightbox (or optionally +% sphinxheavybox since 6.2.0), +% - warning, caution, attention, danger, error to use sphinxheavybox. +% +% At 7.4.0 all admonitions use sphinxheavybox. +% +% - All environments sphinxnote, sphinxwarning, etc... can be redefined as +% will by user. Thay have a single parameter #1 which is the title. +% +% - The default sphinxnote, sphinxwarning, etc... use associated +% one-argument macros \sphinxstylenotetitle, \sphinxstylewarningtitle, etc +% which can be redefined. Their default is to use \sphinxdotitlerowwithicon +% to typeset the title in a coloured header row at top of the +% admonition. (new with 7.4.0) +% +% The sphinxlightbox environment is kept for backward compatiblity, for user +% custom code which used it via custom definitions done in preamble or via +% raw latex directive. +% MEMO: here is for example how sphinxnote was formerly defined: +% (where #1 is the localized string Note, followed with a colon) +% \newenvironment{sphinxnote}[1] +% {\begin{sphinxlightbox}\sphinxstrong{#1} } +% {\end{sphinxlightbox}} +% Use this if you want to revert the 7.4.0 switch to usage of sphinxheavybox. +% (the 7.4.0 redefined \sphinxstylenotetitle will not work in sphinxlightbox, +% so \sphinxstrong{#1} which was its former default is used above). + +% +% Requires: +\RequirePackage{sphinxpackageboxes} +% 7.4.0 removes unneeded \spx@boxes@border +\RequirePackage{framed}% used by sphinxheavybox +% +% Dependencies (they do not need to be defined at time of loading): +% +% - of course the various colour and dimension options handled via sphinx.sty +% +% - dimension register \spx@image@maxheight from sphinxlatexgraphics.sty +% +% - \savenotes/\spewnotes from sphinxpackagefootnote (for sphinxheavybox) + +% Provides: (also in sphinxlatexliterals.sty) +% Only needed here by legacy (deprecated) sphinxlightbox environment. +\providecommand*\sphinxvspacefixafterfrenchlists{% + \ifvmode\ifdim\lastskip<\z@ \vskip\parskip\fi\else\par\fi +} + +% This \dimen register is a legacy relic from Sphinx 1.5 which is used now +% only for sphinxlightbox. It is set in the sphinxadmonition environment. +\newdimen\spx@notice@border +% sphinxlightbox is now also a legacy relic, not used by Sphinx anymore +\newenvironment{sphinxlightbox}{% + \par + \noindent{\color{spx@notice@bordercolor}% + \rule{\linewidth}{\spx@notice@border}}% + \par\nobreak + {\parskip\z@skip\noindent}% + } + {% + % counteract previous possible negative skip (French lists!): + % (we can't cancel that any earlier \vskip introduced a potential pagebreak) + \sphinxvspacefixafterfrenchlists + \nobreak\vbox{\noindent\kern\@totalleftmargin + {\color{spx@notice@bordercolor}% + \rule[\dimexpr.4\baselineskip-\spx@notice@border\relax] + {\linewidth}{\spx@notice@border}}\hss}\allowbreak + }% end of sphinxlightbox environment definition + +% Since 1.5 these environments are named individually sphinxnote, sphinxhint, +% etc... to allow user to redefine them entirely. +% +% The Sphinx definitions for note/hint/important/tip notices were done like +% this, prior to 6.2.0: +% +% \newenvironment{sphinxhint}[1] +% {\begin{sphinxlightbox}\sphinxstrong{#1} }{\end{sphinxlightbox}} +% +% Then from 6.2.0 to 7.4.0 (exclusive) a more complex definition decided +% to use either sphinxlightbox or sphinxheavybox according to whether +% some CSS-like options had been used, for example for a background color. +% +% 6.2.0 also added one layer of mark-up via \sphinxnotetitle etc..., because +% the former \sphinxstrong{#1} used a too generic \sphinxstrong. +% +% At 7.4.0, sphinxheavybox environment is default for all types of notices +% and also for the seealso and todo directives. +% +% Code adapted from framed.sty's "snugshade" environment. +% Nesting works (inner frames do not allow page breaks). +\newenvironment{sphinxheavybox}{\par + % (MEMO: it is not a problem here if there is no sphinxShadowColor, + % as it used only if set) + \spx@boxes@fcolorbox@setup{\spx@noticetype}% + % Those are used by sphinxVerbatim if the \ifspx@inframed boolean is true + \setlength{\FrameRule}{0.5\dimexpr\spx@boxes@border@top+\spx@boxes@border@bottom\relax}% + % MEMO: prior to 5.1.0 \FrameSep was determined as 0.6\baselineskip - + % \FrameRule, and there was no possibility for user to adjust padding. + % Then \fcolorbox was used with \fboxrule set to \FrameRule and \fboxsep + % set to \FrameSep. + % The 5.1.0 default calculation of padding parameters maintains PDF output + % identical to legacy behaviour, as long as padding is not set by user. + \setlength{\FrameSep}{0.5\dimexpr\spx@boxes@padding@top+\spx@boxes@padding@bottom\relax}% + % "setup" macro has prepared the \spx@boxes@... dimen registers + \advance\spx@image@maxheight + -\dimexpr\spx@boxes@border@top+\spx@boxes@border@bottom + +\spx@boxes@padding@top+\spx@boxes@padding@bottom + +\baselineskip\relax % will happen again if nested, needed indeed! + % MEMO: the next comment is before boxing was extended to allow padding and + % multiple border-widths, not to mention shadows... + % configure framed.sty's parameters to obtain same vertical spacing + % as for "light" boxes. We need for this to manually insert parskip glue and + % revert a skip done by framed before the frame. + \ltx@ifundefined{OuterFrameSep}{}{\OuterFrameSep\z@skip}% + \vspace{\FrameHeightAdjust} + % copied/adapted from framed.sty's snugshade + % but now using in place of \fcolorbox the Sphinx sophisticated own + \def\FrameCommand##1{% + \hskip\@totalleftmargin + % "setup" macro MUST have been called before + \spx@boxes@fcolorbox{##1}% + \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth + }% + % 6.2.0 adds support for div._box-decoration-break=slice. + % (it is yet undecided if slice style should inhibit a bottom shadow) + \csname ifspx@\spx@noticetype @border@open\endcsname + \def\FirstFrameCommand + {\spx@boxes@fcolorbox@setup@openbottom\FrameCommand}% + \def\MidFrameCommand + {\spx@boxes@fcolorbox@setup@openboth \FrameCommand}% + \def\LastFrameCommand + {\spx@boxes@fcolorbox@setup@opentop \FrameCommand}% + \fi + \savenotes + % use a minipage if we are already inside a framed environment + \ifspx@inframed + \noindent\begin{minipage}{\linewidth} + \else + % handle case where notice is first thing in a list item (or is quoted) + \if@inlabel + \noindent\par\vspace{-\baselineskip} + \else + \vspace{\parskip} + \fi + \fi + \MakeFramed {\spx@inframedtrue + \advance\hsize-\width \@totalleftmargin\z@ \linewidth\hsize + % minipage initialization copied from LaTeX source code. + \@pboxswfalse + \let\@listdepth\@mplistdepth \@mplistdepth\z@ + \@minipagerestore + \@setminipage }% + \color@begingroup % workaround to an upstream framed.sty bug + } + {% + \par\unskip + \color@endgroup % matches the \color@begingroup + \@minipagefalse + \endMakeFramed + \ifspx@inframed\end{minipage}\fi + % set footnotes at bottom of page + \spewnotes + % arrange for similar spacing below frame as for "light" boxes. + \vskip .4\baselineskip + }% end of sphinxheavybox environment definition + +% - Since 1.5 these environments are named individually to allow user to +% redefine them entirely. +% +% - Since 5.1.0, sphinxheavybox is more versatile and four border widths, four +% padding widths, four corner radii, optional shadow, and three colors can all +% be modified via CSS-named alike options. +% +% - Since 6.2.0, also note/hint/important/tip notices can use these options +% and then they go automatically via sphinxheavybox. If only the legacy options +% are used, they keep using sphinxlightbox. +% +% - Since 6.2.0, \sphinxwarningtitle etc... add one level of mark-up (they +% expand to \sphinxstrong{#1} which was former hard-coded mark-up). +% Example: +% \renewcommand{\sphinxwarningtitle}[1]{\textbf{#1}\par\smallskip +% {\color{sphinxwarningBorderColor}\hrule height1pt}\smallskip} +% +% - Since 7.4.0, all types of notices use sphinxheavybox and the default +% for \sphinxstyletitle is mapped to using \sphinxdotitlerowwithicon{} +% +% MEMO: except for the generic admonition directive (which uses "note" type) +% the argument #1 in these environments has a postfixed colon originating +% in Sphinx LaTeX writer legacy code. The +% \sphinxremovefinalcolon utility in sphinxlatexstyletext.sty can be used as +% \sphinxremovefinalcolon{#1} from inside the definitions of +% \sphinxstylenotetitle et al. commands. + +% Important: even prior to 5.1.0 it was not really possible to use directly +% sphinxheavybox if not triggered from sphinxadmonition, because some +% parameters were defined in sphinxadmonition. This meant that the +% sphinxwarning, sphinxcaution etc... environments (defined below) could not +% be used directly in a document, they had to be triggered via +% sphinxadmonition. The sole data since 5.1.0 needed by sphinxheavybox is the +% type of the notice which sphinxadmonition stores into \spx@noticetype. +% +% In order to facilitate recycling or imitation of the sphinx +% environments, 7.4.0 inserts an extra \def\spx@noticetype{} in their +% definitions, so that they can be used independently of sphinxadmonition +% dispatcher. +% +% MEMO: direct usage of these environments does not execute the div._TeXextras +% and div._TexColor code, there are only done from the sphinxadmonition wrapper. +\newenvironment{sphinxnote}[1] + {\def\spx@noticetype{note}\begin{sphinxheavybox}\sphinxstylenotetitle{#1}} + {\end{sphinxheavybox}} +\newenvironment{sphinxhint}[1] + {\def\spx@noticetype{hint}\begin{sphinxheavybox}\sphinxstylehinttitle{#1}} + {\end{sphinxheavybox}} +\newenvironment{sphinxtip}[1] + {\def\spx@noticetype{tip}\begin{sphinxheavybox}\sphinxstyletiptitle{#1}} + {\end{sphinxheavybox}} +\newenvironment{sphinximportant}[1] + {\def\spx@noticetype{important}\begin{sphinxheavybox}\sphinxstyleimportanttitle{#1}} + {\end{sphinxheavybox}} +\newenvironment{sphinxwarning}[1] + {\def\spx@noticetype{warning}\begin{sphinxheavybox}\sphinxstylewarningtitle{#1}} + {\end{sphinxheavybox}} +\newenvironment{sphinxcaution}[1] + {\def\spx@noticetype{caution}\begin{sphinxheavybox}\sphinxstylecautiontitle{#1}} + {\end{sphinxheavybox}} +\newenvironment{sphinxattention}[1] + {\def\spx@noticetype{attention}\begin{sphinxheavybox}\sphinxstyleattentiontitle{#1}} + {\end{sphinxheavybox}} +\newenvironment{sphinxdanger}[1] + {\def\spx@noticetype{danger}\begin{sphinxheavybox}\sphinxstyledangertitle{#1}} + {\end{sphinxheavybox}} +\newenvironment{sphinxerror}[1] + {\def\spx@noticetype{error}\begin{sphinxheavybox}\sphinxstyleerrortitle{#1}} + {\end{sphinxheavybox}} +% The "see also" was quite plain until 7.4.0 as it simply did +% \newenvironment{sphinxseealso}[1]{\sphinxstyleseealsotitle{#1}}{} +% Here we need to manually insert execution of div.seealso_TeX{color,extras} values +\newenvironment{sphinxseealso}[1] + {\def\spx@noticetype{seealso}% + \begin{sphinxheavybox}\sphinxstyleseealsotitle{#1}% + \ifspx@seealso@withtextcolor\color{sphinxseealsoTextColor}\fi + \spx@seealso@TeXextras + } + {\end{sphinxheavybox}} +% There was no sphinxtodo environment until 7.4.0 because sphinx.ext.todo +% generated \begin{sphinxadmonition}{note}{Todo:} mark-up. +\newcounter{sphinxtodo}% to provide targets from todolist directive output +\newenvironment{sphinxtodo}[1] + {\refstepcounter{sphinxtodo}\def\spx@noticetype{todo}% + \begin{sphinxheavybox}\sphinxstyletodotitle{#1}% + \ifspx@todo@withtextcolor\color{sphinxtodoTextColor}\fi + \spx@todo@TeXextras + } + {\end{sphinxheavybox}} + + +% the main dispatch for all types of notices +\newenvironment{sphinxadmonition}[2]{% #1=type, #2=heading + % can't use #1 directly in definition of end part + \def\spx@noticetype {#1}% + % those next three are a remnant of legacy code; they are not used at + % all by sphinxheavybox, and their usage could be disposed of by sphinxlightbox + % but we keep for backward compatibility and also because it may be simpler + % for user redefinitions to employ for example "spx@notice@bgcolor" and not + % the more bulky "sphinx\spx@noticetype BgColor". + \sphinxcolorlet{spx@notice@bordercolor}{sphinx#1BorderColor}% + \sphinxcolorlet{spx@notice@bgcolor}{sphinx#1BgColor}% + % At 7.4.0 there are no \spx@@boder macros anymore only top, left, + % bottom, right. For this legacy \spx@notice@border only needed by + % sphinxlightbox (which is not used by own Sphinx environments anymore) + % we thus use here @top + \spx@notice@border \dimexpr\csname spx@#1@border@top\endcsname\relax + % trigger the sphinx environment, #2=heading is passed as argument + \begin{sphinx#1}{#2}% + % MEMO: the heading #2 will be typeset before the next lines are executed + % 6.2.0 support of div._TeX{color,extras} options + \csname ifspx@\spx@noticetype @withtextcolor\endcsname + \color{sphinx\spx@noticetype TextColor}% + \fi + % Other code to be executed at start of contents (after title) + \csname spx@\spx@noticetype @TeXextras\endcsname + } + % workaround some LaTeX "feature" of \end command (i.e. can't use "sphinx#1" here) + {\edef\spx@temp{\noexpand\end{sphinx\spx@noticetype}}\spx@temp} + +\newcommand\sphinxtitlerowtoppadding{5pt} +\newcommand\sphinxtitlerowbottompadding{3pt} +\newcommand\sphinxtitlerowaftericonspacecmd{\hskip0.5em\relax} +\newcommand\sphinxdotitlerowwithicon[2]{% #1=type, #2=heading (without final colon) + \begingroup + \kern-\spx@boxes@padding@top + \parskip\z@skip % the \parskip business is a workaround to a vertical + % glue issue showing in LaTeX earlier than 2023-06-01 + \noindent + \kern-\spx@boxes@padding@left % must have been configured by a prior + % \spx@boxes@fcolorbox@setup{} + % inherit settings from the enclosing box and modify what is needed + \spx@boxes@border@top =\z@ + \spx@boxes@border@right =\z@ + \spx@boxes@border@bottom =\z@ + \spx@boxes@border@left =\z@ + \spx@boxes@radius@bottomright@x=\z@ + \spx@boxes@radius@bottomright@y=\z@ + \spx@boxes@radius@bottomleft@x=\z@ + \spx@boxes@radius@bottomleft@x=\z@ + \spx@boxes@padding@top =\sphinxtitlerowtoppadding\relax + \spx@boxes@padding@bottom=\sphinxtitlerowbottompadding\relax + \spx@boxes@withshadowfalse + \sphinxcolorlet{spx@boxes@backgroundcolor}{sphinx#1TtlBgColor}% + \spx@boxes@fcolorbox{% + \makebox[\linewidth][l]{% + \textcolor{sphinx#1TtlFgColor}{% + \@nameuse{sphinx#1TtlIcon}% + % This macro is located here and not after the closing brace + % for reasons of fall-back \spx@faIcon definition in sphinx.sty + % in case fontawesome5 package not found. + \sphinxtitlerowaftericonspacecmd + }% + \sphinxstrong{#2}% + \strut}% + }% + \kern-\spx@boxes@padding@right + \par + \endgroup + \vskip-\parskip + \kern\spx@boxes@padding@top +} + +% #1 holds the localized name of the notice, postfixed with a colon. +% \sphinxremovefinalcolon{#1} will typeset #1 without the colon. +% Legacy definitions (done in sphinxlatexstyletext.sty) were all using +% a boring plain \sphinxstrong{#1}, now we use a coloured title row. +\newcommand\sphinxstylenotetitle [1]{\sphinxdotitlerowwithicon{note}{\sphinxremovefinalcolon{#1}}} +\newcommand\sphinxstylehinttitle [1]{\sphinxdotitlerowwithicon{hint}{\sphinxremovefinalcolon{#1}}} +\newcommand\sphinxstyleimportanttitle[1]{\sphinxdotitlerowwithicon{important}{\sphinxremovefinalcolon{#1}}} +\newcommand\sphinxstyletiptitle [1]{\sphinxdotitlerowwithicon{tip}{\sphinxremovefinalcolon{#1}}} +\newcommand\sphinxstylewarningtitle [1]{\sphinxdotitlerowwithicon{warning}{\sphinxremovefinalcolon{#1}}} +\newcommand\sphinxstylecautiontitle [1]{\sphinxdotitlerowwithicon{caution}{\sphinxremovefinalcolon{#1}}} +\newcommand\sphinxstyleattentiontitle[1]{\sphinxdotitlerowwithicon{attention}{\sphinxremovefinalcolon{#1}}} +\newcommand\sphinxstyledangertitle [1]{\sphinxdotitlerowwithicon{danger}{\sphinxremovefinalcolon{#1}}} +\newcommand\sphinxstyleerrortitle [1]{\sphinxdotitlerowwithicon{error}{\sphinxremovefinalcolon{#1}}} +\newcommand\sphinxstyleseealsotitle [1]{\sphinxdotitlerowwithicon{seealso}{\sphinxremovefinalcolon{#1}}} +\newcommand\sphinxstyletodotitle [1]{\sphinxdotitlerowwithicon{todo}{\sphinxremovefinalcolon{#1}}} +% +% A utility to remove a final colon. Removing last token is not easy in +% LaTeX, and there are additional complications: +% - some languages will make the : "active" in document body, +% - the generic admonition ends up using "note", so for \sphinxnotetitle to +% use it safely, the utility has to allow an input not having any final colon. +% - a bit far-fetched but maybe there is more than one colon inside the input +% (possible from a generic admonition title). +% Hence the scary code. +\newcommand\sphinxremovefinalcolon[1]{% #1 is the "active" : TeX token +% Prior to 7.4.0 this was defined with \protected\def but we do not +% see what usefulness this could have. +\renewcommand\sphinxremovefinalcolon[1]{% + % complications due to : possibly "active" + \begingroup\ifnum\catcode`:=\active + \def\x####1#1\relax{####1}% + \else\def\x####1:\relax{####1}\fi + \expandafter\endgroup\x##1\relax + % trick to let \x work also if input ##1 has no ending colon + \@gobblefour#1\relax:\relax\relax\relax + }% +}% end of wrapper to inject active : +\begingroup\catcode`:\active\expandafter\endgroup\sphinxremovefinalcolon: + +\endinput diff --git a/build/latex/sphinxlatexcontainers.sty b/build/latex/sphinxlatexcontainers.sty new file mode 100644 index 0000000..93b2c8c --- /dev/null +++ b/build/latex/sphinxlatexcontainers.sty @@ -0,0 +1,22 @@ +%% CONTAINER DIRECTIVES +% +% change this info string if making any custom modification +\ProvidesFile{sphinxlatexcontainers.sty}[2021/05/03 containers] + +% The purpose of this file is to provide a dummy environment sphinxclass which +% will be inserted for each class in each container directive. The class name +% will be passed as the argument to the environment. +% +% For a class foo, the user can define customised handling of that class by +% defining the sphinxclassfoo LaTeX environment. + +\newenvironment{sphinxuseclass}[1]{% + \def\sphinxClassFunctionName{sphinxclass#1}% + \ltx@ifundefined{\sphinxClassFunctionName}% + {}% undefined so do nothing + {\expandafter\begin\expandafter{\sphinxClassFunctionName}}% +}{% + \ltx@ifundefined{\sphinxClassFunctionName}% + {}% we did nothing so we keep doing nothing + {\expandafter\end\expandafter{\sphinxClassFunctionName}}% +}% diff --git a/build/latex/sphinxlatexgraphics.sty b/build/latex/sphinxlatexgraphics.sty new file mode 100644 index 0000000..fd0aae6 --- /dev/null +++ b/build/latex/sphinxlatexgraphics.sty @@ -0,0 +1,122 @@ +%% GRAPHICS +% +% change this info string if making any custom modification +\ProvidesFile{sphinxlatexgraphics.sty}[2021/01/27 graphics] + +% Provides support for this output mark-up from Sphinx latex writer: +% +% - macros: +% +% - \sphinxfigcaption +% - \sphinxincludegraphics +% +% - environments: +% +% - sphinxfigure-in-table +% +% May change: +% +% - \sphinxcaption (at begin document) +% +% Also provides: +% +% - \sphinxsafeincludegraphics (default of \sphinxincludegraphics since 2.0) +% - \spx@image@maxheight dimension (used by sphinxlatexadmonitions.sty) +% - \spx@image@box scratch box register (also used by sphinxlatexliterals.sty) +% +% Requires: +% \RequirePackage{graphicx}% done in sphinx.sty +\RequirePackage{amstext}% needed for \firstchoice@true(false) + +% \sphinxincludegraphics resizes images larger than the TeX \linewidth (which +% is adjusted in indented environments), or taller than a certain maximal +% height (usually \textheight and this is reduced in the environments which use +% framed.sty to avoid infinite loop if image too tall). +% +% In case height or width options are present the rescaling is done +% (since 2.0), in a way keeping the width:height ratio either native from +% image or from the width and height options if both were present. +% +\newdimen\spx@image@maxheight +\AtBeginDocument{\spx@image@maxheight\textheight} + +% box scratch register +\newbox\spx@image@box +\newcommand*{\sphinxsafeincludegraphics}[2][]{% + % #1 contains possibly width=, height=, but no scale= since 1.8.4 + \setbox\spx@image@box\hbox{\includegraphics[#1,draft]{#2}}% + \in@false % use some handy boolean flag + \ifdim \wd\spx@image@box>\linewidth + \in@true % flag to remember to adjust options and set box dimensions + % compute height which results from rescaling width to \linewidth + % and keep current aspect ratio. multiply-divide in \numexpr uses + % temporarily doubled precision, hence no overflow. (of course we + % assume \ht is not a few sp's below \maxdimen...(about 16384pt). + \edef\spx@image@rescaledheight % with sp units + {\the\numexpr\ht\spx@image@box + *\linewidth/\wd\spx@image@box sp}% + \ifdim\spx@image@rescaledheight>\spx@image@maxheight + % the rescaled height will be too big, so it is height which decides + % the rescaling factor + \def\spx@image@requiredheight{\spx@image@maxheight}% dimen register + \edef\spx@image@requiredwidth % with sp units + {\the\numexpr\wd\spx@image@box + *\spx@image@maxheight/\ht\spx@image@box sp}% + % TODO: decide if this commented-out block could be needed due to + % rounding in numexpr operations going up + % \ifdim\spx@image@requiredwidth>\linewidth + % \def\spx@image@requiredwidth{\linewidth}% dimen register + % \fi + \else + \def\spx@image@requiredwidth{\linewidth}% dimen register + \let\spx@image@requiredheight\spx@image@rescaledheight% sp units + \fi + \else + % width is ok, let's check height + \ifdim\ht\spx@image@box>\spx@image@maxheight + \in@true + \edef\spx@image@requiredwidth % with sp units + {\the\numexpr\wd\spx@image@box + *\spx@image@maxheight/\ht\spx@image@box sp}% + \def\spx@image@requiredheight{\spx@image@maxheight}% dimen register + \fi + \fi % end of check of width and height + \ifin@ + \setbox\spx@image@box + \hbox{\includegraphics + [%#1,% contained only width and/or height and overruled anyhow + width=\spx@image@requiredwidth,height=\spx@image@requiredheight]% + {#2}}% + % \includegraphics does not set box dimensions to the exactly + % requested ones, see https://github.com/latex3/latex2e/issues/112 + \wd\spx@image@box\spx@image@requiredwidth + \ht\spx@image@box\spx@image@requiredheight + \leavevmode\box\spx@image@box + \else + % here we do not modify the options, no need to adjust width and height + % on output, they will be computed exactly as with "draft" option + \setbox\spx@image@box\box\voidb@x % clear memory + \includegraphics[#1]{#2}% + \fi +}% +% Use the "safe" one by default (2.0) +\def\sphinxincludegraphics{\sphinxsafeincludegraphics} + + +%% FIGURE IN TABLE +% +\newenvironment{sphinxfigure-in-table}[1][\linewidth]{% + \def\@captype{figure}% + \sphinxsetvskipsforfigintablecaption + \begin{minipage}{#1}% +}{\end{minipage}} +% tabulary expands twice contents, we need to prevent double counter stepping +\newcommand*\sphinxfigcaption + {\ifx\equation$%$% this is trick to identify tabulary first pass + \firstchoice@false\else\firstchoice@true\fi + \spx@originalcaption } +\newcommand*\sphinxsetvskipsforfigintablecaption + {\abovecaptionskip\smallskipamount + \belowcaptionskip\smallskipamount} + +\endinput diff --git a/build/latex/sphinxlatexindbibtoc.sty b/build/latex/sphinxlatexindbibtoc.sty new file mode 100644 index 0000000..79e30a1 --- /dev/null +++ b/build/latex/sphinxlatexindbibtoc.sty @@ -0,0 +1,69 @@ +%% INDEX, BIBLIOGRAPHY, APPENDIX, TABLE OF CONTENTS +% +% change this info string if making any custom modification +\ProvidesFile{sphinxlatexindbibtoc.sty}[2021/01/27 index, bib., toc] + +% Provides support for this output mark-up from Sphinx latex writer: +% +% - environments: (backup defaults or get redefined) +% +% - sphinxtheindex (direct mark-up or via python.ist or sphinx.xdy) +% - sphinxthebibliography +% +% - macros: (defines defaults) +% +% - \sphinxmaketitle +% - \sphinxtableofcontents +% - \sphinxnonalphabeticalgroupname +% - \sphinxsymbolsname +% - \sphinxnumbersname +% - \sphinxcite +% +% Requires: +\RequirePackage{makeidx} + +% fix the double index and bibliography on the table of contents +% in jsclasses (Japanese standard document classes) +\ifx\@jsc@uplatextrue\@undefined\else + \renewenvironment{sphinxtheindex} + {\cleardoublepage\phantomsection + \begin{theindex}} + {\end{theindex}} + + \renewenvironment{sphinxthebibliography}[1] + {\cleardoublepage% \phantomsection % not needed here since TeXLive 2010's hyperref + \begin{thebibliography}{#1}} + {\end{thebibliography}} +\fi + +% disable \@chappos in Appendix in pTeX +\ifx\kanjiskip\@undefined\else + \let\py@OldAppendix=\appendix + \renewcommand{\appendix}{ + \py@OldAppendix + \gdef\@chappos{} + } +\fi + +% make commands known to non-Sphinx document classes +\providecommand*{\sphinxmaketitle}{\maketitle} +\providecommand*{\sphinxtableofcontents}{\tableofcontents} +\ltx@ifundefined{sphinxthebibliography} + {\newenvironment + {sphinxthebibliography}{\begin{thebibliography}}{\end{thebibliography}}% + } + {}% else clause of \ltx@ifundefined +\ltx@ifundefined{sphinxtheindex} + {\newenvironment{sphinxtheindex}{\begin{theindex}}{\end{theindex}}}% + {}% else clause of \ltx@ifundefined + +% for usage with xindy: this string gets internationalized in preamble +\newcommand*{\sphinxnonalphabeticalgroupname}{} +% redefined in preamble, headings for makeindex produced index +\newcommand*{\sphinxsymbolsname}{} +\newcommand*{\sphinxnumbersname}{} + +\protected\def\sphinxcite{\cite} + + +\endinput diff --git a/build/latex/sphinxlatexlists.sty b/build/latex/sphinxlatexlists.sty new file mode 100644 index 0000000..8e79355 --- /dev/null +++ b/build/latex/sphinxlatexlists.sty @@ -0,0 +1,131 @@ +%% ALPHANUMERIC LIST ITEMS +% +% change this info string if making any custom modification +\ProvidesFile{sphinxlatexlists.sty}[2021/12/20 lists] + +% Provides support for this output mark-up from Sphinx latex writer: +% - \sphinxsetlistlabels +% - \sphinxlineitem +% and for the maxlistdepth key of sphinxsetup +% Dependencies: the \spx@opt@maxlistdepth from sphinx.sty + +% We need some helpers macros +\newtoks\spx@lineitemlabel +\long\def\sphinx@gobto@sphinxlineitem#1\sphinxlineitem{} +% TeX/LaTeX has no (easy to use) built-in "peek-ahead" mechanism, but +% we would like to know if next token is another \sphinxlineitem (this +% can happen in glossary entries with multiple terms for same definition) +% so we simply grab next token (assuming it is not {tokens} originally) +\newcommand\sphinxlineitem[2]{% + % safe test of whether #2 is \sphinxlineitem + \sphinx@gobto@sphinxlineitem#2\@gobbletwo\sphinxlineitem\unless + \iftrue + % case with sphinxlineitem immediately followed by another \sphinxlineitem: + % accumulate successive terms until actual definition or sub-list is found + \spx@lineitemlabel\expandafter{\the\spx@lineitemlabel\strut#1\\}% + \else + % now issue the \item command with possibly multi-line contents + % these weird incantations with \kern are related to how LaTeX + % handles \item generally + \item[\kern\labelwidth\kern-\itemindent\kern-\leftmargin + {\parbox[t]{\dimexpr\linewidth+\leftmargin\relax}{% + \raggedright + \the\spx@lineitemlabel% accumulated terms before this one, CR separated + \strut#1}}% due to LaTeX internals no \par token allowed here, + % but the \parbox will insert one tacitly at end + \kern-\labelsep]% + \spx@lineitemlabel{}% + % this causes the label to be typeset (filling up the line), clearing up + % things in case a nested list follows. + \leavevmode + \fi #2% +}% + + +\newcommand\sphinxsetlistlabels[5] +{% #1 = style, #2 = enum, #3 = enumnext, #4 = prefix, #5 = suffix + % #2 and #3 are counters used by enumerate environment e.g. enumi, enumii. + % #1 is a macro such as \arabic or \alph + % prefix and suffix are strings (by default empty and a dot). + \@namedef{the#2}{#1{#2}}% + \@namedef{label#2}{#4\@nameuse{the#2}#5}% + \@namedef{p@#3}{\@nameuse{p@#2}#4\@nameuse{the#2}#5}% +}% + + +%% MAXLISTDEPTH +% +% remove LaTeX's cap on nesting depth if 'maxlistdepth' key used. +% This is a hack, which works with the standard classes: it assumes \@toodeep +% is always used in "true" branches: "\if ... \@toodeep \else .. \fi." + +% will force use the "false" branch (if there is one) +\def\spx@toodeep@hack{\fi\iffalse} + +% do nothing if 'maxlistdepth' key not used or if package enumitem loaded. +\ifnum\spx@opt@maxlistdepth=\z@\expandafter\@gobbletwo\fi +\AtBeginDocument{% +\@ifpackageloaded{enumitem}{\remove@to@nnil}{}% + \let\spx@toodeepORI\@toodeep + \def\@toodeep{% + \ifnum\@listdepth<\spx@opt@maxlistdepth\relax + \expandafter\spx@toodeep@hack + \else + \expandafter\spx@toodeepORI + \fi}% +% define all missing \@list... macros + \count@\@ne + \loop + \ltx@ifundefined{@list\romannumeral\the\count@} + {\iffalse}{\iftrue\advance\count@\@ne}% + \repeat + \loop + \ifnum\count@>\spx@opt@maxlistdepth\relax\else + \expandafter\let + \csname @list\romannumeral\the\count@\expandafter\endcsname + \csname @list\romannumeral\the\numexpr\count@-\@ne\endcsname + % workaround 2.6--3.2d babel-french issue (fixed in 3.2e; no change needed) + \ltx@ifundefined{leftmargin\romannumeral\the\count@} + {\expandafter\let + \csname leftmargin\romannumeral\the\count@\expandafter\endcsname + \csname leftmargin\romannumeral\the\numexpr\count@-\@ne\endcsname}{}% + \advance\count@\@ne + \repeat +% define all missing enum... counters and \labelenum... macros and \p@enum.. + \count@\@ne + \loop + \ltx@ifundefined{c@enum\romannumeral\the\count@} + {\iffalse}{\iftrue\advance\count@\@ne}% + \repeat + \loop + \ifnum\count@>\spx@opt@maxlistdepth\relax\else + \newcounter{enum\romannumeral\the\count@}% + \expandafter\def + \csname labelenum\romannumeral\the\count@\expandafter\endcsname + \expandafter + {\csname theenum\romannumeral\the\numexpr\count@\endcsname.}% + \expandafter\def + \csname p@enum\romannumeral\the\count@\expandafter\endcsname + \expandafter + {\csname p@enum\romannumeral\the\numexpr\count@-\@ne\expandafter + \endcsname\csname theenum\romannumeral\the\numexpr\count@-\@ne\endcsname.}% + \advance\count@\@ne + \repeat +% define all missing labelitem... macros + \count@\@ne + \loop + \ltx@ifundefined{labelitem\romannumeral\the\count@} + {\iffalse}{\iftrue\advance\count@\@ne}% + \repeat + \loop + \ifnum\count@>\spx@opt@maxlistdepth\relax\else + \expandafter\let + \csname labelitem\romannumeral\the\count@\expandafter\endcsname + \csname labelitem\romannumeral\the\numexpr\count@-\@ne\endcsname + \advance\count@\@ne + \repeat + \PackageInfo{sphinx}{maximal list depth extended to \spx@opt@maxlistdepth}% +\@gobble\@nnil +} + +\endinput diff --git a/build/latex/sphinxlatexliterals.sty b/build/latex/sphinxlatexliterals.sty new file mode 100644 index 0000000..8acea9f --- /dev/null +++ b/build/latex/sphinxlatexliterals.sty @@ -0,0 +1,997 @@ +%% LITERAL BLOCKS +% +% change this info string if making any custom modification +\ProvidesFile{sphinxlatexliterals.sty}[2024/07/01 v7.4.0 code-blocks and parsed literals] + +% Provides support for this output mark-up from Sphinx latex writer: +% +% - macros: +% - \sphinxLiteralBlockLabel +% - \sphinxSetupCaptionForVerbatim +% - \sphinxSetupCodeBlockInFootnote +% - \sphinxhref +% - \sphinxnolinkurl +% - \sphinxresetverbatimhllines +% - \sphinxunactivateextrasandspace +% - \sphinxupquote +% - \sphinxurl +% +% - environments: +% - sphinxVerbatim +% - sphinxVerbatimintable +% - sphinxalltt +% +% Dependency: +% +% - hyperref (for \phantomsection and \capstart) (loaded later) +% +% Executes \RequirePackage for: +% +% - framed +% - fancyvrb +% - alltt +% - upquote +% - needspace +% - sphinxpackageboxes +\RequirePackage{sphinxpackageboxes} +% 7.4.0 removes unneeded usage of \spx@boxes@border + +% also in sphinxlatexadmonitions.sty: +% This is a workaround to a "feature" of French lists, when literal block +% follows immediately; usable generally (does only \par then), a priori... +\providecommand*\sphinxvspacefixafterfrenchlists{% + \ifvmode\ifdim\lastskip<\z@ \vskip\parskip\fi\else\par\fi +} + +% For framing allowing pagebreaks +\RequirePackage{framed} +% For source code +% MEMO: fancyvrb is used mainly to +% 1- control horizontal and vertical spacing +% 2- optional line numbering +% 3- optional line emphasizing +% 4- while still allowing expansion of Pygments latex mark-up +% Other aspects such as framing, caption handling, codeline wrapping are +% added on top of it. We should stop using fancyvrb and implement +% 1, 2, 3, 4 by own Sphinx fully native Verbatim. This would greatly simplify +% in particular wrapping long code lines in a way allowing page breaks. +\RequirePackage{fancyvrb} +% For parsed-literal blocks. +\RequirePackage{alltt} +% Display "real" single quotes in literal blocks. +\RequirePackage{upquote} +% Skip to next page if not enough space at bottom +\RequirePackage{needspace} + +% Based on use of "fancyvrb.sty"'s Verbatim. +% - with framing allowing page breaks ("framed.sty") +% - with breaking of long lines (exploits Pygments mark-up), +% - with possibly of a top caption, non-separable by pagebreak. +% - and usable inside tables or footnotes ("sphinxpackagefootnote.sty"). + +% for emphasizing lines +\define@key{FV}{hllines}{\def\sphinx@verbatim@checkifhl##1{\in@{, ##1,}{#1}}} +% sphinxVerbatim must be usable by third party without requiring hllines set-up +\def\sphinxresetverbatimhllines{\def\sphinx@verbatim@checkifhl##1{\in@false}} +\sphinxresetverbatimhllines + +% Prior to Sphinx 1.5, \Verbatim and \endVerbatim were modified by Sphinx. +% The aliases defined here are used in sphinxVerbatim environment and can +% serve as hook-points with no need to modify \Verbatim itself. +\let\OriginalVerbatim \Verbatim +\let\endOriginalVerbatim\endVerbatim + +% for captions of literal blocks +% at start of caption title +\newcommand*{\fnum@literalblock}{\literalblockname\nobreakspace\theliteralblock} +% this will be overwritten in document preamble by Babel translation +\newcommand*{\literalblockname}{Listing } +% file extension needed for \caption's good functioning, the file is created +% only if a \listof{literalblock}{foo} command is encountered, which is +% analogous to \listoffigures, but for the code listings (foo = chosen title.) +\newcommand*{\ext@literalblock}{lol} + +% if forced use of minipage encapsulation is needed (e.g. table cells) +\newif\ifsphinxverbatimwithminipage \sphinxverbatimwithminipagefalse + +% Framing macro for use with framed.sty's \FrameCommand +% MEMO: the sophisticated code in \spx@fcolorbox/\spx@CustomFBox +% is here for good reasons +% - be responsive to indented list environments in the manner of +% the "framed" (\fbox) and "shaded" (\colorbox) environments of +% framed.sty; indeed code here is an evolution related to \fcolorbox +% - attach non-detachable continuation hints above/below frame +% - draw the frame and fill the background color in a manner avoiding +% problems in some pdf viewers +% - do background coloring differently from color.sty/xcolor.sty macros +% (even core internal ones) to work around issues at page breaks +% as the framed contents are split into chunks with possibly unpaired +% "color push" or "color pop" +% About the produced output: +% - it obeys current indentation, +% - frame with 4 padding parameters and 4 border-width parameters +% - the contents use the full available text width, limited by indentation, +% - #1 = will be typeset above frame, in a non detachable way, +% - #2 = will be typeset below frame, in a non detachable way, +% - #3 = will be typeset within the frame. +% #1 and #2 are expected to be already typeset \hbox'es. +% #3 are the contents, and in the context of usage of fancyvrb+framed, +% it will arrive here already transformed into horizontal boxes, +% interline penalties and glues. +% +\long\def\spx@verb@FrameCommand #1#2#3{% + % The \spx@verb@boxes@fcolorbox@setup MUST have been executed beforehand. + % These \hskips are for fancyvrb.sty measuring and will make the + % framing "adapt" to an indented context. + \hskip\@totalleftmargin + \hskip-\spx@boxes@border@left\hskip-\spx@boxes@padding@left + \spx@verb@fcolorbox {#1}{#2}{#3}% + \hskip-\spx@boxes@padding@right\hskip-\spx@boxes@border@right + \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth +}% +\long\def\spx@verb@fcolorbox #1#2#3{% + % The \spx@verb@boxes@fcolorbox@setup MUST have been executed beforehand. +% + % MEMO: in the context of framed.sty this will always expand inside some + % \hbox isolated from other code, so we can use \box\z@, \box\tw@,... + % with no need of extra group. +% + % MEMO: this code was originally using \color@b@x but the latter has + % problematic features regarding color in a context like here where #3 + % may contain an unbalanced "color push". +% + \setbox\z@\hbox{#3}% + \edef\spx@verb@fcolorbox@width@sp + {\number\dimexpr\wd\z@+\spx@boxes@border@left + +\spx@boxes@padding@left + +\spx@boxes@padding@right + +\spx@boxes@border@right\relax sp}% + \vbox{#1% continuation hint attached above frame, uses \spx@verb@fcolorbox@width@sp + % the boxes@fcolorbox constructs an \hbox with bbox containing the border + % \spx@verb@boxes@fcolorbox@setup MUST have been executed beforehand. + \spx@boxes@fcolorbox{\box\z@}% + % This \nointerlineskip to maintain legacy spacing when a \hrule was + % formerly last prior item in vertical list. TODO: remove this at 6.0.0 ? + \nointerlineskip + #2% continuation hint attached below frame, uses \spx@verb@fcolorbox@width@sp + }% end of \vbox +}% +\def\spx@verb@fcolorbox@put@c#1{% hide width from framed.sty measuring + \moveright.5\dimexpr\spx@verb@fcolorbox@width@sp\hb@xt@\z@{\hss#1\hss}% +}% +\def\spx@verb@fcolorbox@put@r#1{% right align with contents, width hidden + \moveright\dimexpr\spx@verb@fcolorbox@width@sp-% + \spx@boxes@padding@right-% + \spx@boxes@border@right\hb@xt@\z@{\hss#1}% +}% +\def\spx@verb@fcolorbox@put@l#1{% left align with contents, width hidden + \moveright\dimexpr\spx@boxes@border@left+% + \spx@boxes@padding@left\hb@xt@\z@{#1\hss}% +}% +% +\def\sphinxVerbatim@Continued{% + \csname spx@verb@fcolorbox@put@\spx@opt@verbatimcontinuedalign\endcsname + {{\normalcolor\sphinxstylecodecontinued\literalblockcontinuedname}}% +}% +\def\sphinxVerbatim@Continues{% + \csname spx@verb@fcolorbox@put@\spx@opt@verbatimcontinuesalign\endcsname + {{\normalcolor\sphinxstylecodecontinues\literalblockcontinuesname}}% +}% +\def\sphinxVerbatim@Title{% + \spx@verb@fcolorbox@put@c{\unhcopy\sphinxVerbatim@TitleBox}% +}% +\let\sphinxVerbatim@Before\@empty +\let\sphinxVerbatim@After\@empty +% Defaults are redefined in document preamble according to language +\newcommand*\literalblockcontinuedname{continued from previous page}% +\newcommand*\literalblockcontinuesname{continues on next page}% +% +\def\sphinxVerbatim@FrameCommand{% + \spx@verb@FrameCommand\sphinxVerbatim@Before\sphinxVerbatim@After +}% +\def\sphinxVerbatim@FirstFrameCommand{% + \ifspx@pre@border@open + \spx@boxes@fcolorbox@setup@openbottom + \fi + \spx@verb@FrameCommand\sphinxVerbatim@Before\sphinxVerbatim@Continues +}% +\def\sphinxVerbatim@MidFrameCommand{% + \ifspx@pre@border@open + \spx@boxes@fcolorbox@setup@openboth + \fi + \spx@verb@FrameCommand\sphinxVerbatim@Continued\sphinxVerbatim@Continues +}% +\def\sphinxVerbatim@LastFrameCommand{% + \ifspx@pre@border@open + \spx@boxes@fcolorbox@setup@opentop + \fi + \spx@verb@FrameCommand\sphinxVerbatim@Continued\sphinxVerbatim@After +}% +% +\def\spx@verb@boxes@fcolorbox@setup{% + % Prepares usage of \spx@boxes@fcolorbox + % Extras to remap legacy color names VerbatimBorderColor and VerbatimColor + % to a common naming scheme with admonitions (and topic directive), as + % expected by \spx@boxes@fcolorbox@setup from sphinxpackageboxes.sty. + \sphinxcolorlet{sphinxpreBorderColor}{VerbatimBorderColor}% + \sphinxcolorlet{sphinxpreBgColor}{VerbatimColor}% + % This VerbatimShadowColor is not a legacy name nor user documented but is + % an outcome of sphinx.sty batch definitions for CSS option support. + \sphinxcolorlet{sphinxpreShadowColor}{VerbatimShadowColor}% + \spx@boxes@fcolorbox@setup{pre}% + \ifspx@opt@verbatimwithframe + \else + \spx@boxes@border@top\z@ + \spx@boxes@border@right\z@ + \spx@boxes@border@bottom\z@ + \spx@boxes@border@left\z@ + % MEMO: rounded corners still make sense in presence of a background + % color, so we do not force the fcolorbox@rectangle here + \fi +}% + +% For linebreaks inside Verbatim environment from package fancyvrb. +\newbox\sphinxcontinuationbox +\newbox\sphinxvisiblespacebox +\newcommand*\sphinxafterbreak {\copy\sphinxcontinuationbox} + +% Take advantage of the already applied Pygments mark-up to insert +% potential linebreaks for TeX processing. +% {, <, #, %, $, ' and ": go to next line. +% _, }, ^, &, >, -, ~, and \: stay at end of broken line. +% Use of \textquotesingle for straight quote. +% FIXME: convert this to package options ? +\newcommand*\sphinxbreaksbeforelist {% + \do\PYGZob\{\do\PYGZlt\<\do\PYGZsh\#\do\PYGZpc\%% {, <, #, %, + \do\PYGZdl\$\do\PYGZdq\"% $, " + \def\PYGZsq + {\discretionary{}{\sphinxafterbreak\textquotesingle}{\textquotesingle}}% ' +} +\newcommand*\sphinxbreaksafterlist {% + \do\PYGZus\_\do\PYGZcb\}\do\PYGZca\^\do\PYGZam\&% _, }, ^, &, + \do\PYGZgt\>\do\PYGZhy\-\do\PYGZti\~% >, -, ~ + \do\PYGZbs\\% \ +} +\newcommand*\sphinxbreaksatspecials {% + \def\do##1##2% + {\def##1{\discretionary{}{\sphinxafterbreak\char`##2}{\char`##2}}}% + \sphinxbreaksbeforelist + \def\do##1##2% + {\def##1{\discretionary{\char`##2}{\sphinxafterbreak}{\char`##2}}}% + \sphinxbreaksafterlist +} + +\def\sphinx@verbatim@nolig@list {\do \`}% +% Some characters . , ; ? ! / are neither pygmentized nor "tex-escaped". +% This macro makes them "active" and they will insert potential linebreaks. +% Not compatible with math mode (cf \sphinxunactivateextras, which uses +% these lists to make sure activated characters get de-activated). +\newcommand*\sphinxbreaksbeforeactivelist {}% none +\newcommand*\sphinxbreaksafteractivelist {\do\.\do\,\do\;\do\?\do\!\do\/} +\newcommand*\sphinxbreaksviaactive {% + \def\do##1{\lccode`\~`##1% + \lowercase{\def~}{\discretionary{}{\sphinxafterbreak\char`##1}{\char`##1}}% + \catcode`##1\active}% + \sphinxbreaksbeforeactivelist + \def\do##1{\lccode`\~`##1% + \lowercase{\def~}{\discretionary{\char`##1}{\sphinxafterbreak}{\char`##1}}% + \catcode`##1\active}% + \sphinxbreaksafteractivelist + \lccode`\~`\~ +} + +% If the linebreak is at a space, the latter will be displayed as visible +% space at end of first line, and a continuation symbol starts next line. +\def\spx@verbatim@space {% + \nobreak\hskip\z@skip + \discretionary{\copy\sphinxvisiblespacebox}{\sphinxafterbreak} + {\kern\fontdimen2\font}% +}% + +% if the available space on page is less than \literalblockneedspace, insert pagebreak +\newcommand{\sphinxliteralblockneedspace}{5\baselineskip} +\newcommand{\sphinxliteralblockwithoutcaptionneedspace}{1.5\baselineskip} +% The title (caption) is specified from outside as macro \sphinxVerbatimTitle. +% \sphinxVerbatimTitle is reset to empty after each use of Verbatim. +\newcommand*\sphinxVerbatimTitle {} +% This box to typeset the caption before framed.sty multiple passes for framing. +\newbox\sphinxVerbatim@TitleBox +% This box to measure contents if nested as inner \MakeFramed requires then +% minipage encapsulation but too long contents then break outer \MakeFramed +\newbox\sphinxVerbatim@ContentsBox +% Holder macro for labels of literal blocks. Set-up by LaTeX writer. +\newcommand*\sphinxLiteralBlockLabel {} +\newcommand*\sphinxSetupCaptionForVerbatim [1] +{% + \sphinxvspacefixafterfrenchlists + \needspace{\sphinxliteralblockneedspace}% +% insert a \label via \sphinxLiteralBlockLabel +% reset to normal the color for the literal block caption + \def\sphinxVerbatimTitle + {\py@NormalColor\sphinxcaption{\sphinxLiteralBlockLabel #1}}% +} +\newcommand*\sphinxSetupCodeBlockInFootnote {% + \fvset{fontsize=\footnotesize}\let\caption\sphinxfigcaption + \sphinxverbatimwithminipagetrue % reduces vertical spaces + % we counteract (this is in a group) the \@normalsize from \caption + \let\normalsize\footnotesize\let\@parboxrestore\relax + \def\spx@abovecaptionskip{\sphinxverbatimsmallskipamount}% +} +\newcommand*{\sphinxverbatimsmallskipamount}{\smallskipamount} +% serves to implement line highlighting +\newcommand\sphinxFancyVerbFormatLine[1]{% + \expandafter\sphinx@verbatim@checkifhl\expandafter{\the\FV@CodeLineNo}% + \ifin@ + \sphinxVerbatimHighlightLine{#1}% + \else + \sphinxVerbatimFormatLine{#1}% + \fi +}% +\let\spx@original@set@color\set@color +\newcommand\sphinxVerbatimHighlightLine[1]{% +% This is morally a \colorbox (with a \fboxsep which would be 0pt) +% but some issues of potential colour disappearance at pagebreaks +% require workaround such as the one done here. + \leavevmode + % MEMO: usage of original \colorbox would insert a \set@color here + % and this then places a "color pop" at the end of the \box\z@. + % But this could pair erroneously with an unmatched "color push" + % as #1 is maybe only a part (already hboxed) of a codeline + % if (default) verbatimwrapslines=true + % (cf \spx@verb@@PreProcessLine; refs: #8686) + % MEMO: formerly we did something with \fboxsep in relation to the LaTeX + % bug graphics/4524 for \colorbox, but as we don't use \colorbox... + \setbox\z@\hb@xt@\linewidth{\strut#1\hss}% + % MEMO: \colorbox would lead to \color{sphinxVerbatimHighlightColor} + % plus \color@block, which results in doubled (a color.sty feature) + % color command send to device driver and more importantly has + % a "color pop" which will be after \box\z@. We avoid that for reasons + % mentioned above. + {% + \def\set@color{\let\set@color\spx@original@set@color}% + % will only set \current@color and delay the \set@color to \color@block + % as this all happens inside fancyvrb nested \hbox'es. + \color{sphinxVerbatimHighlightColor}% + % will use \current@color and pop it **before** \box\z@ + \color@block{\wd\z@}{\ht\z@}{\dp\z@}\box\z@ + }% + % we added a group only for \FV@RightListNumber not be influenced by the + % \current@color, if \fvset has been used to set numbers to the right. +}% +% MEMO: fancyvrb has options obeytabs and tabsize. Anyhow tab characters +% do not make it to the tex file, they have been converted to spaces earlier. +% But, if this was not the case, the support would be implemented here via +% \newcommand\sphinxVerbatimFormatLine[1]{\FV@ObeyTabs{\strut #1}}% +\newcommand\sphinxVerbatimFormatLine[1]{\strut#1}% +% MEMO: if verbatimwrapslines is set to true (default) the #1 above is +% simply \box\spx@tempboxb, from the next two macros. +% The next two macros are a deep hack of fancyvrb.sty core line processing in +% order to wrap too long lines, either at spaces and natural break-points, +% (soft wrap) or optionally at any character (hard wrap). This requires deep +% hack to work around the \hbox'es wrappers of fancyvrb.sty as they would +% prevent page breaks. Formerly Sphinx obtained wrapping by inserting the +% material into a vertical box (which was later again boxed -- twice -- by +% fancyvrb thinking it was a single line...) but this was incompatible with +% allowing page breaks (refs: #8686). +% We use core TeX techniques to pre-process a paragraph then recover its +% constituents lines (as boxes, not as tokens) and hand them over to original +% fancyvrb line process. It is mandatory to update \FV@ProcessLine and +% \@tempboxa globally to get fancyvrb internals into working to our +% satisfaction. +% This will get disrupted if anything adding vertical penalties or glues +% is activated via some \vadjust from inside the Pygmentized code lines. +\def\spx@verb@@ProcessLines{% + \unskip + \unpenalty + \setbox\spx@tempboxb\lastbox +\ifvoid\spx@tempboxb\else + {\spx@verb@@ProcessLines}% + \FV@ProcessLine{\box\spx@tempboxb}% + \global\let\FV@ProcessLine\FV@ProcessLine + \global\setbox\@tempboxa=\box\@tempboxa + \aftergroup\spx@verb@@InhibitLineNumber +\fi +}% +\def\spx@verb@@InhibitLineNumber{% + \let\FV@LeftListNumber\relax + \let\FV@RightListNumber\relax +}% +% This will replace fancyvrb's \FV@@PreProcessLine +% Instead of boxing \FV@Line (which contains the Pygmentized line tokens), we +% first typeset it in a vertical box of the suitable width (taking into +% account nested lists) to activate the TeX built-in paragraph builder, then +% we recover individual lines as horizontal boxes and feed them to fancyvrb +% native line processing (which may add line numbers). The interline +% penalties and vertical glue to maintain baseline distance will be added +% again by this process so in recursive \spx@verb@@ProcessLines which starts +% from bottom and makes its way up to first part of the wrapped line we do not +% need to worry about them. An additional initial measuring step is needed if +% user issued verbatimforcewraps=true, which elaborates on the same technique. +% If hard wraps get activated, they get implemented via hacked \PYG macros. +\def\spx@verb@@PreProcessLine{% + \FV@StepLineNo + \FV@Gobble + \def\spx@verb@FV@Line{\FV@Line}% + \ifspx@opt@verbatimforcewraps + \spx@verb@DecideIfWillDoForceWrap + \fi +% MEMO: \everypar{} was issued earlier (and due to \@setminipage +% would have been only \@minipagefalse\everypar{} otherwise). + \setbox\spx@tempboxa=\vtop{\hsize\linewidth + \raggedright\hyphenpenalty\z@\exhyphenpenalty\z@ + \doublehyphendemerits\z@\finalhyphendemerits\z@ +% MEMO: fancyvrb has options obeytabs and tabsize. Anyhow tab characters +% do not make it to the tex file, they have been converted to spaces earlier. +% But, if this was not the case, the support would be implemented here via +% \FV@ObeyTabs{\strut\spx@verb@FV@Line\strut}% +% And one would need a similar change in the measuring phase done by +% \spx@verb@DecideIfWillDoForceWrap + \strut\spx@verb@FV@Line\strut +% MEMO: since LaTeX 2021-06-01, there might be some hooks executed at +% start and end of paragraphs (in future: PDF tagging), but we need an +% explicit \par here for that. Else the kernel hooks at start of paragraph +% are executed but not the ones at its end. + \par + }% + \setbox\spx@tempboxa=\vtop{\unvbox\spx@tempboxa + \setbox\spx@tempboxb\lastbox + {\spx@verb@@ProcessLines}% + \FV@ProcessLine{\box\spx@tempboxb}% + \global\let\FV@ProcessLine\FV@ProcessLine + \global\setbox\@tempboxa=\box\@tempboxa + }% + \unvbox\spx@tempboxa +}% +% +% The normal line wrapping allows breaks at spaces and ascii non +% letters, non digits. The \raggedright above means there will be +% an overfilled line only if some non-breakable "word" was +% encountered, which is longer than a line (it is moved always to +% be on its own on a new line). +% +% The "forced" line wrapping will parse the tokens to add potential +% breakpoints at each character. As some strings are highlighted, +% we have to apply the highlighting character per character, which +% requires to manipulate the output of the Pygments LaTeXFormatter. +% +% Doing this at latex level is complicated. The contents should +% be as expected: i.e. some active characters from +% \sphinxbreaksviaactive, some Pygments character escapes such as +% \PYGZdl{}, and the highlighting \PYG macro with always 2 +% arguments. No other macros should be there, except perhaps +% zero-parameter macros. In particular: +% - the texcomments Pygments option must be set to False +% +% With pdflatex, Unicode input gives multi-bytes characters +% where the first byte is active. We support the "utf8" macros +% only. "utf8x" is not supported. +% +% The highlighting macro \PYG will be applied character per +% character. Highlighting via a colored background gives thus a +% chain of small colored boxes which may cause some artefact in +% some pdf viewers. Can't do anything here if we do want the line +% break to be possible. +% +% First a measurement step is done of what would the standard line +% wrapping give (i.e line breaks only at spaces and non-letter, +% non-digit ascii characters), cf TeX by Topic for the basic +% dissecting technique: TeX unfortunately when building a vertical +% box does not store in an accessible way what was the maximal +% line-width during paragraph building. +% +% MEMO: in future use perhaps rather \RawNoindent/\RawParEnd, but +% ltpara (LaTeX 2021-06-01) is not yet in final form (June 2022). +% +% Avoid LaTeX 2021 alteration of \@@par which potentially could break our +% measurement step (typically if the para/after hook is configured to use +% \vspace). Of course, breakage could happen only from user or package +% adding things to basic Sphinx latex. And perhaps spring LaTeX 2021 will +% provide a non-hooked \@@par, but this should work anyway and can't be +% beaten for speed. +\ltx@ifundefined{tex_par:D} +% We could use \@ifl@t@r\fmtversion{2020/02/02}{use \tex_par:D}{use \@@par}. + {\let\spx@par\@@par}% \@@par is then expected to be TeX's original \par + {\expandafter\let\expandafter\spx@par\csname tex_par:D\endcsname} +% More hesitation for avoiding the at-start-of-par hooks for our +% measurement : 1. with old LaTeX, we can not avoid hooks from everyhook +% or similar packages, 2. and perhaps the hooks add stuff which we should +% actually measure. Ideally, hooks are for inserting things in margin +% which do not change spacing. Most everything else in fact should not be +% executed in our scratch box for measurement, such as counter stepping. +\ltx@ifundefined{tex_everypar:D} + {\let\spx@everypar\everypar} + {\expandafter\let\expandafter\spx@everypar\csname tex_everypar:D\endcsname} +% +% If the max width exceeds the linewidth by more than verbatimmaxoverfull +% character widths, or if the min width plus verbatimmaxunderfull character +% widths is inferior to linewidth, then we apply the "force wrapping" with +% potential line break at each character, else we don't. +\long\def\spx@verb@DecideIfWillDoForceWrap{% + \global\let\spx@verb@maxwidth\z@ + \global\let\spx@verb@minwidth\linewidth + \setbox\spx@tempboxa + \vtop{\raggedright\hyphenpenalty\z@\exhyphenpenalty\z@ + \doublehyphendemerits\z@\finalhyphendemerits\z@ + \spx@everypar{}\noindent\strut\FV@Line\strut\spx@par + \spx@verb@getwidths}% + \ifdim\spx@verb@maxwidth> + \dimexpr\linewidth+\spx@opt@verbatimmaxoverfull\fontcharwd\font`X \relax +% The \expandafter is due to \spx@verb@wrapPYG requiring to "see" the TeX tokens +% from the pygmentize output. + \def\spx@verb@FV@Line{\expandafter\spx@verb@wrapPYG\FV@Line\spx@verb@wrapPYG}% + \else + \ifdim\spx@verb@minwidth< + \dimexpr\linewidth-\spx@opt@verbatimmaxunderfull\fontcharwd\font`X \relax + \def\spx@verb@FV@Line{\expandafter\spx@verb@wrapPYG\FV@Line\spx@verb@wrapPYG}% + \fi + \fi +}% +% auxiliary paragraph dissector to get max and min widths +% but minwidth must not take into account the last line +\def\spx@verb@getwidths {% + \unskip\unpenalty + \setbox\spx@tempboxb\lastbox + \ifvoid\spx@tempboxb + \else + \setbox\spx@tempboxb\hbox{\unhbox\spx@tempboxb}% + \ifdim\spx@verb@maxwidth<\wd\spx@tempboxb + \xdef\spx@verb@maxwidth{\number\wd\spx@tempboxb sp}% + \fi + \expandafter\spx@verb@getwidths@loop + \fi +}% +\def\spx@verb@getwidths@loop {% + \unskip\unpenalty + \setbox\spx@tempboxb\lastbox + \ifvoid\spx@tempboxb + \else + \setbox\spx@tempboxb\hbox{\unhbox\spx@tempboxb}% + \ifdim\spx@verb@maxwidth<\wd\spx@tempboxb + \xdef\spx@verb@maxwidth{\number\wd\spx@tempboxb sp}% + \fi + \ifdim\spx@verb@minwidth>\wd\spx@tempboxb + \xdef\spx@verb@minwidth{\number\wd\spx@tempboxb sp}% + \fi + \expandafter\spx@verb@getwidths@loop + \fi +}% +% auxiliary macros to implement "cut long line even in middle of word" +\catcode`Z=3 % safe delimiter +\def\spx@verb@wrapPYG{% + \futurelet\spx@nexttoken\spx@verb@wrapPYG@i +}% +\def\spx@verb@wrapPYG@i{% + \ifx\spx@nexttoken\spx@verb@wrapPYG\let\next=\@gobble\else + \ifx\spx@nexttoken\PYG\let\next=\spx@verb@wrapPYG@PYG@onebyone\else + \discretionary{}{\sphinxafterbreak}{}% + \let\next\spx@verb@wrapPYG@ii + \fi\fi + \next +}% +% Let's recognize active characters. We don't support utf8x only utf8. +% And here #1 should not have picked up (non empty) braced contents +\long\def\spx@verb@wrapPYG@ii#1{% + \ifcat\noexpand~\noexpand#1\relax% active character + \expandafter\spx@verb@wrapPYG@active + \else % non-active character, control sequence such as \PYGZdl, or empty + \expandafter\spx@verb@wrapPYG@one + \fi {#1}% +}% +\long\def\spx@verb@wrapPYG@active#1{% +% Let's hope expansion of active character does not really require arguments, +% as we certainly don't want to go into expanding upfront token stream anyway. + \expandafter\spx@verb@wrapPYG@iii#1{}{}{}{}{}{}{}{}{}Z#1% +}% +\long\def\spx@verb@wrapPYG@iii#1#2Z{% + \ifx\UTFviii@four@octets#1\let\next=\spx@verb@wrapPYG@four\else + \ifx\UTFviii@three@octets#1\let\next=\spx@verb@wrapPYG@three\else + \ifx\UTFviii@two@octets#1\let\next=\spx@verb@wrapPYG@two\else + \let\next=\spx@verb@wrapPYG@one + \fi\fi\fi + \next +}% +\long\def\spx@verb@wrapPYG@one #1{#1\futurelet\spx@nexttoken\spx@verb@wrapPYG@i}% +\long\def\spx@verb@wrapPYG@two #1#2{#1#2\futurelet\spx@nexttoken\spx@verb@wrapPYG@i}% +\long\def\spx@verb@wrapPYG@three #1#2#3{#1#2#3\futurelet\spx@nexttoken\spx@verb@wrapPYG@i}% +\long\def\spx@verb@wrapPYG@four #1#2#3#4{#1#2#3#4\futurelet\spx@nexttoken\spx@verb@wrapPYG@i}% +% Replace \PYG by itself applied one character at a time! This way breakpoints +% can be inserted. +\def\spx@verb@wrapPYG@PYG@onebyone#1#2#3{% #1 = \PYG, #2 = highlight spec, #3 = tokens + \def\spx@verb@wrapPYG@PYG@spec{{#2}}% + \futurelet\spx@nexttoken\spx@verb@wrapPYG@PYG@i#3Z% +}% +\def\spx@verb@wrapPYG@PYG@i{% + \ifx\spx@nexttokenZ\let\next=\spx@verb@wrapPYG@PYG@done\else + \discretionary{}{\sphinxafterbreak}{}% + \let\next\spx@verb@wrapPYG@PYG@ii + \fi + \next +}% +\def\spx@verb@wrapPYG@PYG@doneZ{\futurelet\spx@nexttoken\spx@verb@wrapPYG@i}% +\long\def\spx@verb@wrapPYG@PYG@ii#1{% + \ifcat\noexpand~\noexpand#1\relax% active character + \expandafter\spx@verb@wrapPYG@PYG@active + \else % non-active character, control sequence such as \PYGZdl, or empty + \expandafter\spx@verb@wrapPYG@PYG@one + \fi {#1}% +}% +\long\def\spx@verb@wrapPYG@PYG@active#1{% +% Let's hope expansion of active character does not really require arguments, +% as we certainly don't want to go into expanding upfront token stream anyway. + \expandafter\spx@verb@wrapPYG@PYG@iii#1{}{}{}{}{}{}{}{}{}Z#1% +}% +\long\def\spx@verb@wrapPYG@PYG@iii#1#2Z{% + \ifx\UTFviii@four@octets#1\let\next=\spx@verb@wrapPYG@PYG@four\else + \ifx\UTFviii@three@octets#1\let\next=\spx@verb@wrapPYG@PYG@three\else + \ifx\UTFviii@two@octets#1\let\next=\spx@verb@wrapPYG@PYG@two\else + \let\next=\spx@verb@wrapPYG@PYG@one + \fi\fi\fi + \next +}% +\long\def\spx@verb@wrapPYG@PYG@one#1{% + \expandafter\PYG\spx@verb@wrapPYG@PYG@spec{#1}% + \futurelet\spx@nexttoken\spx@verb@wrapPYG@PYG@i +}% +\long\def\spx@verb@wrapPYG@PYG@two#1#2{% + \expandafter\PYG\spx@verb@wrapPYG@PYG@spec{#1#2}% + \futurelet\spx@nexttoken\spx@verb@wrapPYG@PYG@i +}% +\long\def\spx@verb@wrapPYG@PYG@three#1#2#3{% + \expandafter\PYG\spx@verb@wrapPYG@PYG@spec{#1#2#3}% + \futurelet\spx@nexttoken\spx@verb@wrapPYG@PYG@i +}% +\long\def\spx@verb@wrapPYG@PYG@four#1#2#3#4{% + \expandafter\PYG\spx@verb@wrapPYG@PYG@spec{#1#2#3#4}% + \futurelet\spx@nexttoken\spx@verb@wrapPYG@PYG@i +}% +\catcode`Z 11 % +% +\g@addto@macro\FV@SetupFont{% + \sbox\sphinxcontinuationbox {\spx@opt@verbatimcontinued}% + \sbox\sphinxvisiblespacebox {\spx@opt@verbatimvisiblespace}% +}% +\newenvironment{sphinxVerbatim}{% + % first, let's check if there is a caption + \ifx\sphinxVerbatimTitle\empty + \sphinxvspacefixafterfrenchlists + \parskip\z@skip + \vskip\sphinxverbatimsmallskipamount + % there was no caption. Check if nevertheless a label was set. + \ifx\sphinxLiteralBlockLabel\empty\else + % we require some space to be sure hyperlink target from \phantomsection + % will not be separated from upcoming verbatim by a page break + \needspace{\sphinxliteralblockwithoutcaptionneedspace}% + \phantomsection\sphinxLiteralBlockLabel + \fi + \else + \parskip\z@skip + \if t\spx@opt@literalblockcappos + \vskip\spx@abovecaptionskip + \def\sphinxVerbatim@Before + {\sphinxVerbatim@Title\nointerlineskip + \kern\dimexpr-\dp\strutbox+\sphinxbelowcaptionspace + % MEMO: prior to 7.4.0 a test was done for presence or + % not of a frame and if not top padding was removed if + % no background color. A background color is now always + % assumed, so this got removed. + % caption package adds \abovecaptionskip vspace, remove it + \spx@ifcaptionpackage{-\abovecaptionskip}{}\relax}% + \else + \vskip\sphinxverbatimsmallskipamount + \def\sphinxVerbatim@After + {\nointerlineskip\kern\dimexpr\dp\strutbox + % MEMO: 7.4.0 removes here too an optional removal of bottom padding + \spx@ifcaptionpackage{-\abovecaptionskip}{}\relax + \sphinxVerbatim@Title}% + \fi + \def\@captype{literalblock}% + \capstart + % \sphinxVerbatimTitle must reset color + \setbox\sphinxVerbatim@TitleBox + \hbox{\begin{minipage}{\linewidth}% + % caption package may detect wrongly if top or bottom, so we help it + \spx@ifcaptionpackage + {\caption@setposition{\spx@opt@literalblockcappos}}{}% + \sphinxVerbatimTitle + \end{minipage}}% + \fi + \global\let\sphinxLiteralBlockLabel\empty + \global\let\sphinxVerbatimTitle\empty + % the "FrameCommand"'s are also responsible to attach the "Title". + \let\FrameCommand \sphinxVerbatim@FrameCommand + % those will also check status of the pre_box-decoration-break option + \let\FirstFrameCommand\sphinxVerbatim@FirstFrameCommand + \let\MidFrameCommand \sphinxVerbatim@MidFrameCommand + \let\LastFrameCommand \sphinxVerbatim@LastFrameCommand + % + \ifspx@opt@verbatimhintsturnover\else + \let\sphinxVerbatim@Continued\@empty + \let\sphinxVerbatim@Continues\@empty + \fi + % initialization for \spx@boxes@fcolorbox from sphinxpackageboxes.sty + % it will take into account status of verbatimwithframe Boolean + \spx@verb@boxes@fcolorbox@setup + \ifspx@opt@verbatimwrapslines + % deep hack into fancyvrb's internal processing of input lines + \let\FV@@PreProcessLine\spx@verb@@PreProcessLine + % space character will allow line breaks + \let\FV@Space\spx@verbatim@space + % allow breaks at special characters using \PYG... macros. + \sphinxbreaksatspecials + % breaks at punctuation characters . , ; ? ! and / (needs catcode activation) + \fvset{codes*=\sphinxbreaksviaactive}% + \fi + \let\FancyVerbFormatLine\sphinxFancyVerbFormatLine + \VerbatimEnvironment + % workaround to fancyvrb's check of current list depth + \def\@toodeep {\advance\@listdepth\@ne}% + % The list environment is needed to control perfectly the vertical space. + % Note: \OuterFrameSep used by framed.sty is later set to \topsep hence 0pt. + % - if caption: distance from last text baseline to caption baseline is + % A+(B-F)+\ht\strutbox, A = \abovecaptionskip (default 10pt), B = + % \baselineskip, F is the framed.sty \FrameHeightAdjust macro, default 6pt. + % Formula valid for F < 10pt. + % - distance of baseline of caption to top of frame is like for tables: + % \sphinxbelowcaptionspace (=0.5\baselineskip) + % - if no caption: distance of last text baseline to code frame is S+(B-F), + % with S = \sphinxverbatimtopskip (=\smallskip) + % - and distance from bottom of frame to next text baseline is + % \baselineskip+\parskip. + % The \trivlist is used to avoid possible "too deeply nested" error. + \itemsep \z@skip + \topsep \z@skip + \partopsep \z@skip + % trivlist will set \parsep to \parskip (which itself is set to zero above) + % \leftmargin will be set to zero by trivlist + \rightmargin\z@ + \parindent \z@% becomes \itemindent. Default zero, but perhaps overwritten. + \trivlist\item\relax + \ifspx@inframed\setbox\sphinxVerbatim@ContentsBox\vbox\bgroup + \@setminipage\hsize\linewidth + % use bulk of minipage paragraph shape restores (this is needed + % in indented contexts, at least for some) + \textwidth\hsize \columnwidth\hsize \@totalleftmargin\z@ + \leftskip\z@skip \rightskip\z@skip \@rightskip\z@skip + \else + \ifsphinxverbatimwithminipage\noindent\begin{minipage}{\linewidth}\fi + \MakeFramed {% adapted over from framed.sty's snugshade environment + \advance\hsize-\width\@totalleftmargin\z@\linewidth\hsize\@setminipage + }% + \fi + % For grid placement from \strut's in \FancyVerbFormatLine + \lineskip\z@skip + % active comma should not be overwritten by \@noligs + \ifspx@opt@verbatimwrapslines + \let\verbatim@nolig@list \sphinx@verbatim@nolig@list + \fi + % optimization: as codelines will be handled inside boxes, \everypar is + % never reset, and it issues \@minipagefalse repeatedly (from \@setminipage). + % As fancyvrb Verbatim will do \@minipagefalse itself, let's simplify things. + \everypar{}% + \color@begingroup % protect against color leaks (upstream framed.sty bug) + \ifspx@pre@withtextcolor\color{VerbatimTextColor}\fi % mostly shadowed by + % Pygments highlighting anyhow + \spx@pre@TeXextras + % will fetch its optional arguments if any + \OriginalVerbatim +}% +{% + \endOriginalVerbatim + \color@endgroup % matches the \color@begingroup + \ifspx@inframed + \egroup % finish \sphinxVerbatim@ContentsBox vbox + \nobreak % update page totals +%%%% +% MEMO (2022/07/09, while preparing 5.1.0 LaTeX CSS-style sphinxsetup options) +% This test will systematically cause to abandon framing if the code-block +% is near bottom of a warning-type notice which TeX has not yet decided whether +% it fits on current page and which is near bottom of page. Indeed the +% \pagetotal will already be very near \pagegoal. This is probably a not +% intended behaviour, and perhaps the whole thing should be removed? Indeed +% the result is surprising then because the notice will be split, code-block +% will be on page 2 and will have no background-color, no border. + \ifdim\dimexpr + \ht\sphinxVerbatim@ContentsBox+ + \dp\sphinxVerbatim@ContentsBox+ + \ht\sphinxVerbatim@TitleBox+ + \dp\sphinxVerbatim@TitleBox+ + % 6.2.0 uses here the dimen registers from sphinxpackageboxes.sty, + % they got setup by \spx@verb@boxes@fcolorbox@setup + \spx@boxes@padding@top+ + \spx@boxes@padding@bottom+ + \ifspx@opt@verbatimwithframe \spx@boxes@border@top+ + \spx@boxes@border@bottom+\fi + % try to account for external frame parameters + % MEMO: this is because the sphinxheavybox (for warning admonitions) + % environment sets \FrameSep and \FrameRule + % TODO: fix this bad implicit dependency + \FrameSep+\FrameRule+ + % Usage here of 2 baseline distances is empirical. + % In border case where code-block fits barely in remaining space, + % it gets framed and looks good but the outer frame may continue + % on top of next page and give (if no contents after code-block) + % an empty framed line, as testing showed. + 2\baselineskip+ + % now add all to accumulated page totals and compare to \pagegoal + \pagetotal+\pagedepth>\pagegoal + % long contents: do not \MakeFramed. Do make a caption (either before or + % after) if title exists. Continuation hints across pagebreaks dropped. + % FIXME? a bottom caption may end up isolated at top of next page + % (no problem with a top caption, which is default) + \spx@opt@verbatimwithframefalse + \def\sphinxVerbatim@Title{\noindent\box\sphinxVerbatim@TitleBox\par}% + \sphinxVerbatim@Before + \noindent\unvbox\sphinxVerbatim@ContentsBox\par + \sphinxVerbatim@After + \else + % short enough contents: use \MakeFramed. As it is nested, this requires + % minipage encapsulation. + \noindent\begin{minipage}{\linewidth}% + \MakeFramed {% Use it now with the fetched contents + \advance\hsize-\width\@totalleftmargin\z@\linewidth\hsize\@setminipage + }% + \unvbox\sphinxVerbatim@ContentsBox + % the \@minipagefalse is superfluous, actually. + \par\unskip\@minipagefalse\endMakeFramed + \end{minipage}% + \fi + \else % non-nested \MakeFramed + \par\unskip\@minipagefalse\endMakeFramed % from framed.sty snugshade + \ifsphinxverbatimwithminipage\end{minipage}\fi + \fi + \endtrivlist +} +\newenvironment {sphinxVerbatimNoFrame} + {\spx@opt@verbatimwithframefalse + \VerbatimEnvironment + \begin{sphinxVerbatim}} + {\end{sphinxVerbatim}} +\newenvironment {sphinxVerbatimintable} + {% don't use a frame if in a table cell + \spx@opt@verbatimwithframefalse + \sphinxverbatimwithminipagetrue + % the literal block caption uses \sphinxcaption which is wrapper of \caption, + % but \caption must be modified because longtable redefines it to work only + % for the own table caption, and tabulary has multiple passes + \let\caption\sphinxfigcaption + % reduce above caption skip + \def\spx@abovecaptionskip{\sphinxverbatimsmallskipamount}% + \VerbatimEnvironment + \begin{sphinxVerbatim}} + {\end{sphinxVerbatim}} + + +%% PARSED LITERALS +% allow long lines to wrap like they do in code-blocks + +% this should be kept in sync with definitions in sphinx.util.texescape +\newcommand*\sphinxbreaksattexescapedchars{% + \def\do##1##2% put potential break point before character + {\def##1{\discretionary{}{\sphinxafterbreak\char`##2}{\char`##2}}}% + \do\{\{\do\textless\<\do\#\#\do\%\%\do\$\$% {, <, #, %, $ + \def\do##1##2% put potential break point after character + {\def##1{\discretionary{\char`##2}{\sphinxafterbreak}{\char`##2}}}% + \do\_\_\do\}\}\do\textasciicircum\^\do\&\&% _, }, ^, &, + \do\textgreater\>\do\textasciitilde\~% >, ~ + \do\textbackslash\\% \ +} +\newcommand*\sphinxbreaksviaactiveinparsedliteral{% + \sphinxbreaksviaactive % by default handles . , ; ? ! / + \lccode`\~`\~ % + % update \dospecials as it is used by \url + % but deactivation will already have been done hence this is unneeded: + % \expandafter\def\expandafter\dospecials\expandafter{\dospecials + % \sphinxbreaksbeforeactivelist\sphinxbreaksafteractivelist\do\-}% +} +\newcommand*\sphinxbreaksatspaceinparsedliteral{% + \lccode`~32 \lowercase{\let~}\spx@verbatim@space\lccode`\~`\~ +} +\newcommand*{\sphinxunactivateextras}{\let\do\@makeother + \sphinxbreaksbeforeactivelist\sphinxbreaksafteractivelist}% +% the \catcode13=5\relax (deactivate end of input lines) is left to callers +\newcommand*{\sphinxunactivateextrasandspace}{\catcode32=10\relax + \sphinxunactivateextras}% +% alltt uses a monospace font and linebreaks at dashes (which are escaped +% to \sphinxhyphen{} which expands to -\kern\z@) are inhibited with pdflatex. +% Not with xelatex (cf \defaultfontfeatures in latex writer), so: +\newcommand*{\sphinxhypheninparsedliteral}{\sphinxhyphennobreak} +% now for the modified alltt environment +\newenvironment{sphinxalltt} +{% at start of next line to workaround Emacs/AUCTeX issue with this file +\begin{alltt}% + \ifspx@opt@parsedliteralwraps + \sbox\sphinxcontinuationbox {\spx@opt@verbatimcontinued}% + \sbox\sphinxvisiblespacebox {\spx@opt@verbatimvisiblespace}% + \let\sphinxhyphen\sphinxhypheninparsedliteral + \sphinxbreaksattexescapedchars + \sphinxbreaksviaactiveinparsedliteral + \sphinxbreaksatspaceinparsedliteral +% alltt takes care of the ' as derivative ("prime") in math mode + \everymath\expandafter{\the\everymath\sphinxunactivateextrasandspace + \catcode`\<=12\catcode`\>=12\catcode`\^=7\catcode`\_=8 }% +% not sure if displayed math (align,...) can end up in parsed-literal, anyway + \everydisplay\expandafter{\the\everydisplay + \catcode13=5 \sphinxunactivateextrasandspace + \catcode`\<=12\catcode`\>=12\catcode`\^=7\catcode`\_=8 }% + \fi } +{\end{alltt}} + + +%% INLINE MARK-UP +% + +% Protect \href's first argument in contexts such as sphinxalltt (or +% \sphinxcode). Sphinx uses \#, \%, \& ... always inside \sphinxhref. +\protected\def\sphinxhref#1#2{{% + \sphinxunactivateextrasandspace % never do \scantokens with active space! +% for the \endlinechar business, https://github.com/latex3/latex2e/issues/286 + \endlinechar\m@ne\everyeof{{\endlinechar13 #2}}% keep catcode regime for #2 + \scantokens{\href{#1}}% normalise it for #1 during \href expansion +}} +% Same for \url. And also \nolinkurl for coherence. +\protected\def\sphinxurl#1{{% + \sphinxunactivateextrasandspace\everyeof{}% (<- precaution for \scantokens) + \endlinechar\m@ne\scantokens{\url{#1}}% +}} +\protected\def\sphinxnolinkurl#1{{% + \sphinxunactivateextrasandspace\everyeof{}% + \endlinechar\m@ne\scantokens{\nolinkurl{#1}}% +}} + +% \sphinxupquote +% to obtain straight quotes we execute \@noligs as patched by upquote, and +% \scantokens is needed in cases where it would be too late for the macro to +% first set catcodes and then fetch its argument. We also make the contents +% breakable at non-escaped . , ; ? ! / using \sphinxbreaksviaactive, +% and also at \ character (which is escaped to \textbackslash{}). +\protected\def\sphinxtextbackslashbreakbefore + {\discretionary{}{\sphinxafterbreak\sphinx@textbackslash}{\sphinx@textbackslash}} +\protected\def\sphinxtextbackslashbreakafter + {\discretionary{\sphinx@textbackslash}{\sphinxafterbreak}{\sphinx@textbackslash}} +\let\sphinxtextbackslash\sphinxtextbackslashbreakafter +% - is escaped to \sphinxhyphen{} and this default ensures no linebreak +% behaviour (also with a non monospace font, or with xelatex) +\newcommand*{\sphinxhyphenininlineliteral}{\sphinxhyphennobreak} +% the macro must be protected if it ends up used in moving arguments, +% in 'alltt' \@noligs is done already, and the \scantokens must be avoided. +\protected\def\sphinxupquote#1{{\def\@tempa{alltt}% + \ifx\@tempa\@currenvir\else + \let\sphinxhyphen\sphinxhyphenininlineliteral + \ifspx@opt@inlineliteralwraps + % break at . , ; ? ! / + \sphinxbreaksviaactive + % break also at \ + \setbox8=\hbox{\textbackslash}% + \def\sphinx@textbackslash{\copy8}% + \let\textbackslash\sphinxtextbackslash + % by default, no continuation symbol on next line but may be added + \let\sphinxafterbreak\sphinxafterbreakofinlineliteral + % do not overwrite the comma set-up + \let\verbatim@nolig@list\sphinx@literal@nolig@list + \fi + % fix a space-gobbling issue due to LaTeX's original \do@noligs +% TODO: using \@noligs as patched by upquote.sty is now unneeded because +% either ` and ' are escaped (non-unicode engines) or they don't build +% ligatures (unicode engines). Thus remove this and unify handling of `, <, >, +% ' and - with the characters . , ; ? ! / as handled via +% \sphinxbreaksviaactive. +% Hence \sphinx@do@noligs will be removed, or rather replaced with code +% inserting discretionaries, as they allow a continuation symbol on start of +% next line to achieve common design with code-blocks. +% TODO: do the above TODO! +% Extend \sphinxunactivateextras for \sphinxhref as the latter may +% actually be in the scope of \sphinxupquote and does a \scantokens +% of its own. + \expandafter\def\expandafter\sphinxunactivateextras\expandafter + {\sphinxunactivateextras\verbatim@nolig@list}% + \let\do@noligs\sphinx@do@noligs + \@noligs\endlinechar\m@ne\everyeof{}% (<- in case inside \sphinxhref) + \expandafter\scantokens + \fi {{#1}}}}% extra brace pair to fix end-space gobbling issue... +\def\sphinx@do@noligs #1{\catcode`#1\active\begingroup\lccode`\~`#1\relax + \lowercase{\endgroup\def~{\leavevmode\kern\z@\char`#1 }}} +\def\sphinx@literal@nolig@list {\do\`\do\<\do\>\do\'\do\-}% +\let\sphinxafterbreakofinlineliteral\empty + + +\endinput diff --git a/build/latex/sphinxlatexnumfig.sty b/build/latex/sphinxlatexnumfig.sty new file mode 100644 index 0000000..6d72961 --- /dev/null +++ b/build/latex/sphinxlatexnumfig.sty @@ -0,0 +1,122 @@ +%% NUMBERING OF FIGURES, TABLES, AND LITERAL BLOCKS +% +% change this info string if making any custom modification +\ProvidesFile{sphinxlatexnumfig.sty}[2021/01/27 numbering] + +% Requires: remreset (old LaTeX only) +% relates to numfig and numfig_secnum_depth configuration variables + +% LaTeX 2018-04-01 and later provides \@removefromreset +\ltx@ifundefined{@removefromreset} + {\RequirePackage{remreset}} + {}% avoid warning +% Everything is delayed to \begin{document} to allow hyperref patches into +% \newcounter to solve duplicate label problems for internal hyperlinks to +% code listings (literalblock counter). User or extension re-definitions of +% \theliteralblock, et al., thus have also to be delayed. (changed at 3.5.0) +\AtBeginDocument{% +\ltx@ifundefined{c@chapter} + {\newcounter{literalblock}}% + {\newcounter{literalblock}[chapter]% + \def\theliteralblock{\ifnum\c@chapter>\z@\arabic{chapter}.\fi + \arabic{literalblock}}% + }% +\ifspx@opt@nonumfigreset + \ltx@ifundefined{c@chapter}{}{% + \@removefromreset{figure}{chapter}% + \@removefromreset{table}{chapter}% + \@removefromreset{literalblock}{chapter}% + \ifspx@opt@mathnumfig + \@removefromreset{equation}{chapter}% + \fi + }% + \def\thefigure{\arabic{figure}}% + \def\thetable {\arabic{table}}% + \def\theliteralblock{\arabic{literalblock}}% + \ifspx@opt@mathnumfig + \def\theequation{\arabic{equation}}% + \fi +\else +\let\spx@preAthefigure\@empty +\let\spx@preBthefigure\@empty +% \ifspx@opt@usespart % <-- LaTeX writer could pass such a 'usespart' boolean +% % as sphinx.sty package option +% If document uses \part, (triggered in Sphinx by latex_toplevel_sectioning) +% LaTeX core per default does not reset chapter or section +% counters at each part. +% But if we modify this, we need to redefine \thechapter, \thesection to +% include the part number and this will cause problems in table of contents +% because of too wide numbering. Simplest is to do nothing. +% \fi +\ifnum\spx@opt@numfigreset>0 + \ltx@ifundefined{c@chapter} + {} + {\g@addto@macro\spx@preAthefigure{\ifnum\c@chapter>\z@\arabic{chapter}.}% + \g@addto@macro\spx@preBthefigure{\fi}}% +\fi +\ifnum\spx@opt@numfigreset>1 + \@addtoreset{figure}{section}% + \@addtoreset{table}{section}% + \@addtoreset{literalblock}{section}% + \ifspx@opt@mathnumfig + \@addtoreset{equation}{section}% + \fi% + \g@addto@macro\spx@preAthefigure{\ifnum\c@section>\z@\arabic{section}.}% + \g@addto@macro\spx@preBthefigure{\fi}% +\fi +\ifnum\spx@opt@numfigreset>2 + \@addtoreset{figure}{subsection}% + \@addtoreset{table}{subsection}% + \@addtoreset{literalblock}{subsection}% + \ifspx@opt@mathnumfig + \@addtoreset{equation}{subsection}% + \fi% + \g@addto@macro\spx@preAthefigure{\ifnum\c@subsection>\z@\arabic{subsection}.}% + \g@addto@macro\spx@preBthefigure{\fi}% +\fi +\ifnum\spx@opt@numfigreset>3 + \@addtoreset{figure}{subsubsection}% + \@addtoreset{table}{subsubsection}% + \@addtoreset{literalblock}{subsubsection}% + \ifspx@opt@mathnumfig + \@addtoreset{equation}{subsubsection}% + \fi% + \g@addto@macro\spx@preAthefigure{\ifnum\c@subsubsection>\z@\arabic{subsubsection}.}% + \g@addto@macro\spx@preBthefigure{\fi}% +\fi +\ifnum\spx@opt@numfigreset>4 + \@addtoreset{figure}{paragraph}% + \@addtoreset{table}{paragraph}% + \@addtoreset{literalblock}{paragraph}% + \ifspx@opt@mathnumfig + \@addtoreset{equation}{paragraph}% + \fi% + \g@addto@macro\spx@preAthefigure{\ifnum\c@subparagraph>\z@\arabic{subparagraph}.}% + \g@addto@macro\spx@preBthefigure{\fi}% +\fi +\ifnum\spx@opt@numfigreset>5 + \@addtoreset{figure}{subparagraph}% + \@addtoreset{table}{subparagraph}% + \@addtoreset{literalblock}{subparagraph}% + \ifspx@opt@mathnumfig + \@addtoreset{equation}{subparagraph}% + \fi% + \g@addto@macro\spx@preAthefigure{\ifnum\c@subsubparagraph>\z@\arabic{subsubparagraph}.}% + \g@addto@macro\spx@preBthefigure{\fi}% +\fi +\expandafter\g@addto@macro +\expandafter\spx@preAthefigure\expandafter{\spx@preBthefigure}% +\let\thefigure\spx@preAthefigure +\let\thetable\spx@preAthefigure +\let\theliteralblock\spx@preAthefigure +\g@addto@macro\thefigure{\arabic{figure}}% +\g@addto@macro\thetable{\arabic{table}}% +\g@addto@macro\theliteralblock{\arabic{literalblock}}% + \ifspx@opt@mathnumfig + \let\theequation\spx@preAthefigure + \g@addto@macro\theequation{\arabic{equation}}% + \fi +\fi +}% end of big \AtBeginDocument + +\endinput diff --git a/build/latex/sphinxlatexobjects.sty b/build/latex/sphinxlatexobjects.sty new file mode 100644 index 0000000..5d9b69b --- /dev/null +++ b/build/latex/sphinxlatexobjects.sty @@ -0,0 +1,365 @@ +%% MODULE RELEASE DATA AND OBJECT DESCRIPTIONS +% +% change this info string if making any custom modification +\ProvidesFile{sphinxlatexobjects.sty}[2023/07/23 documentation environments] + +% Provides support for this output mark-up from Sphinx latex writer: +% +% - environments +% +% - fulllineitems +% - productionlist +% - optionlist +% - DUlineblock (also "lineblock") +% +% - macros +% +% - \DUrole +% - various legacy support macros related to author and release +% data of documented objects and modules. + +% \moduleauthor{name}{email} +\newcommand{\moduleauthor}[2]{} + +% \sectionauthor{name}{email} +\newcommand{\sectionauthor}[2]{} + +% Allow the release number to be specified independently of the +% \date{}. This allows the date to reflect the document's date and +% release to specify the release that is documented. +% +\newcommand{\py@release}{\releasename\space\version} +\newcommand{\version}{}% part of \py@release, used by title page and headers +% \releaseinfo is used on titlepage (sphinxmanual.cls, sphinxhowto.cls) +\newcommand{\releaseinfo}{} +\newcommand{\setreleaseinfo}[1]{\renewcommand{\releaseinfo}{#1}} +% this is inserted via template and #1=release config variable +\newcommand{\release}[1]{\renewcommand{\version}{#1}} +% this is defined by template to 'releasename' latex_elements key +\newcommand{\releasename}{} +% Fix issue in case release and releasename deliberately left blank +\newcommand{\sphinxheadercomma}{, }% used in fancyhdr header definition +\newcommand{\sphinxifemptyorblank}[1]{% +% test after one expansion of macro #1 if contents is empty or spaces + \if&\expandafter\@firstofone\detokenize\expandafter{#1}&% + \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}% +\AtBeginDocument {% + \sphinxifemptyorblank{\releasename} + {\sphinxifemptyorblank{\version}{\let\sphinxheadercomma\empty}{}} + {}% +}% + +% Allow specification of the author's address separately from the +% author's name. This can be used to format them differently, which +% is a good thing. +% +\newcommand{\py@authoraddress}{} +\newcommand{\authoraddress}[1]{\renewcommand{\py@authoraddress}{#1}} + +% {fulllineitems} is the main environment for object descriptions. +% +% With 4.0.0 \pysigline (and \pysiglinewithargsret), used in a fulllineitems +% environment the #1 will already be of the width which is computed here, i.e. +% the available width on line, so the \makebox becomes a bit superfluous +\newcommand{\py@itemnewline}[1]{% macro used as \makelabel in fulllineitems +% Memo: this presupposes \itemindent is 0pt + \kern\labelsep % because \@labels core latex box does \hskip-\labelsep + \makebox[\dimexpr\linewidth+\labelwidth\relax][l]{#1}% + \kern-\labelsep % because at end of \@labels box there is \hskip\labelsep +} + +\newenvironment{fulllineitems}{% + \begin{list}{}{\labelwidth \leftmargin + \rightmargin \z@ \topsep -\parskip \partopsep \parskip + \itemsep -\parsep + \let\makelabel=\py@itemnewline}% +}{\end{list}} + +% Signatures, possibly multi-line +% +% For legacy reasons Sphinx uses LaTeX \list and \item's for signatures +% This is delicate: +% - the actual item label is not typeset immediately by \item but later as part +% of the \everypar which will be triggered by either next paragraph or a manual +% \leavevmode, or if nothing in-between by the next \item, +% - \begingroup \item[foo] \endgroup leads to errors, +% - vertical space depends on \parskip and \itemsep values in somewhat +% subtle manners. +% +% Since the 2022/01/13 version things are simpler as \parskip is simply set +% to zero during execution of \pysigline/\pysiglinewithargsret +% +% Parameter for separation via \itemsep of multiple signatures with common desc +\newlength\sphinxsignaturesep +\setlength\sphinxsignaturesep{\smallskipamount} +% latex.py outputs mark-up like this: +% \pysigstartsignatures \pysigstopsignatures +\newcommand{\pysigstartsignatures}{% + % store current \parskip and \itemsep + \edef\pysig@restore@itemsep@and@parskip{% + \itemsep\the\itemsep\relax + \parskip\the\parskip\relax + }% + % set them to control the spacing between signatures sharing common desc + \parskip\z@skip + \itemsep\sphinxsignaturesep +} +\newcommand{\pysigstopsignatures}{% +% 1) encourage a pagebreak in an attempt to try to avoid last +% signature ending up separated from description (due to voodoo next) +\penalty-100 +% 2) some voodoo to separate last signature from description in a manner +% robust with respect to the latter being itself a LaTeX list object +\leavevmode\par\kern-\baselineskip\item[\strut] +% + \leavevmode + % it is important \leavevmode was issued before the \parskip reset, and + % it is also needed for the case of an object desc itself a LaTeX \list + % now restore \itemsep and \parskip + \pysig@restore@itemsep@and@parskip +} +% Each signature is rendered as NAME[TPLIST](ARGLIST) where the +% size of is parametrized by \sphinxsignaturelistskip (0pt by default). +\newlength\sphinxsignaturelistskip +\setlength\sphinxsignaturelistskip{0pt} +\newcommand{\pysigtypelistopen}{\hskip\sphinxsignaturelistskip\sphinxcode{[}} +\newcommand{\pysigtypelistclose}{\sphinxcode{]}} +\newcommand{\pysigarglistopen}{\hskip\sphinxsignaturelistskip\sphinxcode{(}} +\newcommand{\pysigarglistclose}{\sphinxcode{)}} +% +% Use a \parbox to accommodate long argument list in signatures +% LaTeX did not imagine that an \item label could need multi-line rendering +\newlength{\py@argswidth} +\newcommand{\py@sigparams}[2]{% + % The \py@argswidth has been computed in \pysiglinewithargsret to make the + % argument list use full available width + \parbox[t]{\py@argswidth}{\raggedright #1\pysigarglistclose#2\strut}% + % final strut is to help get correct vertical separation +} +\newcommand{\py@sigparamswithtypelist}[3]{% + % similar to \py@sigparams but with different delimiters and an additional + % type parameters list given as #1, the argument list as #2 and the return + % annotation as #3 + \parbox[t]{\py@argswidth}{% + \raggedright #1\pysigtypelistclose% + \pysigarglistopen#2\pysigarglistclose% + #3\strut}% +} + +\newcommand{\pysigline}[1]{% + % as \py@argswidth is available, we use it but no "args" here + % the \relax\relax is because \py@argswidth is a "skip" variable + % this will make the label occupy the full available linewidth + \py@argswidth=\dimexpr\linewidth+\labelwidth\relax\relax + \item[{\parbox[t]{\py@argswidth}{\raggedright #1\strut}}] + \pysigadjustitemsep +} +\newcommand{\pysiglinewithargsret}[3]{% + % as #1 may contain a footnote using \label we need to make \label + % a no-op here to avoid LaTeX complaining about duplicates +\let\spx@label\label\let\label\@gobble + \settowidth{\py@argswidth}{#1\pysigarglistopen}% +\let\label\spx@label + \py@argswidth=\dimexpr\linewidth+\labelwidth-\py@argswidth\relax\relax + \item[{#1\pysigarglistopen\py@sigparams{#2}{#3}\strut}] + \pysigadjustitemsep +} +\newcommand{\pysiglinewithargsretwithtypelist}[4]{ +% #1 = name, #2 = typelist, #3 = arglist, #4 = retann +\let\spx@label\label\let\label\@gobble + \settowidth{\py@argswidth}{#1\pysigtypelistopen}% +\let\label\spx@label + \py@argswidth=\dimexpr\linewidth+\labelwidth-\py@argswidth\relax\relax + \item[{#1\pysigtypelistopen\py@sigparamswithtypelist{#2}{#3}{#4}\strut}] + \pysigadjustitemsep +} + +\def\sphinxoptionalextraspace{0.5mm} +\newcommand{\pysigwithonelineperarg}[3]{% + % render each argument on its own line + \item[#1\pysigarglistopen\strut] + \leavevmode\par\nopagebreak + % this relies on \pysigstartsignatures having set \parskip to zero + \begingroup + \let\sphinxparamcomma\sphinxparamcommaoneperline + \def\sphinxoptionalhook{\ifvmode\else\kern\sphinxoptionalextraspace\relax\fi}% + % The very first \sphinxparam should not emit a \par hence a complication + % with a group and global definition here as it may occur in a \sphinxoptional + \global\let\spx@sphinxparam\sphinxparam + \gdef\sphinxparam{\gdef\sphinxparam{\par\spx@sphinxparam}\spx@sphinxparam}% + #2\par + \endgroup + \global\let\sphinxparam\spx@sphinxparam + % fulllineitems sets \labelwidth to be like \leftmargin + \nopagebreak\noindent\kern-\labelwidth\pysigarglistclose{#3} + \pysigadjustitemsep +} +\newcommand{\pysigwithonelineperargwithonelinepertparg}[4]{ + % #1 = name, #2 = typelist, #3 = arglist, #4 = retann + % render each type parameter and argument on its own line + \item[#1\pysigtypelistopen\strut] + \leavevmode\par\nopagebreak + \begingroup + \let\sphinxparamcomma\sphinxparamcommaoneperline + % \sphinxtypeparam is treated similarly to \sphinxparam but since + % \sphinxoptional is not accepted in a type parameters list, we do + % not need the hook or the global definition + \let\spx@sphinxtypeparam\sphinxtypeparam + \def\sphinxtypeparam{\def\sphinxtypeparam{\par\spx@sphinxtypeparam}\spx@sphinxtypeparam}% + #2\par + \endgroup + \nopagebreak\noindent\kern-\labelwidth\pysigtypelistclose% + % render the rest of the signature like in \pysigwithonelineperarg + \pysigarglistopen\strut\par\nopagebreak + \begingroup + \let\sphinxparamcomma\sphinxparamcommaoneperline + \def\sphinxoptionalhook{\ifvmode\else\kern\sphinxoptionalextraspace\relax\fi}% + \global\let\spx@sphinxparam\sphinxparam + \gdef\sphinxparam{\gdef\sphinxparam{\par\spx@sphinxparam}\spx@sphinxparam}% + #3\par + \endgroup + \global\let\sphinxparam\spx@sphinxparam + \nopagebreak\noindent\kern-\labelwidth\pysigarglistclose{#4} + \pysigadjustitemsep +} +\newcommand{\pysiglinewithargsretwithonelinepertparg}[4]{ + % #1 = name, #2 = typelist, #3 = arglist, #4 = retann + % render each type parameter on its own line but the arguments list inline + \item[#1\pysigtypelistopen\strut] + \leavevmode\par\nopagebreak + \begingroup + \let\sphinxparamcomma\sphinxparamcommaoneperline + % \sphinxtypeparam is treated similarly to \sphinxparam but since + % \sphinxoptional is not accepted in a type parameters list, we do + % not need the hook or the global definition + \let\spx@sphinxtypeparam\sphinxtypeparam + \def\sphinxtypeparam{\def\sphinxtypeparam{\par\spx@sphinxtypeparam}\spx@sphinxtypeparam}% + #2\par + \endgroup + \nopagebreak\noindent\kern-\labelwidth\pysigtypelistclose% + % render the arguments list on one line + \pysigarglistopen#3\pysigarglistclose#4\strut + \pysigadjustitemsep +} +\newcommand{\pysigwithonelineperargwithtypelist}[4]{ + % #1 = name, #2 = typelist, #3 = arglist, #4 = retann + % render the type parameters list on one line, but each argument is rendered on its own line +\let\spx@label\label\let\label\@gobble + \settowidth{\py@argswidth}{#1\pysigtypelistopen}% +\let\label\spx@label + \py@argswidth=\dimexpr\linewidth+\labelwidth-\py@argswidth\relax\relax + \item[{#1\pysigtypelistopen\parbox[t]{\py@argswidth}{% + \raggedright #2\pysigtypelistclose\pysigarglistopen\strut}\strut}] + % render the rest of the signature like in \pysigwithonelineperarg + \begingroup + \let\sphinxparamcomma\sphinxparamcommaoneperline + \def\sphinxoptionalhook{\ifvmode\else\kern\sphinxoptionalextraspace\relax\fi}% + \global\let\spx@sphinxparam\sphinxparam + \gdef\sphinxparam{\gdef\sphinxparam{\par\spx@sphinxparam}\spx@sphinxparam}% + #3\par + \endgroup + \global\let\sphinxparam\spx@sphinxparam + \nopagebreak\noindent\kern-\labelwidth\pysigarglistclose{#4} + \pysigadjustitemsep +} +\newcommand{\pysigadjustitemsep}{% + % adjust \itemsep to control the separation with the next signature + % sharing common description + \ifsphinxsigismultiline + % inside a multiline signature, no extra vertical spacing + % ("multiline" here does not refer to possibly long + % list of arguments, but to a cpp domain feature) + \itemsep\z@skip + \else + \itemsep\sphinxsignaturesep + \fi +} +\newif\ifsphinxsigismultiline +\newcommand{\pysigstartmultiline}{\sphinxsigismultilinetrue}% +\newcommand{\pysigstopmultiline}{\sphinxsigismultilinefalse\itemsep\sphinxsignaturesep}% + +% Production lists +% +\newenvironment{productionlist}{% +% \def\sphinxoptional##1{{\Large[}##1{\Large]}} + \def\production##1##2{\\\sphinxcode{\sphinxupquote{##1}}&::=&\sphinxcode{\sphinxupquote{##2}}}% + \def\productioncont##1{\\& &\sphinxcode{\sphinxupquote{##1}}}% + \parindent=2em + \indent + \setlength{\LTpre}{0pt}% + \setlength{\LTpost}{0pt}% + \begin{longtable}[l]{lcl} +}{% + \end{longtable} +} + +% Definition lists; requested by AMK for HOWTO documents. Probably useful +% elsewhere as well, so keep in in the general style support. +% +\newenvironment{definitions}{% + \begin{description}% + \def\term##1{\item[{##1}]\mbox{}\\*[0mm]}% +}{% + \end{description}% +} + +%% FROM DOCTUTILS LATEX WRITER +% +% The following is stuff copied from docutils' latex writer. +% +\newcommand{\optionlistlabel}[1]{\normalfont\bfseries #1 \hfill}% \bf deprecated +\newenvironment{optionlist}[1] +{\begin{list}{} + {\setlength{\labelwidth}{#1}% + \setlength{\rightmargin}{1cm}% + \setlength{\leftmargin}{\rightmargin}% + \addtolength{\leftmargin}{\labelwidth}% + \addtolength{\leftmargin}{\labelsep}% + \renewcommand{\makelabel}{\optionlistlabel}}% +}{\end{list}} + +\newlength{\lineblockindentation} +\setlength{\lineblockindentation}{2.5em} +\newenvironment{lineblock}[1] +{\begin{list}{} + {\setlength{\partopsep}{\parskip}% + \addtolength{\partopsep}{\baselineskip}% + \topsep0pt\itemsep0.15\baselineskip\parsep0pt + \leftmargin#1\relax}% + \raggedright} +{\end{list}} + +% From docutils.writers.latex2e +% inline markup (custom roles) +% \DUrole{#1}{#2} tries \DUrole#1{#2} +\providecommand*{\DUrole}[2]{% + \ifcsname DUrole\detokenize{#1}\endcsname + \csname DUrole\detokenize{#1}\endcsname{#2}% + \else% backwards compatibility: try \docutilsrole#1{#2} + \ifcsname docutilsrole\detokenize{#1}\endcsname + \csname docutilsrole\detokenize{#1}\endcsname{#2}% + \else + #2% + \fi + \fi +} + +\providecommand*{\DUprovidelength}[2]{% + \ifdefined#1\else\newlength{#1}\setlength{#1}{#2}\fi +} + +\DUprovidelength{\DUlineblockindent}{2.5em} +\ifdefined\DUlineblock\else + \newenvironment{DUlineblock}[1]{% + \list{}{\setlength{\partopsep}{\parskip}% + \addtolength{\partopsep}{\baselineskip}% + \setlength{\topsep}{0pt}% + \setlength{\itemsep}{0.15\baselineskip}% + \setlength{\parsep}{0pt}% + \setlength{\leftmargin}{#1}}% + \raggedright + } + {\endlist} +\fi + +\endinput diff --git a/build/latex/sphinxlatexshadowbox.sty b/build/latex/sphinxlatexshadowbox.sty new file mode 100644 index 0000000..a2a1a0e --- /dev/null +++ b/build/latex/sphinxlatexshadowbox.sty @@ -0,0 +1,116 @@ +%% TOPIC AND CONTENTS BOXES +% +% change this info string if making any custom modification +\ProvidesFile{sphinxlatexshadowbox.sty}[2023/03/19 sphinxShadowBox] + +% Provides support for this output mark-up from Sphinx latex writer: +% +% - sphinxShadowBox (environment) +% +% Dependencies (they do not need to be defined at time of loading): +% +% - of course the various colour and dimension options handled via sphinx.sty +% - dimension register \spx@image@maxheight from sphinxlatexgraphics.sty +% - \savenotes/\spewnotes from sphinxpackagefootnote +% - \ifspx@inframed defined in sphinx.sty +% +% Requires: +\RequirePackage{framed} +\RequirePackage{sphinxpackageboxes} + +% At 5.1.0 the code formerly here in a definition of \spx@ShadowFBox has been +% refactored to hand over to a more powerful \spx@boxes@fcolorbox provided by +% file sphinxpackageboxes.sty, it can draw rounded corners and add a background +% color. + +% At 6.2.0, \spx@ShadowFBox is so much simplified that it is now not +% separately defined but directly incorporated into the \FrameCommand +% definition done by sphinxShadowBox environment below. + +% Use framed.sty \MakeFramed/\endMakeFramed to allow page breaks for topic +% boxes. Originally Sphinx used \shadowbox from fancybox.sty but it did not +% allow pagebreaks (which was problematic for "contents" directive if there +% are many subsections). +% +% Docutils does not allow topic to be nested within topics or other body +% elements. But the LaTeX code here does allow it: +% +% - a topic inside another topic would be rendered in a minipage (thus not +% allowing pagebreaks). Its external frame would adapt perfectly to +% the *current (smaller) width for text*. +% +% - a topic inside (nested) lists or quote environments would have its frame +% take the *full width* of the page, but its text contents on the other hand +% would obey exactly the current indentation plus inner separation. This is +% in contrast with the framing used for literal blocks, also based, but in a +% more sophisticated way on usage of \MakeFramed/\endMakeFramed, and +% adjusting to current text indentation. +\newenvironment{sphinxShadowBox} + {% + \spx@boxes@fcolorbox@setup{topic}% + % we will use the dimen registers from sphinxpackageboxes.sty which now hold + % the values from options related to topic/contents + % MEMO: \spx@boxes@fcolorbox creates an \hbox but does not quit vertical + % mode; but in context of framed.sty's \FrameCommand TeX is already + % in restricted horizontal mode, so no need for a \leavevmode here. + \def\FrameCommand {\spx@boxes@fcolorbox}% + % 6.2.0 adds support for div.topic_box-decoration-break=slice. + % (it is yet undecided if slice style should inhibit a bottom shadow) + \ifspx@topic@border@open + \def\FirstFrameCommand + {\spx@boxes@fcolorbox@setup@openbottom\FrameCommand}% + \def\MidFrameCommand + {\spx@boxes@fcolorbox@setup@openboth \FrameCommand}% + \def\LastFrameCommand + {\spx@boxes@fcolorbox@setup@opentop \FrameCommand}% + \fi + \advance\spx@image@maxheight + -\dimexpr\spx@boxes@border@top+\spx@boxes@border@bottom + +\spx@boxes@padding@top+\spx@boxes@padding@bottom + +\ifdim\spx@boxes@shadow@yoffset<\z@-\fi\spx@boxes@shadow@yoffset + +\baselineskip\relax + % configure framed.sty not to add extra vertical spacing + \ltx@ifundefined{OuterFrameSep}{}{\OuterFrameSep\z@skip}% + % the \trivlist will add the vertical spacing on top and bottom which is + % typical of center environment as used in Sphinx <= 1.4.1 + % the \noindent has the effet of an extra blank line on top, to + % imitate closely the layout from Sphinx <= 1.4.1; the \FrameHeightAdjust + % will put top part of frame on this baseline. + \def\FrameHeightAdjust {\baselineskip}% + % use package footnote to handle footnotes + \savenotes + \trivlist\item\noindent + % use a minipage if we are already inside a framed environment + \ifspx@inframed\begin{minipage}{\linewidth}\fi + \MakeFramed {\spx@inframedtrue + % framed.sty puts into "\width" the added width (padding+border widths) + % adjust \hsize to what the contents must use + \advance\hsize-\width + % adjust LaTeX parameters to behave properly in indented/quoted contexts + \FrameRestore + % typeset the contents as in a minipage (Sphinx <= 1.4.1 used a minipage and + % itemize/enumerate are therein typeset more tightly, we want to keep + % that). We copy-paste from LaTeX source code but don't do a real minipage. + \@pboxswfalse + \let\@listdepth\@mplistdepth \@mplistdepth\z@ + \@minipagerestore + \@setminipage + }% + \color@begingroup % workaround upstream framed.sty bug + \ifspx@topic@withtextcolor + \color{sphinxtopicTextColor}% + \fi + \spx@topic@TeXextras + }% + {% insert the "endminipage" code + \par\unskip + \color@endgroup % matches the \color@begingroup + \@minipagefalse + \endMakeFramed + \ifspx@inframed\end{minipage}\fi + \endtrivlist + % output the stored footnotes + \spewnotes + } + +\endinput diff --git a/build/latex/sphinxlatexstyleheadings.sty b/build/latex/sphinxlatexstyleheadings.sty new file mode 100644 index 0000000..b5e9c85 --- /dev/null +++ b/build/latex/sphinxlatexstyleheadings.sty @@ -0,0 +1,86 @@ +%% TITLES +% +% change this info string if making any custom modification +\ProvidesFile{sphinxlatexstyleheadings.sty}[2023/02/11 headings] + +\RequirePackage[nobottomtitles*]{titlesec} +\@ifpackagelater{titlesec}{2016/03/15}% + {\@ifpackagelater{titlesec}{2016/03/21}% + {}% + {\newif\ifsphinx@ttlpatch@ok + \IfFileExists{etoolbox.sty}{% + \RequirePackage{etoolbox}% + \patchcmd{\ttlh@hang}{\parindent\z@}{\parindent\z@\leavevmode}% + {\sphinx@ttlpatch@oktrue}{}% + \ifsphinx@ttlpatch@ok + \patchcmd{\ttlh@hang}{\noindent}{}{}{\sphinx@ttlpatch@okfalse}% + \fi + }{}% + \ifsphinx@ttlpatch@ok + \typeout{^^J Package Sphinx Info: ^^J + **** titlesec 2.10.1 successfully patched for bugfix ****^^J}% + \else + \AtEndDocument{\PackageWarningNoLine{sphinx}{^^J% +******** titlesec 2.10.1 has a bug, (section numbers disappear) ......|^^J% +******** and Sphinx could not patch it, perhaps because your local ...|^^J% +******** copy is already fixed without a changed release date. .......|^^J% +******** If not, you must update titlesec! ...........................|}}% + \sphinxbuildwarning{badtitlesec}% + \fi + }% + }{} + +% Augment the sectioning commands used to get our own font family in place, +% and reset some internal data items (\titleformat from titlesec package) +\titleformat{\section}{\Large\py@HeaderFamily}% + {\py@TitleColor\thesection}{0.5em}{\py@TitleColor} +\titleformat{\subsection}{\large\py@HeaderFamily}% + {\py@TitleColor\thesubsection}{0.5em}{\py@TitleColor} +% \normalsize added as work-around to a lualatex-ja upstream problem +% https://osdn.net/projects/luatex-ja/ticket/47321 +\titleformat{\subsubsection}{\normalsize\py@HeaderFamily}% + {\py@TitleColor\thesubsubsection}{0.5em}{\py@TitleColor} +% By default paragraphs (and subsubsections) will not be numbered because +% sphinxmanual.cls and sphinxhowto.cls set secnumdepth to 2 +\titleformat{\paragraph}{\normalsize\py@HeaderFamily}% + {\py@TitleColor\theparagraph}{0.5em}{\py@TitleColor} +\titleformat{\subparagraph}{\normalsize\py@HeaderFamily}% + {\py@TitleColor\thesubparagraph}{0.5em}{\py@TitleColor} + + +% Since Sphinx 1.5, users should use HeaderFamily key to 'sphinxsetup' rather +% than defining their own \py@HeaderFamily command (which is still possible). +% Memo: \py@HeaderFamily is also used by \maketitle as defined in +% sphinxmanual.cls/sphinxhowto.cls +\newcommand{\py@HeaderFamily}{\spx@opt@HeaderFamily} + +% This sets up the fancy chapter headings that make the documents look +% at least a little better than the usual LaTeX output. +\@ifpackagewith{fncychap}{Bjarne}{ + \ChNameVar {\raggedleft\normalsize \py@HeaderFamily} + \ChNumVar {\raggedleft\Large \py@HeaderFamily} + \ChTitleVar{\raggedleft\Large \py@HeaderFamily} + % This creates (numbered) chapter heads without the leading \vspace*{}: + \def\@makechapterhead#1{% + {\parindent \z@ \raggedright \normalfont + \ifnum \c@secnumdepth >\m@ne + \if@mainmatter + \DOCH + \fi + \fi + \interlinepenalty\@M + \if@mainmatter + \DOTI{#1}% + \else% + \DOTIS{#1}% + \fi + }} +}{}% <-- "false" clause of \@ifpackagewith + +% fix fncychap's bug which uses prematurely the \textwidth value +\@ifpackagewith{fncychap}{Bjornstrup} + {\AtBeginDocument{\mylen\textwidth\advance\mylen-2\myhi}}% + {}% <-- "false" clause of \@ifpackagewith + + +\endinput diff --git a/build/latex/sphinxlatexstylepage.sty b/build/latex/sphinxlatexstylepage.sty new file mode 100644 index 0000000..4066129 --- /dev/null +++ b/build/latex/sphinxlatexstylepage.sty @@ -0,0 +1,79 @@ +%% PAGE STYLING +% +% change this info string if making any custom modification +\ProvidesFile{sphinxlatexstylepage.sty}[2021/01/27 page styling] + +% Separate paragraphs by space by default. +\IfFileExists{parskip-2001-04-09.sty}% since September 2018 TeXLive update +% new parskip.sty, but let it rollback to old one. +% hopefully TeX installation not broken and LaTeX kernel not too old + {\RequirePackage{parskip}[=v1]} +% standard one from 1989. Admittedly \section of article/book gives possibly +% anomalous spacing, but we can't require September 2018 release for some time. + {\RequirePackage{parskip}} + +% Style parameters and macros used by most documents here +\raggedbottom +\sloppy +\hbadness = 5000 % don't print trivial gripes + +% Require package fancyhdr except under memoir class +\@ifclassloaded{memoir}{}{\RequirePackage{fancyhdr}} +% Use \pagestyle{normal} as the primary pagestyle for text. +% Redefine the 'normal' header/footer style when using "fancyhdr" package: +\@ifpackageloaded{fancyhdr}{% + \ltx@ifundefined{c@chapter} + {% no \chapter, "howto" (non-Japanese) docclass + \fancypagestyle{plain}{ + \fancyhf{} + \fancyfoot[C]{{\py@HeaderFamily\thepage}} + \renewcommand{\headrulewidth}{0pt} + \renewcommand{\footrulewidth}{0pt} + } + % Same as 'plain', this way we can use it in template + % FIXME: shouldn't this have a running header with Name and Release like 'manual'? + \fancypagestyle{normal}{ + \fancyhf{} + \fancyfoot[C]{{\py@HeaderFamily\thepage}} + \renewcommand{\headrulewidth}{0pt} + \renewcommand{\footrulewidth}{0pt} + } + }% + {% classes with \chapter command + \fancypagestyle{normal}{ + \fancyhf{} + \fancyfoot[RO]{{\py@HeaderFamily\thepage}} + \fancyfoot[LO]{{\py@HeaderFamily\nouppercase{\rightmark}}} + \fancyhead[RO]{{\py@HeaderFamily \@title\sphinxheadercomma\py@release}} + \if@twoside + \fancyfoot[LE]{{\py@HeaderFamily\thepage}} + \fancyfoot[RE]{{\py@HeaderFamily\nouppercase{\leftmark}}} + \fancyhead[LE]{{\py@HeaderFamily \@title\sphinxheadercomma\py@release}} + \fi + \renewcommand{\headrulewidth}{0.4pt} + \renewcommand{\footrulewidth}{0.4pt} + % define chaptermark with \@chappos when \@chappos is available for Japanese + \ltx@ifundefined{@chappos}{} + {\def\chaptermark##1{\markboth{\@chapapp\space\thechapter\space\@chappos\space ##1}{}}} + } + % Update the plain style so we get the page number & footer line, + % but not a chapter or section title. This is to keep the first + % page of a chapter `clean.' + \fancypagestyle{plain}{ + \fancyhf{} + \fancyfoot[RO]{{\py@HeaderFamily\thepage}} + \if@twoside\fancyfoot[LE]{{\py@HeaderFamily\thepage}}\fi + \renewcommand{\headrulewidth}{0pt} + \renewcommand{\footrulewidth}{0.4pt} + } + } + } + {% no fancyhdr: memoir class + % Provide default for 'normal' style simply as an alias of 'plain' style + % This way we can use \pagestyle{normal} in LaTeX template + \def\ps@normal{\ps@plain} + % Users of memoir class are invited to redefine 'normal' style in preamble + } + + +\endinput diff --git a/build/latex/sphinxlatexstyletext.sty b/build/latex/sphinxlatexstyletext.sty new file mode 100644 index 0000000..1655fbc --- /dev/null +++ b/build/latex/sphinxlatexstyletext.sty @@ -0,0 +1,147 @@ +%% TEXT STYLING +% +% change this info string if making any custom modification +\ProvidesFile{sphinxlatexstyletext.sty}[2024/07/01 v7.4.0 text styling] + +% 7.4.0 has moved all that is related to admonitions to sphinxlatexadmonitions.sty +% Most everything left here consists of macros which are part of the latex markup +% produced by the Sphinx LaTeX writer. + +% Some custom font markup commands. +\protected\def\sphinxstrong#1{\textbf{#1}} +\protected\def\sphinxcode#1{\texttt{#1}} +\protected\def\sphinxbfcode#1{\textbf{\sphinxcode{#1}}} +\protected\def\sphinxemail#1{\textsf{#1}} +\protected\def\sphinxtablecontinued#1{\textsf{#1}} +\protected\def\sphinxtitleref#1{\emph{#1}} +\protected\def\sphinxmenuselection#1{\emph{#1}} +\protected\def\sphinxguilabel#1{\emph{#1}} +\protected\def\sphinxkeyboard#1{\sphinxcode{#1}} +\protected\def\sphinxaccelerator#1{\underline{#1}} +\protected\def\sphinxcrossref#1{\emph{#1}} +\protected\def\sphinxtermref#1{\emph{#1}} +\protected\def\sphinxsamedocref#1{\emph{#1}} +\protected\def\sphinxparam#1{\emph{#1}} +\protected\def\sphinxtypeparam#1{\emph{#1}} +% \optional is used for ``[, arg]``, i.e. desc_optional nodes. +\long\protected\def\sphinxoptional#1{% + {\sphinxoptionalhook\textnormal{\Large[}}{#1}\hspace{0.5mm}{\textnormal{\Large]}}} +\let\sphinxoptionalhook\empty + +% additional customizable styling +\def\sphinxstyleindexentry #1{\texttt{#1}} +\def\sphinxstyleindexextra #1{ (\emph{#1})} +\def\sphinxstyleindexpageref #1{, \pageref{#1}} +\def\sphinxstyleindexpagemain#1{\textbf{#1}} +\def\spxentry{\@backslashchar spxentry}% let to \sphinxstyleindexentry in index +\def\spxextra{\@backslashchar spxextra}% let to \sphinxstyleindexextra in index +\def\sphinxstyleindexlettergroup #1% + {{\Large\sffamily#1}\nopagebreak\vspace{1mm}} +\def\sphinxstyleindexlettergroupDefault #1% + {{\Large\sffamily\sphinxnonalphabeticalgroupname}\nopagebreak\vspace{1mm}} +\protected\def\sphinxstyletopictitle #1{\textbf{#1}\par\medskip} +\let\sphinxstylesidebartitle\sphinxstyletopictitle +\protected\def\sphinxstyleothertitle #1{\textbf{#1}} +\protected\def\sphinxstylesidebarsubtitle #1{~\\\textbf{#1} \smallskip} +% \text.. commands do not allow multiple paragraphs +% attention, this one is not self-delimiting +\protected\def\sphinxstyletheadfamily {\sffamily} +\protected\def\sphinxstyleemphasis #1{\emph{#1}} +\protected\def\sphinxstyleliteralemphasis#1{\emph{\sphinxcode{#1}}} +\protected\def\sphinxstylestrong #1{\textbf{#1}} +\protected\def\sphinxstyleliteralstrong#1{\sphinxbfcode{#1}} +\protected\def\sphinxstyleabbreviation #1{\textsc{#1}} +\protected\def\sphinxstyleliteralintitle#1{\sphinxcode{#1}} +\newcommand*\sphinxstylecodecontinued[1]{{\footnotesize(#1)}}% +\newcommand*\sphinxstylecodecontinues[1]{{\footnotesize(#1)}}% +% figure legend comes after caption and may contain arbitrary body elements +\newenvironment{sphinxlegend}{\par\small}{\par} +% reduce hyperref "Token not allowed in a PDF string" warnings on PDF builds +\AtBeginDocument{\pdfstringdefDisableCommands{% +% all "protected" macros possibly ending up in section titles should be here +% TODO: examine if \sphinxhref, \sphinxurl, \sphinnolinkurl should be handled + \let\sphinxstyleemphasis \@firstofone + \let\sphinxstyleliteralemphasis \@firstofone + \let\sphinxstylestrong \@firstofone + \let\sphinxstyleliteralstrong \@firstofone + \let\sphinxstyleabbreviation \@firstofone + \let\sphinxstyleliteralintitle \@firstofone + \let\sphinxupquote \@firstofone + \let\sphinxstrong \@firstofone + \let\sphinxcode \@firstofone + \let\sphinxbfcode \@firstofone + \let\sphinxemail \@firstofone + \let\sphinxcrossref \@firstofone + \let\sphinxtermref \@firstofone + \let\sphinxsamedocref\@firstofone + \let\sphinxhyphen\sphinxhyphenforbookmarks + \def\PYG#1#2{#2}% (can not yet appear in section titles, but perhaps in future) +}} + +% Special characters +% +\def\sphinxparamcomma{, }% by default separate parameters with comma + space +% If the signature is rendered with one line per param, this wil be used +% instead (this \texttt makes the comma slightly more distinctive). +\def\sphinxparamcommaoneperline{\texttt{,}} +% +% The \kern\z@ is to prevent en-dash and em-dash TeX ligatures. +% A linebreak can occur after the dash in regular text (this is +% normal behaviour of "-" in TeX, it is not related to \kern\z@). +% +% Parsed-literals and inline literals also use the \sphinxhyphen +% but linebreaks there are prevented due to monospace font family. +% (xelatex needs a special addition, cf. sphinxlatexliterals.sty) +% +% Inside code-blocks, dashes are escaped via another macro, from +% Pygments latex output (search for \PYGZhy in sphinxlatexliterals.sty), +% and are configured to allow linebreaks despite the monospace font. +% (the #1 swallows the {} from \sphinxhyphen{} mark-up) +\protected\def\sphinxhyphen#1{-\kern\z@} +\protected\def\sphinxhyphennobreak#1{\mbox{-}} +% The {} from texescape mark-up is kept, else -- gives en-dash in PDF bookmark +\def\sphinxhyphenforbookmarks{-} + +% For curly braces inside \index macro +\def\sphinxleftcurlybrace{\{} +\def\sphinxrightcurlybrace{\}} + +% Declare Unicode characters used by linux tree command to pdflatex utf8/utf8x +\def\spx@bd#1#2{% + \leavevmode + \begingroup + \ifx\spx@bd@height \@undefined\def\spx@bd@height{\baselineskip}\fi + \ifx\spx@bd@width \@undefined\setbox0\hbox{0}\def\spx@bd@width{\wd0 }\fi + \ifx\spx@bd@thickness\@undefined\def\spx@bd@thickness{.6\p@}\fi + \ifx\spx@bd@lower \@undefined\def\spx@bd@lower{\dp\strutbox}\fi + \lower\spx@bd@lower#1{#2}% + \endgroup +}% +\@namedef{sphinx@u2500}% BOX DRAWINGS LIGHT HORIZONTAL + {\spx@bd{\vbox to\spx@bd@height} + {\vss\hrule\@height\spx@bd@thickness + \@width\spx@bd@width\vss}}% +\@namedef{sphinx@u2502}% BOX DRAWINGS LIGHT VERTICAL + {\spx@bd{\hb@xt@\spx@bd@width} + {\hss\vrule\@height\spx@bd@height + \@width \spx@bd@thickness\hss}}% +\@namedef{sphinx@u2514}% BOX DRAWINGS LIGHT UP AND RIGHT + {\spx@bd{\hb@xt@\spx@bd@width} + {\hss\raise.5\spx@bd@height + \hb@xt@\z@{\hss\vrule\@height.5\spx@bd@height + \@width \spx@bd@thickness\hss}% + \vbox to\spx@bd@height{\vss\hrule\@height\spx@bd@thickness + \@width.5\spx@bd@width\vss}}}% +\@namedef{sphinx@u251C}% BOX DRAWINGS LIGHT VERTICAL AND RIGHT + {\spx@bd{\hb@xt@\spx@bd@width} + {\hss + \hb@xt@\z@{\hss\vrule\@height\spx@bd@height + \@width \spx@bd@thickness\hss}% + \vbox to\spx@bd@height{\vss\hrule\@height\spx@bd@thickness + \@width.5\spx@bd@width\vss}}}% +\protected\def\sphinxunichar#1{\@nameuse{sphinx@u#1}}% + +% Tell TeX about pathological hyphenation cases: +\hyphenation{Base-HTTP-Re-quest-Hand-ler} + +\endinput diff --git a/build/latex/sphinxlatextables.sty b/build/latex/sphinxlatextables.sty new file mode 100644 index 0000000..54b42cb --- /dev/null +++ b/build/latex/sphinxlatextables.sty @@ -0,0 +1,1241 @@ +%% TABLES (WITH SUPPORT FOR MERGED CELLS OF GENERAL CONTENTS) +% +% change this info string if making any custom modification +\ProvidesFile{sphinxlatextables.sty}[2024/07/01 v7.4.0 tables]% + +% Provides support for this output mark-up from Sphinx latex writer +% and table templates: +% +% - the tabulary and longtable environments from the eponymous packages +% - the varwidth environment +% - the >{} etc mark-up possible in tabularcolumns is from array package +% which is loaded by longtable and tabulary +% - \X, \Y, T column types; others (L, C, R, J) are from tabulary package +% - \sphinxaftertopcaption +% - \sphinxatlongtableend +% - \sphinxatlongtablestart +% - \sphinxattableend +% - \sphinxattablestart +% - \sphinxcapstartof +% - \sphinxcolwidth +% - \sphinxlongtablecapskipadjust +% - \sphinxmultirow +% - \sphinxstartmulticolumn +% - \sphinxstopmulticolumn +% - \sphinxtablestrut +% - \sphinxthecaptionisattop +% - \sphinxthelongtablecaptionisattop +% - \sphinxhline +% - \sphinxcline +% - \sphinxvlinecrossing +% - \sphinxfixclines +% - \sphinxtoprule +% - \sphinxmidrule +% - \sphinxbottomrule +% - \sphinxtableatstartofbodyhook +% - \sphinxtableafterendhook +% - \sphinxthistablewithglobalstyle +% - \sphinxthistablewithbooktabsstyle +% - \sphinxthistablewithborderlessstyle +% - \sphinxthistablewithstandardstyle +% - \sphinxthistablewithcolorrowsstyle +% - \sphinxthistablewithnocolorrowsstyle +% - \sphinxthistablewithvlinesstyle +% - \sphinxthistablewithnovlinesstyle +% +% Also provides user command (see docs) +% - \sphixncolorblend +% (Sphinx 7.4.0 now requires xcolor, so \sphinxcolorblend does not check +% its availability anymore) +% +% Executes \RequirePackage for: +% +% - tabulary +% - longtable +% - varwidth +% - colortbl +% - booktabs if 'booktabs' in latex_table_style +% +% Extends tabulary and longtable via patches and custom macros to support +% merged cells possibly containing code-blocks in complex tables + +\RequirePackage{tabulary} +% tabulary has a bug with its re-definition of \multicolumn in its first pass +% which is not \long. But now Sphinx does not use LaTeX's \multicolumn but its +% own macro. Hence we don't even need to patch tabulary. See +% sphinxpackagemulticell.sty +% X or S (Sphinx) may have meanings if some table package is loaded hence +% \X was chosen to avoid possibility of conflict +\newcolumntype{\X}[2]{p{\dimexpr + (\linewidth-\spx@arrayrulewidth)*#1/#2-\tw@\tabcolsep-\spx@arrayrulewidth\relax}} +\newcolumntype{\Y}[1]{p{\dimexpr + #1\dimexpr\linewidth-\spx@arrayrulewidth\relax-\tw@\tabcolsep-\spx@arrayrulewidth\relax}} +% \spx@arrayrulewidth is used internally and its meaning will be set according +% to the table type; no extra user code should modify it. In particular any +% \setlength{\spx@arrayrulewidth}{...} may break all of LaTeX... (really...) +\def\spx@arrayrulewidth{\arrayrulewidth}% 5.3.0, to be adjusted by each table +% using here T (for Tabulary) feels less of a problem than the X could be +\newcolumntype{T}{J}% +% For tables allowing pagebreaks +\RequirePackage{longtable} +% User interface to set-up whitespace before and after tables: +\newcommand*\sphinxtablepre {0pt}% +\newcommand*\sphinxtablepost{\medskipamount}% +% Space from caption baseline to top of table or frame of literal-block +\newcommand*\sphinxbelowcaptionspace{.5\sphinxbaselineskip}% +% as one can not use \baselineskip from inside longtable (it is zero there) +% we need \sphinxbaselineskip, which defaults to \baselineskip +\def\sphinxbaselineskip{\baselineskip}% +% The following is to ensure that, whether tabular(y) or longtable: +% - if a caption is on top of table: +% a) the space between its last baseline and the top rule of table is +% exactly \sphinxbelowcaptionspace +% b) the space from last baseline of previous text to first baseline of +% caption is exactly \parskip+\baselineskip+ height of a strut. +% c) the caption text will wrap at width \LTcapwidth (4in) +% - make sure this works also if "caption" package is loaded by user +% (with its width or margin option taking place of \LTcapwidth role) +% TODO: obtain same for caption of literal block: a) & c) DONE, b) TO BE DONE +% +% To modify space below such top caption, adjust \sphinxbelowcaptionspace +% To add or remove space above such top caption, adjust \sphinxtablepre: +% notice that \abovecaptionskip, \belowcaptionskip, \LTpre are **ignored** +% A. Table with longtable +\def\sphinxatlongtablestart + {\par + \vskip\parskip + \vskip\dimexpr\sphinxtablepre\relax % adjust vertical position + \vbox{}% get correct baseline from above + \LTpre\z@skip\LTpost\z@skip % set to zero longtable's own skips + \edef\sphinxbaselineskip{\dimexpr\the\dimexpr\baselineskip\relax\relax}% + \spx@inframedtrue % message to sphinxheavybox + }% +% Compatibility with caption package +\def\sphinxthelongtablecaptionisattop{% + \spx@ifcaptionpackage{\noalign{\vskip-\belowcaptionskip}}{}% +}% +% Achieves exactly \sphinxbelowcaptionspace below longtable caption +\def\sphinxlongtablecapskipadjust + {\dimexpr-\dp\strutbox + -\spx@ifcaptionpackage{\abovecaptionskip}{\sphinxbaselineskip}% + +\sphinxbelowcaptionspace\relax}% +\def\sphinxatlongtableend{\@nobreakfalse % latex3/latex2e#173 + \prevdepth\z@\vskip\sphinxtablepost\relax}% +% B. Table with tabular or tabulary +\def\sphinxattablestart{\par\vskip\dimexpr\sphinxtablepre\relax + \spx@inframedtrue % message to sphinxheavybox + }% +\let\sphinxattableend\sphinxatlongtableend +% This is used by tabular and tabulary templates +\newcommand*\sphinxcapstartof[1]{% + \vskip\parskip + \vbox{}% force baselineskip for good positioning by capstart of hyperanchor + % hyperref puts the anchor 6pt above this baseline; in case of caption + % this baseline will be \ht\strutbox above first baseline of caption + \def\@captype{#1}% + \capstart +% move back vertically, as tabular (or its caption) will compensate + \vskip-\baselineskip\vskip-\parskip +}% +\def\sphinxthecaptionisattop{% locate it after \sphinxcapstartof + \spx@ifcaptionpackage + {\caption@setposition{t}% + \vskip\baselineskip\vskip\parskip % undo those from \sphinxcapstartof + \vskip-\belowcaptionskip % anticipate caption package skip + % caption package uses a \vbox, not a \vtop, so "single line" case + % gives different result from "multi-line" without this: + \nointerlineskip + }% + {}% +}% +\def\sphinxthecaptionisatbottom{% (not finalized; for template usage) + \spx@ifcaptionpackage{\caption@setposition{b}}{}% +}% +% The aim of \sphinxcaption is to apply to tabular(y) the maximal width +% of caption as done by longtable +\def\sphinxtablecapwidth{\LTcapwidth}% +\newcommand\sphinxcaption{\@dblarg\spx@caption}% +\long\def\spx@caption[#1]#2{% + \noindent\hb@xt@\linewidth{\hss + \vtop{\@tempdima\dimexpr\sphinxtablecapwidth\relax +% don't exceed linewidth for the caption width + \ifdim\@tempdima>\linewidth\hsize\linewidth\else\hsize\@tempdima\fi +% longtable ignores \abovecaptionskip/\belowcaptionskip, so do the same here + \abovecaptionskip\sphinxabovecaptionskip % \z@skip + \belowcaptionskip\sphinxbelowcaptionskip % \z@skip + \caption[{#1}]% + {\strut\ignorespaces#2\ifhmode\unskip\@finalstrut\strutbox\fi}% + }\hss}% + \par\prevdepth\dp\strutbox +}% +\def\sphinxabovecaptionskip{\z@skip}% Do not use! Flagged for removal +\def\sphinxbelowcaptionskip{\z@skip}% Do not use! Flagged for removal +% This wrapper of \abovecaptionskip is used in sphinxVerbatim for top +% caption, and with another value in sphinxVerbatimintable +% TODO: To unify space above caption of a code-block with the one above +% caption of a table/longtable, \abovecaptionskip must not be used +% This auxiliary will get renamed and receive a different meaning +% in future. +\def\spx@abovecaptionskip{\abovecaptionskip}% +% Achieve \sphinxbelowcaptionspace below a caption located above a tabular +% or a tabulary +\newcommand\sphinxaftertopcaption +{% + \spx@ifcaptionpackage + {\par\prevdepth\dp\strutbox\nobreak\vskip-\abovecaptionskip}{\nobreak}% + \vskip\dimexpr\sphinxbelowcaptionspace\relax + \vskip-\baselineskip\vskip-\parskip +}% +% varwidth is crucial for our handling of general contents in merged cells +\RequirePackage{varwidth} +% but addition of a compatibility patch with hyperref is needed +% (tested with varwidth v 0.92 Mar 2009) +\AtBeginDocument {% + \let\@@vwid@Hy@raisedlink\Hy@raisedlink + \long\def\@vwid@Hy@raisedlink#1{\@vwid@wrap{\@@vwid@Hy@raisedlink{#1}}}% + \edef\@vwid@setup{% + \let\noexpand\Hy@raisedlink\noexpand\@vwid@Hy@raisedlink % HYPERREF ! + \unexpanded\expandafter{\@vwid@setup}}% +}% + +% NOTA BENE: since the multicolumn and multirow code was written Sphinx +% decided to prefix non public internal macros by \spx@ and in fact all +% such macros here should now be prefixed by \spx@table@, but doing the +% update is delayed to later. (written at 5.3.0) + +%%%%%%%%%%%%%%%%%%%%% +% --- MULTICOLUMN --- +% standard LaTeX's \multicolumn +% 1. does not allow verbatim contents, +% 2. interacts very poorly with tabulary. +% +% It is needed to write own macros for Sphinx: to allow code-blocks in merged +% cells rendered by tabular/longtable, and to allow multi-column cells with +% paragraphs to be taken into account sanely by tabulary algorithm for column +% widths. +% +% This requires quite a bit of hacking. First, in Sphinx, the multi-column +% contents will *always* be wrapped in a varwidth environment. The issue +% becomes to pass it the correct target width. We must trick tabulary into +% believing the multicolumn is simply separate columns, else tabulary does not +% incorporate the contents in its algorithm. But then we must clear the +% vertical rules... +% +% configuration of tabulary +\setlength{\tymin}{3\fontcharwd\font`0 }% minimal width of "squeezed" columns +\setlength{\tymax}{10000pt}% allow enough room for paragraphs to "compete" +% we need access to tabulary's final computed width. \@tempdima is too volatile +% to hope it has kept tabulary's value when \sphinxcolwidth needs it. +\newdimen\sphinx@TY@tablewidth +\def\tabulary{% + \def\TY@final{\sphinx@TY@tablewidth\@tempdima\tabular}% + \let\endTY@final\endtabular + \TY@tabular}% +% next hack is needed only if user has set latex_use_latex_multicolumn to True: +% it fixes tabulary's bug with \multicolumn defined "short" in first pass. (if +% upstream tabulary adds a \long, our extra one causes no harm) +\def\sphinx@tempa #1\def\multicolumn#2#3#4#5#6#7#8#9\sphinx@tempa + {\def\TY@tab{#1\long\def\multicolumn####1####2####3{\multispan####1\relax}#9}}% +\expandafter\sphinx@tempa\TY@tab\sphinx@tempa +% +% TN. 1: as \omit is never executed, Sphinx multicolumn does not need to worry +% like standard multicolumn about |l| vs l|. On the other hand it assumes +% columns are separated by a | ... (if not it will add extraneous +% \arrayrulewidth space for each column separation in its estimate of available +% width). +% +% Update at 5.3.0: code uses \spx@arrayrulewidth which is kept in sync with the +% table column specification (aka preamble): +% - no | in preamble: \spx@arrayrulewidth -> \z@ +% - at least a | in the preamble: \spx@arrayrulewidth -> \arrayrulewidth +% This is used for computation of merged cells widths. Mixed preambles using +% at least a | but not using it for all columns (as can be obtained via the +% tabularcolumns directive) may cause some merged cells contents to be slightly +% shifted to the left as they assume merged columns are | separated where in +% fact they perhaps are not. +% +% TN. 1b: as Sphinx multicolumn uses neither \omit nor \span, it can not +% (easily) get rid of extra macros from >{...} or <{...} between columns. At +% least, it has been made compatible with colortbl's \columncolor. +% +% TN. 2: tabulary's second pass is handled like tabular/longtable's single +% pass, with the difference that we hacked \TY@final to set in +% \sphinx@TY@tablewidth the final target width as computed by tabulary. This is +% needed only to handle columns with a "horizontal" specifier: "p" type columns +% (inclusive of tabulary's LJRC) holds the target column width in the +% \linewidth dimension. +% +% TN. 3: use of \begin{sphinxmulticolumn}...\end{sphinxmulticolumn} mark-up +% would need some hacking around the fact that groups can not span across table +% cells (the code does inserts & tokens, see TN1b). It was decided to keep it +% simple with \sphinxstartmulticolumn...\sphinxstopmulticolumn. +% +% MEMO about nesting: if sphinxmulticolumn is encountered in a nested tabular +% inside a tabulary it will think to be at top level in the tabulary. But +% Sphinx generates no nested tables, and if some LaTeX macro uses internally a +% tabular this will not have a \sphinxstartmulticolumn within it! +% +% 5.3.0 adds a check for multirow as single-row multi-column will allow a row +% colour but multi-row multi-column should not. +% Attention that this assumes \sphinxstartmulticolumn is always followed +% in latex mark-up either by \sphinxmultirow or \begin (from \begin{varwidth}). +\def\sphinxstartmulticolumn#1#2{% + \ifx\sphinxmultirow#2% + \gdef\spx@table@hackCT@inmergedcell{\spx@table@hackCT@nocolor}% + \else + \global\let\spx@table@hackCT@inmergedcell\spx@@table@hackCT@inmergedcell + \fi + \sphinx@startmulticolumn{#1}#2% +}% +\def\sphinx@startmulticolumn{% + \ifx\equation$% $ tabulary's first pass + \expandafter\sphinx@TYI@start@multicolumn + \else % either not tabulary or tabulary's second pass + \expandafter\sphinx@start@multicolumn + \fi +}% +\def\sphinxstopmulticolumn{% + \ifx\equation$% $ tabulary's first pass + \expandafter\sphinx@TYI@stop@multicolumn + \else % either not tabulary or tabulary's second pass + \ignorespaces + \fi +}% +\def\sphinx@TYI@start@multicolumn#1{% + % use \gdef always to avoid stack space build up + \gdef\sphinx@tempa{#1}\begingroup\setbox\z@\hbox\bgroup +}% +\def\sphinx@TYI@stop@multicolumn{\egroup % varwidth was used with \tymax + \xdef\sphinx@tempb{\the\dimexpr\wd\z@/\sphinx@tempa}% per column width + \endgroup + \expandafter\sphinx@TYI@multispan\expandafter{\sphinx@tempa}% +}% +\def\sphinx@TYI@multispan #1{% + \kern\sphinx@tempb\ignorespaces % the per column occupied width + \ifnum#1>\@ne % repeat, taking into account subtleties of TeX's & ... + \expandafter\sphinx@TYI@multispan@next\expandafter{\the\numexpr#1-\@ne\expandafter}% + \fi +}% +\def\sphinx@TYI@multispan@next{&\relax\sphinx@TYI@multispan}% +% +% Now the branch handling either the second pass of tabulary or the single pass +% of tabular/longtable. This is the delicate part where we gather the +% dimensions from the p columns either set-up by tabulary or by user p column +% or Sphinx \X, \Y columns. The difficulty is that to get the said width, the +% template must be inserted (other hacks would be horribly complicated except +% if we rewrote crucial parts of LaTeX's \@array !) and we can not do +% \omit\span like standard \multicolumn's easy approach. Thus we must cancel +% the \vrule separators. Also, perhaps the column specifier is of the l, c, r +% type, then we attempt an ad hoc rescue to give varwidth a reasonable target +% width. +\def\sphinx@start@multicolumn#1{% + \gdef\sphinx@multiwidth{0pt}\gdef\sphinx@tempa{#1}\sphinx@multispan{#1}% +}% +\def\sphinx@multispan #1{% + \ifnum#1=\@ne\expandafter\sphinx@multispan@end + \else\expandafter\sphinx@multispan@next + \fi {#1}% +}% +\def\sphinx@multispan@next #1{% + % trick to recognize L, C, R, J or p, m, b type columns + \ifdim\baselineskip>\z@ + \gdef\sphinx@tempb{\linewidth}% + \else + % if in an l, r, c type column, try and hope for the best + \xdef\sphinx@tempb{\the\dimexpr(\ifx\TY@final\@undefined\linewidth\else + \sphinx@TY@tablewidth\fi-\spx@arrayrulewidth)/\sphinx@tempa + -\tw@\tabcolsep-\spx@arrayrulewidth\relax}% + \fi + \noindent\kern\sphinx@tempb\relax + \xdef\sphinx@multiwidth + {\the\dimexpr\sphinx@multiwidth+\sphinx@tempb+\tw@\tabcolsep+\spx@arrayrulewidth}% + \spx@table@hackCT@fixcolorpanel + % silence a | column separator in our merged cell + \spx@table@hackCT@inhibitvline + % prevent column colours to interfere with our multi-column but allow row + % colour (we can't obey a \cellcolor as it has not be seen yet at this stage) + \spx@table@hackCT@inmergedcell&\relax + % repeat + \expandafter\sphinx@multispan\expandafter{\the\numexpr#1-\@ne}% +}% +\def\sphinx@multispan@end#1{% + % first, trace back our steps horizontally + \noindent\kern-\dimexpr\sphinx@multiwidth\relax + % and now we set the final computed width for the varwidth environment + \ifdim\baselineskip>\z@ + \xdef\sphinx@multiwidth{\the\dimexpr\sphinx@multiwidth+\linewidth}% + \else + \xdef\sphinx@multiwidth{\the\dimexpr\sphinx@multiwidth+ + (\ifx\TY@final\@undefined\linewidth\else + \sphinx@TY@tablewidth\fi-\spx@arrayrulewidth)/\sphinx@tempa + -\tw@\tabcolsep-\spx@arrayrulewidth\relax}% + \fi + % last cell of the multi-column + \aftergroup\spx@table@hackCT@fixcolorpanel + \aftergroup\spx@table@hackCT@inmergedcell +}% +\newcommand*\sphinxcolwidth[2]{% + % this dimension will always be used for varwidth, and serves as maximum + % width when cells are merged either via multirow or multicolumn or both, + % as always their contents is wrapped in varwidth environment. + \ifnum#1>\@ne % multi-column (and possibly also multi-row) + % we wrote our own multicolumn code especially to handle that (and allow + % verbatim contents) + \ifx\equation$%$ + \tymax % first pass of tabulary (cf MEMO above regarding nesting) + \else % the \@gobble thing is for compatibility with standard \multicolumn + \sphinx@multiwidth\@gobble{#1/#2}% + \fi + \else % single column multirow + \ifx\TY@final\@undefined % not a tabulary. + \ifdim\baselineskip>\z@ + % in a p{..} type column, \linewidth is the target box width + \linewidth + \else + % l, c, r columns. Do our best. + \dimexpr(\linewidth-\spx@arrayrulewidth)/#2- + \tw@\tabcolsep-\spx@arrayrulewidth\relax + \fi + \else % in tabulary + \ifx\equation$%$% first pass + \tymax % it is set to a big value so that paragraphs can express themselves + \else + % second pass. + \ifdim\baselineskip>\z@ + \linewidth % in a L, R, C, J column or a p, \X, \Y ... + \else + % we have hacked \TY@final to put in \sphinx@TY@tablewidth the table width + \dimexpr(\sphinx@TY@tablewidth-\spx@arrayrulewidth)/#2- + \tw@\tabcolsep-\spx@arrayrulewidth\relax + \fi + \fi + \fi + \fi +}% +% fallback default in case user has set latex_use_latex_multicolumn to True: +% \sphinxcolwidth will use this only inside LaTeX's standard \multicolumn +\def\sphinx@multiwidth #1#2{\dimexpr % #1 to gobble the \@gobble (!) + (\ifx\TY@final\@undefined\linewidth\else\sphinx@TY@tablewidth\fi + -\spx@arrayrulewidth)*#2-\tw@\tabcolsep-\spx@arrayrulewidth\relax}% + +% \spx@table@hackCT@inhibitvline +% packages like colortbl add group levels, we need to "climb back up" to be +% able to hack the \vline and also the colortbl inserted tokens. The hack +% sets the \arrayrulewidth to \z@ to inhibit a | separator at right end +% of the cell, if present (our code does not use \omit so can not avoid the +% \vline insertion, but setting its width to zero makes it do nothing). +% Some subtlety with colour panels must be taken care of. +\def\spx@table@hackCT@inhibitvline{\ifnum\currentgrouptype=6\relax + \kern\spx@arrayrulewidth % will be compensated by extra colour panel left overhang + \arrayrulewidth\z@% trick to inhibit the {\vrule width \arrayrulewidth} + \else\aftergroup\spx@table@hackCT@inhibitvline\fi}% + +% hacking around colour matters +% Sphinx 1.6 comment: +% It turns out \CT@row@color is not expanded contrarily to \CT@column@color +% during LaTeX+colortbl preamble preparation, hence it would be possible for +% \CT@setup to discard only the column color and choose to obey or not +% row color and cell color. It would even be possible to propagate cell color +% to row color for the duration of the Sphinx multicolumn... the (provisional?) +% choice has been made to cancel the colortbl colours for the multicolumn +% duration. +% Sphinx 5.3.0 comment: +% - colortbl has no mechanism to disable colour background in a given cell: +% \cellcolor triggers one more \color, but has no possibility to revert +% a previously emitted \color, only to override it via an additional \color +% - prior to 5.3.0, Sphinx did not officially support colour in tables, +% but it did have a mechanism to protect merged cells from being partly +% covered by colour panels at various places. At 5.3.0 this mechanism +% is relaxed a bit to allow row colour for a single-row merged cell. +% +% fixcolorpanel +\def\spx@table@hackCT@fixcolorpanel{\ifnum\currentgrouptype=6\relax + \edef\spx@table@leftcolorpanelextra + % \edef as \arrayrulewidth will be set to \z@ next, + % hence also \spx@arrayrulewidth... + {\sphinxcolorpanelextraoverhang+\the\spx@arrayrulewidth}% + \else\aftergroup\spx@table@hackCT@fixcolorpanel\fi}% +% +% inmergedcell +% \spx@table@hackCT@inmergedcell will be locally set to either this +% \spx@@table@hackCT@inmergedcell or to \spx@table@hackCT@nocolor +% "\let\spx@original@CT@setup\CT@setup" is done after loading colortbl +\def\spx@@table@hackCT@inmergedcell{\ifnum\currentgrouptype=6\relax + \let\CT@setup\spx@CT@setup@inmergedcell + \else\aftergroup\spx@@table@hackCT@inmergedcell\fi +}% +\newif\ifspx@table@inmergedcell +\def\spx@CT@setup@inmergedcell #1\endgroup{% + % - obey only row color and disable effect of \sphinxcolorblend + % - turn on the inmergedcell boolean to signal to \CT@row@color + \spx@original@CT@setup + \spx@table@inmergedcelltrue % needed by \CT@row@color + % deactivate effect of \sphinxcolorblend if it happened at all + \ifdefined\blendcolors\blendcolors{}\fi + \CT@row@color + \CT@do@color + \global\let\CT@cell@color\relax + \endgroup +}% +% +% nocolor +\def\spx@table@hackCT@nocolor{\ifnum\currentgrouptype=6\relax +% sadly \CT@column@color is possibly already expanded so we can't +% simply do \let\CT@column@color\relax etc... +% admittedly we could perhaps hack \CT@color but well + \let\CT@setup\spx@CT@setup@nocolor + \else\aftergroup\spx@table@hackCT@nocolor\fi +} +\def\spx@CT@setup@nocolor#1\endgroup{% + \global\let\CT@cell@color\relax + % the above fix was added at 5.3.0 + % formerly a \cellcolor added by a raw latex directive in the merged cell + % would have caused colour to apply to the *next* cell after the merged + % one; we don't support \cellcolor from merged cells contents anyhow. + \endgroup} +% +% norowcolor +\def\spx@table@hackCT@norowcolor{% +% a bit easier although merged cells complicate the matter as they do need +% to keep the rowcolor; and we can't know yet if we are in a merged cell + \ifnum\currentgrouptype=6\relax + \ifx\CT@row@color\relax + \else + \let\spx@saved@CT@row@color\CT@row@color + \def\CT@row@color{% + \ifspx@table@inmergedcell\expandafter\spx@saved@CT@row@color\fi + }% + \fi + \else\aftergroup\spx@table@hackCT@norowcolor\fi +} +% +% \sphinxcolorblend +\def\spx@table@hackCT@colorblend{% + \ifnum\currentgrouptype=6\relax + \expandafter\blendcolors\spx@colorblendparam + % merged cells will do a \blendcolors{} to cancel the effet + % we can not know here yet if in merged cell as the boolean + % \ifspx@table@inmergedcell is not yet updated + \else + \aftergroup\spx@table@hackCT@colorblend + \fi +} +\def\sphinxcolorblend#1{\gdef\spx@colorblendparam{{#1}}\spx@table@hackCT@colorblend} + + +%%%%%%%%%%%%%%%%%% +% --- MULTIROW --- +% standard \multirow +% 1. does not allow verbatim contents, +% 2. does not allow blank lines in its argument, +% 3. its * specifier means to typeset "horizontally" which is very +% bad for paragraph content. 2016 version has = specifier but it +% must be used with p type columns only, else results are bad, +% 4. it requires manual intervention if the contents is too long to fit +% in the asked-for number of rows. +% 5. colour panels (either from \rowcolor or \columncolor) will hide +% the bottom part of multirow text, hence manual tuning is needed +% to put the multirow insertion at the _bottom_. +% +% The Sphinx solution consists in always having contents wrapped +% in a varwidth environment so that it makes sense to estimate how many +% lines it will occupy, and then ensure by insertion of suitable struts +% that the table rows have the needed height. The needed mark-up is done +% by LaTeX writer, which has its own id for the merged cells. +% +% The colour issue is "solved" by clearing colour panels in all cells, +% whether or not the multirow is single-column or multi-column. +% +% MEMO at 5.3.0: to allow a multirow cell in a single column to react to +% \columncolor correctly, it seems only way is that the contents +% are inserted by bottom cell (this is mentioned in multirow.sty doc, too). +% Sphinx could at Python level "move" the contents to that cell. But the +% mechanism used here via \sphinxtablestrut to enlarge rows to make room for +% the contents if needed becomes more challenging yet, because \sphinxtablestrut +% mark-up will be parsed by TeX *before* it sees the contents of the merged +% cell.. So it seems the best way would be to actually store the contents into +% some owned-by-Sphinx box storage which needs to be globally allocated to +% that usage ; then we need multiple such boxes, say at least 5 to cover +% 99% or use case. Or perhaps some trick with storing in a \vbox and recovering +% via some \vsplit but this becomes complicated... perhaps in future. +% +% In passing we obtain baseline alignments across rows (only if +% \arraystretch is 1, as LaTeX's does not obey \arraystretch in "p" +% multi-line contents, only first and last line...) +% +% TODO: examine the situation with \arraystretch > 1. The \extrarowheight +% is hopeless for multirow anyhow, it makes baseline alignment strictly +% impossible. +\newcommand\sphinxmultirow[2]{\begingroup + % #1 = nb of spanned rows, #2 = Sphinx id of "cell", #3 = contents + % but let's fetch #3 in a way allowing verbatim contents ! + \def\sphinx@nbofrows{#1}\def\sphinx@cellid{#2}% + \afterassignment\sphinx@multirow\let\next= +}% +\def\sphinx@multirow {% + \setbox\z@\hbox\bgroup\aftergroup\sphinx@@multirow\strut +}% +\def\sphinx@@multirow {% +% MEMO: we could check status of \CT@cell@color here, but unfortunately we +% can't know the exact height which will be covered by the cells in total +% (it may be more than our \box\z@ dimensions). We could use an \fcolorbox +% wrapper on \box\z@ but this will not extend precisely to the bottom rule. +% +% Only solution if we want to obey a raw \cellcolor, or a \columncolor, seems +% to delay unboxing the gathered contents as part of the bottom row with +% a suitable vertical adjustment... +% + % The contents, which is a varwidth environment, has been captured in + % \box0 (a \hbox). + % We have with \sphinx@cellid an assigned unique id. The goal is to give + % about the same height to all the involved rows. + % For this Sphinx will insert a \sphinxtablestrut{cell_id} mark-up + % in LaTeX file and the expansion of the latter will do the suitable thing. + \dimen@\dp\z@ + \dimen\tw@\ht\@arstrutbox + \advance\dimen@\dimen\tw@ + \advance\dimen\tw@\dp\@arstrutbox + \count@=\dimen@ % type conversion dim -> int + \count\tw@=\dimen\tw@ + \divide\count@\count\tw@ % TeX division truncates + \advance\dimen@-\count@\dimen\tw@ + % 1300sp is about 0.02pt. For comparison a rule default width is 0.4pt. + % (note that if \count@ holds 0, surely \dimen@>1300sp) + \ifdim\dimen@>1300sp \advance\count@\@ne \fi + % now \count@ holds the count L of needed "lines" + % and \sphinx@nbofrows holds the number N of rows + % we have L >= 1 and N >= 1 + % if L is a multiple of N, ... clear what to do ! + % else write L = qN + r, 1 <= r < N and we will + % arrange for each row to have enough space for: + % q+1 "lines" in each of the first r rows + % q "lines" in each of the (N-r) bottom rows + % for a total of (q+1) * r + q * (N-r) = q * N + r = L + % It is possible that q == 0. + \count\tw@\count@ + % the TeX division truncates + \divide\count\tw@\sphinx@nbofrows\relax + \count4\count\tw@ % q + \multiply\count\tw@\sphinx@nbofrows\relax + \advance\count@-\count\tw@ % r + \expandafter\xdef\csname sphinx@tablestrut_\sphinx@cellid\endcsname + {\noexpand\sphinx@tablestrut{\the\count4}{\the\count@}{\sphinx@cellid}}% + \dp\z@\z@ + % this will use the real height if it is >\ht\@arstrutbox + \sphinxtablestrut{\sphinx@cellid}\box\z@ + \endgroup % group was opened in \sphinxmultirow +}% +\newcommand*\sphinxtablestrut[1]{% + % #1 is a "cell_id", i.e. the id of a merged group of table cells + \csname sphinx@tablestrut_#1\endcsname +}% +% LaTeX typesets the table row by row, hence each execution can do +% an update for the next row. +\newcommand*\sphinx@tablestrut[3]{\begingroup + % #1 = q, #2 = (initially) r, #3 = cell_id, q+1 lines in first r rows + % if #2 = 0, create space for max(q,1) table lines + % if #2 > 0, create space for q+1 lines and decrement #2 + \leavevmode + \count@#1\relax + \ifnum#2=\z@ + \ifnum\count@=\z@\count@\@ne\fi + \else + % next row will be with a #2 decremented by one + \expandafter\xdef\csname sphinx@tablestrut_#3\endcsname + {\noexpand\sphinx@tablestrut{#1}{\the\numexpr#2-\@ne}{#3}}% + \advance\count@\@ne + \fi + \vrule\@height\ht\@arstrutbox + \@depth\dimexpr\count@\ht\@arstrutbox+\count@\dp\@arstrutbox-\ht\@arstrutbox\relax + \@width\z@ + \endgroup + % we need this to avoid colour panels hiding bottom parts of multirow text + \spx@table@hackCT@nocolor +}% + +%%%%%%%%%%%%%%%%%% +% --- STYLING --- +% + +% +% Support for colour in table +% +% Core LaTeX package (very old, part of texlive-latex-base on Debian distr.) +% providing \columncolor, \rowcolor, \cellcolor and \arrayrulecolor. +\RequirePackage{colortbl} +\let\spx@original@CT@setup\CT@setup + +% LaTeX's \cline has **strong** deficiencies +% ****************************************** +% We work around them via an added \sphinxfixclines{number of columns} in the +% table mark-up, and also extra mark-up \sphinxvlinecrossing{col no} for +% crossings not contiguous to any cline. To fix the gap at left extremity of a +% \cline, we redefine the core LaTeX \c@line because this avoids adjoining a +% small square with potential PDF viewer anti-aliasing issues. We waited +% after loading colortbl because it also redefines \c@line for it to obey the +% colour set by \arrayrulecolor. +% MEMO: booktabs package does *not* redefine \@cline so we are safe here. +\def\@cline#1-#2\@nil{% + \omit + \@multicnt#1% + \advance\@multispan\m@ne + \ifnum\@multicnt=\@ne\@firstofone{&\omit}\fi + \@multicnt#2% + \advance\@multicnt-#1% + \advance\@multispan\@ne + {\CT@arc@ +% start of Sphinx modification + \ifnum#1>\@ne\kern-\spx@arrayrulewidth\fi% fix gap at join with vertical lines +% end of Sphinx modification +% Comments: +% +% If we had the information whether the previous column ended with a | or +% not, we could decide what to do here. Alternatively the mark-up could +% use either original \cline or the one modified as here depending on case. +% One wonders why LaTeX does not provide itself the alternative as a +% complement to \cline, to use on case by case basis. +% Here we handle both at same time via using the \spx@arrayrulewidth which +% will be \z@ if no | at all so will induce here nothing. +% +% As a result Sphinx basically supports well only tables having either all +% columns |-separated, or no | at all, as it uses \spx@arrayrrulewidth in +% all columns (here and in multicolumn code). +% +% We also considered a method not modifying \c@line but it requires too +% much extra mark-up from Python LaTeX writer and/or extra LaTeX coding. +% back to LaTeX+colortbl code + \leaders\hrule\@height\arrayrulewidth\hfill}% + \cr +% the last one will need to be compensated, this is job of \sphinxclines + \noalign{\vskip-\arrayrulewidth}% +} +\def\spx@table@fixvlinejoin{% + {\CT@arc@ % this is the color command set up by \arrayrulecolor + \vrule\@height\arrayrulewidth +% side remark: LaTeX has only a single \arrayrulewidth for all kinds +% for cell borders in table, horizontal or vertical... + \@depth\z@ + \@width\spx@arrayrulewidth + }% +} +% Sphinx LaTeX writer issues one such for each vertical line separating two +% contiguous multirow cells; i.e. those crossings which can are not already +% taken care of by our modified at left extremity \cline. +% One could imagine a more \...crossingS (plural) receiving a comma delimited +% list, which would simplify the mark-up but this would complexify both the +% Python and the LaTeX coding. +\def\sphinxtablevlinecrossing#1{% + \sphinxtabledecrementrownum + \omit + \@multispan{#1}% + \hfill + \spx@table@fixvlinejoin + \cr + \noalign{\vskip-\arrayrulewidth}% +} +% This "fixclines" is also needed if no \sphinxcline emitted and is useful +% even in extreme case with no \sphinxvlinecrossing either, to give correct +% height to multirow extending across all table width assuming other rows are +% separated generally by an \hline, so as to keep coherent line spacing. +% +% It is designed to work ok even if no | separators are in the table (because +% \spx@table@fixvlinejoin uses \spx@arrayrulewidth which is \z@ in that case). +\def\sphinxtablefixclines#1{% #1 is the number of columns of the table + \sphinxtabledecrementrownum + \omit + \spx@table@fixvlinejoin% unneeded if first \cline started at column 1 but does + % not hurt; fills small gap at left-bordered table + \@multispan{#1}% + \hfill + \spx@table@fixvlinejoin% fill small gap at right-bordered table + \cr + % this final one does NO \vskip-\arrayrulewidth... that's the whole point +} +%%%% end of \cline workarounds + +% +% - passing option "table" to xcolor also loads colortbl but we needed to +% load color or xcolor prior to the handling of the options +% +% - the \rowcolors command from [table]{xcolor} has various problems: +% +% * it is rigid and does not out-of-the-box allow a more complex scheme +% such as colorA+colorB+colorC+colorB+colorC+colorB+colorC... suitable to +% distinguish a header row. +% +% * its code does not export the used colour, an information which we may +% need for example to colourize the rule via \arrayrulecolor in the +% appropriate manner, for example to colourize the booktabs induced vertical +% whitespace to avoid gaps (if one wants to). +% +% * incompatibility with tabulary: the output depends on parity of total +% number of rows! +% +% * problems with longtable: the caption will receive a background colour +% panel, if we do not deactivate the \rowcolors action during definition of +% the headers and footers; this requires extra mark-up. Besides if we +% deactivate using \hiderowcolors during header and footer formation, the +% parity of the body rows is shifted, \rownum is even, not odd, at first body +% row. And setting \rownum at start of first body row is too late for +% influencing the colour. +% +% * it has a global impact and must be reset at each table. We can not +% issue it only once and it provides no public interface (without @) to +% cancel its effect conveniently (\hiderowcolors can only be used from +% *inside* a table.) +% +% * its core mechanism which increments the row count is triggered +% if a \cline is encountered... so this offsets the alternating colours... +% ... or not if there are two \cline's in the row... +% (as we will use same mechanism we have to correct this increment). +% +% So we need our own code. + +% Provide \rownum and rownum LaTeX counter (code copied from colortbl v1.0f) +\ltx@ifundefined{rownum}{% + \ltx@ifundefined{c@rownum}% + {\newcount\rownum\let\c@rownum\rownum}% + {\let\rownum\c@rownum}% + }% +{\let\c@rownum\rownum} +\providecommand\therownum{\arabic{rownum}} + +% extra overhang for color panels to avoid visual artifacts in pdf viewers +% (particularly if borderless) +\def\sphinxcolorpanelextraoverhang{0.1pt} +\def\spx@table@leftcolorpanelextra {\sphinxcolorpanelextraoverhang} +\def\spx@table@rightcolorpanelextra{\sphinxcolorpanelextraoverhang} +% the macro to which \CT@row@color will be set for coloured rows, serves both +% in header and body, the colours must have been defined at time of use +\def\spx@table@CT@row@color{\ifspx@table@inmergedcell + \CT@color{sphinxTableMergeColor}% + \else + \CT@color{sphinxTableRowColor}% + \fi + \@tempdimb\dimexpr\col@sep+\spx@table@leftcolorpanelextra\relax + \@tempdimc\dimexpr\col@sep+\spx@table@rightcolorpanelextra\relax + }% +% used by itself this will influence a single row if \CT@everycr is the +% colortbl one, to influences all rows the \CT@everycr must be modified (see +% below) +\def\sphinxrowcolorON {\global\let\CT@row@color\spx@table@CT@row@color}% +% this one turns off row colours until the next \sphinxrowcolorON +\def\sphinxrowcolorOFF{\global\let\CT@row@color\relax}% +% this one inhibits the row colour in one cell only (can be used as +% >{\sphinxnorowcolor} for turning off row colours in a given column) +\def\sphinxnorowcolor{\spx@table@hackCT@norowcolor}% + +% \sphinxtoprule (or rather \sphinxtabletoprulehook) will be modified by +% the colorrows class to execute this one: +\def\spx@table@@toprule@rowcolorON{% + \noalign{% + % Because of tabulary 2-pass system, the colour set-up at end of table + % would contaminate the header colours at start of table, so must reset + % them here. We want all header rows to obey same colours, so we don't + % use original \CT@everycr which sets \CT@row@color to \relax. + \global\CT@everycr{\the\everycr}% + \global\sphinxcolorlet{sphinxTableRowColor}{sphinxTableRowColorHeader}% + \global\sphinxcolorlet{sphinxTableMergeColor}{\sphinxTableMergeColorHeader}% + \sphinxrowcolorON + }% +}% + +% \sphinxtableatstartofbodyhook will be modified by colorrows class to +% execute this one; it starts the alternating colours and triggers increment +% or \rownum count at each new row (the xcolor base method for \rowcolors) +\def\spx@table@@startbodycolorrows{% + \noalign{% + \global\CT@everycr{% Nota Bene: in a longtable with \hline the \everycr is + % done two extra times! but 2 is even, so this is ok + \noalign{\global\advance\rownum\@ne % the xcolor \rowcolors base trick +% MEMO: colortbl \CT@row@color is expanded *after* the cell contents have been +% gathered and measured, so it can't be used to expose e.g. the colour to the +% cell contents macro code. Of course if it is known how the colour is chosen +% the procedure could be done from inside the cell. Simpler to expose the colour +% in a public name sphinxTableRowColor at start of the row in this \noalign. + \sphinxSwitchCaseRowColor\rownum + }% + \the\everycr + }% + \global\rownum\@ne % is done from inside table so ok with tabulary two passes + \sphinxSwitchCaseRowColor\rownum % set up color for the first body row + \sphinxrowcolorON % has been done from \sphinxtoprule location but let's do + % it again in case \sphinxtabletoprulehook has been used + % to inhibit colours in the header rows + }% end of noalign contents +} +% set the colours according to row parity; a priori #1 is \rownum, but +% the macro has been designed to be usable in user level added code +\def\sphinxSwitchCaseRowColor#1{% + \ifodd#1\relax + \global\sphinxcolorlet{sphinxTableRowColor}{sphinxTableRowColorOdd}% + \global\sphinxcolorlet{sphinxTableMergeColor}{\sphinxTableMergeColorOdd}% + \else + \global\sphinxcolorlet{sphinxTableRowColor}{sphinxTableRowColorEven}% + \global\sphinxcolorlet{sphinxTableMergeColor}{\sphinxTableMergeColorEven}% + \fi +} + +% each \cline or \cmidrule (booktabs) consumes one \cr, offsetting the \rownum +% parity; so this macro serves to compensate and must be added to each such +% \cline or \cmidrule (see below) +\def\spx@table@@decrementrownum{\noalign{\global\advance\rownum\m@ne}} +\let\sphinxtabledecrementrownum\@empty + +% \sphinxtableafterendhook will be modified by colorrows class to execute +% this after the table +\def\spx@table@resetcolortbl{% + \sphinxrowcolorOFF + \spx@table@reset@CTeverycr +% this last bit is done in order for the \sphinxbottomrule from the "foot" +% longtable template to be able to use same code as the \sphinxbottomrule +% at end of table body; see \sphinxbooktabsspecialbottomrule code + \global\rownum\z@ +} +\def\spx@table@reset@CTeverycr{% +% we should probably be more cautious and not hard-code here the colortbl +% set-up; so the macro is defined without @ to fac + \global\CT@everycr{\noalign{\global\let\CT@row@color\relax}\the\everycr}% +} + +% At last the style macros \sphinxthistablewithstandardstyle etc... + +% They are executed before the table environments in a scope limiting +% wrapper "savenotes" environment. +% +% 0) colour support is enacted via adding code to three hooks: +% - \sphinxtabletoprulehook (implicit from \sphinxtoprule expansion) +% - \sphinxtableatstartofbodyhook (explicit from table templates) +% - \sphinxtableafterendhook (explicit from table templates) +% additionally special adjustment must be made in \sphinxcline +% +\def\sphinxtoprule{\spx@toprule\sphinxtabletoprulehook} +% \spx@toprule is what is defined by the standard, booktabs and borderless +% styles. +% The colorrows class will prepend \spx@table@toprule@rowcolorON into +% \sphinxtabletoprulehook which a priori is \@empty but can contain user added +% extra code, and is executed after \spx@toprule. +\let\sphinxtabletoprulehook \@empty +\let\sphinxtableatstartofbodyhook\@empty +\let\sphinxtableafterendhook \@empty +% +% 1) we manage these three hooks in a way allowing a custom user extra wrapper +% environment from a container class to use them as entry point for some +% custom code. The container code is done first, prior to table templates. +% So, the style macros will *prepend* the needed color-code to the existing +% custom user code, so the custom user code can override them. The custom +% user code should not redefine any of the 3 \sphinxtable...hook macros via a +% \global\def, but their contents can use \gdef. In fact they probably need +% to for the first two hooks which are executed from inside the table and +% a priori need their code to be in a \noalign which limits scope. +% +% 2) the table templates and LaTeX writer code make it so that only +% one of either +% \sphinxthistablewithcolorrowsstyle, +% or \sphinxthistablewithnocolorrowsstyle +% will be inserted explicitly depending on local :class: for table. +% The global 'colorrows' style in latex_table_style translates at bottom +% of this file into code for inserting \sphinxthistablewithcolorrowsstyle +% at end of \sphinxthistablewithglobalstyle. So it is impossible +% to have first \sphinxthistablewithnocolorrowsstyle, then +% \sphinxthistablewithcolorrowsstyle. Nevertheless we have written +% the code so that in this case colorrows would indeed activate (except +% if it was already executed before as it self-annihilates). + +% standard style +\def\sphinxthistablewithstandardstyle{% + % Those two are produced by the latex writer + \def\sphinxhline {\hline}% + % \sphinxtabledecrementrownum is a no-op which is redefined by colorrows + % to correct the \rownum increment induced by \cline in colorrows regime + \def\sphinxcline {\sphinxtabledecrementrownum\cline}% + % LaTeX's \cline needs fixing + \let\sphinxvlinecrossing\sphinxtablevlinecrossing + \let\sphinxfixclines \sphinxtablefixclines + % Those three are inserted by the table templates + \def\spx@toprule {\hline}% + \def\sphinxmidrule {\hline}% + \def\sphinxbottomrule {\hline}% + % Do not tamper with this internal + \def\spx@arrayrulewidth{\arrayrulewidth}% +} + +% booktabs style +% The \@xcmidrule patch below will do beyond its main stuff +% \sphinxadjustcmidrulebelowsep +% Indeed the poor booktabs spacing with \cmidrule (if \sphinxbooktabscmidrule +% defined below is overwritten to use it) is quite awful. Do +% \let\sphinxadjustcmidrulebelowsep\empty +% if you prefer booktabs defaults. +\def\sphinxadjustcmidrulebelowsep{\belowrulesep=\aboverulesep} +\AtBeginDocument{% patch booktabs to avoid extra vertical space from + % consecutive \sphinxcline, if defined to use \cmidrule + \ifdefined\@xcmidrule + \let\spx@original@@xcmidrule\@xcmidrule + \def\@xcmidrule{\sphinxadjustcmidrulebelowsep + % if we don't do that, two \sphinxcline in the same row + % will cause the second short rule to be shifted down + \ifx\@tempa\sphinxcline\let\@tempa\cmidrule\fi + \spx@original@@xcmidrule}% + \fi +} +% wrappers to allow customization, e.g. via a container class +% the top, mid, bottom definitions are in fact overwritten (later, below) +% byt more complex ones needed to handle booktabs+colorrows context +\def\sphinxbooktabstoprule {\toprule} +\def\sphinxbooktabsmidrule {\midrule} +\def\sphinxbooktabsbottomrule{\bottomrule} +% +\let\sphinxbooktabscmidrule \@gobble % i.e. draw no short rules at all! +% You can redefine this to use \cmidrule with various options, such +% as \cmidrule(lr), but: +% Attention, if you want this to use \cmidrule (or \cline) you must, +% if the table uses row colours, +% also include the \sphinxtabledecrementrownum token like e.g. this +% \def\sphinxbooktabscmidrule{\sphinxtabledecrementrownum\cmidrule(lr)} +% and it must be first due to internals of the \cmidrule usage of \futurelet. + +\def\sphinxthistablewithbooktabsstyle{% + \let\sphinxhline\@empty % there is no wrapper macro here so if you want to change that + % you will have to redefine \sphinxthistablewithbooktabsstyle + \def\sphinxcline {\sphinxbooktabscmidrule}% defaults to give \@gobble + \let\sphinxvlinecrossing\@gobble % no | in a booktabs-style table ! + \let\sphinxfixclines \@gobble % should not be used with booktabs + \cmidrule + \def\spx@toprule {\sphinxbooktabstoprule}% + \def\sphinxmidrule {\sphinxbooktabsmidrule}% + \def\sphinxbottomrule{\sphinxbooktabsbottomrule}% + \def\spx@arrayrulewidth{\z@}% +} +\AtBeginDocument{\@ifpackageloaded{booktabs}% + {}% + {\def\sphinxthistablewithbooktabsstyle{% + \PackageWarning{sphinx}{% +Add \string\usepackage{booktabs} to the preamble to allow\MessageBreak +local use of booktabs table style}% + \sphinxbuildwarning{booktabs}% + \sphinxthistablewithstandardstyle + }}% +}% + +% borderless style +\def\sphinxthistablewithborderlessstyle{% + \let\sphinxhline \@empty + \let\sphinxcline \@gobble + \let\sphinxvlinecrossing\@gobble + \let\sphinxfixclines \@gobble + \let\spx@toprule \@empty + \let\sphinxmidrule \@empty + \let\sphinxbottomrule \@empty + \def\spx@arrayrulewidth{\z@}% +}% + +% colorrows style +% +\let\sphinxifthistablewithcolorrowsTF\@secondoftwo +\def\sphinxthistablewithcolorrowsstyle{% + \let\sphinxifthistablewithcolorrowsTF\@firstoftwo +% this is defined to auto-silence itself (in the surrounding scope-limiting +% environment) after one execution ("colorrows" can never follow "nocolorrows") + \let\sphinxthistablewithcolorrowsstyle\@empty +% + \let\spx@table@toprule@rowcolorON \spx@table@@toprule@rowcolorON + \let\spx@table@startbodycolorrows \spx@table@@startbodycolorrows + \let\sphinxtabledecrementrownum \spx@table@@decrementrownum +% Is it the best choice to "prepend" to existing code there? + \spx@prepend\spx@table@toprule@rowcolorON\to\sphinxtabletoprulehook + \spx@prepend\spx@table@startbodycolorrows\to\sphinxtableatstartofbodyhook +% +% this one is not set to \@empty by nocolorrows, because it looks harmless +% to execute it always, as it simply resets to standard colortbl state after +% the table; so we don't need an @@ version for this one + \spx@prepend\spx@table@resetcolortbl\to\sphinxtableafterendhook +} +\def\spx@prepend#1\to#2{% attention about using this only with #2 "storage macro" + \toks@{#1}% + \toks@\expandafter\expandafter\expandafter{\expandafter\the\expandafter\toks@#2}% + \edef#2{\the\toks@}% +}% + +\def\sphinxthistablewithnocolorrowsstyle{% + \let\sphinxifthistablewithcolorrowsTF\@secondoftwo +% rather than trying to remove the code added by 'colorrows' style, we +% simply make it no-op, without even checking if really it was activated. + \let\spx@table@toprule@rowcolorON\@empty + \let\spx@table@startbodycolorrows\@empty + \let\sphinxtabledecrementrownum \@empty +% we don't worry about \sphinxtableafterendhook as the \spx@table@resetcolortbl +% done at end can not do harm; and we could also have not bothered with the +% \sphinxtabledecrementrownum as its \rownum decrement, if active, is harmless +% in non-colorrows context +} + +% (not so easy) implementation of the booktabscolorgaps option. This option +% defaults to true and is not officially documented, as already colorrows is +% only opt-in, so it is there only as a "turn-off" switch, but if nobody +% complains in next few months, it will probably be removed altogether at +% 6.0.0. The reason it exists is because of longtable aspeces described +% below. +% +% As it is used via \sphinxsetup booktabscolorgaps status is not known here +% and may change locally. So it must be implemented via delayed or +% conditional code. +% +% We do not know the order of execution of \sphinxthistablewithbooktabsstyle +% versus \sphinxthistablewithcolorrows: if booktabs is global option it +% will be executed first; but if colorrows is global option and not booktabs +% then colorrows will be executed first via \sphinxthistablewithglobalstyle +% +% Modifying things from locations such as \sphinxtabletoprulehook which are +% executed within the table is not convenient as it must use \global +% but then we would have to undo this after the table. +% +% So what we do is to prepare booktabs specific macros to incorporate +% a conditional to check the colorrows status. We must each time check +% both if colorrows is activated and if colorgaps is. We do this via +% macros without @ so they can be used easily in customization code. +% When and if booktabscolorgaps option is removed, we can then replace +% \sphinxifbooktabswithcolorgapsTF by \sphinxifthistablewithcolorrowsTF +\def\sphinxifbooktabswithcolorgapsTF{% + \if1\ifspx@opt@booktabscolorgaps + \sphinxifthistablewithcolorrowsTF{1}{0}% + \else0\fi + \expandafter\@firstoftwo + \else\expandafter\@secondoftwo + \fi +} +% as this is done without "@" it can be relatively easily be overwritten +% by user in customization code +\def\sphinxbooktabstoprule{% + \sphinxifbooktabswithcolorgapsTF + {\sphinxbooktabsspecialtoprule}% + {\toprule}% +}% +\def\sphinxbooktabscolorgapsoverhang{0.1pt}% avoid pixel/rounding effects +% auxiliary fork +\long\def\spx@table@crazyfork + #1\endfirsthead\endhead\sphinxtableatstartofbodyhook#2#3\@nil{#2} +% we fetch the next token to check if there is a header or not +% this is a bit fragile as it relies on the table templates +% and it assumes this token #1 is never braced... +% let's make this \long in case #1 is \par (should not be) +\long\def\sphinxbooktabsspecialtoprule\sphinxtabletoprulehook#1{% + \specialrule{\heavyrulewidth}{\abovetopsep}{\z@}% + % this macro contains colour init code (and defines sphinxTableRowColor) + \sphinxtabletoprulehook + % unfortunately colortbl provides no way to save/restore the + % \arrayrulecolor status, we have to code it ourselves + \noalign{\global\let\spx@@saved@CT@arc@\CT@arc@ +% \@declaredcolor is not \long. Although #1 can probably never be \par with +% our templates, let's be cautious and not use the creazyfork inside the \color + \spx@table@crazyfork +% this crazy code checks if #1 is one of \endfirsthead, \endhead or +% \sphinxtableatstartofbodyhook, as criterion for table with no header + #1\endhead\sphinxtableatstartofbodyhook\@secondoftwo + \endfirsthead#1\sphinxtableatstartofbodyhook\@secondoftwo + \endfirsthead\endhead#1\@secondoftwo + \endfirsthead\endhead\sphinxtableatstartofbodyhook\@firstoftwo + \@nil + {\gdef\CT@arc@{\color{sphinxTableRowColor}}}% + {\gdef\CT@arc@{\color{sphinxTableRowColorOdd}}}% + }% end of \noalign + % \specialrule uses \noalign itself + \specialrule{\dimexpr\belowrulesep+\sphinxbooktabscolorgapsoverhang\relax}% + {\z@}{-\sphinxbooktabscolorgapsoverhang}% + \noalign{\global\let\CT@arc@\spx@@saved@CT@arc@}% + #1% let's not forget to re-insert this #1 in token stream + % fortunately longtable's \endfirsthead/\endhead are not delimiters but + % are really tokens awaiting expansion... +}% +\def\sphinxbooktabsmidrule{% + \sphinxifbooktabswithcolorgapsTF + {\sphinxbooktabsspecialmidrule}% + {\midrule}% +}% +\def\sphinxbooktabsspecialmidrule{% + \noalign{\global\let\spx@@saved@CT@arc@\CT@arc@ + \gdef\CT@arc@{\color{sphinxTableRowColor}}% this is RowColorHeader + }% + \specialrule{\dimexpr\aboverulesep+\sphinxbooktabscolorgapsoverhang\relax\relax}% + {-\sphinxbooktabscolorgapsoverhang}{\z@}% + \noalign{\global\let\CT@arc@\spx@@saved@CT@arc@}% + \specialrule{\lightrulewidth}{\z@}{\z@}% + \noalign{\gdef\CT@arc@{\color{sphinxTableRowColorOdd}}}% + \specialrule{\dimexpr\belowrulesep+\sphinxbooktabscolorgapsoverhang\relax\relax}% + {\z@}{-\sphinxbooktabscolorgapsoverhang}% + \noalign{\global\let\CT@arc@\spx@@saved@CT@arc@}% +}% +\def\sphinxbooktabsbottomrule{% + \sphinxifbooktabswithcolorgapsTF + {\sphinxbooktabsspecialbottomrule}% + {\bottomrule}% +}% +% The colour here is already updated because of the \\ before so we must +% execute again the colour selection code, but this is not too complicated. +% What is annoying though is that \sphinxbottomrule in the longtable context +% appears both in the "foot" part and after the last body row. For the first +% occurrence the \rownum could be arbitrary if it had not been reset by each +% table using it via the \sphinxtableafterendhook (see above). This avoids +% having to modify the longtable template. But as \rownum is thus 0 in the +% "foot", the \sphinxSwitchCaseRowColor has to know how to handle negative +% inputs (in fact the -1 value), the Sphinx definition has no issue with that +% but any redefinition must be aware of this constraint. +\def\sphinxbooktabsspecialbottomrule{% + \noalign{\global\let\spx@@saved@CT@arc@\CT@arc@ + \sphinxSwitchCaseRowColor{\numexpr\rownum-\@ne\relax}% + \gdef\CT@arc@{\color{sphinxTableRowColor}}% + }% + \specialrule{\dimexpr\aboverulesep+\sphinxbooktabscolorgapsoverhang\relax}% + {-\sphinxbooktabscolorgapsoverhang}{\z@}% + \noalign{\global\let\CT@arc@\spx@@saved@CT@arc@}% + \specialrule{\heavyrulewidth}{\z@}{\belowbottomsep}% +}% +% +% MEMO: with longtable \sphinxtoprule, \sphinxmidrule and \sphinxbottomrule +% are evaluated at time of constructing the headers and footers as boxes +% (already typeset material and expanded macros; \sphinxbottomrule is also +% evaluated at very end of table body, i.e. "normally"). So the used colour +% to fill the booktabs gaps is decided during the headers and footers +% construction by longtable. Actually they are expanded twice: in firsthead +% then in head, respectively in foot and lastfoot. But in current design the +% header row colours are fixed, not alternating, so there is at least no +% coherence issue there. + +% The \spx@arrayrulewidth is used for some complex matters of merged +% cells size computations. +% tabularcolumns argument will override any global or local style and +% trigger the appropriate adjustment of \spx@arrayrulewidth. +% Notice that this will be bad if the table uses booktabs style +% but anyhow table with booktabs should not use any | separator. +\def\sphinxthistablewithvlinesstyle{% + \def\spx@arrayrulewidth{\arrayrulewidth}% + \let\sphinxvlinecrossing\sphinxtablevlinecrossing + \let\sphinxfixclines \sphinxtablefixclines +}% +\def\sphinxthistablewithnovlinesstyle{% + \def\spx@arrayrulewidth{\z@}% + \let\sphinxvlinecrossing\@gobble + % let's not bother to modify \sphinxfixclines, it works fine and is + % useful in standard style + no vline (only hlines and clines); + % besides, only one of vline or novline style macro is executed +}% + +% default is the standard style +\def\sphinxthistablewithglobalstyle{\sphinxthistablewithstandardstyle} + +\ifspx@opt@booktabs + \RequirePackage{booktabs} + \def\sphinxthistablewithglobalstyle{\sphinxthistablewithbooktabsstyle} +\fi +\ifspx@opt@borderless + \def\sphinxthistablewithglobalstyle{\sphinxthistablewithborderlessstyle} +\fi +% colorrows appends to the current globalstyle (standard, booktabs, or borderless) +\ifspx@opt@colorrows % let the globalstyle trigger the colorrows style on top of it + \expandafter\def\expandafter\sphinxthistablewithglobalstyle\expandafter + {\sphinxthistablewithglobalstyle + \sphinxthistablewithcolorrowsstyle + } +\fi + + +\endinput diff --git a/build/latex/sphinxmanual.cls b/build/latex/sphinxmanual.cls new file mode 100644 index 0000000..2e4b30d --- /dev/null +++ b/build/latex/sphinxmanual.cls @@ -0,0 +1,128 @@ +% +% sphinxmanual.cls for Sphinx (https://www.sphinx-doc.org/) +% + +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{sphinxmanual}[2019/12/01 v2.3.0 Document class (Sphinx manual)] + +% chapters starting at odd pages (overridden by 'openany' document option) +\PassOptionsToClass{openright}{\sphinxdocclass} + +% 'oneside' option overriding the 'twoside' default +\newif\if@oneside +\DeclareOption{oneside}{\@onesidetrue} +% Pass remaining document options to the parent class. +\DeclareOption*{\PassOptionsToClass{\CurrentOption}{\sphinxdocclass}} +\ProcessOptions\relax + +% Defaults two-side document +\if@oneside +% nothing to do (oneside is the default) +\else +\PassOptionsToClass{twoside}{\sphinxdocclass} +\fi + +\LoadClass{\sphinxdocclass} + +% Set some sane defaults for section numbering depth and TOC depth. You can +% reset these counters in your preamble. +% +\setcounter{secnumdepth}{2} +\setcounter{tocdepth}{1} + +% Adapt \and command to the flushright context of \sphinxmaketitle, to +% avoid ragged line endings if author names do not fit all on one single line +\DeclareRobustCommand{\and}{% + \end{tabular}\kern-\tabcolsep + \allowbreak + \hskip\dimexpr1em+\tabcolsep\@plus.17fil\begin{tabular}[t]{c}% +}% +% If it is desired that each author name be on its own line, use in preamble: +%\DeclareRobustCommand{\and}{% +% \end{tabular}\kern-\tabcolsep\\\begin{tabular}[t]{c}% +%}% +% Change the title page to look a bit better, and fit in with the fncychap +% ``Bjarne'' style a bit better. +% +\newcommand{\sphinxmaketitle}{% + \let\sphinxrestorepageanchorsetting\relax + \ifHy@pageanchor\def\sphinxrestorepageanchorsetting{\Hy@pageanchortrue}\fi + \hypersetup{pageanchor=false}% avoid duplicate destination warnings + \begin{titlepage}% + \let\footnotesize\small + \let\footnoterule\relax + \noindent\rule{\textwidth}{1pt}\par + \begingroup % for PDF information dictionary + \def\endgraf{ }\def\and{\& }% + \pdfstringdefDisableCommands{\def\\{, }}% overwrite hyperref setup + \hypersetup{pdfauthor={\@author}, pdftitle={\@title}}% + \endgroup + \begin{flushright}% + \sphinxlogo + \py@HeaderFamily + {\Huge \@title \par} + {\itshape\LARGE \py@release\releaseinfo \par} + \vfill + {\LARGE + \begin{tabular}[t]{c} + \@author + \end{tabular}\kern-\tabcolsep + \par} + \vfill\vfill + {\large + \@date \par + \vfill + \py@authoraddress \par + }% + \end{flushright}%\par + \@thanks + \end{titlepage}% + \setcounter{footnote}{0}% + \let\thanks\relax\let\maketitle\relax + %\gdef\@thanks{}\gdef\@author{}\gdef\@title{} + \clearpage + \ifdefined\sphinxbackoftitlepage\sphinxbackoftitlepage\fi + \if@openright\cleardoublepage\else\clearpage\fi + \sphinxrestorepageanchorsetting +} + +\newcommand{\sphinxtableofcontents}{% + \pagenumbering{roman}% + \begingroup + \parskip \z@skip + \sphinxtableofcontentshook + \tableofcontents + \endgroup + % before resetting page counter, let's do the right thing. + \if@openright\cleardoublepage\else\clearpage\fi + \pagenumbering{arabic}% +} + +% This is needed to get the width of the section # area wide enough in the +% library reference. Doing it here keeps it the same for all the manuals. +% +\newcommand{\sphinxtableofcontentshook}{% + \renewcommand*\l@section{\@dottedtocline{1}{1.5em}{2.6em}}% + \renewcommand*\l@subsection{\@dottedtocline{2}{4.1em}{3.5em}}% +} + +% Fix the bibliography environment to add an entry to the Table of +% Contents. +% For a report document class this environment is a chapter. +% +\newenvironment{sphinxthebibliography}[1]{% + \if@openright\cleardoublepage\else\clearpage\fi + % \phantomsection % not needed here since TeXLive 2010's hyperref + \begin{thebibliography}{#1}% + \addcontentsline{toc}{chapter}{\bibname}}{\end{thebibliography}} + +% Same for the indices. +% The memoir class already does this, so we don't duplicate it in that case. +% +\@ifclassloaded{memoir} + {\newenvironment{sphinxtheindex}{\begin{theindex}}{\end{theindex}}} + {\newenvironment{sphinxtheindex}{% + \if@openright\cleardoublepage\else\clearpage\fi + \phantomsection % needed as no chapter, section, ... created + \begin{theindex}% + \addcontentsline{toc}{chapter}{\indexname}}{\end{theindex}}} diff --git a/build/latex/sphinxmessages.sty b/build/latex/sphinxmessages.sty new file mode 100644 index 0000000..68ebffa --- /dev/null +++ b/build/latex/sphinxmessages.sty @@ -0,0 +1,21 @@ +% +% sphinxmessages.sty +% +% message resources for Sphinx +% +\ProvidesPackage{sphinxmessages}[2019/01/04 v2.0 Localized LaTeX macros (Sphinx team)] + +\renewcommand{\literalblockcontinuedname}{continued from previous page} +\renewcommand{\literalblockcontinuesname}{continues on next page} +\renewcommand{\sphinxnonalphabeticalgroupname}{Non\sphinxhyphen{}alphabetical} +\renewcommand{\sphinxsymbolsname}{Symbols} +\renewcommand{\sphinxnumbersname}{Numbers} +\def\pageautorefname{page} + +\addto\captionsenglish{\renewcommand{\figurename}{Fig.\@{} }} +\def\fnum@figure{\figurename\thefigure{}} + +\addto\captionsenglish{\renewcommand{\tablename}{Table }} +\def\fnum@table{\tablename\thetable{}} + +\addto\captionsenglish{\renewcommand{\literalblockname}{Listing}} \ No newline at end of file diff --git a/build/latex/sphinxoptionsgeometry.sty b/build/latex/sphinxoptionsgeometry.sty new file mode 100644 index 0000000..af5a804 --- /dev/null +++ b/build/latex/sphinxoptionsgeometry.sty @@ -0,0 +1,54 @@ +%% OPTIONS FOR GEOMETRY +% +% change this info string if making any custom modification +\ProvidesFile{sphinxoptionsgeometry.sty}[2021/01/27 geometry] + +% geometry +\ifx\kanjiskip\@undefined + \PassOptionsToPackage{% + hmargin={\unexpanded{\spx@opt@hmargin}},% + vmargin={\unexpanded{\spx@opt@vmargin}},% + marginpar=\unexpanded{\spx@opt@marginpar}} + {geometry} +\else + % set text width for Japanese documents to be integer multiple of 1zw + % and text height to be integer multiple of \baselineskip + % the execution is delayed to \sphinxsetup then geometry.sty + \normalsize\normalfont + \newcommand*\sphinxtextwidthja[1]{% + \if@twocolumn\tw@\fi + \dimexpr + \numexpr\dimexpr\paperwidth-\tw@\dimexpr#1\relax\relax/ + \dimexpr\if@twocolumn\tw@\else\@ne\fi zw\relax + zw\relax}% + \newcommand*\sphinxmarginparwidthja[1]{% + \dimexpr\numexpr\dimexpr#1\relax/\dimexpr1zw\relax zw\relax}% + \newcommand*\sphinxtextlinesja[1]{% + \numexpr\@ne+\dimexpr\paperheight-\topskip-\tw@\dimexpr#1\relax\relax/ + \baselineskip\relax}% + \ifx\@jsc@uplatextrue\@undefined\else + % the way we found in order for the papersize special written by + % geometry in the dvi file to be correct in case of jsbook class + \ifnum\mag=\@m\else % do nothing special if nomag class option or 10pt + \PassOptionsToPackage{truedimen}{geometry}% + \fi + \fi + \PassOptionsToPackage{% + hmarginratio={1:1},% + textwidth=\unexpanded{\sphinxtextwidthja{\spx@opt@hmargin}},% + vmarginratio={1:1},% + lines=\unexpanded{\sphinxtextlinesja{\spx@opt@vmargin}},% + marginpar=\unexpanded{\sphinxmarginparwidthja{\spx@opt@marginpar}},% + footskip=2\baselineskip,% + }{geometry}% + \AtBeginDocument + {% update a dimension used by the jsclasses + \ifx\@jsc@uplatextrue\@undefined\else\fullwidth\textwidth\fi + % for some reason, jreport normalizes all dimensions with \@settopoint + \@ifclassloaded{jreport} + {\@settopoint\textwidth\@settopoint\textheight\@settopoint\marginparwidth} + {}% <-- "false" clause of \@ifclassloaded + }% +\fi + +\endinput diff --git a/build/latex/sphinxoptionshyperref.sty b/build/latex/sphinxoptionshyperref.sty new file mode 100644 index 0000000..b88f108 --- /dev/null +++ b/build/latex/sphinxoptionshyperref.sty @@ -0,0 +1,35 @@ +%% Bookmarks and hyperlinks +% +% change this info string if making any custom modification +\ProvidesFile{sphinxoptionshyperref.sty}[2021/01/27 hyperref] + +% to make pdf with correct encoded bookmarks in Japanese +% this should precede the hyperref package +\ifx\kanjiskip\@undefined +% for non-Japanese: make sure bookmarks are ok also with lualatex + \PassOptionsToPackage{pdfencoding=unicode}{hyperref} +\else + \RequirePackage{atbegshi} + \ifx\ucs\@undefined + \ifnum 42146=\euc"A4A2 + \AtBeginShipoutFirst{\special{pdf:tounicode EUC-UCS2}} + \else + \AtBeginShipoutFirst{\special{pdf:tounicode 90ms-RKSJ-UCS2}} + \fi + \else + \AtBeginShipoutFirst{\special{pdf:tounicode UTF8-UCS2}} + \fi +\fi + +\ifx\@jsc@uplatextrue\@undefined\else + \PassOptionsToPackage{setpagesize=false}{hyperref} +\fi + +% These options can be overridden inside 'hyperref' key +% or by later use of \hypersetup. +\PassOptionsToPackage{colorlinks,breaklinks,% + linkcolor=InnerLinkColor,filecolor=OuterLinkColor,% + menucolor=OuterLinkColor,urlcolor=OuterLinkColor,% + citecolor=InnerLinkColor}{hyperref} + +\endinput diff --git a/build/latex/sphinxpackageboxes.sty b/build/latex/sphinxpackageboxes.sty new file mode 100644 index 0000000..2345051 --- /dev/null +++ b/build/latex/sphinxpackageboxes.sty @@ -0,0 +1,827 @@ +%% COLOURED BOXES +% +% change this info string if making any custom modification +\ProvidesPackage{sphinxpackageboxes}[2024/07/01 v7.4.0 advanced colored boxes] +% 7.4.0 removes usage of some booleans "...withbackgroundcolor" and +% "...withbordercolor" as well as \spx@boxes@border dimen which was +% actually really needed nowhere. This was done in sync with changes in +% sphinx.sty, sphinxlatexadmonitions.sty and sphinxlatexliterals.sty. +% +% Optionally executes \RequirePackage for: +% +% - pict2e. Ideally we would like to use the v0.4a 2020/08/16 release of this +% package as it allows dimensional arguments to its \moveto, \lineto, etc... +% Or we could use extra package "picture". We opt for custom wrappers +% \spx@moveto, \spx@lineto, ..., working with old versions. +% +% - ellipse. This package extends pict2e with elliptical arcs. Its author +% Daan Leijen also has contributed package longfbox which is part of +% TeXLive. Had I known about it, I would perhaps have based Sphinx CSS on +% top of longfbox at least partly. But this would not have spared me all +% the work in sphinx.sty, which was a long walk until 6.2.0 version. +% Besides I don't need the breakable boxes from longfbox, as Sphinx has +% its own rather advanced layer on top of framed. I would need to check if +% some thorny color issues solved by Sphinx (and not by tcolorbox) at page +% breaks are solved by longfbox as well. (I have not tested) + +% At 6.2.0 refactoring, we do not wait for at begin document to try to load +% pict2e. Actually since 6.0.0 the default is for code-blocks to use +% rounded boxes, and the only reason since then to wait "at begin document" +% was to check if user had reverted that default and in fact pict2e was not +% needed. But with \sphinxbox, we can not know for sure even in that case +% that pict2e is not needed. And even back then it would have been possible +% to user to try to employ \sphinxsetup via raw directive in document body +% and require some rounded corners (which was thus impossible to satisfy). +% Time to be much simpler and attempt unconditionally to load pict2e +% immediately. This will also have advantage that we can use +% \@ifpackageloaded{pict2e} and not have to query and save its setting later +% at begin document. +\IfFileExists{pict2e.sty} + {\RequirePackage{pict2e}} + {\PackageWarningNoLine{sphinx}{% + The package pict2e is required for rounded boxes.\MessageBreak + It does not seem to be available on your system.\MessageBreak + Options for setting radii will be ignored% + }% + % Formerly a \sphinxbuildwarning was issued but if we did that now it + % would mean that the produced PDF will always have a red banner near its + % end about pict2e not being available if indeed it is not available, even + % if user has reverted the default and dropped rounded corners. Formerly + % the serious warning was done after having checked at begin document that + % indeed a rounded corner option had been used. As we drop the check now, + % let's be more discrete and simply duplicate the earlier warning to make + % it visible near end of compilation log and console output. + \AtEndDocument{\PackageWarningNoLine{sphinx}{% + The package pict2e is required for rounded boxes.\MessageBreak + As it does not seem to be available on your system,\MessageBreak + options setting radii have all been ignored}}% + }% + +\IfFileExists{ellipse.sty} + {\RequirePackage{ellipse}} + {\PackageWarningNoLine{sphinx}{% + The package ellipse is required for elliptical corners.\MessageBreak + It does not seem to be available on your system.\MessageBreak + All non-straight corners will use circle arcs.% + }% + \AtEndDocument{\PackageWarningNoLine{sphinx}{% + The package ellipse is required for elliptical corners.\MessageBreak + As it does not seem to be available on your system,\MessageBreak + all non-straight corners have used circle arcs.}}% + }% + +% The pict2e release v0.4b of 2020/09/30 does not allocate scratch dimen +% register \@tempdimd which ellipse package uses. Thus ellipse package is +% broken since (written on March 20, 2023). Simply allocate the register +% ourself to fix that, pending some upstream fix. +\@ifpackageloaded{ellipse}{\ifdefined\@tempdimd\else\newdimen\@tempdimd\fi}{} + +% Provides box registers \spx@tempboxa, \spx@tempboxb usable in other places +\newbox\spx@tempboxa +\newbox\spx@tempboxb + +%%%%%%%%%%%%%%%% +% Internal registers, conditionals, colors to be configured by each caller +% via a preliminary "setup" call +\newif\ifspx@boxes@withshadow +\newif\ifspx@boxes@insetshadow +%%% \newif\ifspx@boxes@withbackgroundcolor % removed at 7.4.0 +\newif\ifspx@boxes@withshadowcolor +%%% \newif\ifspx@boxes@withbordercolor % removed at 7.4.0 +\newif\ifspx@boxes@shadowinbbox +% +\newdimen\spx@boxes@border@top +\newdimen\spx@boxes@border@right +\newdimen\spx@boxes@border@bottom +\newdimen\spx@boxes@border@left +% +\newdimen\spx@boxes@padding@top +\newdimen\spx@boxes@padding@right +\newdimen\spx@boxes@padding@bottom +\newdimen\spx@boxes@padding@left +% +\newdimen\spx@boxes@shadow@xoffset +\newdimen\spx@boxes@shadow@yoffset +% +\newdimen\spx@boxes@radius@topleft@x +\newdimen\spx@boxes@radius@topright@x +\newdimen\spx@boxes@radius@bottomright@x +\newdimen\spx@boxes@radius@bottomleft@x +\newdimen\spx@boxes@radius@topleft@y +\newdimen\spx@boxes@radius@topright@y +\newdimen\spx@boxes@radius@bottomright@y +\newdimen\spx@boxes@radius@bottomleft@y +% +% These colors will be set to colors defined appropriately by caller of +% \spx@boxes@fcolorbox@setup macro +% spx@boxes@bordercolor +% spx@boxes@backgroundcolor +% spx@boxes@shadowcolor +% spx@boxes@textcolor + +%%%%%%%%%%%%%%%% +% "setup" macro +% +% It must be called prior to \spx@boxes@fcolorbox for parameters of the latter +% to be initialized. +% +% It also prepares \spx@boxes@fcolorbox to expand to one of +% \spx@boxes@fcolorbox@rectangle or \spx@boxes@fcolorbox@rounded depending on +% the configuration and availability of the pict2e package. +% +% The #1 is one of: pre, topic, warning, danger, etc.... +% +% We delay until here the parsing of radii options to extract x and y +% components. +\def\spx@boxes@setradii#1 #2 #3\@nnil#4#5{% + #4\dimexpr#1\relax + #5\dimexpr#2\relax + \ifdim#5=-\maxdimen#5#4\fi + % if one of them is zero or negative set both to zero + \ifdim#4>\z@\else#4\z@#5\z@\fi + \ifdim#5>\z@\else#4\z@#5\z@\fi +}% +% if ellipse.sty is not available ignore the second component of all radii +% specifications, use circle arcs with radius the x component +\@ifpackageloaded{ellipse} + {} + {\def\spx@boxes@setradii#1 #2 #3\@nnil#4#5{#4\dimexpr#1\relax #5#4}} + +% Using \dimexpr for maximal user input flexibility. +\def\spx@boxes@fcolorbox@setup#1{% + \spx@boxes@border@top \dimexpr\@nameuse{spx@#1@border@top}\relax + \spx@boxes@border@right \dimexpr\@nameuse{spx@#1@border@right}\relax + \spx@boxes@border@bottom\dimexpr\@nameuse{spx@#1@border@bottom}\relax + \spx@boxes@border@left \dimexpr\@nameuse{spx@#1@border@left}\relax + % + \spx@boxes@padding@top \dimexpr\@nameuse{spx@#1@padding@top}\relax + \spx@boxes@padding@right \dimexpr\@nameuse{spx@#1@padding@right}\relax + \spx@boxes@padding@bottom\dimexpr\@nameuse{spx@#1@padding@bottom}\relax + \spx@boxes@padding@left \dimexpr\@nameuse{spx@#1@padding@left}\relax + % + \edef\spx@temp{\csname spx@#1@radius@topleft\endcsname\space}% + \expandafter + \spx@boxes@setradii + \spx@temp + {-\maxdimen} + \@nnil + \spx@boxes@radius@topleft@x\spx@boxes@radius@topleft@y + \edef\spx@temp{\csname spx@#1@radius@topright\endcsname\space}% + \expandafter + \spx@boxes@setradii + \spx@temp + {-\maxdimen} + \@nnil + \spx@boxes@radius@topright@x\spx@boxes@radius@topright@y + \edef\spx@temp{\csname spx@#1@radius@bottomright\endcsname\space}% + \expandafter + \spx@boxes@setradii + \spx@temp + {-\maxdimen} + \@nnil + \spx@boxes@radius@bottomright@x\spx@boxes@radius@bottomright@y + \edef\spx@temp{\csname spx@#1@radius@bottomleft\endcsname\space}% + \expandafter + \spx@boxes@setradii + \spx@temp + {-\maxdimen} + \@nnil + \spx@boxes@radius@bottomleft@x\spx@boxes@radius@bottomleft@y + % + \@nameuse{ifspx@#1@withshadow}% + \spx@boxes@withshadowtrue + \spx@boxes@shadow@xoffset \dimexpr\@nameuse{spx@#1@shadow@xoffset}\relax + \spx@boxes@shadow@yoffset \dimexpr\@nameuse{spx@#1@shadow@yoffset}\relax + \else + \spx@boxes@withshadowfalse + \fi + % not nesting in previous to avoid TeX conditional subtleties + \@nameuse{ifspx@#1@insetshadow}% + \spx@boxes@insetshadowtrue + \else + \spx@boxes@insetshadowfalse + \fi + % + \sphinxcolorlet{spx@boxes@bordercolor}{sphinx#1BorderColor}% + % + \sphinxcolorlet{spx@boxes@backgroundcolor}{sphinx#1BgColor}% + % + \@nameuse{ifspx@#1@withshadowcolor}% + \spx@boxes@withshadowcolortrue + \sphinxcolorlet{spx@boxes@shadowcolor}{sphinx#1ShadowColor}% + \else + \spx@boxes@withshadowcolorfalse + \fi + % Display elements pre, topic, warning et al. by default do not include + % shadow in box (legacy; and only topic actually uses a shadow per default) + % This may be refactored still more in future, but this 6.2.0 extra helped + % reduce workload from code-blocks (pre), contents (topic) and admonitions. + % As this conditional is a priori false and should only be changed locally + % (by \sphinxbox), this line is actually superfluous. + \spx@boxes@shadowinbboxfalse + \spx@boxes@fcolorbox@setup@fcolorbox +} +\@ifpackageloaded{pict2e} +{% pict2e is available and loaded + \def\spx@boxes@fcolorbox@setup@fcolorbox{% + \if1% use rounded boxes only if needed (rx>0 iff ry>0) + \ifdim\spx@boxes@radius@topleft@x >\z@0\fi + \ifdim\spx@boxes@radius@topright@x >\z@0\fi + \ifdim\spx@boxes@radius@bottomright@x>\z@0\fi + \ifdim\spx@boxes@radius@bottomleft@x >\z@0\fi + 1\def\spx@boxes@fcolorbox{\spx@boxes@fcolorbox@rectangle}% + \else + \def\spx@boxes@fcolorbox{\spx@boxes@fcolorbox@rounded}% + \fi + }% end of definition of setup@fcolorbox in case of presence of pict2e +}% +{% pict2e could not be loaded, we must always use fcolorbox@rectangle + \def\spx@boxes@fcolorbox@setup@fcolorbox{% + \def\spx@boxes@fcolorbox{\spx@boxes@fcolorbox@rectangle}% + }% end of definition of setup@fcolorbox in case of absence of pict2e +}% end of "no pict2e" branch + +%%%%%%%%%%%%%%%% +% Support of box-decoration-break=slice +% +% 6.2.0 has renamed and moved this here from sphinxlatexliterals.sty, +% to facilitate supporting box-decoration-break=slice for all directives, +% not only code-block. +% +% It also modified when these post actions are executed, in order +% for openboth to be able to trigger usage of fcolorbox@rectangle. +% So now openbottom and opentop also take advantage of this possible +% optimization. +\def\spx@boxes@fcolorbox@setup@openbottom{% + \spx@boxes@border@bottom \z@ + \spx@boxes@radius@bottomright@x\z@ \spx@boxes@radius@bottomright@y\z@ + \spx@boxes@radius@bottomleft@x \z@ \spx@boxes@radius@bottomleft@y \z@ + \spx@boxes@fcolorbox@setup@fcolorbox +}% +\def\spx@boxes@fcolorbox@setup@opentop{% + \spx@boxes@border@top \z@ + \spx@boxes@radius@topright@x\z@ \spx@boxes@radius@topright@y\z@ + \spx@boxes@radius@topleft@x \z@ \spx@boxes@radius@topleft@y \z@ + \spx@boxes@fcolorbox@setup@fcolorbox +}% +\def\spx@boxes@fcolorbox@setup@openboth{% + \spx@boxes@border@top \z@ + \spx@boxes@border@bottom \z@ + \spx@boxes@radius@bottomright@x\z@ \spx@boxes@radius@bottomright@y\z@ + \spx@boxes@radius@bottomleft@x \z@ \spx@boxes@radius@bottomleft@y \z@ + \spx@boxes@radius@topright@x\z@ \spx@boxes@radius@topright@y\z@ + \spx@boxes@radius@topleft@x \z@ \spx@boxes@radius@topleft@y \z@ + \def\spx@boxes@fcolorbox{\spx@boxes@fcolorbox@rectangle}% +}% + +%%%%%%%%%%%%%%%% +% \sphinxbox (added at 6.2.0) +% +% For an inline box, possibly rounded. +\newcommand\sphinxbox[1][]{% #1 stands for the options, they are... optional! + % \leavevmode makes sure TeX switches to paragraph mode, which is necessary + % if this is first in a paragraph or a list element. The \sphinxAtStartPar + % mechanism also ensures this automatically, if not redefined, but not with + % lualatex as then it is by default doing nothing. + \leavevmode + \begingroup + \ifcsname spx@boxes@sphinxbox@isnested\endcsname + % nested boxes reset all box options to be as the \sphinxboxsetup + % defaults, before applying their specific options + \spx@boxes@sphinxbox@reset + \else + % top layer box, toggle the nested flag + \csname spx@boxes@sphinxbox@isnested\endcsname + \fi + % we do not use \sphinxboxsetup as it is a user command extending the + % "reset" storage + \setkeys{sphinxbox}{#1}% + \spx@boxes@fcolorbox@setup{box}% + \spx@boxes@shadowinbboxtrue% inline sphinx boxes include shadow in bbox + \ifspx@box@withtextcolor\color{sphinxboxTextColor}\fi + % + % MEMO: the fcolorbox@{rectangle,rounded} draw the contents (which here + % will be encapsulated as \box\z@) last, i.e. after shadow, background, + % and border and their color commands. The \reset@color from naked + % top-level \color commands in argument (which can not arise from Sphinx + % mark-up anyhow) would end up being placed via color.sty \aftergroup core + % mechanism in token stream after \spx@boxes@sphinxbox@a (which is the + % first \aftergroup) hence after the box contents with its unbalanced + % color pushes is shipped to PDF. So the missing color pop specials are + % inserted then in correct order at correct place (after the \endgroup at + % end of \spx@boxes@sphinxbox@a but this is not relevant) and do not end + % up causing havoc in push/pop pairs (and all this happens on same page). + % + % There is thus no reason here to go to the trouble to add an extra + % \color@begingroup/\color@endgroup or like pair to encapsulate the caught + % contents in order for the \box\z@ to contain as many color pop's as it + % has color pushes. But as this is subtle, this comment was added for + % future maintenance. Actually even if the contents were not drawn last, + % their (purely theoretical, as Sphinx mark-up can not create it) missing + % color pop's would not have caused trouble I guess as long as the color + % insertions for shadow, background, border are correctly balanced. + \setbox0\hbox\bgroup\aftergroup\spx@boxes@sphinxbox@a + \afterassignment\spx@box@TeXextras + \let\next=% +} +\def\spx@boxes@sphinxbox@a{\spx@boxes@fcolorbox{% + \ifspx@opt@box@addstrut\strut\fi\box\z@}\endgroup} + +\newcommand\newsphinxbox[2][]{% + \newcommand#2[1][]{\sphinxbox[#1,##1]}% +} +% Let's catch \renewsphinxbox[...]{\sphinxbox} which would cause \sphinxbox +% to fall into infinite looping on use. +\newcommand\renewsphinxbox[2][]{% + \in@{#2}{\sphinxbox}% + \ifin@ + \PackageWarning{sphinx}{Attempt to \string\renewsphinxbox\space + the \string\sphinxbox\space command\MessageBreak + itself. This is not allowed and will be ignored.\MessageBreak + Reported}% + \else + \renewcommand#2[1][]{\sphinxbox[#1,##1]}% + \fi +} + +%%%%%%%%%%%%%%%% +% MACROS +% +% \spx@boxes@fcolorbox expands either to \spx@boxes@fcolorbox@rectangle +% or \spx@boxes@fcolorbox@rounded depending on preliminary set-up. +% +% This is decided by the "setup" which must have been executed by the caller. +% Let's give it some (thus unneeded) default fall-back for clarity. +\def\spx@boxes@fcolorbox{\spx@boxes@fcolorbox@rectangle} +% +% A macro \spx@boxes@fcolorbox@setuphook used to be executed at start of the +% \hbox constructs (rectangle or rounded). This was used until 6.2.0 for the +% support of pre_box-decoration-break option, hence was really an internal +% non-public macro. As it is not needed anymore, with some hesitation it got +% entirely removed at 6.2.0 on the occasion of a refactoring of interactions of +% this file with sphinxlatexliterals.sty. Besides its name should have been +% rather something such as \spx@boxes@fcolorbox@atstartofhbox. +% +% After "setup", \spx@boxes@fcolorbox expands to one of: +% +% - \spx@boxes@fcolorbox@rectangle (4 padding parameters, 4 border widths, 2 shadow widths, +% and three colours: background, border and shadow; same as in CSS styling) +% +% It branches to one of: +% - \spx@boxes@fcolorbox@externalshadow +% - \spx@boxes@fcolorbox@insetshadow (same concept of "inset" as in CSS styling) +% +% - \spx@boxes@fcolorbox@rounded: rounded corners using the picture environment +% and pict2e package for its low-weight interface to PDF graphics operations + +% MEMO: we have also successfully tested usage of tcolorbox.sty (its \tcbox) but +% decided to use pict2e.sty for the following reasons: +% 1- PDF build was observed to be an order of magnitude faster, +% 2- the boxes we can do with pict2e appear to be fancy enough, +% almost matching what one can see in HTML renderings, +% 2- orders of magnitude smaller dependency (tcolorbox uses the pgf TeX +% framework), although on Ubuntu it seems texlive-pictures is +% needed which also contains the whole of pgf/TikZ... so this point +% is a bit moot... + +% For code-blocks, attachments of caption and continuation hints are done +% exactly as prior to extension of Sphinx via this package, whether the box +% has straight or rounded corners. The vertical space occupied is the same, +% if nothing else is changed (perhaps in future the title itself could be also +% rendered in a rounded box?) + +%%%%%%%% +%//// \spx@boxes@fcolorbox@rectangle +% +% This box will have the same baseline as its argument (which is typeset in +% horizontal mode). It takes into account four border widths parameters, four +% padding parameters, two shadow widths (each possibly negative), and three +% colors: background, border and shadow. Its boundary box takes into account +% border and padding. Width of shadow is taken into account if the boolean +% \ifspx@boxes@shadowinbbox is \iftrue. The "setup" sets it to \iffalse. +% Prior to 6.2.0, shadow size was included in bbox but the callers manually +% removed it by extra steps. The \sphinxbox command sets it to \iftrue after +% the "setup". +% +% It is up to the caller to take extra steps if the border and padding must go +% into margin as well (see sphinxlatexliterals.sty for how this is done in +% \spx@verb@FrameCommand). +% +% In usage as a "FrameCommand" with framed.sty, the argument will already be a +% collection of TeX boxes (and interline glues). +% +% This was designed so that the parameters configured by "setup" are +% interpreted as they would be as CSS properties in an HTML context. +\long\def\spx@boxes@fcolorbox@rectangle#1{% + \hbox\bgroup + \setbox\spx@tempboxa + \hbox{\kern\dimexpr\spx@boxes@border@left+\spx@boxes@padding@left\relax + {#1}% + \kern\dimexpr\spx@boxes@padding@right+\spx@boxes@border@right\relax}% + \ht\spx@tempboxa + \dimexpr\ht\spx@tempboxa+\spx@boxes@border@top+\spx@boxes@padding@top\relax + \dp\spx@tempboxa + \dimexpr\dp\spx@tempboxa+\spx@boxes@padding@bottom+\spx@boxes@border@bottom\relax + \ifspx@boxes@insetshadow + \expandafter\spx@boxes@fcolorbox@insetshadow + \else + \expandafter\spx@boxes@fcolorbox@externalshadow + \fi +} + +% external shadow +\def\spx@boxes@fcolorbox@externalshadow{% + % reserve space to external shadow if on left + \ifspx@boxes@withshadow + \ifspx@boxes@shadowinbbox + \ifdim\spx@boxes@shadow@xoffset<\z@\kern-\spx@boxes@shadow@xoffset\fi + \fi + \fi + % BACKGROUND + % draw background and move back to reference point + {\color{spx@boxes@backgroundcolor}% + \vrule\@height\ht\spx@tempboxa + \@depth\dp\spx@tempboxa + \@width\wd\spx@tempboxa + \kern-\wd\spx@tempboxa + }% + % BOX SHADOW + % draw shadow and move back to reference point + \ifspx@boxes@withshadow + \vbox{% + \moveright\spx@boxes@shadow@xoffset + \hbox{\lower\spx@boxes@shadow@yoffset + \vbox{\ifspx@boxes@withshadowcolor + \color{spx@boxes@shadowcolor}% + \else + % 6.2.0: guard against a manually inserted \color command in + % contents which could leak at a page break to the shadow + \normalcolor + \fi + \ifdim\spx@boxes@shadow@yoffset<\z@ + \hrule\@height-\spx@boxes@shadow@yoffset + \kern\spx@boxes@shadow@yoffset + \fi + \setbox\spx@tempboxb\hb@xt@\wd\spx@tempboxa{% + \ifdim\spx@boxes@shadow@xoffset<\z@\vrule\@width-\spx@boxes@shadow@xoffset\fi + \hss + \ifdim\spx@boxes@shadow@xoffset>\z@\vrule\@width\spx@boxes@shadow@xoffset\fi + }% + \ht\spx@tempboxb\ht\spx@tempboxa + \dp\spx@tempboxb\dp\spx@tempboxa + \box\spx@tempboxb + \ifdim\spx@boxes@shadow@yoffset>\z@ + \kern-\spx@boxes@shadow@yoffset + \hrule\@height\spx@boxes@shadow@yoffset + \fi + \kern-\dp\spx@tempboxa + }% end of \vbox, attention it will have zero depth if yoffset>0 + \kern-\wd\spx@tempboxa + \ifdim\spx@boxes@shadow@xoffset>\z@ + \kern-\spx@boxes@shadow@xoffset + \fi + }% end of \hbox, attention its depth is only yoffset if yoffset>0 + }% end of \vbox + \fi % end of shadow drawing, and we are back to horizontal reference point + % BOX BORDER + % 7.4.0 requires a set border color + \vbox{\color{spx@boxes@bordercolor}% + \hrule\@height\spx@boxes@border@top + \kern-\spx@boxes@border@top + \setbox\spx@tempboxb\hb@xt@\wd\spx@tempboxa + {\vrule\@width\spx@boxes@border@left + \hss\vrule\@width\spx@boxes@border@right + }% + \ht\spx@tempboxb\ht\spx@tempboxa + \dp\spx@tempboxb\dp\spx@tempboxa + \box\spx@tempboxb + \kern-\spx@boxes@border@bottom + \hrule\@height\spx@boxes@border@bottom + \kern-\dp\spx@tempboxa + }% attention this box has zero depth due to \hrule at bottom + % step back to horizontal reference point + \kern-\wd\spx@tempboxa + % end of border drawing + % CONTENTS + % adjust the total depth to include the bottom shadow + \ifspx@boxes@withshadow + \ifdim\spx@boxes@shadow@yoffset>\z@ + \dp\spx@tempboxa\dimexpr\dp\spx@tempboxa+\spx@boxes@shadow@yoffset\relax + \fi + \fi + \box\spx@tempboxa + % include lateral shadow in total width + \ifspx@boxes@withshadow + \ifspx@boxes@shadowinbbox + \ifdim\spx@boxes@shadow@xoffset>\z@\kern\spx@boxes@shadow@xoffset\fi + \fi + \fi + \egroup +} + +% inset shadow +% +% The parameters signs are interpreted as in CSS styling. +\def\spx@boxes@fcolorbox@insetshadow{% + % BACKGROUND + % draw background and move back to reference point + % 7.4.0 always assumes a background color + {\color{spx@boxes@backgroundcolor}% + \vrule\@height\ht\spx@tempboxa + \@depth\dp\spx@tempboxa + \@width\wd\spx@tempboxa + \kern-\wd\spx@tempboxa + }% + % BOX SHADOW + % draw shadow and move back to reference point + \ifspx@boxes@withshadow + \hbox{\vbox{\ifspx@boxes@withshadowcolor + \color{spx@boxes@shadowcolor}% + \else + % 6.2.0: guard against a manually inserted \color command in + % contents which could leak at a page break to the shadow + \normalcolor + \fi +% NOTA BENE +% We deliberately draw shadow partially under an area later covered by frame +% with the idea to avoid anti-aliasing problems but in fact this may be a bad +% idea with border is thin. +% This may need some extra testing with PDF viewers... reports welcome! + \ifdim\spx@boxes@shadow@yoffset>\z@ + \hrule\@height\dimexpr\spx@boxes@border@top+\spx@boxes@shadow@yoffset\relax + \kern-\spx@boxes@shadow@yoffset + \kern-\spx@boxes@border@top + \fi + \setbox\spx@tempboxb\hb@xt@\wd\spx@tempboxa{% + \ifdim\spx@boxes@shadow@xoffset>\z@ + \vrule\@width\dimexpr\spx@boxes@border@left+\spx@boxes@shadow@xoffset\relax\fi + \hss + \ifdim\spx@boxes@shadow@xoffset<\z@ + \vrule\@width\dimexpr-\spx@boxes@shadow@xoffset+\spx@boxes@border@right\relax\fi + }% + \ht\spx@tempboxb\ht\spx@tempboxa + \dp\spx@tempboxb\dp\spx@tempboxa + \box\spx@tempboxb + \ifdim\spx@boxes@shadow@yoffset<\z@ + \kern\spx@boxes@shadow@yoffset + \kern-\spx@boxes@border@bottom + \hrule\@height\dimexpr-\spx@boxes@shadow@yoffset+\spx@boxes@border@bottom\relax + \fi + \kern-\dp\spx@tempboxa + }% end of \vbox, attention it will have zero depth if yoffset<0 + \kern-\wd\spx@tempboxa + }% end of \hbox, attention its depth is only |yoffset| if yoffset<0 + \fi % end of inset shadow drawing, and we are back to horizontal reference point + % BOX BORDER + % 7.4.0 requires a set border color + \vbox{\color{spx@boxes@bordercolor}% + \hrule\@height\spx@boxes@border@top + \kern-\spx@boxes@border@top + \setbox\spx@tempboxb\hb@xt@\wd\spx@tempboxa + {\vrule\@width\spx@boxes@border@left + \hss\vrule\@width\spx@boxes@border@right + }% + \ht\spx@tempboxb\ht\spx@tempboxa + \dp\spx@tempboxb\dp\spx@tempboxa + \box\spx@tempboxb + \kern-\spx@boxes@border@bottom + \hrule\@height\spx@boxes@border@bottom + \kern-\dp\spx@tempboxa + }% attention this box has zero depth due to \hrule at bottom + % step back to horizontal reference point + \kern-\wd\spx@tempboxa + % end of border drawing + % CONTENTS + \box\spx@tempboxa + \egroup +} + +% let's abort input if pict2e package could not be loaded. +% To be extra safe we also alias @rounded to @rectangle but +% a priori the architecture is done so that @rounded will never +% be called in that case by other Sphinx LaTeX components. +\@ifpackageloaded{pict2e} + {} + {\def\spx@boxes@fcolorbox@rounded{\spx@boxes@fcolorbox@rectangle}% + \endinput + } + +% we proceed now in the context of pict2e being available and loaded +% (TeX being a macro-expansion based language it would have +% swallowed all the coming definitions even if pict2e +% had in fact not been loaded... but we aborted the input above) +%%%%%%%% +%//// \spx@boxes@fcolorbox@rounded +% +% Prior to 6.2.0, a constant border-width was applied as the border was +% obtained as a \strokepath. This allowed 4 distinct radii but not to vary the +% border widths. Now the border is drawn by two \fillpath operation, the first +% one filling up to external border, the second one actually filling for the +% background paradoxically on top of it, up to internal border path. +% +% This 6.2.0 abandonment of \strokepath allowed great simplification in +% supporting opentop, openbottom and openboth situations, and it can +% allow automatic support of openleft and openright analogs. +% +% And 6.2.0 also implements elliptical arcs thanks to ellipse package, +% which extends pict2e. + +% Currently, inset shadow is not supported. +% +% Prior to 6.2.0 an inset shadow triggered the rectangle variant, so we never +% ended here, but now it is simply ignored. This change does not appear to me +% to be breaking, as it changes output only for conf.py's specifying both +% rounded corners and an inset shadow and the documentation said it was +% incompatible. + +% wrappers for pict2e usage if old +% Better not to copy over 2020 pict2e definitions in case +% something internal changes +% However our wrappers will work ONLY with dimensional inputs +% No need to pre-expand the arguments +% Braces in case the expression uses parentheses +\def\spx@moveto(#1,#2){\moveto({\strip@pt\dimexpr#1\relax},{\strip@pt\dimexpr#2\relax})} +\def\spx@lineto(#1,#2){\lineto({\strip@pt\dimexpr#1\relax},{\strip@pt\dimexpr#2\relax})} +% attention here the [N] becomes mandatory +% \circlearc[]{}{}{}{}{} +\def\spx@circlearc[#1]#2#3#4%#5#6 + {\circlearc[#1]{\strip@pt\dimexpr#2\relax}% + {\strip@pt\dimexpr#3\relax}% + {\strip@pt\dimexpr#4\relax}% + } +% attention here too the [N] becomes mandatory +% the core path macro of ellipse.sty. Thanks to Daan Leijen, author of this +% package. +% \elliparc []{}{}{}{}{}{} +% maybe this wrapper is unneeded but I don't have real time to check +\def\spx@elliparc[#1]#2#3#4#5%#6#7 + {\elliparc[#1]{\strip@pt\dimexpr#2\relax}% + {\strip@pt\dimexpr#3\relax}% + {\strip@pt\dimexpr#4\relax}% + {\strip@pt\dimexpr#5\relax}% + } + +% Macro whose execution prepares a path to be either stroked or filled +% Only fill operation is used at 6.2.0. The radii are given by the set box +% parameters, but the width and height are in \spx@width and \spx@height. A +% \put command will be used for appropriate shifts. +% 6.2.0 adds elliptical corners! +% But I feel perhaps I need to think about how x-radius and y-radius should +% interact with border-width. So consider output WIP for time being. +\def\spx@boxes@border@defpath{% + \spx@moveto(\spx@boxes@radius@bottomleft@x,\z@)% our \spx@moveto is a bit rigid + % and we must use \z@ not 0 here + \spx@lineto(\spx@width-\spx@boxes@radius@bottomright@x,\z@)% + % x and y radii are either both positive or both zero + % probably not needed to actually guard against the latter case, + % let's do it nevertheless + \ifdim\spx@boxes@radius@bottomright@x>\z@ + \ifdim\spx@boxes@radius@bottomright@x=\spx@boxes@radius@bottomright@y + \spx@circlearc[2]{\spx@width-\spx@boxes@radius@bottomright@x}% + {\spx@boxes@radius@bottomright@y}% + {\spx@boxes@radius@bottomright@x}{-90}{0}% + \else + \spx@elliparc[2]{\spx@width-\spx@boxes@radius@bottomright@x}% + {\spx@boxes@radius@bottomright@y}% + {\spx@boxes@radius@bottomright@x} + {\spx@boxes@radius@bottomright@y}{-90}{0}% + \fi + \fi + \spx@lineto(\spx@width,% + \spx@height-\spx@boxes@radius@topright@y)% + \ifdim\spx@boxes@radius@topright@x>\z@ + \ifdim\spx@boxes@radius@topright@x=\spx@boxes@radius@topright@y + \spx@circlearc[2]{\spx@width-\spx@boxes@radius@topright@x} + {\spx@height-\spx@boxes@radius@topright@y}% + {\spx@boxes@radius@topright@x}{0}{90}% + \else + \spx@elliparc[2]{\spx@width-\spx@boxes@radius@topright@x} + {\spx@height-\spx@boxes@radius@topright@y}% + {\spx@boxes@radius@topright@x}% + {\spx@boxes@radius@topright@y}{0}{90}% + \fi + \fi + \spx@lineto(\spx@boxes@radius@topleft@x,\spx@height)% + \ifdim\spx@boxes@radius@topleft@x>\z@ + \ifdim\spx@boxes@radius@topleft@x=\spx@boxes@radius@topleft@y + \spx@circlearc[2]{\spx@boxes@radius@topleft@x}% + {\spx@height-\spx@boxes@radius@topleft@y}% + {\spx@boxes@radius@topleft@x}{90}{180}% + \else + \spx@elliparc[2]{\spx@boxes@radius@topleft@x}% + {\spx@height-\spx@boxes@radius@topleft@y}% + {\spx@boxes@radius@topleft@x}% + {\spx@boxes@radius@topleft@y}{90}{180}% + \fi + \fi + \spx@lineto(\z@,\spx@boxes@radius@bottomleft@y)% + \ifdim\spx@boxes@radius@bottomleft@x>\z@ + \ifdim\spx@boxes@radius@bottomleft@x=\spx@boxes@radius@bottomleft@y + \spx@circlearc[2]{\spx@boxes@radius@bottomleft@x}% + {\spx@boxes@radius@bottomleft@y}% + {\spx@boxes@radius@bottomleft@x}{180}{270}% + \else + \spx@elliparc[2]{\spx@boxes@radius@bottomleft@x}% + {\spx@boxes@radius@bottomleft@y}% + {\spx@boxes@radius@bottomleft@x}% + {\spx@boxes@radius@bottomleft@y}{180}{270}% + \fi + \fi +}% end of definition of \spx@boxes@border@defpath + +% The customization of the various parameters must have been done via an +% appropriate call to \spx@boxes@fcolorbox@setup, which will have set up +% \spx@boxes@fcolorbox to expand to \spx@boxes@fcolorbox@rounded, and will +% have set its various parameters. +% +\long\def\spx@boxes@fcolorbox@rounded #1{% + \hbox{% + \ifspx@boxes@withshadow + \ifspx@boxes@insetshadow + \spx@boxes@withshadowfalse % ignore inset shadow + \fi + \fi + % reserve space to external shadow if on left + \ifspx@boxes@withshadow + \ifspx@boxes@shadowinbbox + \ifdim\spx@boxes@shadow@xoffset<\z@\kern-\spx@boxes@shadow@xoffset\fi + \fi + \fi + \vbox{% + % adjust vertical bbox + \ifspx@boxes@withshadow + \ifdim\spx@boxes@shadow@yoffset<\z@ + \kern-\spx@boxes@shadow@yoffset + \fi + \fi + \setlength{\unitlength}{1pt}% + \setbox\spx@tempboxa + \hbox{\kern\dimexpr\spx@boxes@border@left+\spx@boxes@padding@left\relax + {#1}% + \kern\dimexpr\spx@boxes@padding@right+\spx@boxes@border@right\relax}% + \ht\spx@tempboxa + \dimexpr\ht\spx@tempboxa+\spx@boxes@border@top+\spx@boxes@padding@top\relax + \dp\spx@tempboxa + \dimexpr\dp\spx@tempboxa+\spx@boxes@padding@bottom+\spx@boxes@border@bottom\relax + \edef\spx@width{\number\wd\spx@tempboxa sp}% + \edef\spx@height{\number\dimexpr\ht\spx@tempboxa+\dp\spx@tempboxa sp}% + \hbox{% + \begin{picture}% + % \strip@pt\dimexpr to work around "old" LaTeX picture limitation + % (we could use the "picture" package, this would add another dependency) + (\strip@pt\dimexpr\spx@width\relax,\strip@pt\dimexpr\spx@height\relax)% + \spx@boxes@border@defpath + \ifspx@boxes@withshadow + \ifspx@boxes@withshadowcolor + \color{spx@boxes@shadowcolor}% + \else + % 6.2.0: here and elsewhere guard against a manually inserted + % \color command in contents which could leak to the shadow + % to the shadow + \normalcolor + \fi + \put(\strip@pt\spx@boxes@shadow@xoffset,% + \strip@pt\dimexpr-\spx@boxes@shadow@yoffset\relax) + {\fillpath}% + \fi + \spx@boxes@border@defpath% must be redone after each \fillpath! (even if + % was in a \put) + % 7.4.0 requires a set border color + \color{spx@boxes@bordercolor}% + \fillpath + % and backgroundcolor command + \color{spx@boxes@backgroundcolor}% + \edef\spx@width{\number\dimexpr\spx@width-\spx@boxes@border@left + -\spx@boxes@border@right sp}% + \edef\spx@height{\number\dimexpr\spx@height-\spx@boxes@border@top + -\spx@boxes@border@bottom sp}% + % redefine a path (in relative coordinates) matching the area delimited + % by the internal borders + \spx@boxes@border@defpath + % use \put to shift, and fill it with background color + \put(\strip@pt\spx@boxes@border@left,\strip@pt\spx@boxes@border@bottom) + {\fillpath}% + \end{picture}}% end of picture \hbox in \vbox + % back-up vertically for outputting the contents + \kern-\dimexpr\ht\spx@tempboxa+\dp\spx@tempboxa\relax + % adjust vertical bbox + \ifspx@boxes@withshadow + \ifdim\spx@boxes@shadow@yoffset>\z@ + \dp\spx@tempboxa\dimexpr\dp\spx@tempboxa+\spx@boxes@shadow@yoffset\relax + \fi + \fi + % inhibit TeX's "line skip" adjustment when piling up hboxes in a vbox + \nointerlineskip + \box\spx@tempboxa + }% end of \vbox + % include lateral shadow in total width + \ifspx@boxes@withshadow + \ifspx@boxes@shadowinbbox + \ifdim\spx@boxes@shadow@xoffset>\z@\kern\spx@boxes@shadow@xoffset\fi + \fi + \fi + }% end of \hbox +}% + + +\endinput diff --git a/build/latex/sphinxpackagecyrillic.sty b/build/latex/sphinxpackagecyrillic.sty new file mode 100644 index 0000000..9aa62fc --- /dev/null +++ b/build/latex/sphinxpackagecyrillic.sty @@ -0,0 +1,55 @@ +%% CYRILLIC IN NON-CYRILLIC DOCUMENTS (pdflatex only) +% +% refs: https://tex.stackexchange.com/q/460271/ +\ProvidesPackage{sphinxpackagecyrillic}% + [2018/11/21 v2.0 support for Cyrillic in non-Cyrillic documents] +\RequirePackage{kvoptions} +\SetupKeyvalOptions{prefix=spx@cyropt@} % use \spx@cyropt@ prefix +\DeclareBoolOption[false]{Xtwo} +\DeclareBoolOption[false]{TtwoA} +\DeclareDefaultOption{\@unknownoptionerror} +\ProcessLocalKeyvalOptions* % ignore class options + +\ifspx@cyropt@Xtwo +% original code by tex.sx user egreg (updated 2019/10/28): +% https://tex.stackexchange.com/a/460325/ +% 159 Cyrillic glyphs as available in X2 TeX 8bit font encoding +% This assumes inputenc loaded with utf8 option, or LaTeX release +% as recent as 2018/04/01 which does it automatically. + \@tfor\next:=% + {Ё}{Ђ}{Є}{Ѕ}{І}{Ј}{Љ}{Њ}{Ћ}{Ў}{Џ}{А}{Б}{В}{Г}{Д}{Е}{Ж}{З}{И}{Й}% + {К}{Л}{М}{Н}{О}{П}{Р}{С}{Т}{У}{Ф}{Х}{Ц}{Ч}{Ш}{Щ}{Ъ}{Ы}{Ь}{Э}{Ю}% + {Я}{а}{б}{в}{г}{д}{е}{ж}{з}{и}{й}{к}{л}{м}{н}{о}{п}{р}{с}{т}{у}% + {ф}{х}{ц}{ч}{ш}{щ}{ъ}{ы}{ь}{э}{ю}{я}{ё}{ђ}{є}{ѕ}{і}{ј}{љ}{њ}{ћ}% + {ў}{џ}{Ѣ}{ѣ}{Ѫ}{ѫ}{Ѵ}{ѵ}{Ґ}{ґ}{Ғ}{ғ}{Ҕ}{ҕ}{Җ}{җ}{Ҙ}{ҙ}{Қ}{қ}{Ҝ}{ҝ}% + {Ҟ}{ҟ}{Ҡ}{ҡ}{Ң}{ң}{Ҥ}{ҥ}{Ҧ}{ҧ}{Ҩ}{ҩ}{Ҫ}{ҫ}{Ҭ}{ҭ}{Ү}{ү}{Ұ}{ұ}{Ҳ}{ҳ}% + {Ҵ}{ҵ}{Ҷ}{ҷ}{Ҹ}{ҹ}{Һ}{һ}{Ҽ}{ҽ}{Ҿ}{ҿ}{Ӏ}{Ӄ}{ӄ}{Ӆ}{ӆ}{Ӈ}{ӈ}{Ӌ}{ӌ}% + {Ӎ}{ӎ}{Ӕ}{ӕ}{Ә}{ә}{Ӡ}{ӡ}{Ө}{ө}\do + {% + \begingroup\def\IeC{\protect\DeclareTextSymbolDefault}% + \protected@edef\@temp{\endgroup + \@ifl@t@r{\fmtversion}{2019/10/01}{\csname u8:\next\endcsname}{\next}}% + \@temp{X2}% + }% +\else +\ifspx@cyropt@TtwoA +% original code by tex.sx user jfbu: +% https://tex.stackexchange.com/a/460305/ +% 63*2+1=127 Cyrillic glyphs as found in T2A 8bit TeX font-encoding + \@tfor\@tempa:=% + {ae}{a}{b}{chrdsc}{chvcrs}{ch}{c}{dje}{dze}{dzhe}{d}{erev}{ery}{e}% + {f}{ghcrs}{gup}{g}{hdsc}{hrdsn}{h}{ie}{ii}{ishrt}{i}{je}% + {kbeak}{kdsc}{kvcrs}{k}{lje}{l}{m}{ndsc}{ng}{nje}{n}{otld}{o}{p}{r}% + {schwa}{sdsc}{sftsn}{shch}{shha}{sh}{s}{tshe}{t}{ushrt}{u}{v}% + {ya}{yhcrs}{yi}{yo}{yu}{y}{zdsc}{zhdsc}{zh}{z}\do + {% + \expandafter\DeclareTextSymbolDefault\expandafter + {\csname cyr\@tempa\endcsname}{T2A}% + \expandafter\uppercase\expandafter{\expandafter + \def\expandafter\@tempa\expandafter{\@tempa}}% + \expandafter\DeclareTextSymbolDefault\expandafter + {\csname CYR\@tempa\endcsname}{T2A}% + }% + \DeclareTextSymbolDefault{\CYRpalochka}{T2A}% +\fi\fi +\endinput diff --git a/build/latex/sphinxpackagefootnote.sty b/build/latex/sphinxpackagefootnote.sty new file mode 100644 index 0000000..7f2e291 --- /dev/null +++ b/build/latex/sphinxpackagefootnote.sty @@ -0,0 +1,434 @@ +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{sphinxpackagefootnote}% + [2024/05/17 v7.3.x Sphinx custom footnotehyper package (Sphinx team)] +%% +%% Package: sphinxpackagefootnote +%% Version: based on footnotehyper.sty 2021/02/04 v1.1d +%% https://www.ctan.org/pkg/footnotehyper +%% License: the one applying to Sphinx +%% +% Provides support for footnote mark-up from Sphinx latex writer: +% - "footnote" and "footnotetext" environments allowing verbatim material +% - "savenotes" environment for wrapping environments, such as for tables +% which have problems with LaTeX footnotes +% - hyperlinks +% +% Sphinx uses exclusively this mark-up for footnotes: +% - \begin{footnote}[N] +% - \begin{footnotetext}[N] +% - \sphinxfootnotemark[N] +% where N is a number. +% +%% Some small differences from upstream footnotehyper.sty: +%% - a tabulary compatibility layer (partial but enough for Sphinx), +%% - usage of \spx@opt@BeforeFootnote +%% - usage of \sphinxunactivateextrasandspace from sphinx.sty, +%% - \sphinxlongtablepatch +%% +%% Starting with Sphinx v4.5.0, inherited footnotehyper macros for +%% footnote/footnotetext receive some Sphinx specific extras to +%% implement "intelligent" footnote marks checking page numbers. +%% +%% All footnotes output from Sphinx are hyperlinked. With "savenotes" +%% footnotes may appear on page distinct from footnote mark, the latter +%% will indicate page number of the footnote. +\newif\iffootnotehyperparse\footnotehyperparsetrue +\DeclareOption*{\PackageWarning{sphinxpackagefootnote}{Option `\CurrentOption' is unknown}}% +\ProcessOptions\relax +\newbox\FNH@notes +\newtoks\FNH@toks % 1.1c +\newdimen\FNH@width +\let\FNH@colwidth\columnwidth +\newif\ifFNH@savingnotes +\AtBeginDocument {% + \let\FNH@latex@footnote \footnote + \let\FNH@latex@footnotetext\footnotetext + \let\FNH@H@@footnotetext \@footnotetext + \let\FNH@H@@mpfootnotetext \@mpfootnotetext + \newenvironment{savenotes} + {\FNH@savenotes\ignorespaces}{\FNH@spewnotes\ignorespacesafterend}% + \let\spewnotes \FNH@spewnotes + \let\footnote \FNH@footnote + \let\footnotetext \FNH@footnotetext + \let\endfootnote \FNH@endfntext + \let\endfootnotetext\FNH@endfntext + % always True branch taken with Sphinx + \@ifpackageloaded{hyperref} + {\ifHy@hyperfootnotes + \let\FNH@H@@footnotetext\H@@footnotetext + \let\FNH@H@@mpfootnotetext\H@@mpfootnotetext + \else + \let\FNH@hyper@fntext\FNH@nohyp@fntext + \fi}% + {\let\FNH@hyper@fntext\FNH@nohyp@fntext}% +}% +\def\FNH@hyper@fntext{\FNH@fntext\FNH@hyper@fntext@i}% +\def\FNH@nohyp@fntext{\FNH@fntext\FNH@nohyp@fntext@i}% +\def\FNH@fntext #1{% + \ifx\ifmeasuring@\@undefined + \expandafter\@secondoftwo\else\expandafter\@firstofone\fi +% these two lines modified for Sphinx (tabulary compatibility): + {\ifmeasuring@\expandafter\@gobbletwo\else\expandafter\@firstofone\fi}% + {\ifx\equation$\expandafter\@gobbletwo\fi #1}%$ +}% +\long\def\FNH@hyper@fntext@i#1{% + \global\setbox\FNH@notes\vbox + {\unvbox\FNH@notes + \FNH@startnote + \@makefntext + {\rule\z@\footnotesep\ignorespaces + \ifHy@nesting\expandafter\ltx@firstoftwo + \else\expandafter\ltx@secondoftwo + \fi + {\expandafter\hyper@@anchor\expandafter{\Hy@footnote@currentHref}{#1}}% + {\Hy@raisedlink + {\expandafter\hyper@@anchor\expandafter{\Hy@footnote@currentHref}% + {\relax}}% + \let\@currentHref\Hy@footnote@currentHref + \let\@currentlabelname\@empty + #1}% + \@finalstrut\strutbox + }% + \FNH@endnote + }% +}% +\long\def\FNH@nohyp@fntext@i#1{% + \global\setbox\FNH@notes\vbox + {\unvbox\FNH@notes + \FNH@startnote + \@makefntext{\rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}% + \FNH@endnote + }% +}% +\def\FNH@startnote{% + \hsize\FNH@colwidth + \interlinepenalty\interfootnotelinepenalty + \reset@font\footnotesize + \floatingpenalty\@MM + \@parboxrestore + \protected@edef\@currentlabel{\csname p@\@mpfn\endcsname\@thefnmark}% + \color@begingroup +}% +\def\FNH@endnote{\color@endgroup}% +\def\FNH@savenotes{% + \begingroup + \ifFNH@savingnotes\else + \FNH@savingnotestrue + \let\@footnotetext \FNH@hyper@fntext + \let\@mpfootnotetext \FNH@hyper@fntext + \let\H@@mpfootnotetext\FNH@nohyp@fntext + \FNH@width\columnwidth + \let\FNH@colwidth\FNH@width + \global\setbox\FNH@notes\box\voidb@x + \let\FNH@thempfn\thempfn + \let\FNH@mpfn\@mpfn + \ifx\@minipagerestore\relax\let\@minipagerestore\@empty\fi + \expandafter\def\expandafter\@minipagerestore\expandafter{% + \@minipagerestore + \let\thempfn\FNH@thempfn + \let\@mpfn\FNH@mpfn + }% + \fi +}% +\def\FNH@spewnotes {% + \if@endpe\ifx\par\@@par\FNH@toks{}\else + \FNH@toks\expandafter{\expandafter + \def\expandafter\par\expandafter{\par}\@endpetrue}% + \expandafter\expandafter\expandafter + \FNH@toks + \expandafter\expandafter\expandafter + {\expandafter\the\expandafter\FNH@toks + \expandafter\def\expandafter\@par\expandafter{\@par}}% + \expandafter\expandafter\expandafter + \FNH@toks + \expandafter\expandafter\expandafter + {\expandafter\the\expandafter\FNH@toks + \expandafter\everypar\expandafter{\the\everypar}}\fi + \else\FNH@toks{}\fi + \expandafter + \endgroup\the\FNH@toks + \ifFNH@savingnotes\else + \ifvoid\FNH@notes\else + \begingroup + \let\@makefntext\@empty + \let\@finalstrut\@gobble + \let\rule\@gobbletwo + \ifx\@footnotetext\@mpfootnotetext + \expandafter\FNH@H@@mpfootnotetext + \else + \expandafter\FNH@H@@footnotetext + \fi{\unvbox\FNH@notes}% + \endgroup + \fi + \fi +}% +\def\FNH@footnote@envname {footnote}% +\def\FNH@footnotetext@envname{footnotetext}% +\def\FNH@footnote{% +% this line added for Sphinx: + \spx@opt@BeforeFootnote + \ifx\@currenvir\FNH@footnote@envname + \expandafter\FNH@footnoteenv + \else + \expandafter\FNH@latex@footnote + \fi +}% +\def\FNH@footnoteenv{% +% this line added for Sphinx (footnotes in parsed literal blocks): + \catcode13=5 \sphinxunactivateextrasandspace + \@ifnextchar[% + \FNH@footnoteenv@i %] + {\stepcounter\@mpfn + \protected@xdef\@thefnmark{\thempfn}% + \@footnotemark + \def\FNH@endfntext@fntext{\@footnotetext}% + \FNH@startfntext}% +}% +\def\FNH@footnoteenv@i[#1]{% + \begingroup + % This legacy code from LaTeX core restricts #1 to be digits only + % This limitation could be lifted but legacy Sphinx anyhow obeys it + \csname c@\@mpfn\endcsname #1\relax + \unrestored@protected@xdef\@thefnmark{\thempfn}% + \endgroup +% -- Sphinx specific: +% currently commented out due to +% https://github.com/sphinx-doc/sphinx/pull/10191#issuecomment-1038807448 +% Memo: memoir class detection of successive footnote marks (to separate them +% by commas) is broken by \refstepcounter and also by \label, and some +% mitigation such as in \sphinxfootref would be needed + % \global\let\spx@saved@thefnmark\@thefnmark + % % this is done to access robustly the page number where footnote mark is + % \refstepcounter{sphinxfootnotemark}\label{footnotemark.\thesphinxfootnotemark}% + % % if possible, compare page numbers of mark and footnote to define \@thefnmark + % \ltx@ifundefined{r@\thesphinxscope.footnote.#1}% + % {}% one more latex run is needed + % {\sphinx@xdef@thefnmark{#1}}% check of page numbers possible +% -- + \@footnotemark + \def\FNH@endfntext@fntext{\@footnotetext}% +% -- Sphinx specific: + % we need to reset \@thefnmark as it is used by \FNH@startfntext via + % \FNH@startnote to set \@currentlabel which will be used by \label +% currently commented out (see above) + % \global\let\@thefnmark\spx@saved@thefnmark +% -- + \FNH@startfntext +% -- again Sphinx specific + % \@currentlabel as needed by \label got set by \FNH@startnote + % insert this at start of footnote text then the label will allow + % to robustly know on which page the footnote text ends up +% currently only of use for extra footnote marks so in case footnote multiply referred + \phantomsection\label{\thesphinxscope.footnote.#1}% +}% +\def\FNH@footnotetext{% + \ifx\@currenvir\FNH@footnotetext@envname + \expandafter\FNH@footnotetextenv + \else + \expandafter\FNH@latex@footnotetext + \fi +}% +\def\FNH@footnotetextenv{% + \@ifnextchar[% + \FNH@footnotetextenv@i %] + {\protected@xdef\@thefnmark{\thempfn}% + \def\FNH@endfntext@fntext{\@footnotetext}% + \FNH@startfntext}% +}% +\def\FNH@footnotetextenv@i[#1]{% + \begingroup + \csname c@\@mpfn\endcsname #1\relax + \unrestored@protected@xdef\@thefnmark{\thempfn}% + \endgroup + \ifFNH@savingnotes + \def\FNH@endfntext@fntext{\FNH@nohyp@fntext}% + \else + \def\FNH@endfntext@fntext{\FNH@H@@footnotetext}% + \fi + \FNH@startfntext +% -- Sphinx specific addition + \phantomsection\label{\thesphinxscope.footnote.#1}% +}% +\def\FNH@startfntext{% + \setbox\z@\vbox\bgroup + \FNH@startnote + \FNH@prefntext + \rule\z@\footnotesep\ignorespaces +}% +\def\FNH@endfntext {% + \@finalstrut\strutbox + \FNH@postfntext + \FNH@endnote + \egroup + \begingroup + \let\@makefntext\@empty\let\@finalstrut\@gobble\let\rule\@gobbletwo + \FNH@endfntext@fntext {\unvbox\z@}% + \endgroup +}% +\let\FNH@prefntext\@empty +\let\FNH@postfntext\@empty +\AtBeginDocument{\iffootnotehyperparse\expandafter\FNH@check\fi}% +\def\FNH@safeif#1{% + \iftrue\csname if#1\endcsname\csname fi\endcsname\expandafter\@firstoftwo + \else\csname fi\endcsname\expandafter\@secondoftwo + \fi +}% +\def\FNH@check{% + \ifx\@makefntextFB\@undefined\expandafter\FNH@check@ + \else\expandafter\FNH@frenchb@ + \fi +}% +\def\FNH@frenchb@{% + \def\FNH@prefntext{% + \localleftbox{}% + \let\FBeverypar@save\FBeverypar@quote + \let\FBeverypar@quote\relax + \FNH@safeif{FB@koma}% + {\FNH@safeif{FBFrenchFootnotes}% + {\ifx\footnote\thanks + \let\@@makefnmark\@@makefnmarkTH + \@makefntextTH{} % space as in french.ldf + \else + \let\@@makefnmark\@@makefnmarkFB + \@makefntextFB{} % space as in french.ldf + \fi + }{\let\@@makefnmark\@@makefnmarkORI + \@makefntextORI{}% no space as in french.ldf + }% + }% + {\FNH@safeif{FBFrenchFootnotes}% + {\@makefntextFB{}}% + {\@makefntextORI{}}% + }% + }% + \def\FNH@postfntext{% + \let\FBeverypar@quote\FBeverypar@save + \localleftbox{\FBeveryline@quote}% + }% +}% +\def\FNH@check@{% + \expandafter\FNH@check@a\@makefntext{1.2!3?4,}% + \FNH@@@1.2!3?4,\FNH@@@\relax +}% +\long\def\FNH@check@a #11.2!3?4,#2\FNH@@@#3{% + \ifx\relax#3\expandafter\FNH@checkagain@ + \else + \def\FNH@prefntext{#1}\def\FNH@postfntext{#2}% + \expandafter\FNH@check@b + \fi +}% +\def\FNH@checkagain@{% + \expandafter\FNH@checkagain@a + \detokenize\expandafter{\@makefntext{1.2!3?4,}}\relax\FNH@@@ +}% +\edef\FNH@temp{\noexpand\FNH@checkagain@a ##1\string{1.2!3?4,\string}}% +\expandafter\def\FNH@temp#2#3\FNH@@@{% + \ifx\relax#2% + \def\FNH@prefntext{\@makefntext{}}% + \else\FNH@bad@makefntext@alert + \fi +}% +\def\FNH@check@b #1\relax{% + \expandafter\expandafter\expandafter\FNH@check@c + \expandafter\meaning\expandafter\FNH@prefntext + \meaning\FNH@postfntext1.2!3?4,\FNH@check@c\relax +}% +\def\FNH@check@c #11.2!3?4,#2#3\relax{% + \ifx\FNH@check@c#2\else\FNH@bad@makefntext@alert\fi +}% +% slight reformulation for Sphinx +\def\FNH@bad@makefntext@alert{% + \sphinxbuildwarning{badfootnotes}% + \PackageWarningNoLine{sphinxpackagefootnote}% + {Footnotes will be sub-optimal, sorry. This is due to the document class or^^J + some package modifying macro \string\@makefntext.^^J + You can try to report this incompatibility at^^J + https://github.com/sphinx-doc/sphinx with this info:}% + \typeout{\meaning\@makefntext}% + \let\FNH@prefntext\@empty\let\FNH@postfntext\@empty +}% +% this macro from original footnote.sty is not used anymore by Sphinx +% but for simplicity sake let's just keep it as is +\def\makesavenoteenv{\@ifnextchar[\FNH@msne@ii\FNH@msne@i}%] +\def\FNH@msne@i #1{% + \expandafter\let\csname FNH$#1\expandafter\endcsname %$ + \csname #1\endcsname + \expandafter\let\csname endFNH$#1\expandafter\endcsname %$ + \csname end#1\endcsname + \FNH@msne@ii[#1]{FNH$#1}%$ +}% +\def\FNH@msne@ii[#1]#2{% + \expandafter\edef\csname#1\endcsname{% + \noexpand\savenotes + \expandafter\noexpand\csname#2\endcsname + }% + \expandafter\edef\csname end#1\endcsname{% + \expandafter\noexpand\csname end#2\endcsname + \noexpand\expandafter + \noexpand\spewnotes + \noexpand\if@endpe\noexpand\@endpetrue\noexpand\fi + }% +}% +% +% some extras for Sphinx : +% \sphinxfootnotemark: +% - if in section titles will auto-remove itself from TOC +\def\sphinxfootnotemark [#1]% + {\ifx\thepage\relax\else\sphinxfootref{#1}\fi}% +\newcounter{sphinxfootnotemark} +\renewcommand\thesphinxfootnotemark{\number\value{sphinxfootnotemark}} +% - compares page number of footnote mark versus the one of footnote text +\def\sphinx@xdef@thefnmark#1{% + \expandafter\expandafter\expandafter\sphinx@footref@get + \csname r@\thesphinxscope.footnote.#1\endcsname\relax + \expandafter\expandafter\expandafter\sphinx@footmark@getpage + \csname r@footnotemark.\thesphinxfootnotemark\endcsname\thepage\relax + \protected@xdef\@thefnmark{% + \ifx\spx@footmarkpage\spx@footrefpage + \spx@footreflabel + \else + % the macro \sphinxthefootnotemark is in sphinx.sty + \sphinxthefootnotemark{\spx@footreflabel}{\spx@footrefpage}% + \fi + }% +}% +\def\sphinx@footref@get #1#2#3#4#5\relax{% + \def\spx@footreflabel{#1}% + \def\spx@footrefpage {#2}% + \def\spx@footrefHref {#4}% +}% +\def\sphinx@footmark@getpage #1#2#3\relax{% + \edef\spx@footmarkpage{#2}% +}% +\protected\def\sphinxfootref#1{% #1 always is explicit number in Sphinx + \spx@opt@BeforeFootnote + % each of \refstepcounter and \label interferes with memoir class detection + % of successive footnote marks, so we move them to inside \@makefnmark + \let\spx@saved@makefnmark\@makefnmark + \ltx@ifundefined{r@\thesphinxscope.footnote.#1}% + {\gdef\@thefnmark{?}% on first LaTeX run + \refstepcounter{sphinxfootnotemark}\label{footnotemark.\thesphinxfootnotemark}% + }% + {\def\@makefnmark{% will be used by \H@@footnotemark + \refstepcounter{sphinxfootnotemark}\label{footnotemark.\thesphinxfootnotemark}% + \sphinx@xdef@thefnmark{#1}% also defines \spx@footrefHref + % must be executed after \refstepcounter + \hyper@linkstart{link}{\spx@footrefHref}% + \spx@saved@makefnmark + \hyper@linkend + }% + }% + \H@@footnotemark + \let\@makefnmark\spx@saved@makefnmark +}% +\AtBeginDocument{% + % let hyperref less complain + \pdfstringdefDisableCommands{\def\sphinxfootnotemark [#1]{}}% + % to obtain hyperlinked footnotes in longtable environment we must replace + % hyperref's patch of longtable's patch of \@footnotetext by our own + \let\LT@p@ftntext\FNH@hyper@fntext + % this *requires* longtable to be used always wrapped in savenotes environment +}% +\endinput +%% +%% End of file `sphinxpackagefootnote.sty'. diff --git a/build/latex/sphinxpackagesubstitutefont.sty b/build/latex/sphinxpackagesubstitutefont.sty new file mode 100644 index 0000000..536bf20 --- /dev/null +++ b/build/latex/sphinxpackagesubstitutefont.sty @@ -0,0 +1,21 @@ +%% a stub for obsoleted LaTeX package substitutefont +% The package substitutefont stopped being distributed with TeXLive +% around August 2023 and was moved to "obsolete" section. +% cf https://ctan.org/pkg/substitutefont +% Trying to load it raises a LaTeX build error since. + +% The \substitutefont has a LaTeX kernel replacement +% \DeclareFontFamilySubstitution +% which was added to LaTeX 2020-02-02 +% The aim of this stub is to do that replacement silently. + +% change this info string if making any custom modification +\ProvidesPackage{sphinxpackagesubstitutefont}[2023/15/11 v7.3.0 substitutefont stub] + +\ifdefined\DeclareFontFamilySubstitution + \def\substitutefont{\DeclareFontFamilySubstitution} +\else + \usepackage{substitutefont} +\fi + +\endinput