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