1
|
1 |
\makeatletter
|
|
2 |
|
|
3 |
% Development notes at
|
|
4 |
% http://docutils.python-hosting.com/wiki/NewLatex
|
|
5 |
|
|
6 |
|
|
7 |
\providecommand{\Dprinting}{false}
|
|
8 |
|
|
9 |
|
|
10 |
\providecommand{\DSearly}{}
|
|
11 |
\providecommand{\DSlate}{}
|
|
12 |
|
|
13 |
\providecommand{\Ddocumentclass}{scrartcl}
|
|
14 |
\providecommand{\Ddocumentoptions}{a4paper}
|
|
15 |
|
|
16 |
\documentclass[\Ddocumentoptions]{\Ddocumentclass}
|
|
17 |
|
|
18 |
\DSearly
|
|
19 |
|
|
20 |
|
|
21 |
\providecommand{\DSfontencoding}{
|
|
22 |
% Set up font encoding.
|
|
23 |
% AE is a T1-emulation. It provides most characters and features
|
|
24 |
% as T1-encoded fonts but doesn't use ugly bitmap fonts.
|
|
25 |
\usepackage{ae}
|
|
26 |
% Provide the characters not contained in AE from EC bitmap fonts.
|
|
27 |
\usepackage{aecompl}
|
|
28 |
% Guillemets ("<<", ">>") in AE.
|
|
29 |
\usepackage{aeguill}
|
|
30 |
}
|
|
31 |
|
|
32 |
|
|
33 |
\providecommand{\DSsymbols}{%
|
|
34 |
% Fix up symbols.
|
|
35 |
% The Euro symbol in Computer Modern looks, um, funny. Let's get a
|
|
36 |
% proper Euro symbol.
|
|
37 |
\RequirePackage{eurosym}%
|
|
38 |
\renewcommand{\texteuro}{\euro}%
|
|
39 |
}
|
|
40 |
|
|
41 |
|
|
42 |
% Taken from
|
|
43 |
% <http://groups.google.de/groups?selm=1i0n5tgtplti420e1omp4pctlv19jpuhbb%404ax.com>
|
|
44 |
% and modified. Used with permission.
|
|
45 |
\providecommand{\Dprovidelength}[2]{%
|
|
46 |
\begingroup%
|
|
47 |
\escapechar\m@ne%
|
|
48 |
\xdef\@gtempa{{\string#1}}%
|
|
49 |
\endgroup%
|
|
50 |
\expandafter\@ifundefined\@gtempa%
|
|
51 |
{\newlength{#1}\setlength{#1}{#2}}%
|
|
52 |
{}%
|
|
53 |
}
|
|
54 |
|
|
55 |
\providecommand{\Dprovidecounter}[1]{%
|
|
56 |
% Like \newcounter except that it doesn't crash if the counter
|
|
57 |
% already exists.
|
|
58 |
\@ifundefined{c@#1}{\newcounter{#1}}{}
|
|
59 |
}
|
|
60 |
|
|
61 |
\Dprovidelength{\Dboxparindent}{\parindent}
|
|
62 |
\providecommand{\Dmakeboxminipage}[1]{%
|
|
63 |
% Make minipage for use in a box created by \Dmakefbox.
|
|
64 |
\begin{minipage}[t]{0.9\linewidth}%
|
|
65 |
\setlength{\parindent}{\Dboxparindent}%
|
|
66 |
#1%
|
|
67 |
\end{minipage}%
|
|
68 |
}
|
|
69 |
\providecommand{\Dmakefbox}[1]{%
|
|
70 |
% Make a centered, framed box. Useful e.g. for admonitions.
|
|
71 |
\vspace{0.4\baselineskip}%
|
|
72 |
\begin{center}%
|
|
73 |
\fbox{\Dmakeboxminipage{#1}}%
|
|
74 |
\end{center}%
|
|
75 |
\vspace{0.4\baselineskip}%
|
|
76 |
}
|
|
77 |
\providecommand{\Dmakebox}[1]{%
|
|
78 |
% Make a centered, frameless box. Useful e.g. for block quotes.
|
|
79 |
% Do not use minipages here, but create pseudo-lists to allow
|
|
80 |
% page-breaking. (Don't use KOMA-script's addmargin environment
|
|
81 |
% because it messes up bullet lists.)
|
|
82 |
\Dmakelistenvironment{}{}{%
|
|
83 |
\setlength{\parskip}{0pt}%
|
|
84 |
\setlength{\parindent}{\Dboxparindent}%
|
|
85 |
\item{#1}%
|
|
86 |
}%
|
|
87 |
}
|
|
88 |
|
|
89 |
|
|
90 |
\RequirePackage{ifthen}
|
|
91 |
\providecommand{\Dfrenchspacing}{true}
|
|
92 |
\ifthenelse{\equal{\Dfrenchspacing}{true}}{\frenchspacing}{}
|
|
93 |
|
|
94 |
|
|
95 |
\Dprovidelength{\Dblocklevelvspace}{%
|
|
96 |
% Space between block-level elements other than paragraphs.
|
|
97 |
0.7\baselineskip plus 0.3\baselineskip minus 0.2\baselineskip%
|
|
98 |
}
|
|
99 |
\providecommand{\Dauxiliaryspace}{%
|
|
100 |
\ifthenelse{\equal{\Dneedvspace}{true}}{\vspace{\Dblocklevelvspace}}{}%
|
|
101 |
\par\noindent%
|
|
102 |
}
|
|
103 |
\providecommand{\Dauxiliaryparspace}{%
|
|
104 |
\ifthenelse{\equal{\Dneedvspace}{true}}{\vspace{\Dblocklevelvspace}}{}%
|
|
105 |
\par%
|
|
106 |
}
|
|
107 |
\providecommand{\Dparagraphspace}{\par}
|
|
108 |
\providecommand{\Dneedvspace}{true}
|
|
109 |
|
|
110 |
|
|
111 |
\providecommand{\DSlinks}{
|
|
112 |
% Targets and references.
|
|
113 |
\RequirePackage[colorlinks=false,pdfborder={0 0 0}]{hyperref}
|
|
114 |
|
|
115 |
\providecommand{\Draisedlink}[1]{\Hy@raisedlink{##1}}
|
|
116 |
|
|
117 |
% References.
|
|
118 |
% We're assuming here that the "refid" and "refuri" attributes occur
|
|
119 |
% only in inline context (in TextElements).
|
|
120 |
\providecommand{\DArefid}[5]{%
|
|
121 |
\ifthenelse{\equal{##4}{reference}}{%
|
|
122 |
\Dexplicitreference{\###3}{##5}%
|
|
123 |
}{%
|
|
124 |
% If this is not a target node (targets with refids are
|
|
125 |
% uninteresting and should be silently dropped).
|
|
126 |
\ifthenelse{\not\equal{##4}{target}}{%
|
|
127 |
% If this is a footnote reference, call special macro.
|
|
128 |
\ifthenelse{\equal{##4}{footnotereference}}{%
|
|
129 |
\Dimplicitfootnotereference{\###3}{##5}%
|
|
130 |
}{%
|
|
131 |
\ifthenelse{\equal{##4}{citationreference}}{%
|
|
132 |
\Dimplicitcitationreference{\###3}{##5}%
|
|
133 |
}{%
|
|
134 |
\Dimplicitreference{\###3}{##5}%
|
|
135 |
}%
|
|
136 |
}%
|
|
137 |
}{}%
|
|
138 |
}%
|
|
139 |
}
|
|
140 |
\providecommand{\DArefuri}[5]{%
|
|
141 |
\ifthenelse{\equal{##4}{target}}{%
|
|
142 |
% Hyperlink targets can (and should be) ignored because they are
|
|
143 |
% invisible.
|
|
144 |
}{%
|
|
145 |
% We only have explicit URI references, so one macro suffices.
|
|
146 |
\Durireference{##3}{##5}%
|
|
147 |
}%
|
|
148 |
}
|
|
149 |
% Targets.
|
|
150 |
\providecommand{\DAids}[5]{%
|
|
151 |
\label{##3}%
|
|
152 |
\ifthenelse{\equal{##4}{footnotereference}}{%
|
|
153 |
{%
|
|
154 |
\renewcommand{\HyperRaiseLinkDefault}{%
|
|
155 |
% Dirty hack to make backrefs to footnote references work.
|
|
156 |
% For some reason, \baselineskip is 0pt in fn references.
|
|
157 |
0.5\Doriginalbaselineskip%
|
|
158 |
}%
|
|
159 |
\Draisedlink{\hypertarget{##3}{}}##5%
|
|
160 |
}%
|
|
161 |
}{%
|
|
162 |
\Draisedlink{\hypertarget{##3}{}}##5%
|
|
163 |
}%
|
|
164 |
}
|
|
165 |
% Color in references.
|
|
166 |
\RequirePackage{color}
|
|
167 |
\providecommand{\Dimplicitreference}[2]{%
|
|
168 |
% Create implicit reference to ID. Implicit references occur
|
|
169 |
% e.g. in TOC-backlinks of section titles. Parameters:
|
|
170 |
% 1. Target.
|
|
171 |
% 2. Link text.
|
|
172 |
\href{##1}{##2}%
|
|
173 |
}
|
|
174 |
\providecommand{\Dimplicitfootnotereference}[2]{%
|
|
175 |
% Ditto, but for the special case of footnotes.
|
|
176 |
% We want them to be rendered like explicit references.
|
|
177 |
\Dexplicitreference{##1}{##2}%
|
|
178 |
}
|
|
179 |
\providecommand{\Dimplicitcitationreference}[2]{%
|
|
180 |
% Ditto for citation references.
|
|
181 |
\Dimplicitfootnotereference{##1}{##2}%
|
|
182 |
}
|
|
183 |
\ifthenelse{\equal{\Dprinting}{true}}{
|
|
184 |
\providecommand{\Dexplicitreferencecolor}{black}
|
|
185 |
}{
|
|
186 |
\providecommand{\Dexplicitreferencecolor}{blue}
|
|
187 |
}
|
|
188 |
\providecommand{\Dexplicitreference}[2]{%
|
|
189 |
% Create explicit reference to ID, e.g. created with "foo_".
|
|
190 |
% Parameters:
|
|
191 |
% 1. Target.
|
|
192 |
% 2. Link text.
|
|
193 |
\href{##1}{{\color{\Dexplicitreferencecolor}##2}}%
|
|
194 |
}
|
|
195 |
\providecommand{\Durireferencecolor}{\Dexplicitreferencecolor}
|
|
196 |
\providecommand{\Durireference}[2]{%
|
|
197 |
% Create reference to URI. Parameters:
|
|
198 |
% 1. Target.
|
|
199 |
% 2. Link text.
|
|
200 |
\href{##1}{{\color{\Durireferencecolor}##2}}%
|
|
201 |
}
|
|
202 |
}
|
|
203 |
|
|
204 |
|
|
205 |
\providecommand{\DSlanguage}{%
|
|
206 |
% Set up babel.
|
|
207 |
\ifthenelse{\equal{\Dlanguagebabel}{}}{}{
|
|
208 |
\RequirePackage[\Dlanguagebabel]{babel}
|
|
209 |
}
|
|
210 |
}
|
|
211 |
|
|
212 |
|
|
213 |
|
|
214 |
|
|
215 |
\providecommand{\DAclasses}[5]{%
|
|
216 |
\Difdefined{DN#4C#3}{%
|
|
217 |
% Pass only contents, nothing else!
|
|
218 |
\csname DN#4C#3\endcsname{#5}%
|
|
219 |
}{%
|
|
220 |
\Difdefined{DC#3}{%
|
|
221 |
\csname DC#3\endcsname{#5}%
|
|
222 |
}{%
|
|
223 |
#5%
|
|
224 |
}%
|
|
225 |
}%
|
|
226 |
}
|
|
227 |
|
|
228 |
\providecommand{\Difdefined}[3]{\@ifundefined{#1}{#3}{#2}}
|
|
229 |
|
|
230 |
\providecommand{\Dattr}[5]{%
|
|
231 |
% Global attribute dispatcher.
|
|
232 |
% Parameters:
|
|
233 |
% 1. Attribute number.
|
|
234 |
% 2. Attribute name.
|
|
235 |
% 3. Attribute value.
|
|
236 |
% 4. Node name.
|
|
237 |
% 5. Node contents.
|
|
238 |
\Difdefined{DN#4A#2V#3}{%
|
|
239 |
\csname DN#4A#2V#3\endcsname{#1}{#2}{#3}{#4}{#5}%
|
|
240 |
}{\Difdefined{DN#4A#2}{%
|
|
241 |
\csname DN#4A#2\endcsname{#1}{#2}{#3}{#4}{#5}%
|
|
242 |
}{\Difdefined{DA#2V#3}{%
|
|
243 |
\csname DA#2V#3\endcsname{#1}{#2}{#3}{#4}{#5}%
|
|
244 |
}{\Difdefined{DA#2}{%
|
|
245 |
\csname DA#2\endcsname{#1}{#2}{#3}{#4}{#5}%
|
|
246 |
}{#5%
|
|
247 |
}}}}%
|
|
248 |
}
|
|
249 |
|
|
250 |
\providecommand{\DNparagraph}[1]{#1}
|
|
251 |
\providecommand{\Dformatboxtitle}[1]{{\Large\textbf{#1}}}
|
|
252 |
\providecommand{\Dformatboxsubtitle}[1]{{\large\textbf{#1}}}
|
|
253 |
\providecommand{\Dtopictitle}[1]{%
|
|
254 |
\Difinsidetoc{\vspace{1em}\par}{}%
|
|
255 |
\noindent\Dformatboxtitle{#1}%
|
|
256 |
\ifthenelse{\equal{\Dhassubtitle}{false}}{\vspace{1em}}{\vspace{0.5em}}%
|
|
257 |
\par%
|
|
258 |
}
|
|
259 |
\providecommand{\Dtopicsubtitle}[1]{%
|
|
260 |
\noindent\Dformatboxsubtitle{#1}%
|
|
261 |
\vspace{1em}%
|
|
262 |
\par%
|
|
263 |
}
|
|
264 |
\providecommand{\Dsidebartitle}[1]{\Dtopictitle{#1}}
|
|
265 |
\providecommand{\Dsidebarsubtitle}[1]{\Dtopicsubtitle{#1}}
|
|
266 |
\providecommand{\Ddocumenttitle}[1]{%
|
|
267 |
\begin{center}{\Huge#1}\end{center}%
|
|
268 |
\ifthenelse{\equal{\Dhassubtitle}{true}}{\vspace{0.1cm}}{\vspace{1cm}}%
|
|
269 |
}
|
|
270 |
\providecommand{\Ddocumentsubtitle}[1]{%
|
|
271 |
\begin{center}{\huge#1}\end{center}%
|
|
272 |
\vspace{1cm}%
|
|
273 |
}
|
|
274 |
% Can be overwritten by user stylesheet.
|
|
275 |
\providecommand{\Dformatsectiontitle}[1]{#1}
|
|
276 |
\providecommand{\Dformatsectionsubtitle}[1]{\Dformatsectiontitle{#1}}
|
|
277 |
\providecommand{\Dbookmarksectiontitle}[1]{%
|
|
278 |
% Return text suitable for use in \section*, \subsection*, etc.,
|
|
279 |
% containing a PDF bookmark. Parameter: The title (as node tree).
|
|
280 |
\Draisedlink{\Dpdfbookmark{\Dtitleastext}}%
|
|
281 |
#1%
|
|
282 |
}
|
|
283 |
\providecommand{\Dsectiontitlehook}[1]{#1}
|
|
284 |
\providecommand{\Dsectiontitle}[1]{%
|
|
285 |
\Dsectiontitlehook{%
|
|
286 |
\Ddispatchsectiontitle{\Dbookmarksectiontitle{\Dformatsectiontitle{#1}}}%
|
|
287 |
}%
|
|
288 |
}
|
|
289 |
\providecommand{\Ddispatchsectiontitle}[1]{%
|
|
290 |
\@ifundefined{Dsectiontitle\roman{Dsectionlevel}}{%
|
|
291 |
\Ddeepsectiontitle{#1}%
|
|
292 |
}{%
|
|
293 |
\csname Dsectiontitle\roman{Dsectionlevel}\endcsname{#1}%
|
|
294 |
}%
|
|
295 |
}
|
|
296 |
\providecommand{\Ddispatchsectionsubtitle}[1]{%
|
|
297 |
\Ddispatchsectiontitle{#1}%
|
|
298 |
}
|
|
299 |
\providecommand{\Dsectiontitlei}[1]{\section*{#1}}
|
|
300 |
\providecommand{\Dsectiontitleii}[1]{\subsection*{#1}}
|
|
301 |
\providecommand{\Ddeepsectiontitle}[1]{%
|
|
302 |
% Anything below \subsubsection (like \paragraph or \subparagraph)
|
|
303 |
% is useless because it uses the same font. The only way to
|
|
304 |
% (visually) distinguish such deeply nested sections is to use
|
|
305 |
% section numbering.
|
|
306 |
\subsubsection*{#1}%
|
|
307 |
}
|
|
308 |
\providecommand{\Dsectionsubtitlehook}[1]{#1}
|
|
309 |
\Dprovidelength{\Dsectionsubtitleraisedistance}{0.7em}
|
|
310 |
\providecommand{\Dsectionsubtitlescaling}{0.85}
|
|
311 |
\providecommand{\Dsectionsubtitle}[1]{%
|
|
312 |
\Dsectionsubtitlehook{%
|
|
313 |
% Move the subtitle nearer to the title.
|
|
314 |
\vspace{-\Dsectionsubtitleraisedistance}%
|
|
315 |
% Don't create a PDF bookmark.
|
|
316 |
\Ddispatchsectionsubtitle{%
|
|
317 |
\Dformatsectionsubtitle{\scalebox{\Dsectionsubtitlescaling}{#1}}%
|
|
318 |
}%
|
|
319 |
}%
|
|
320 |
}
|
|
321 |
% Boolean variable.
|
|
322 |
\providecommand{\Dhassubtitle}{false}
|
|
323 |
\providecommand{\DNtitle}[1]{%
|
|
324 |
\csname D\Dparent title\endcsname{#1}%
|
|
325 |
}
|
|
326 |
\providecommand{\DNsubtitle}[1]{%
|
|
327 |
\csname D\Dparent subtitle\endcsname{#1}%
|
|
328 |
}
|
|
329 |
\newcounter{Dpdfbookmarkid}
|
|
330 |
\setcounter{Dpdfbookmarkid}{0}
|
|
331 |
\providecommand{\Dpdfbookmark}[1]{%
|
|
332 |
% Temporarily decrement Desctionlevel counter.
|
|
333 |
\addtocounter{Dsectionlevel}{-1}%
|
|
334 |
%\typeout{\arabic{Dsectionlevel}}%
|
|
335 |
%\typeout{#1}%
|
|
336 |
%\typeout{docutils\roman{Dpdfbookmarkid}}%
|
|
337 |
%\typeout{}%
|
|
338 |
\pdfbookmark[\arabic{Dsectionlevel}]{#1}{docutils\arabic{Dpdfbookmarkid}}%
|
|
339 |
\addtocounter{Dsectionlevel}{1}%
|
|
340 |
\addtocounter{Dpdfbookmarkid}{1}%
|
|
341 |
}
|
|
342 |
|
|
343 |
%\providecommand{\DNliteralblock}[1]{\begin{quote}\ttfamily\raggedright#1\end{quote}}
|
|
344 |
\providecommand{\DNliteralblock}[1]{%
|
|
345 |
\Dmakelistenvironment{}{%
|
|
346 |
\ifthenelse{\equal{\Dinsidetabular}{true}}{%
|
|
347 |
\setlength{\leftmargin}{0pt}%
|
|
348 |
}{}%
|
|
349 |
\setlength{\rightmargin}{0pt}%
|
|
350 |
}{%
|
|
351 |
\raggedright\item\noindent\nohyphens{\textnhtt{#1\Dfinalstrut}}%
|
|
352 |
}%
|
|
353 |
}
|
|
354 |
\providecommand{\DNdoctestblock}[1]{%
|
|
355 |
% Treat doctest blocks the same as literal blocks.
|
|
356 |
\DNliteralblock{#1}%
|
|
357 |
}
|
|
358 |
\RequirePackage{hyphenat}
|
|
359 |
\providecommand{\DNliteral}[1]{\textnhtt{#1}}
|
|
360 |
\providecommand{\DNemphasis}[1]{\emph{#1}}
|
|
361 |
\providecommand{\DNstrong}[1]{\textbf{#1}}
|
|
362 |
\providecommand{\Dvisitdocument}{\begin{document}\noindent}
|
|
363 |
\providecommand{\Ddepartdocument}{\end{document}}
|
|
364 |
\providecommand{\DNtopic}[1]{%
|
|
365 |
\ifthenelse{\equal{\DcurrentNtopicAcontents}{1}}{%
|
|
366 |
\addtocounter{Dtoclevel}{1}%
|
|
367 |
\par\noindent%
|
|
368 |
#1%
|
|
369 |
\addtocounter{Dtoclevel}{-1}%
|
|
370 |
}{%
|
|
371 |
\par\noindent%
|
|
372 |
\Dmakebox{#1}%
|
|
373 |
}%
|
|
374 |
}
|
|
375 |
\providecommand{\Dformatrubric}[1]{\textbf{#1}}
|
|
376 |
\Dprovidelength{\Dprerubricspace}{0.3em}
|
|
377 |
\providecommand{\DNrubric}[1]{%
|
|
378 |
\vspace{\Dprerubricspace}\par\noindent\Dformatrubric{#1}\par%
|
|
379 |
}
|
|
380 |
|
|
381 |
\providecommand{\Dbullet}{}
|
|
382 |
\providecommand{\Dsetbullet}[1]{\renewcommand{\Dbullet}{#1}}
|
|
383 |
\providecommand{\DNbulletlist}[1]{%
|
|
384 |
\Difinsidetoc{%
|
|
385 |
\Dtocbulletlist{#1}%
|
|
386 |
}{%
|
|
387 |
\Dmakelistenvironment{\Dbullet}{}{#1}%
|
|
388 |
}%
|
|
389 |
}
|
|
390 |
\renewcommand{\@pnumwidth}{2.2em}
|
|
391 |
\providecommand{\DNlistitem}[1]{%
|
|
392 |
\Difinsidetoc{%
|
|
393 |
\ifthenelse{\equal{\theDtoclevel}{1}\and\equal{\Dlocaltoc}{false}}{%
|
|
394 |
{%
|
|
395 |
\par\addvspace{1em}\noindent%
|
|
396 |
\sectfont%
|
|
397 |
#1\hfill\pageref{\DcurrentNlistitemAtocrefid}%
|
|
398 |
}%
|
|
399 |
}{%
|
|
400 |
\@dottedtocline{0}{\Dtocindent}{0em}{#1}{%
|
|
401 |
\pageref{\DcurrentNlistitemAtocrefid}%
|
|
402 |
}%
|
|
403 |
}%
|
|
404 |
}{%
|
|
405 |
\item{#1}%
|
|
406 |
}%
|
|
407 |
}
|
|
408 |
\providecommand{\DNenumeratedlist}[1]{#1}
|
|
409 |
\newcounter{Dsectionlevel}
|
|
410 |
\providecommand{\Dvisitsectionhook}{}
|
|
411 |
\providecommand{\Ddepartsectionhook}{}
|
|
412 |
\providecommand{\Dvisitsection}{%
|
|
413 |
\addtocounter{Dsectionlevel}{1}%
|
|
414 |
\Dvisitsectionhook%
|
|
415 |
}
|
|
416 |
\providecommand{\Ddepartsection}{%
|
|
417 |
\Ddepartsectionhook%
|
|
418 |
\addtocounter{Dsectionlevel}{-1}%
|
|
419 |
}
|
|
420 |
|
|
421 |
% Using \_ will cause hyphenation after _ even in \textnhtt-typewriter
|
|
422 |
% because the hyphenat package redefines \_. So we use
|
|
423 |
% \textunderscore here.
|
|
424 |
\providecommand{\Dtextunderscore}{\textunderscore}
|
|
425 |
|
|
426 |
\providecommand{\Dtextinlineliteralfirstspace}{{ }}
|
|
427 |
\providecommand{\Dtextinlineliteralsecondspace}{{~}}
|
|
428 |
|
|
429 |
\Dprovidelength{\Dlistspacing}{0.8\baselineskip}
|
|
430 |
|
|
431 |
\providecommand{\Dsetlistrightmargin}{%
|
|
432 |
\ifthenelse{\lengthtest{\linewidth>10em}}{%
|
|
433 |
% Equal margins.
|
|
434 |
\setlength{\rightmargin}{\leftmargin}%
|
|
435 |
}{%
|
|
436 |
% If the line is narrower than 10em, we don't remove any further
|
|
437 |
% space from the right.
|
|
438 |
\setlength{\rightmargin}{0pt}%
|
|
439 |
}%
|
|
440 |
}
|
|
441 |
\providecommand{\Dresetlistdepth}{false}
|
|
442 |
\Dprovidelength{\Doriginallabelsep}{\labelsep}
|
|
443 |
\providecommand{\Dmakelistenvironment}[3]{%
|
|
444 |
% Make list environment with support for unlimited nesting and with
|
|
445 |
% reasonable default lengths. Parameters:
|
|
446 |
% 1. Label (same as in list environment).
|
|
447 |
% 2. Spacing (same as in list environment).
|
|
448 |
% 3. List contents (contents of list environment).
|
|
449 |
\ifthenelse{\equal{\Dinsidetabular}{true}}{%
|
|
450 |
% Unfortunately, vertical spacing doesn't work correctly when
|
|
451 |
% using lists inside tabular environments, so we use a minipage.
|
|
452 |
\begin{minipage}[t]{\linewidth}%
|
|
453 |
}{}%
|
|
454 |
{%
|
|
455 |
\renewcommand{\Dneedvspace}{false}%
|
|
456 |
% \parsep0.5\baselineskip
|
|
457 |
\renewcommand{\Dresetlistdepth}{false}%
|
|
458 |
\ifnum \@listdepth>5%
|
|
459 |
\protect\renewcommand{\Dresetlistdepth}{true}%
|
|
460 |
\@listdepth=5%
|
|
461 |
\fi%
|
|
462 |
\begin{list}{%
|
|
463 |
#1%
|
|
464 |
}{%
|
|
465 |
\setlength{\itemsep}{0pt}%
|
|
466 |
\setlength{\partopsep}{0pt}%
|
|
467 |
\setlength{\topsep}{0pt}%
|
|
468 |
% List should take 90% of total width.
|
|
469 |
\setlength{\leftmargin}{0.05\linewidth}%
|
|
470 |
\ifthenelse{\lengthtest{\leftmargin<1.8em}}{%
|
|
471 |
\setlength{\leftmargin}{1.8em}%
|
|
472 |
}{}%
|
|
473 |
\setlength{\labelsep}{\Doriginallabelsep}%
|
|
474 |
\Dsetlistrightmargin%
|
|
475 |
#2%
|
|
476 |
}{%
|
|
477 |
#3%
|
|
478 |
}%
|
|
479 |
\end{list}%
|
|
480 |
\ifthenelse{\equal{\Dresetlistdepth}{true}}{\@listdepth=5}{}%
|
|
481 |
}%
|
|
482 |
\ifthenelse{\equal{\Dinsidetabular}{true}}{\end{minipage}}{}%
|
|
483 |
}
|
|
484 |
\providecommand{\Dfinalstrut}{\@finalstrut\@arstrutbox}
|
|
485 |
\providecommand{\DAlastitem}[5]{#5\Dfinalstrut}
|
|
486 |
|
|
487 |
\Dprovidelength{\Ditemsep}{0pt}
|
|
488 |
\providecommand{\Dmakeenumeratedlist}[6]{%
|
|
489 |
% Make enumerated list.
|
|
490 |
% Parameters:
|
|
491 |
% - prefix
|
|
492 |
% - type (\arabic, \roman, ...)
|
|
493 |
% - suffix
|
|
494 |
% - suggested counter name
|
|
495 |
% - start number - 1
|
|
496 |
% - list contents
|
|
497 |
\newcounter{#4}%
|
|
498 |
\Dmakelistenvironment{#1#2{#4}#3}{%
|
|
499 |
% Use as much space as needed for the label.
|
|
500 |
\setlength{\labelwidth}{10em}%
|
|
501 |
% Reserve enough space so that the label doesn't go beyond the
|
|
502 |
% left margin of preceding paragraphs. Like that:
|
|
503 |
%
|
|
504 |
% A paragraph.
|
|
505 |
%
|
|
506 |
% 1. First item.
|
|
507 |
\setlength{\leftmargin}{2.5em}%
|
|
508 |
\Dsetlistrightmargin%
|
|
509 |
\setlength{\itemsep}{\Ditemsep}%
|
|
510 |
% Use counter recommended by Python module.
|
|
511 |
\usecounter{#4}%
|
|
512 |
% Set start value.
|
|
513 |
\addtocounter{#4}{#5}%
|
|
514 |
}{%
|
|
515 |
% The list contents.
|
|
516 |
#6%
|
|
517 |
}%
|
|
518 |
}
|
|
519 |
|
|
520 |
|
|
521 |
% Single quote in literal mode. \textquotesingle from package
|
|
522 |
% textcomp has wrong width when using package ae, so we use a normal
|
|
523 |
% single curly quote here.
|
|
524 |
\providecommand{\Dtextliteralsinglequote}{'}
|
|
525 |
|
|
526 |
|
|
527 |
% "Tabular lists" are field lists and options lists (not definition
|
|
528 |
% lists because there the term always appears on its own line). We'll
|
|
529 |
% use the terminology of field lists now ("field", "field name",
|
|
530 |
% "field body"), but the same is also analogously applicable to option
|
|
531 |
% lists.
|
|
532 |
%
|
|
533 |
% We want these lists to be breakable across pages. We cannot
|
|
534 |
% automatically get the narrowest possible size for the left column
|
|
535 |
% (i.e. the field names or option groups) because tabularx does not
|
|
536 |
% support multi-page tables, ltxtable needs to have the table in an
|
|
537 |
% external file and we don't want to clutter the user's directories
|
|
538 |
% with auxiliary files created by the filecontents environment, and
|
|
539 |
% ltablex is not included in teTeX.
|
|
540 |
%
|
|
541 |
% Thus we set a fixed length for the left column and use list
|
|
542 |
% environments. This also has the nice side effect that breaking is
|
|
543 |
% now possible anywhere, not just between fields.
|
|
544 |
%
|
|
545 |
% Note that we are creating a distinct list environment for each
|
|
546 |
% field. There is no macro for a whole tabular list!
|
|
547 |
\Dprovidelength{\Dtabularlistfieldnamewidth}{6em}
|
|
548 |
\Dprovidelength{\Dtabularlistfieldnamesep}{0.5em}
|
|
549 |
\providecommand{\Dinsidetabular}{false}
|
|
550 |
\providecommand{\Dsavefieldname}{}
|
|
551 |
\providecommand{\Dsavefieldbody}{}
|
|
552 |
\Dprovidelength{\Dusedfieldnamewidth}{0pt}
|
|
553 |
\Dprovidelength{\Drealfieldnamewidth}{0pt}
|
|
554 |
\providecommand{\Dtabularlistfieldname}[1]{\renewcommand{\Dsavefieldname}{#1}}
|
|
555 |
\providecommand{\Dtabularlistfieldbody}[1]{\renewcommand{\Dsavefieldbody}{#1}}
|
|
556 |
\Dprovidelength{\Dparskiptemp}{0pt}
|
|
557 |
\providecommand{\Dtabularlistfield}[1]{%
|
|
558 |
{%
|
|
559 |
% This only saves field name and field body in \Dsavefieldname and
|
|
560 |
% \Dsavefieldbody, resp. It does not insert any text into the
|
|
561 |
% document.
|
|
562 |
#1%
|
|
563 |
% Recalculate the real field name width everytime we encounter a
|
|
564 |
% tabular list field because it may have been changed using a
|
|
565 |
% "raw" node.
|
|
566 |
\setlength{\Drealfieldnamewidth}{\Dtabularlistfieldnamewidth}%
|
|
567 |
\addtolength{\Drealfieldnamewidth}{\Dtabularlistfieldnamesep}%
|
|
568 |
\Dmakelistenvironment{%
|
|
569 |
\makebox[\Drealfieldnamewidth][l]{\Dsavefieldname}%
|
|
570 |
}{%
|
|
571 |
\setlength{\labelwidth}{\Drealfieldnamewidth}%
|
|
572 |
\setlength{\leftmargin}{\Drealfieldnamewidth}%
|
|
573 |
\setlength{\rightmargin}{0pt}%
|
|
574 |
\setlength{\labelsep}{0pt}%
|
|
575 |
}{%
|
|
576 |
\item%
|
|
577 |
\settowidth{\Dusedfieldnamewidth}{\Dsavefieldname}%
|
|
578 |
\setlength{\Dparskiptemp}{\parskip}%
|
|
579 |
\ifthenelse{%
|
|
580 |
\lengthtest{\Dusedfieldnamewidth>\Dtabularlistfieldnamewidth}%
|
|
581 |
}{%
|
|
582 |
\mbox{}\par%
|
|
583 |
\setlength{\parskip}{0pt}%
|
|
584 |
}{}%
|
|
585 |
\Dsavefieldbody%
|
|
586 |
\setlength{\parskip}{\Dparskiptemp}%
|
|
587 |
%XXX Why did we need this?
|
|
588 |
%\@finalstrut\@arstrutbox%
|
|
589 |
}%
|
|
590 |
\par%
|
|
591 |
}%
|
|
592 |
}
|
|
593 |
|
|
594 |
\providecommand{\Dformatfieldname}[1]{\textbf{#1:}}
|
|
595 |
\providecommand{\DNfieldlist}[1]{#1}
|
|
596 |
\providecommand{\DNfield}[1]{\Dtabularlistfield{#1}}
|
|
597 |
\providecommand{\DNfieldname}[1]{%
|
|
598 |
\Dtabularlistfieldname{%
|
|
599 |
\Dformatfieldname{#1}%
|
|
600 |
}%
|
|
601 |
}
|
|
602 |
\providecommand{\DNfieldbody}[1]{\Dtabularlistfieldbody{#1}}
|
|
603 |
|
|
604 |
\providecommand{\Dformatoptiongroup}[1]{%
|
|
605 |
% Format option group, e.g. "-f file, --input file".
|
|
606 |
\texttt{#1}%
|
|
607 |
}
|
|
608 |
\providecommand{\Dformatoption}[1]{%
|
|
609 |
% Format option, e.g. "-f file".
|
|
610 |
% Put into mbox to avoid line-breaking at spaces.
|
|
611 |
\mbox{#1}%
|
|
612 |
}
|
|
613 |
\providecommand{\Dformatoptionstring}[1]{%
|
|
614 |
% Format option string, e.g. "-f".
|
|
615 |
#1%
|
|
616 |
}
|
|
617 |
\providecommand{\Dformatoptionargument}[1]{%
|
|
618 |
% Format option argument, e.g. "file".
|
|
619 |
\textsl{#1}%
|
|
620 |
}
|
|
621 |
\providecommand{\Dformatoptiondescription}[1]{%
|
|
622 |
% Format option description, e.g.
|
|
623 |
% "\DNparagraph{Read input data from file.}"
|
|
624 |
#1%
|
|
625 |
}
|
|
626 |
\providecommand{\DNoptionlist}[1]{#1}
|
|
627 |
\providecommand{\Doptiongroupjoiner}{,{ }}
|
|
628 |
\providecommand{\Disfirstoption}{%
|
|
629 |
% Auxiliary macro indicating if a given option is the first child
|
|
630 |
% of its option group (if it's not, it has to preceded by
|
|
631 |
% \Doptiongroupjoiner).
|
|
632 |
false%
|
|
633 |
}
|
|
634 |
\providecommand{\DNoptionlistitem}[1]{%
|
|
635 |
\Dtabularlistfield{#1}%
|
|
636 |
}
|
|
637 |
\providecommand{\DNoptiongroup}[1]{%
|
|
638 |
\renewcommand{\Disfirstoption}{true}%
|
|
639 |
\Dtabularlistfieldname{\Dformatoptiongroup{#1}}%
|
|
640 |
}
|
|
641 |
\providecommand{\DNoption}[1]{%
|
|
642 |
% If this is not the first option in this option group, add a
|
|
643 |
% joiner.
|
|
644 |
\ifthenelse{\equal{\Disfirstoption}{true}}{%
|
|
645 |
\renewcommand{\Disfirstoption}{false}%
|
|
646 |
}{%
|
|
647 |
\Doptiongroupjoiner%
|
|
648 |
}%
|
|
649 |
\Dformatoption{#1}%
|
|
650 |
}
|
|
651 |
\providecommand{\DNoptionstring}[1]{\Dformatoptionstring{#1}}
|
|
652 |
\providecommand{\DNoptionargument}[1]{{ }\Dformatoptionargument{#1}}
|
|
653 |
\providecommand{\DNdescription}[1]{%
|
|
654 |
\Dtabularlistfieldbody{\Dformatoptiondescription{#1}}%
|
|
655 |
}
|
|
656 |
|
|
657 |
\providecommand{\DNdefinitionlist}[1]{%
|
|
658 |
\begin{description}%
|
|
659 |
\parskip0pt%
|
|
660 |
#1%
|
|
661 |
\end{description}%
|
|
662 |
}
|
|
663 |
\providecommand{\DNdefinitionlistitem}[1]{%
|
|
664 |
% LaTeX expects the label in square brackets; we provide an empty
|
|
665 |
% label.
|
|
666 |
\item[]#1%
|
|
667 |
}
|
|
668 |
\providecommand{\Dformatterm}[1]{#1}
|
|
669 |
\providecommand{\DNterm}[1]{\hspace{-5pt}\Dformatterm{#1}}
|
|
670 |
% I'm still not sure what's the best rendering for classifiers. The
|
|
671 |
% colon syntax is used by reStructuredText, so it's at least WYSIWYG.
|
|
672 |
% Use slanted text because italic would cause too much emphasis.
|
|
673 |
\providecommand{\Dformatclassifier}[1]{\textsl{#1}}
|
|
674 |
\providecommand{\DNclassifier}[1]{~:~\Dformatclassifier{#1}}
|
|
675 |
\providecommand{\Dformatdefinition}[1]{#1}
|
|
676 |
\providecommand{\DNdefinition}[1]{\par\Dformatdefinition{#1}}
|
|
677 |
|
|
678 |
\providecommand{\Dlineblockindentation}{2.5em}
|
|
679 |
\providecommand{\DNlineblock}[1]{%
|
|
680 |
\Dmakelistenvironment{}{%
|
|
681 |
\ifthenelse{\equal{\Dparent}{lineblock}}{%
|
|
682 |
% Parent is a line block, so indent.
|
|
683 |
\setlength{\leftmargin}{\Dlineblockindentation}%
|
|
684 |
}{%
|
|
685 |
% At top level; don't indent.
|
|
686 |
\setlength{\leftmargin}{0pt}%
|
|
687 |
}%
|
|
688 |
\setlength{\rightmargin}{0pt}%
|
|
689 |
\setlength{\parsep}{0pt}%
|
|
690 |
}{%
|
|
691 |
#1%
|
|
692 |
}%
|
|
693 |
}
|
|
694 |
\providecommand{\DNline}[1]{\item#1}
|
|
695 |
|
|
696 |
|
|
697 |
\providecommand{\DNtransition}{%
|
|
698 |
\raisebox{0.25em}{\parbox{\linewidth}{\hspace*{\fill}\hrulefill\hrulefill\hspace*{\fill}}}%
|
|
699 |
}
|
|
700 |
|
|
701 |
|
|
702 |
\providecommand{\Dformatblockquote}[1]{%
|
|
703 |
% Format contents of block quote.
|
|
704 |
% This occurs in block-level context, so we cannot use \textsl.
|
|
705 |
{\slshape#1}%
|
|
706 |
}
|
|
707 |
\providecommand{\Dformatattribution}[1]{---\textup{#1}}
|
|
708 |
\providecommand{\DNblockquote}[1]{%
|
|
709 |
\Dmakebox{%
|
|
710 |
\Dformatblockquote{#1}
|
|
711 |
}%
|
|
712 |
}
|
|
713 |
\providecommand{\DNattribution}[1]{%
|
|
714 |
\par%
|
|
715 |
\begin{flushright}\Dformatattribution{#1}\end{flushright}%
|
|
716 |
}
|
|
717 |
|
|
718 |
|
|
719 |
% Sidebars:
|
|
720 |
\RequirePackage{picins}
|
|
721 |
% Vertical and horizontal margins.
|
|
722 |
\Dprovidelength{\Dsidebarvmargin}{0.5em}
|
|
723 |
\Dprovidelength{\Dsidebarhmargin}{1em}
|
|
724 |
% Padding (space between contents and frame).
|
|
725 |
\Dprovidelength{\Dsidebarpadding}{1em}
|
|
726 |
% Frame width.
|
|
727 |
\Dprovidelength{\Dsidebarframewidth}{2\fboxrule}
|
|
728 |
% Position ("l" or "r").
|
|
729 |
\providecommand{\Dsidebarposition}{r}
|
|
730 |
% Width.
|
|
731 |
\Dprovidelength{\Dsidebarwidth}{0.45\linewidth}
|
|
732 |
\providecommand{\DNsidebar}[1]{
|
|
733 |
\parpic[\Dsidebarposition]{%
|
|
734 |
\begin{minipage}[t]{\Dsidebarwidth}%
|
|
735 |
% Doing this with nested minipages is ugly, but I haven't found
|
|
736 |
% another way to place vertical space before and after the fbox.
|
|
737 |
\vspace{\Dsidebarvmargin}%
|
|
738 |
{%
|
|
739 |
\setlength{\fboxrule}{\Dsidebarframewidth}%
|
|
740 |
\setlength{\fboxsep}{\Dsidebarpadding}%
|
|
741 |
\fbox{%
|
|
742 |
\begin{minipage}[t]{\linewidth}%
|
|
743 |
\setlength{\parindent}{\Dboxparindent}%
|
|
744 |
#1%
|
|
745 |
\end{minipage}%
|
|
746 |
}%
|
|
747 |
}%
|
|
748 |
\vspace{\Dsidebarvmargin}%
|
|
749 |
\end{minipage}%
|
|
750 |
}%
|
|
751 |
}
|
|
752 |
|
|
753 |
|
|
754 |
% Citations and footnotes.
|
|
755 |
\providecommand{\Dformatfootnote}[1]{%
|
|
756 |
% Format footnote.
|
|
757 |
{%
|
|
758 |
\footnotesize#1%
|
|
759 |
% \par is necessary for LaTeX to adjust baselineskip to the
|
|
760 |
% changed font size.
|
|
761 |
\par%
|
|
762 |
}%
|
|
763 |
}
|
|
764 |
\providecommand{\Dformatcitation}[1]{\Dformatfootnote{#1}}
|
|
765 |
\Dprovidelength{\Doriginalbaselineskip}{0pt}
|
|
766 |
\providecommand{\DNfootnotereference}[1]{%
|
|
767 |
{%
|
|
768 |
% \baselineskip is 0pt in \textsuperscript, so we save it here.
|
|
769 |
\setlength{\Doriginalbaselineskip}{\baselineskip}%
|
|
770 |
\textsuperscript{#1}%
|
|
771 |
}%
|
|
772 |
}
|
|
773 |
\providecommand{\DNcitationreference}[1]{{[}#1{]}}
|
|
774 |
\Dprovidelength{\Dfootnotesep}{3.5pt}
|
|
775 |
\providecommand{\Dsetfootnotespacing}{%
|
|
776 |
% Spacing commands executed at the beginning of footnotes.
|
|
777 |
\setlength{\parindent}{0pt}%
|
|
778 |
\hspace{1em}%
|
|
779 |
}
|
|
780 |
\providecommand{\DNfootnote}[1]{%
|
|
781 |
% See ltfloat.dtx for details.
|
|
782 |
{%
|
|
783 |
\insert\footins{%
|
|
784 |
\vspace{\Dfootnotesep}%
|
|
785 |
\Dsetfootnotespacing%
|
|
786 |
\Dformatfootnote{#1}%
|
|
787 |
}%
|
|
788 |
}%
|
|
789 |
}
|
|
790 |
\providecommand{\DNcitation}[1]{\DNfootnote{#1}}
|
|
791 |
\providecommand{\Dformatfootnotelabel}[1]{%
|
|
792 |
% Keep \footnotesize in footnote labels (\textsuperscript would
|
|
793 |
% reduce the font size even more).
|
|
794 |
\textsuperscript{\footnotesize#1{ }}%
|
|
795 |
}
|
|
796 |
\providecommand{\Dformatcitationlabel}[1]{{[}#1{]}{ }}
|
|
797 |
\providecommand{\Dformatmultiplebackrefs}[1]{%
|
|
798 |
% If in printing mode, do not write out multiple backrefs.
|
|
799 |
\ifthenelse{\equal{\Dprinting}{true}}{}{\textsl{#1}}%
|
|
800 |
}
|
|
801 |
\providecommand{\Dthislabel}{}
|
|
802 |
\providecommand{\DNlabel}[1]{%
|
|
803 |
\renewcommand{\Dthislabel}{#1}
|
|
804 |
\ifthenelse{\not\equal{\Dsinglebackref}{}}{%
|
|
805 |
\let\Doriginallabel=\Dthislabel%
|
|
806 |
\def\Dthislabel{%
|
|
807 |
\Dsinglefootnotebacklink{\Dsinglebackref}{\Doriginallabel}%
|
|
808 |
}%
|
|
809 |
}{}%
|
|
810 |
\ifthenelse{\equal{\Dparent}{footnote}}{%
|
|
811 |
% Footnote label.
|
|
812 |
\Dformatfootnotelabel{\Dthislabel}%
|
|
813 |
}{%
|
|
814 |
\ifthenelse{\equal{\Dparent}{citation}}{%
|
|
815 |
% Citation label.
|
|
816 |
\Dformatcitationlabel{\Dthislabel}%
|
|
817 |
}{}%
|
|
818 |
}%
|
|
819 |
% If there are multiple backrefs, add them now.
|
|
820 |
\Dformatmultiplebackrefs{\Dmultiplebackrefs}%
|
|
821 |
}
|
|
822 |
\providecommand{\Dsinglefootnotebacklink}[2]{%
|
|
823 |
% Create normal backlink of a footnote label. Parameters:
|
|
824 |
% 1. ID.
|
|
825 |
% 2. Link text.
|
|
826 |
% Treat like a footnote reference.
|
|
827 |
\Dimplicitfootnotereference{\##1}{#2}%
|
|
828 |
}
|
|
829 |
\providecommand{\Dmultifootnotebacklink}[2]{%
|
|
830 |
% Create generated backlink, as in (1, 2). Parameters:
|
|
831 |
% 1. ID.
|
|
832 |
% 2. Link text.
|
|
833 |
% Treat like a footnote reference.
|
|
834 |
\Dimplicitfootnotereference{\##1}{#2}%
|
|
835 |
}
|
|
836 |
\providecommand{\Dsinglecitationbacklink}[2]{\Dsinglefootnotebacklink{#1}{#2}}
|
|
837 |
\providecommand{\Dmulticitationbacklink}[2]{\Dmultifootnotebacklink{#1}{#2}}
|
|
838 |
|
|
839 |
|
|
840 |
\RequirePackage{longtable}
|
|
841 |
\providecommand{\Dmaketable}[2]{%
|
|
842 |
% Make table. Parameters:
|
|
843 |
% 1. Table spec (like "|p|p|").
|
|
844 |
% 2. Table contents.
|
|
845 |
{%
|
|
846 |
\renewcommand{\Dinsidetabular}{true}%
|
|
847 |
\begin{longtable}{#1}%
|
|
848 |
\hline%
|
|
849 |
#2%
|
|
850 |
\end{longtable}%
|
|
851 |
}%
|
|
852 |
}
|
|
853 |
\providecommand{\DNthead}[1]{%
|
|
854 |
#1%
|
|
855 |
\endhead%
|
|
856 |
}
|
|
857 |
\providecommand{\DNrow}[1]{%
|
|
858 |
#1\tabularnewline%
|
|
859 |
\hline%
|
|
860 |
}
|
|
861 |
\providecommand{\Dcolspan}[2]{%
|
|
862 |
% Take care of the morecols attribute (but incremented by 1).
|
|
863 |
&\multicolumn{#1}{l|}{#2}%
|
|
864 |
}
|
|
865 |
\providecommand{\Dcolspanleft}[2]{%
|
|
866 |
% Like \Dmorecols, but called for the leftmost entries in a table
|
|
867 |
% row.
|
|
868 |
\multicolumn{#1}{|l|}{#2}%
|
|
869 |
}
|
|
870 |
\providecommand{\Dsubsequententry}[1]{%
|
|
871 |
%
|
|
872 |
}
|
|
873 |
% \DNentry is not used because we set the ampersand ("&") in the
|
|
874 |
% \DAcolspan... macros.
|
|
875 |
\providecommand{\DAtableheaderentry}[5]{\Dformattableheaderentry{#5}}
|
|
876 |
\providecommand{\Dformattableheaderentry}[1]{{\bfseries#1}}
|
|
877 |
|
|
878 |
|
|
879 |
\providecommand{\DNsystemmessage}[1]{%
|
|
880 |
{%
|
|
881 |
\ifthenelse{\equal{\Dprinting}{false}}{\color{red}}{}%
|
|
882 |
\bfseries%
|
|
883 |
#1%
|
|
884 |
}%
|
|
885 |
}
|
|
886 |
|
|
887 |
|
|
888 |
\providecommand{\Dinsidehalign}{false}
|
|
889 |
\newsavebox{\Dalignedimagebox}
|
|
890 |
\Dprovidelength{\Dalignedimagewidth}{0pt}
|
|
891 |
\providecommand{\Dhalign}[2]{%
|
|
892 |
% Horizontally align the contents to the left or right so that the
|
|
893 |
% text flows around it.
|
|
894 |
% Parameters:
|
|
895 |
% 1. l or r
|
|
896 |
% 2. Contents.
|
|
897 |
\renewcommand{\Dinsidehalign}{true}%
|
|
898 |
% For some obscure reason \parpic consumes some vertical space.
|
|
899 |
\vspace{-3pt}%
|
|
900 |
% Now we do something *really* ugly, but this enables us to wrap the
|
|
901 |
% image in a minipage while still allowing tight frames when
|
|
902 |
% class=border (see \DNimageCborder).
|
|
903 |
\sbox{\Dalignedimagebox}{#2}%
|
|
904 |
\settowidth{\Dalignedimagewidth}{\usebox{\Dalignedimagebox}}%
|
|
905 |
\parpic[#1]{%
|
|
906 |
\begin{minipage}[b]{\Dalignedimagewidth}%
|
|
907 |
% Compensate for previously added space, but not entirely.
|
|
908 |
\vspace*{2.0pt}%
|
|
909 |
\vspace*{\Dfloatimagetopmargin}%
|
|
910 |
\usebox{\Dalignedimagebox}%
|
|
911 |
\vspace*{1.5pt}%
|
|
912 |
\vspace*{\Dfloatimagebottommargin}%
|
|
913 |
\end{minipage}%
|
|
914 |
}%
|
|
915 |
\renewcommand{\Dinsidehalign}{false}%
|
|
916 |
}
|
|
917 |
|
|
918 |
|
|
919 |
\RequirePackage{graphicx}
|
|
920 |
% Maximum width of an image.
|
|
921 |
\providecommand{\Dimagemaxwidth}{\linewidth}
|
|
922 |
\providecommand{\Dfloatimagemaxwidth}{0.5\linewidth}
|
|
923 |
% Auxiliary variable.
|
|
924 |
\Dprovidelength{\Dcurrentimagewidth}{0pt}
|
|
925 |
\providecommand{\DNimageAalign}[5]{%
|
|
926 |
\ifthenelse{\equal{#3}{left}}{%
|
|
927 |
\Dhalign{l}{#5}%
|
|
928 |
}{%
|
|
929 |
\ifthenelse{\equal{#3}{right}}{%
|
|
930 |
\Dhalign{r}{#5}%
|
|
931 |
}{%
|
|
932 |
\ifthenelse{\equal{#3}{center}}{%
|
|
933 |
% Text floating around centered figures is a bad idea. Thus
|
|
934 |
% we use a center environment. Note that no extra space is
|
|
935 |
% added by the writer, so the space added by the center
|
|
936 |
% environment is fine.
|
|
937 |
\begin{center}#5\end{center}%
|
|
938 |
}{%
|
|
939 |
#5%
|
|
940 |
}%
|
|
941 |
}%
|
|
942 |
}%
|
|
943 |
}
|
|
944 |
% Base path for images.
|
|
945 |
\providecommand{\Dimagebase}{}
|
|
946 |
% Auxiliary command. Current image path.
|
|
947 |
\providecommand{\Dimagepath}{}
|
|
948 |
\providecommand{\DNimageAuri}[5]{%
|
|
949 |
% Insert image. We treat the URI like a path here.
|
|
950 |
\renewcommand{\Dimagepath}{\Dimagebase#3}%
|
|
951 |
\Difdefined{DcurrentNimageAwidth}{%
|
|
952 |
\Dwidthimage{\DcurrentNimageAwidth}{\Dimagepath}%
|
|
953 |
}{%
|
|
954 |
\Dsimpleimage{\Dimagepath}%
|
|
955 |
}%
|
|
956 |
}
|
|
957 |
\Dprovidelength{\Dfloatimagevmargin}{0pt}
|
|
958 |
\providecommand{\Dfloatimagetopmargin}{\Dfloatimagevmargin}
|
|
959 |
\providecommand{\Dfloatimagebottommargin}{\Dfloatimagevmargin}
|
|
960 |
\providecommand{\Dwidthimage}[2]{%
|
|
961 |
% Image with specified width.
|
|
962 |
% Parameters:
|
|
963 |
% 1. Image width.
|
|
964 |
% 2. Image path.
|
|
965 |
% Need to make bottom-alignment dependent on align attribute (add
|
|
966 |
% functional test first). Need to observe height attribute.
|
|
967 |
%\begin{minipage}[b]{#1}%
|
|
968 |
\includegraphics[width=#1,height=\textheight,keepaspectratio]{#2}%
|
|
969 |
%\end{minipage}%
|
|
970 |
}
|
|
971 |
\providecommand{\Dcurrentimagemaxwidth}{}
|
|
972 |
\providecommand{\Dsimpleimage}[1]{%
|
|
973 |
% Insert image, without much parametrization.
|
|
974 |
\settowidth{\Dcurrentimagewidth}{\includegraphics{#1}}%
|
|
975 |
\ifthenelse{\equal{\Dinsidehalign}{true}}{%
|
|
976 |
\renewcommand{\Dcurrentimagemaxwidth}{\Dfloatimagemaxwidth}%
|
|
977 |
}{%
|
|
978 |
\renewcommand{\Dcurrentimagemaxwidth}{\Dimagemaxwidth}%
|
|
979 |
}%
|
|
980 |
\ifthenelse{\lengthtest{\Dcurrentimagewidth>\Dcurrentimagemaxwidth}}{%
|
|
981 |
\Dwidthimage{\Dcurrentimagemaxwidth}{#1}%
|
|
982 |
}{%
|
|
983 |
\Dwidthimage{\Dcurrentimagewidth}{#1}%
|
|
984 |
}%
|
|
985 |
}
|
|
986 |
\providecommand{\Dwidthimage}[2]{%
|
|
987 |
% Image with specified width.
|
|
988 |
% Parameters:
|
|
989 |
% 1. Image width.
|
|
990 |
% 2. Image path.
|
|
991 |
\Dwidthimage{#1}{#2}%
|
|
992 |
}
|
|
993 |
|
|
994 |
% Figures.
|
|
995 |
\providecommand{\DNfigureAalign}[5]{%
|
|
996 |
% Hack to make it work Right Now.
|
|
997 |
%\def\DcurrentNimageAwidth{\DcurrentNfigureAwidth}%
|
|
998 |
%
|
|
999 |
%\def\DcurrentNimageAwidth{\linewidth}%
|
|
1000 |
\DNimageAalign{#1}{#2}{#3}{#4}{%
|
|
1001 |
\begin{minipage}[b]{0.4\linewidth}#5\end{minipage}}%
|
|
1002 |
%\let\DcurrentNimageAwidth=\relax%
|
|
1003 |
%
|
|
1004 |
%\let\DcurrentNimageAwidth=\relax%
|
|
1005 |
}
|
|
1006 |
\providecommand{\DNcaption}[1]{\par\noindent{\slshape#1}}
|
|
1007 |
\providecommand{\DNlegend}[1]{\Dauxiliaryspace#1}
|
|
1008 |
|
|
1009 |
\providecommand{\DCborder}[1]{\fbox{#1}}
|
|
1010 |
% No padding between image and border.
|
|
1011 |
\providecommand{\DNimageCborder}[1]{\frame{#1}}
|
|
1012 |
|
|
1013 |
|
|
1014 |
% Need to replace with language-specific stuff. Maybe look at
|
|
1015 |
% csquotes.sty and ask the author for permission to use parts of it.
|
|
1016 |
\providecommand{\Dtextleftdblquote}{``}
|
|
1017 |
\providecommand{\Dtextrightdblquote}{''}
|
|
1018 |
|
|
1019 |
% Table of contents:
|
|
1020 |
\Dprovidelength{\Dtocininitialsectnumwidth}{2.4em}
|
|
1021 |
\Dprovidelength{\Dtocadditionalsectnumwidth}{0.7em}
|
|
1022 |
% Level inside a table of contents. While this is at -1, we are not
|
|
1023 |
% inside a TOC.
|
|
1024 |
\Dprovidecounter{Dtoclevel}%
|
|
1025 |
\setcounter{Dtoclevel}{-1}
|
|
1026 |
\providecommand{\Dlocaltoc}{false}%
|
|
1027 |
\providecommand{\DNtopicClocal}[1]{%
|
|
1028 |
\renewcommand{\Dlocaltoc}{true}%
|
|
1029 |
\addtolength{\Dtocsectnumwidth}{2\Dtocadditionalsectnumwidth}%
|
|
1030 |
\addtolength{\Dtocindent}{-2\Dtocadditionalsectnumwidth}%
|
|
1031 |
#1%
|
|
1032 |
\addtolength{\Dtocindent}{2\Dtocadditionalsectnumwidth}%
|
|
1033 |
\addtolength{\Dtocsectnumwidth}{-2\Dtocadditionalsectnumwidth}%
|
|
1034 |
\renewcommand{\Dlocaltoc}{false}%
|
|
1035 |
}
|
|
1036 |
\Dprovidelength{\Dtocindent}{0pt}%
|
|
1037 |
\Dprovidelength{\Dtocsectnumwidth}{\Dtocininitialsectnumwidth}
|
|
1038 |
% Compensate for one additional TOC indentation space so that the
|
|
1039 |
% top-level is unindented.
|
|
1040 |
\addtolength{\Dtocsectnumwidth}{-\Dtocadditionalsectnumwidth}
|
|
1041 |
\addtolength{\Dtocindent}{-\Dtocsectnumwidth}
|
|
1042 |
\providecommand{\Difinsidetoc}[2]{%
|
|
1043 |
\ifthenelse{\not\equal{\theDtoclevel}{-1}}{#1}{#2}%
|
|
1044 |
}
|
|
1045 |
\providecommand{\DNgeneratedCsectnum}[1]{%
|
|
1046 |
\Difinsidetoc{%
|
|
1047 |
% Section number inside TOC.
|
|
1048 |
\makebox[\Dtocsectnumwidth][l]{#1}%
|
|
1049 |
}{%
|
|
1050 |
% Section number inside section title.
|
|
1051 |
#1\quad%
|
|
1052 |
}%
|
|
1053 |
}
|
|
1054 |
\providecommand{\Dtocbulletlist}[1]{%
|
|
1055 |
\addtocounter{Dtoclevel}{1}%
|
|
1056 |
\addtolength{\Dtocindent}{\Dtocsectnumwidth}%
|
|
1057 |
\addtolength{\Dtocsectnumwidth}{\Dtocadditionalsectnumwidth}%
|
|
1058 |
#1%
|
|
1059 |
\addtolength{\Dtocsectnumwidth}{-\Dtocadditionalsectnumwidth}%
|
|
1060 |
\addtolength{\Dtocindent}{-\Dtocsectnumwidth}%
|
|
1061 |
\addtocounter{Dtoclevel}{-1}%
|
|
1062 |
}
|
|
1063 |
|
|
1064 |
|
|
1065 |
% For \Dpixelunit, the length value is pre-multiplied with 0.75, so by
|
|
1066 |
% specifying "pt" we get the same notion of "pixel" as graphicx.
|
|
1067 |
\providecommand{\Dpixelunit}{pt}
|
|
1068 |
% Normally lengths are relative to the current linewidth.
|
|
1069 |
\providecommand{\Drelativeunit}{\linewidth}
|
|
1070 |
|
|
1071 |
|
|
1072 |
%\RequirePackage{fixmath}
|
|
1073 |
%\RequirePackage{amsmath}
|
|
1074 |
|
|
1075 |
|
|
1076 |
\DSfontencoding
|
|
1077 |
\DSlanguage
|
|
1078 |
\DSlinks
|
|
1079 |
\DSsymbols
|
|
1080 |
\DSlate
|
|
1081 |
|
|
1082 |
\makeatother
|