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