[f66f990] | 1 | \NeedsTeXFormat{LaTeX2e} |
---|
| 2 | \ProvidesPackage{footnotehyper-sphinx}% |
---|
| 3 | [2017/10/27 v1.7 hyperref aware footnote.sty for sphinx (JFB)] |
---|
| 4 | %% |
---|
| 5 | %% Package: footnotehyper-sphinx |
---|
| 6 | %% Version: based on footnotehyper.sty 2017/03/07 v1.0 |
---|
| 7 | %% as available at https://www.ctan.org/pkg/footnotehyper |
---|
| 8 | %% License: the one applying to Sphinx |
---|
| 9 | %% |
---|
| 10 | %% Refer to the PDF documentation at https://www.ctan.org/pkg/footnotehyper for |
---|
| 11 | %% the code comments. |
---|
| 12 | %% |
---|
| 13 | %% Differences: |
---|
| 14 | %% 1. a partial tabulary compatibility layer added (enough for Sphinx mark-up), |
---|
| 15 | %% 2. use of \spx@opt@BeforeFootnote from sphinx.sty, |
---|
| 16 | %% 3. use of \sphinxunactivateextrasandspace from sphinx.sty, |
---|
| 17 | %% 4. macro definition \sphinxfootnotemark, |
---|
| 18 | %% 5. macro definition \sphinxlongtablepatch |
---|
| 19 | %% 6. replaced an \undefined by \@undefined |
---|
| 20 | \DeclareOption*{\PackageWarning{footnotehyper-sphinx}{Option `\CurrentOption' is unknown}}% |
---|
| 21 | \ProcessOptions\relax |
---|
| 22 | \newbox\FNH@notes |
---|
| 23 | \newdimen\FNH@width |
---|
| 24 | \let\FNH@colwidth\columnwidth |
---|
| 25 | \newif\ifFNH@savingnotes |
---|
| 26 | \AtBeginDocument {% |
---|
| 27 | \let\FNH@latex@footnote \footnote |
---|
| 28 | \let\FNH@latex@footnotetext\footnotetext |
---|
| 29 | \let\FNH@H@@footnotetext \@footnotetext |
---|
| 30 | \newenvironment{savenotes} |
---|
| 31 | {\FNH@savenotes\ignorespaces}{\FNH@spewnotes\ignorespacesafterend}% |
---|
| 32 | \let\spewnotes \FNH@spewnotes |
---|
| 33 | \let\footnote \FNH@footnote |
---|
| 34 | \let\footnotetext \FNH@footnotetext |
---|
| 35 | \let\endfootnote \FNH@endfntext |
---|
| 36 | \let\endfootnotetext\FNH@endfntext |
---|
| 37 | \@ifpackageloaded{hyperref} |
---|
| 38 | {\ifHy@hyperfootnotes |
---|
| 39 | \let\FNH@H@@footnotetext\H@@footnotetext |
---|
| 40 | \else |
---|
| 41 | \let\FNH@hyper@fntext\FNH@nohyp@fntext |
---|
| 42 | \fi}% |
---|
| 43 | {\let\FNH@hyper@fntext\FNH@nohyp@fntext}% |
---|
| 44 | }% |
---|
| 45 | \def\FNH@hyper@fntext{\FNH@fntext\FNH@hyper@fntext@i}% |
---|
| 46 | \def\FNH@nohyp@fntext{\FNH@fntext\FNH@nohyp@fntext@i}% |
---|
| 47 | \def\FNH@fntext #1{% |
---|
| 48 | \ifx\ifmeasuring@\@undefined |
---|
| 49 | \expandafter\@secondoftwo\else\expandafter\@firstofone\fi |
---|
| 50 | % these two lines modified for Sphinx (tabulary compatibility): |
---|
| 51 | {\ifmeasuring@\expandafter\@gobbletwo\else\expandafter\@firstofone\fi}% |
---|
| 52 | {\ifx\equation$\expandafter\@gobbletwo\fi #1}%$ |
---|
| 53 | }% |
---|
| 54 | \long\def\FNH@hyper@fntext@i#1{% |
---|
| 55 | \global\setbox\FNH@notes\vbox |
---|
| 56 | {\unvbox\FNH@notes |
---|
| 57 | \FNH@startnote |
---|
| 58 | \@makefntext |
---|
| 59 | {\rule\z@\footnotesep\ignorespaces |
---|
| 60 | \ifHy@nesting\expandafter\ltx@firstoftwo |
---|
| 61 | \else\expandafter\ltx@secondoftwo |
---|
| 62 | \fi |
---|
| 63 | {\expandafter\hyper@@anchor\expandafter{\Hy@footnote@currentHref}{#1}}% |
---|
| 64 | {\Hy@raisedlink |
---|
| 65 | {\expandafter\hyper@@anchor\expandafter{\Hy@footnote@currentHref}% |
---|
| 66 | {\relax}}% |
---|
| 67 | \let\@currentHref\Hy@footnote@currentHref |
---|
| 68 | \let\@currentlabelname\@empty |
---|
| 69 | #1}% |
---|
| 70 | \@finalstrut\strutbox |
---|
| 71 | }% |
---|
| 72 | \FNH@endnote |
---|
| 73 | }% |
---|
| 74 | }% |
---|
| 75 | \long\def\FNH@nohyp@fntext@i#1{% |
---|
| 76 | \global\setbox\FNH@notes\vbox |
---|
| 77 | {\unvbox\FNH@notes |
---|
| 78 | \FNH@startnote |
---|
| 79 | \@makefntext{\rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}% |
---|
| 80 | \FNH@endnote |
---|
| 81 | }% |
---|
| 82 | }% |
---|
| 83 | \def\FNH@startnote{% |
---|
| 84 | \hsize\FNH@colwidth |
---|
| 85 | \interlinepenalty\interfootnotelinepenalty |
---|
| 86 | \reset@font\footnotesize |
---|
| 87 | \floatingpenalty\@MM |
---|
| 88 | \@parboxrestore |
---|
| 89 | \protected@edef\@currentlabel{\csname p@\@mpfn\endcsname\@thefnmark}% |
---|
| 90 | \color@begingroup |
---|
| 91 | }% |
---|
| 92 | \def\FNH@endnote{\color@endgroup}% |
---|
| 93 | \def\FNH@savenotes{% |
---|
| 94 | \begingroup |
---|
| 95 | \ifFNH@savingnotes\else |
---|
| 96 | \FNH@savingnotestrue |
---|
| 97 | \let\@footnotetext \FNH@hyper@fntext |
---|
| 98 | \let\@mpfootnotetext \FNH@hyper@fntext |
---|
| 99 | \let\H@@mpfootnotetext\FNH@nohyp@fntext |
---|
| 100 | \FNH@width\columnwidth |
---|
| 101 | \let\FNH@colwidth\FNH@width |
---|
| 102 | \global\setbox\FNH@notes\box\voidb@x |
---|
| 103 | \let\FNH@thempfn\thempfn |
---|
| 104 | \let\FNH@mpfn\@mpfn |
---|
| 105 | \ifx\@minipagerestore\relax\let\@minipagerestore\@empty\fi |
---|
| 106 | \expandafter\def\expandafter\@minipagerestore\expandafter{% |
---|
| 107 | \@minipagerestore |
---|
| 108 | \let\thempfn\FNH@thempfn |
---|
| 109 | \let\@mpfn\FNH@mpfn |
---|
| 110 | }% |
---|
| 111 | \fi |
---|
| 112 | }% |
---|
| 113 | \def\FNH@spewnotes {% |
---|
| 114 | \endgroup |
---|
| 115 | \ifFNH@savingnotes\else |
---|
| 116 | \ifvoid\FNH@notes\else |
---|
| 117 | \begingroup |
---|
| 118 | \let\@makefntext\@empty |
---|
| 119 | \let\@finalstrut\@gobble |
---|
| 120 | \let\rule\@gobbletwo |
---|
| 121 | \FNH@H@@footnotetext{\unvbox\FNH@notes}% |
---|
| 122 | \endgroup |
---|
| 123 | \fi |
---|
| 124 | \fi |
---|
| 125 | }% |
---|
| 126 | \def\FNH@footnote@envname {footnote}% |
---|
| 127 | \def\FNH@footnotetext@envname{footnotetext}% |
---|
| 128 | \def\FNH@footnote{% |
---|
| 129 | % this line added for Sphinx: |
---|
| 130 | \spx@opt@BeforeFootnote |
---|
| 131 | \ifx\@currenvir\FNH@footnote@envname |
---|
| 132 | \expandafter\FNH@footnoteenv |
---|
| 133 | \else |
---|
| 134 | \expandafter\FNH@latex@footnote |
---|
| 135 | \fi |
---|
| 136 | }% |
---|
| 137 | \def\FNH@footnoteenv{% |
---|
| 138 | % this line added for Sphinx (footnotes in parsed literal blocks): |
---|
| 139 | \catcode13=5 \sphinxunactivateextrasandspace |
---|
| 140 | \@ifnextchar[% |
---|
| 141 | \FNH@footnoteenv@i %] |
---|
| 142 | {\stepcounter\@mpfn |
---|
| 143 | \protected@xdef\@thefnmark{\thempfn}% |
---|
| 144 | \@footnotemark |
---|
| 145 | \def\FNH@endfntext@fntext{\@footnotetext}% |
---|
| 146 | \FNH@startfntext}% |
---|
| 147 | }% |
---|
| 148 | \def\FNH@footnoteenv@i[#1]{% |
---|
| 149 | \begingroup |
---|
| 150 | \csname c@\@mpfn\endcsname #1\relax |
---|
| 151 | \unrestored@protected@xdef\@thefnmark{\thempfn}% |
---|
| 152 | \endgroup |
---|
| 153 | \@footnotemark |
---|
| 154 | \def\FNH@endfntext@fntext{\@footnotetext}% |
---|
| 155 | \FNH@startfntext |
---|
| 156 | }% |
---|
| 157 | \def\FNH@footnotetext{% |
---|
| 158 | \ifx\@currenvir\FNH@footnotetext@envname |
---|
| 159 | \expandafter\FNH@footnotetextenv |
---|
| 160 | \else |
---|
| 161 | \expandafter\FNH@latex@footnotetext |
---|
| 162 | \fi |
---|
| 163 | }% |
---|
| 164 | \def\FNH@footnotetextenv{% |
---|
| 165 | \@ifnextchar[% |
---|
| 166 | \FNH@footnotetextenv@i %] |
---|
| 167 | {\protected@xdef\@thefnmark{\thempfn}% |
---|
| 168 | \def\FNH@endfntext@fntext{\@footnotetext}% |
---|
| 169 | \FNH@startfntext}% |
---|
| 170 | }% |
---|
| 171 | \def\FNH@footnotetextenv@i[#1]{% |
---|
| 172 | \begingroup |
---|
| 173 | \csname c@\@mpfn\endcsname #1\relax |
---|
| 174 | \unrestored@protected@xdef\@thefnmark{\thempfn}% |
---|
| 175 | \endgroup |
---|
| 176 | \ifFNH@savingnotes |
---|
| 177 | \def\FNH@endfntext@fntext{\FNH@nohyp@fntext}% |
---|
| 178 | \else |
---|
| 179 | \def\FNH@endfntext@fntext{\FNH@H@@footnotetext}% |
---|
| 180 | \fi |
---|
| 181 | \FNH@startfntext |
---|
| 182 | }% |
---|
| 183 | \def\FNH@startfntext{% |
---|
| 184 | \setbox\z@\vbox\bgroup |
---|
| 185 | \FNH@startnote |
---|
| 186 | \FNH@prefntext |
---|
| 187 | \rule\z@\footnotesep\ignorespaces |
---|
| 188 | }% |
---|
| 189 | \def\FNH@endfntext {% |
---|
| 190 | \@finalstrut\strutbox |
---|
| 191 | \FNH@postfntext |
---|
| 192 | \FNH@endnote |
---|
| 193 | \egroup |
---|
| 194 | \begingroup |
---|
| 195 | \let\@makefntext\@empty\let\@finalstrut\@gobble\let\rule\@gobbletwo |
---|
| 196 | \FNH@endfntext@fntext {\unvbox\z@}% |
---|
| 197 | \endgroup |
---|
| 198 | }% |
---|
| 199 | \AtBeginDocument{% |
---|
| 200 | \let\FNH@@makefntext\@makefntext |
---|
| 201 | \ifx\@makefntextFB\@undefined |
---|
| 202 | \expandafter\@gobble\else\expandafter\@firstofone\fi |
---|
| 203 | {\ifFBFrenchFootnotes \let\FNH@@makefntext\@makefntextFB \else |
---|
| 204 | \let\FNH@@makefntext\@makefntextORI\fi}% |
---|
| 205 | \expandafter\FNH@check@a\FNH@@makefntext{1.2!3?4,}% |
---|
| 206 | \FNH@@@1.2!3?4,\FNH@@@\relax |
---|
| 207 | }% |
---|
| 208 | \long\def\FNH@check@a #11.2!3?4,#2\FNH@@@#3{% |
---|
| 209 | \ifx\relax#3\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi |
---|
| 210 | \FNH@bad@makefntext@alert |
---|
| 211 | {\def\FNH@prefntext{#1}\def\FNH@postfntext{#2}\FNH@check@b}% |
---|
| 212 | }% |
---|
| 213 | \def\FNH@check@b #1\relax{% |
---|
| 214 | \expandafter\expandafter\expandafter\FNH@check@c |
---|
| 215 | \expandafter\meaning\expandafter\FNH@prefntext |
---|
| 216 | \meaning\FNH@postfntext1.2!3?4,\FNH@check@c\relax |
---|
| 217 | }% |
---|
| 218 | \def\FNH@check@c #11.2!3?4,#2#3\relax{% |
---|
| 219 | \ifx\FNH@check@c#2\expandafter\@gobble\fi\FNH@bad@makefntext@alert |
---|
| 220 | }% |
---|
| 221 | % slight reformulation for Sphinx |
---|
| 222 | \def\FNH@bad@makefntext@alert{% |
---|
| 223 | \PackageWarningNoLine{footnotehyper-sphinx}% |
---|
| 224 | {Footnotes will be sub-optimal, sorry. This is due to the document class or^^J |
---|
| 225 | some package modifying macro \string\@makefntext.^^J |
---|
| 226 | You can try to report this incompatibility at^^J |
---|
| 227 | https://github.com/sphinx-doc/sphinx with this info:}% |
---|
| 228 | \typeout{\meaning\@makefntext}% |
---|
| 229 | \let\FNH@prefntext\@empty\let\FNH@postfntext\@empty |
---|
| 230 | }% |
---|
| 231 | % this macro from original footnote.sty is not used anymore by Sphinx |
---|
| 232 | % but for simplicity sake let's just keep it as is |
---|
| 233 | \def\makesavenoteenv{\@ifnextchar[\FNH@msne@ii\FNH@msne@i}%] |
---|
| 234 | \def\FNH@msne@i #1{% |
---|
| 235 | \expandafter\let\csname FNH$#1\expandafter\endcsname %$ |
---|
| 236 | \csname #1\endcsname |
---|
| 237 | \expandafter\let\csname endFNH$#1\expandafter\endcsname %$ |
---|
| 238 | \csname end#1\endcsname |
---|
| 239 | \FNH@msne@ii[#1]{FNH$#1}%$ |
---|
| 240 | }% |
---|
| 241 | \def\FNH@msne@ii[#1]#2{% |
---|
| 242 | \expandafter\edef\csname#1\endcsname{% |
---|
| 243 | \noexpand\savenotes |
---|
| 244 | \expandafter\noexpand\csname#2\endcsname |
---|
| 245 | }% |
---|
| 246 | \expandafter\edef\csname end#1\endcsname{% |
---|
| 247 | \expandafter\noexpand\csname end#2\endcsname |
---|
| 248 | \noexpand\expandafter |
---|
| 249 | \noexpand\spewnotes |
---|
| 250 | \noexpand\if@endpe\noexpand\@endpetrue\noexpand\fi |
---|
| 251 | }% |
---|
| 252 | }% |
---|
| 253 | % end of footnotehyper 2017/02/16 v0.99 |
---|
| 254 | % some extras for Sphinx : |
---|
| 255 | % \sphinxfootnotemark: usable in section titles and silently removed from TOCs. |
---|
| 256 | \def\sphinxfootnotemark [#1]% |
---|
| 257 | {\ifx\thepage\relax\else\protect\spx@opt@BeforeFootnote |
---|
| 258 | \protect\footnotemark[#1]\fi}% |
---|
| 259 | \AtBeginDocument{% |
---|
| 260 | % let hyperref less complain |
---|
| 261 | \pdfstringdefDisableCommands{\def\sphinxfootnotemark [#1]{}}% |
---|
| 262 | % to obtain hyperlinked footnotes in longtable environment we must replace |
---|
| 263 | % hyperref's patch of longtable's patch of \@footnotetext by our own |
---|
| 264 | \let\LT@p@ftntext\FNH@hyper@fntext |
---|
| 265 | % this *requires* longtable to be used always wrapped in savenotes environment |
---|
| 266 | }% |
---|
| 267 | \endinput |
---|
| 268 | %% |
---|
| 269 | %% End of file `footnotehyper-sphinx.sty'. |
---|