summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore7
-rwxr-xr-xbuild/add-math-kleen-org.hs13
-rwxr-xr-xbuild/extract-title.hs16
-rw-r--r--build/preamble.tex253
-rw-r--r--build/preview/preview.dtx1872
-rw-r--r--build/preview/preview.ins44
-rw-r--r--build/preview/preview.sty.do4
-rw-r--r--build/template.html561
-rwxr-xr-xbuild/tex-filter.hs58
-rw-r--r--clean.do3
-rw-r--r--default.do2
-rw-r--r--default.html.do13
-rw-r--r--default.svg.do20
-rwxr-xr-xdo177
-rw-r--r--index.md.do18
l---------lists/all/0011
l---------lists/all/0021
l---------lists/all/0031
-rw-r--r--lists/all/title1
-rw-r--r--lists/default.md.do24
l---------lists/stuff/0011
l---------lists/stuff/0021
-rw-r--r--lists/stuff/title1
-rw-r--r--posts/blub.md40
-rw-r--r--posts/blub2.md40
-rw-r--r--posts/blub3.md40
-rw-r--r--style.css64
27 files changed, 2776 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..936b9f9
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
1.do_built*
2build/preview/*
3!build/preview/preview.dtx
4!build/preview/preview.ins
5!build/preview/preview.sty.do
6htdocs
7nginx \ No newline at end of file
diff --git a/build/add-math-kleen-org.hs b/build/add-math-kleen-org.hs
new file mode 100755
index 0000000..e564149
--- /dev/null
+++ b/build/add-math-kleen-org.hs
@@ -0,0 +1,13 @@
1#!/usr/bin/env runhaskell
2
3import Data.Map
4import Text.Pandoc.Pretty
5import Text.Pandoc.JSON
6import System.IO
7
8add_title :: Pandoc -> Pandoc
9add_title (Pandoc m bs) = Pandoc (add_title' m) bs
10 where add_title' m@(Meta map) = Meta $ insert "title" (MetaInlines $ [Link [Str "math.kleen.org:"] ("/","math.kleen.org"), Space] ++ docTitle m) map
11
12main :: IO ()
13main = toJSONFilter add_title
diff --git a/build/extract-title.hs b/build/extract-title.hs
new file mode 100755
index 0000000..f3ca1ba
--- /dev/null
+++ b/build/extract-title.hs
@@ -0,0 +1,16 @@
1#!/usr/bin/env runhaskell
2
3import Text.Pandoc.Pretty
4import Text.Pandoc.JSON
5import System.IO
6
7extract_title :: Pandoc -> IO Pandoc
8extract_title d@(Pandoc m _) = do hPutStrLn stderr $ render Nothing $ cat $ map pretty (docTitle m)
9 return d
10 where pretty :: Inline -> Doc
11 pretty (Str s) = text s
12 pretty Space = space
13 pretty _ = empty
14
15main :: IO ()
16main = toJSONFilter extract_title
diff --git a/build/preamble.tex b/build/preamble.tex
new file mode 100644
index 0000000..b996382
--- /dev/null
+++ b/build/preamble.tex
@@ -0,0 +1,253 @@
1\documentclass[14pt,preview,border=1pt,class=extarticle]{standalone}
2
3\usepackage{amssymb}
4\usepackage{amsmath}
5\usepackage{etoolbox}
6
7\usepackage{tikz}
8\usetikzlibrary{arrows,decorations.markings,chains,calc,matrix}
9\usepackage{tikz-cd}
10\tikzset{>=cm to}
11
12\usepackage{mathtools}
13
14\undef\Re
15\undef\Im
16
17\DeclareMathOperator{\colim}{\textnormal{colim}}
18\DeclareMathOperator{\Spec}{\textnormal{Spec}}
19\DeclareMathOperator{\im}{\textnormal{im}}
20\DeclareMathOperator{\Sing}{\textnormal{Sing}}
21\DeclareMathOperator{\Map}{\textnormal{Map}}
22\DeclareMathOperator{\InnHom}{\textnormal{\textbf{Hom}}}
23\DeclareMathOperator{\Hom}{\textnormal{Hom}}
24\undef\hom
25\DeclareMathOperator{\hom}{\textnormal{hom}}
26\DeclareMathOperator{\nerve}{\textnormal{N}}
27\DeclareMathOperator{\simpnerve}{\textnormal{sN}}
28\DeclareMathOperator{\core}{\textnormal{Core}}
29\DeclareMathOperator{\id}{\textnormal{id}}
30\undef\lim
31\DeclareMathOperator{\lim}{\textnormal{lim}}
32\DeclareMathOperator{\Op}{\textnormal{op}}
33\DeclareMathOperator{\yon}{\textnormal{y}}
34\DeclareMathOperator{\HomL}{\textnormal{\textbf{Hom}}^{\textnormal{L}}}
35\DeclareMathOperator{\sk}{\textnormal{sk}}
36\DeclareMathOperator{\cosk}{\textnormal{cosk}}
37\DeclareMathOperator{\thom}{\textnormal{Th}}
38\DeclareMathOperator{\Bl}{\textnormal{Bl}}
39\DeclareMathOperator{\Stab}{\textnormal{Stab}}
40
41\newcommand*{\alg}[1]{\ensuremath{\overline{#1}}\xspace}
42\newcommand*{\sep}[1]{\ensuremath{#1^{\textnormal{sep}}}\xspace}
43\newcommand*{\ab}[1]{\ensuremath{#1^{\textnormal{ab}}}\xspace}
44\newcommand*{\units}[1]{\ensuremath{#1^\times}\xspace}
45\newcommand*{\lapl}{\Delta}
46\newcommand*{\grad}{\nabla}
47\newcommand*{\op}[1]{\ensuremath{#1^{\textnormal{op}}}\xspace}
48\newcommand*{\codiag}[1]{\ensuremath{\nabla\mkern-3mu_{#1}}\xspace}
49\newcommand*{\diag}[1]{\ensuremath{\Delta_{#1}}\xspace}
50
51\newcommand*{\cech}{\v{C}ech\xspace}
52\newcommand*{\mc}{\operatorname{\textnormal{\v{C}}}}
53
54\newcommand*{\normal}{\lhd}
55\newcommand*{\isom}{\cong}
56\newcommand*{\homot}{\sim}
57\newcommand*{\cequiv}{\simeq}
58
59\makeatletter
60\let\@oldsubset=\subset
61\def\@subsethelper#1#2{\mathrel{\raisebox{.5pt}{$#1\@oldsubset$}}\xspace}
62\DeclareRobustCommand*{\subset}{\mathpalette\@subsethelper\relax}
63
64\let\@oldotimes=\otimes
65\def\@otimeshelper#1#2{\mathrel{\raisebox{.5pt}{$#1\@oldotimes$}}\xspace}
66\DeclareRobustCommand*{\otimes}{\mathpalette\@otimeshelper\relax}
67\makeatother
68
69\tikzset{/tikz/commutative diagrams/arrows={thin}}
70
71\makeatletter
72\newbox\@xrat
73\renewcommand*{\xrightarrow}[2][-cm to]{%
74 \setbox\@xrat=\hbox{\ensuremath{\scriptstyle #2}}
75 \pgfmathsetlengthmacro{\@xratlen}{max(1.6em,\wd\@xrat+.6em)}
76 \pgfmathsetlengthmacro{\@xratinnersep}{.5ex-\dp\@xrat}
77 \mathrel{\tikz [#1,baseline=-.6ex]
78 \draw (0,0) -- node[auto,inner sep=\@xratinnersep] {\box\@xrat} (\@xratlen,0) ;}}
79\renewcommand*{\xleftarrow}[2][cm to-]{%
80 \setbox\@xrat=\hbox{\ensuremath{\scriptstyle #2}}
81 \pgfmathsetlengthmacro{\@xratlen}{max(1.6em,\wd\@xrat+.6em)}
82 \pgfmathsetlengthmacro{\@xratinnersep}{.5ex-\dp\@xrat}
83 \mathrel{\tikz [#1,baseline=-.6ex]
84 \draw (0,0) -- node[auto,inner sep=\@xratinnersep] {\box\@xrat} (\@xratlen,0) ;}}
85\newcommand*{\xrightarrowb}[2][-cm to]{%
86 \setbox\@xrat=\hbox{\ensuremath{\scriptstyle #2}}
87 \pgfmathsetlengthmacro{\@xratlen}{max(1.6em,\wd\@xrat+.6em)}
88 \pgfmathsetlengthmacro{\@xratinnersep}{.5ex}
89 \mathrel{\tikz [#1,baseline=-.6ex]
90 \draw (0,0) -- node[auto,inner sep=\@xratinnersep] {\box\@xrat} (\@xratlen,0) ;}}
91\newcommand*{\xleftarrowb}[2][cm to-]{%
92 \setbox\@xrat=\hbox{\ensuremath{\scriptstyle #2}}
93 \pgfmathsetlengthmacro{\@xratlen}{max(1.6em,\wd\@xrat+.6em)}
94 \pgfmathsetlengthmacro{\@xratinnersep}{.5ex}
95 \mathrel{\tikz [#1,baseline=-.6ex]
96 \draw (0,0) -- node[auto,inner sep=\@xratinnersep] {\box\@xrat} (\@xratlen,0) ;}}
97
98\pgfarrowsdeclare{my right hook}{my right hook}
99{
100\arrowsize=0.2pt
101\advance\arrowsize by .5\pgflinewidth
102\pgfarrowsleftextend{-.5\pgflinewidth}
103\pgfarrowsrightextend{3.5\arrowsize+.5\pgflinewidth}
104}
105{
106\arrowsize=0.2pt
107\advance\arrowsize by .5\pgflinewidth
108\pgfsetdash{}{0pt} % do not dash
109\pgfsetroundjoin % fix join
110\pgfsetroundcap % fix cap
111\pgfpathmoveto{\pgfpoint{0\arrowsize}{-7\arrowsize}}
112\pgfpatharc{-90}{90}{3.5\arrowsize}
113\pgfusepathqstroke
114}
115
116\tikzset{%
117 iso/.style={above,sloped,inner sep=0},
118 iso'/.style={below,sloped,inner sep=0},
119 to/.style={-cm to},
120 onto/.style={-cm double to},
121 into/.style={my right hook-cm to},
122 mapsto/.style={|-cm to},
123 clim/.style={decoration={markings,
124 mark=at position#1 with {\draw[-] (0,-3\pgflinewidth) -- (0,3\pgflinewidth);}},
125 postaction=decorate},
126 clim/.default=0.5,
127 opim/.style={decoration={markings,
128 mark=at position#1 with {\draw[-] circle(3\pgflinewidth);}},
129 postaction=decorate},
130 opim/.default=0.5
131}
132
133\newcommand*\@tikzto[2]{\mathrel{\begin{tikzpicture}[baseline]%
134 \draw[to,line width={#2\pgflinewidth},scale=#1](0,.55ex) -- (1.6em,.55ex);%
135 \end{tikzpicture}}}
136
137\newcommand*\@tikzcto[2]{\mathrel{\begin{tikzpicture}[baseline]%
138 \draw[to,line width={#2\pgflinewidth},scale=#1](0,.55ex) -- (0.8em,.55ex);%
139 \end{tikzpicture}}}
140
141\newcommand*\@tikzonto[2]{\mathrel{\begin{tikzpicture}[baseline]%
142 \draw[onto,line width={#2\pgflinewidth},scale=#1](0,.55ex) -- (1.6em,.55ex);%
143 \end{tikzpicture}}}
144
145\newcommand*\@tikzinto[2]{\mathrel{\begin{tikzpicture}[baseline]%
146 \draw[into,line width={#2\pgflinewidth},scale=#1](0,.55ex) -- (1.6em,.55ex);%
147 \end{tikzpicture}}}
148
149\newcommand*\@tikzclim[2]{\mathrel{\begin{tikzpicture}[baseline]%
150 \draw[into,clim,line width={#2\pgflinewidth},scale=#1](0,.55ex) -- (1.6em,.55ex);%
151 \end{tikzpicture}}}
152
153\newcommand*\@tikzopim[2]{\mathrel{\begin{tikzpicture}[baseline]%
154 \draw[into,opim,line width={#2\pgflinewidth},scale=#1](0,.55ex) -- (1.6em,.55ex);%
155 \end{tikzpicture}}}
156
157\newcommand*\@tikzmapsto[2]{\mathrel{\begin{tikzpicture}[baseline]%
158 \draw[mapsto,line width={#2\pgflinewidth},scale=#1](0,.55ex) -- (1.6em,.55ex);%
159 \end{tikzpicture}}}
160
161\newcommand*\@tikziso[4]{\mathrel{\begin{tikzpicture}[baseline]%
162 \draw[to,line width={#2\pgflinewidth},scale=#1](0,.55ex) -- node[iso,pos=0.47,inner sep=#4]{$#3\sim$} (1.6em,.55ex);%
163 \end{tikzpicture}}}
164
165\newcommand*\tikzto{\mathchoice{\@tikzto{1.0}{1}}{\@tikzto{1.0}{1}}{\@tikzcto{0.8}{0.9}}{\@tikzcto{0.6}{0.75}}}
166\newcommand*\tikzcto{\mathchoice{\@tikzcto{1.0}{1}}{\@tikzcto{1.0}{1}}{\@tikzcto{0.8}{0.9}}{\@tikzcto{0.6}{0.75}}}
167\newcommand*\tikzonto{\mathchoice{\@tikzonto{1.0}{1}}{\@tikzonto{1.0}{1}}{\@tikzonto{0.8}{0.9}}{\@tikzonto{0.6}{0.75}}}
168\newcommand*\tikzinto{\mathchoice{\@tikzinto{1.0}{1}}{\@tikzinto{1.0}{1}}{\@tikzinto{0.8}{0.9}}{\@tikzinto{0.6}{0.75}}}
169\newcommand*\tikzclim{\mathchoice{\@tikzclim{1.0}{1}}{\@tikzclim{1.0}{1}}{\@tikzclim{0.8}{0.9}}{\@tikzclim{0.6}{0.75}}}
170\newcommand*\tikzopim{\mathchoice{\@tikzopim{1.0}{1}}{\@tikzopim{1.0}{1}}{\@tikzopim{0.8}{0.9}}{\@tikzopim{0.6}{0.75}}}
171\newcommand*\tikzmapsto{\mathchoice{\@tikzmapsto{1.0}{1}}{\@tikzmapsto{1.0}{1}}{\@tikzmapsto{0.8}{0.9}}{\@tikzmapsto{0.6}{0.75}}}
172\newcommand*\tikziso{\mathchoice{\@tikziso{1.0}{1}{\displaystyle}{0pt}}%
173 {\@tikziso{1.0}{1}{\textstyle}{0pt}}%
174 {\@tikziso{0.8}{0.9}{\scriptstyle}{0pt}}%
175 {\@tikziso{0.67}{0.8}{\scriptscriptstyle}{0.15ex}}}
176\makeatother
177
178\renewcommand*{\to}[1][]{\ifthenelse{\isempty{#1}}{\tikzto}{\xrightarrowb{#1}}}
179\newcommand*{\cto}{\ensuremath{\tikzcto}}
180\newcommand*{\into}[1][]{\ifthenelse{\isempty{#1}}{\tikzinto}{\xrightarrowb[into]{#1}}}
181\newcommand*{\onto}[1][]{\ifthenelse{\isempty{#1}}{\tikzonto}{\xrightarrowb[onto]{#1}}}
182\newcommand*{\clim}{\tikzclim}
183\newcommand*{\opim}{\tikzopim}
184
185\newcommand*{\iso}{\tikziso}
186
187\renewcommand*{\mapsto}{\tikzmapsto}
188
189\newcommand*{\ca}[1]{\ensuremath{\mathscr{#1}}\xspace}
190\renewcommand*{\cal}[1]{\ensuremath{\mathcal{#1}}\xspace}
191\newcommand*{\f}[1]{\ensuremath{\mathfrak{#1}}\xspace}
192
193\newcommand{\cl}[2][0]{{}\mkern#1mu\overline{\mkern-#1mu#2}}
194\newcommand*{\Int}[1]{\ensuremath{#1^\circ}\xspace}
195
196\newcommand*{\infcat}[1][1]{\((\infty,#1)\)–category\xspace}
197\newcommand*{\linfcat}{\(\infty\)–category\xspace}
198\newcommand*{\infcats}[1][1]{\((\infty,#1)\)–categories\xspace}
199\newcommand*{\linfcats}{\(\infty\)–categories\xspace}
200\newcommand*{\Cat}{\textnormal{\textsf{Cat}}}
201\newcommand*{\spc}{\textnormal{\textbf{Spc}}}
202\newcommand*{\ICat}{\textnormal{\textbf{Cat}}}
203\newcommand*{\infpshv}{\operatorname{\textnormal{\textbf{PShv}}}}
204\newcommand*{\infshv}{\operatorname{\textnormal{\textbf{Sh}}}}
205\newcommand*{\hypshv}{\operatorname{\widehat{\textnormal{\textbf{Sh}}}}}
206\newcommand*{\hyp}[1][]{\operatorname{\ca H}^{#1}\mkern-2mu}
207\newcommand*{\phyp}[1][]{\operatorname{\ca H}^{#1}_{\bullet}\mkern-2mu}
208\newcommand*{\sh}{\operatorname{\ca{SH}}}
209\newcommand*{\shv}{\operatorname{\textnormal{\textsf{Shv}}}}
210\newcommand*{\pshv}{\operatorname{\textnormal{\textsf{PShv}}}}
211\newcommand*{\Aff}{\operatorname{\textnormal{\textsf{Aff}}}}
212\newcommand*{\Ring}{\operatorname{\textnormal{\textsf{Ring}}}}
213\newcommand*{\Alg}{\operatorname{\textnormal{\textsf{Alg}}}}
214\newcommand*{\Disc}{\operatorname{\textnormal{\textsf{Disc}}}}
215\newcommand*{\mfd}{\operatorname{\textnormal{\textsf{Mfd}}}}
216\newcommand*{\sm}[1][k]{\mathop{\textnormal{\textsf{Sm}}/k}}
217\newcommand*{\Simp}{\mathbf{\Delta}}
218\newcommand*{\sset}{\operatorname{\textnormal{\textsf{sSet}}}}
219\newcommand*{\ssetQ}{\operatorname{\textnormal{\textsf{sSet}}_{\textnormal{\textsf{Q}}}}}
220\newcommand*{\ssetJ}{\operatorname{\textnormal{\textsf{sSet}}_{\textnormal{\textsf{J}}}}}
221\newcommand*{\Top}{\operatorname{\textnormal{\textsf{Top}}}}
222\newcommand*{\qcat}{\operatorname{\textnormal{\textsf{qCat}}_{2}}}
223\newcommand*{\Fin}{\operatorname{\textnormal{\textsf{Fin}}_{*}}}
224\newcommand*{\tang}[1]{\textnormal{T}\mkern-2mu_{#1}}
225\newcommand*{\dual}[1]{\textnormal{D}#1}
226
227\def\<#1>{\left\langle #1 \right\rangle}
228
229\newcommand{\dd}[1][]{%
230 \mathrm{d}%
231 \if\relax\detokenize{#1}\relax%
232 \else%
233 ^{#1}\mkern-1.5mu%
234 \fi%
235}
236
237\newcommand{\Diff}[1][]{%
238 \mathrm{D}%
239 \if\relax\detokenize{#1}\relax%
240 \else%
241 ^{#1}\m
242 kern-1.5mu%
243 \fi%
244}
245
246\newcommand{\ddd}[1][]{%
247 \mathop{}\!\dd[#1]%
248}
249
250\undef\AA
251\undef\SS
252\renewcommand*{\do}[1]{\expandafter\def\csname#1#1\endcsname{\ensuremath{\mathbb{#1}}\xspace}}
253\docsvlist{A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z}
diff --git a/build/preview/preview.dtx b/build/preview/preview.dtx
new file mode 100644
index 0000000..0675c27
--- /dev/null
+++ b/build/preview/preview.dtx
@@ -0,0 +1,1872 @@
1% \iffalse
2%% The preview style for extracting previews from LaTeX documents.
3%% Developed as part of AUCTeX <URL:http://www.gnu.org/software/auctex>.
4%
5% Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006,
6% 2010 Free Software Foundation
7%
8% This program is free software; you can redistribute it and/or modify
9% it under the terms of the GNU General Public License as published by
10% the Free Software Foundation; either version 3 of the License, or
11% (at your option) any later version.
12%
13% This program is distributed in the hope that it will be useful,
14% but WITHOUT ANY WARRANTY; without even the implied warranty of
15% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16% GNU General Public License for more details.
17%
18% You should have received a copy of the GNU General Public License
19% along with this program; if not, write to the
20% Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
21% Boston, MA 02110-1301 USA
22% \fi
23% \CheckSum{1758}
24% \GetFileInfo{preview.sty}
25% \date{\filedate}
26% \author{David Kastrup\thanks{\texttt{dak@gnu.org}}}
27% \title{The \texttt{preview} Package for \LaTeX\\Version \fileversion}
28% \maketitle
29% \section{Introduction}
30% The main purpose of this package is the extraction of certain
31% environments (most notably displayed formulas) from \LaTeX\ sources
32% as graphics. This works with DVI files postprocessed by either
33% Dvips and Ghostscript or dvipng, but it also works when you are
34% using PDF\TeX\ for generating PDF files (usually also postprocessed
35% by Ghostscript).
36%
37% Current uses of the package include the \previewlatex\ package for
38% WYSIWYG functionality in the AUC\TeX\ editing environment,
39% generation of previews in LyX, as part of the operation of the
40% ps4pdf package, the tbook XML system and some other tools.
41%
42% Producing EPS files with Dvips and its derivatives using the
43% \texttt{-E} option is not a good alternative: People make do by
44% fiddling around with |\thispagestyle{empty}| and hoping for the best
45% (namely, that the specified contents will indeed fit on single
46% pages), and then trying to guess the baseline of the resulting code
47% and stuff, but this is at best dissatisfactory. The preview package
48% provides an easy way to ensure that exactly one page per request
49% gets shipped, with a well-defined baseline and no page decorations.
50% While you still can use the preview package with the `classic'
51% \begin{quote}
52% |dvips -E -i|
53% \end{quote}
54% invocation, there are better ways available that don't rely on Dvips
55% not getting confused by PostScript specials.
56%
57% For most applications, you'll want to make use of the |tightpage|
58% option. This will embed the page dimensions into the PostScript or
59% PDF code, obliterating the need to use the |-E -i| options to Dvips.
60% You can then produce all image files with a single run of
61% Ghostscript from a single PDF or PostScript (as opposed to EPS)
62% file.
63%
64% Various options exist that will pass \TeX\ dimensions and other
65% information about the respective shipped out material (including
66% descender size) into the log file, where external applications might
67% make use of it.
68%
69% The possibility for generating a whole set of graphics with a single
70% run of Ghostscript (whether from \LaTeX\ or PDF\LaTeX) increases
71% both speed and robustness of applications. It is also feasible to
72% use dvipng on a DVI file with the options
73% \begin{quote}
74% |-picky -noghostscript|
75% \end{quote}
76% to omit generating any image file that requires Ghostscript, then
77% let a script generate all missing files using Dvips/Ghostscript.
78% This will usually speed up the process significantly.
79%
80% \section{Package options}
81% The package is included with the customary
82% \begin{quote}
83% |\usepackage|\oarg{options}|{preview}|
84% \end{quote}
85% You should usually load this package as the last one, since it
86% redefines several things that other packages may also provide.
87%
88% The following options are available:
89% \begin{description}
90% \item[|active|] is the most essential option. If this option is not
91% specified, the |preview| package will be inactive and the document
92% will be typeset as if the |preview| package were not loaded,
93% except that all declarations and environments defined by the
94% package are still legal but have no effect. This allows defining
95% previewing characteristics in your document, and only activating
96% them by calling \LaTeX\ as
97% \begin{quote}
98% \raggedright
99% |latex '\PassOptionsToPackage{active}{preview}| |\input|\marg{filename}|'|
100% \end{quote}
101% \item[|noconfig|] Usually the file |prdefault.cfg| gets loaded
102% whenever the |preview| package gets activated. |prdefault.cfg| is
103% supposed to contain definitions that can cater for otherwise bad
104% results, for example, if a certain document class would otherwise
105% lead to trouble. It also can be used to override any settings
106% made in this package, since it is loaded at the very end of it.
107% In addition, there may be configuration files specific for certain
108% |preview| options like |auctex| which have more immediate needs.
109% The |noconfig| option suppresses loading of those option files,
110% too.
111% \item[|psfixbb|] Dvips determines the bounding boxes from the
112% material in the DVI file it understands. Lots of PostScript
113% specials are not part of that. Since the \TeX\ boxes do not make
114% it into the DVI file, but merely characters, rules and specials
115% do, Dvips might include far too small areas. The option |psfixbb|
116% will include |/dev/null| as a graphic file in the ultimate upper
117% left and lower right corner of the previewed box. This will make
118% Dvips generate an appropriate bounding box.
119% \item[|dvips|] If this option is specified as a class option or to
120% other packages, several packages pass things like page size
121% information to Dvips, or cause crop marks or draft messages
122% written on pages. This seriously hampers the usability of
123% previews. If this option is specified, the changes will be undone
124% if possible.
125% \item[|pdftex|] If this option is set, PDF\TeX\ is assumed as the
126% output driver. This mainly affects the |tightpage| option.
127% \item[|xetex|] If this option is set, Xe\TeX\ is assumed as the
128% output driver. This mainly affects the |tightpage| option.
129% \item[|displaymath|] will make all displayed math environments
130% subject to preview processing. This will typically be the most
131% desired option.
132% \item[|floats|] will make all float objects subject to preview
133% processing. If you want to be more selective about what floats to
134% pass through to a preview, you should instead use the
135% \cmd{\PreviewSnarfEnvironment} command on the floats you want to
136% have previewed.
137% \item[|textmath|] will make all text math subject to previews.
138% Since math mode is used throughly inside of \LaTeX\ even for other
139% purposes, this works by redefining \cmd\(, \cmd\)
140% and |$| and the |math| environment (apparently some people use
141% that). Only occurences of these text math delimiters in later
142% loaded packages and in the main document will thus be affected.
143% \item[|graphics|] will subject all \cmd{\includegraphics} commands
144% to a preview.
145% \item[|sections|] will subject all section headers to a preview.
146% \item[|delayed|] will delay all activations and redefinitions the
147% |preview| package makes until |\||begin{document}|. The purpose
148% of this is to cater for documents which should be subjected to the
149% |preview| package without having been prepared for it. You can
150% process such documents with
151% \begin{quote}
152% |latex '\RequirePackage[active,delayed,|\meta{options}|]{preview}|
153% |\input|\marg{filename}|'|
154% \end{quote}
155% This relaxes the requirement to be loading the |preview| package
156% as last package.
157% \item[\meta{driver}] loads a special driver file
158% |pr|\meta{driver}|.def|. The remaining options are implemented
159% through the use of driver files.
160% \item[|auctex|] This driver will produce fake error messages at the
161% start and end of every preview environment that enable the Emacs
162% package \previewlatex\ in connection with AUC\TeX\ to pinpoint
163% the exact source location where the previews have originated.
164% Unfortunately, there is no other reliable means of passing the
165% current \TeX\ input position \emph{in} a line to external
166% programs. In order to make the parsing more robust, this option
167% also switches off quite a few diagnostics that could be
168% misinterpreted.
169%
170% You should not specify this option manually, since it will only be
171% needed by automated runs that want to parse the pseudo error
172% messages. Those runs will then use \cmd{\PassOptionsToPackage} in
173% order to effect the desired behaviour. In addition,
174% |prauctex.cfg| will get loaded unless inhibited by the |noconfig|
175% option. This caters for the most frequently encountered
176% problematic commands.
177% \item[|showlabels|] During the editing process, some people like to
178% see the label names in their equations, figures and the like. Now
179% if you are using Emacs for editing, and in particular
180% \previewlatex, I'd strongly recommend that you check out the
181% Ref\TeX\ package which pretty much obliterates the need for this
182% kind of functionality. If you still want it, standard \LaTeX\
183% provides it with the |showkeys| package, and there is also the
184% less encompassing |showlabels| package. Unfortunately, since
185% those go to some pain not to change the page layout and spacing,
186% they also don't change |preview|'s idea of the \TeX\ dimensions of
187% the involved boxes. So if you are using |preview| for determing
188% bounding boxes, those packages are mostly useless. The option
189% |showlabels| offers a substitute for them.
190% \item[|tightpage|] It is not uncommon to want to use the results of
191% |preview| as graphic images for some other application. One
192% possibility is to generate a flurry of EPS files with
193% \begin{quote}
194% |dvips -E -i -Pwww -o| \meta{outputfile}|.000| \meta{inputfile}
195% \end{quote}
196% However, in case those are to be processed further into graphic
197% image files by Ghostscript, this process is inefficient since all
198% of those files need to be processed one by one. In addition, it
199% is necessary to extract the bounding box comments from the EPS
200% files and convert them into page dimension parameters for
201% Ghostscript in order to avoid full-page graphics. This is not
202% even possible if you wanted to use Ghostscript in a~\emph{single}
203% run for generating the files from a single PostScript file, since
204% Dvips will in that case leave no bounding box information
205% anywhere.
206%
207% The solution is to use the |tightpage| option. That way a single
208% command line like
209% \begin{quote}
210% \raggedright
211% \texttt{gs -sDEVICE=png16m -dTextAlphaBits=4 -r300
212% -dGraphicsAlphaBits=4 -dSAFER -q -dNOPAUSE
213% -sOutputFile=\meta{outputfile}\%d.png \meta{inputfile}.ps}
214% \end{quote}
215% will be able to produce tight graphics from a single PostScript
216% file generated with Dvips \emph{without} use of the options
217% |-E -i|, in a single run.
218%
219% The |tightpage| option actually also works when using the |pdftex|
220% option and generating PDF files with PDF\TeX. The resulting PDF
221% file has separate page dimensions for every page and can directly
222% be converted with one run of Ghostscript into image files.
223%
224% If neither |dvips| or |pdftex| have been specified, the
225% corresponding option will get autodetected and invoked.
226%
227% If you need this in a batch environment where you don't want to
228% use |preview|'s automatic extraction facilities, no problem: just
229% don't use any of the extraction options, and wrap everything to be
230% previewed into |preview| environments. This is how LyX does its
231% math previews.
232%
233% If the pages under the |tightpage| option are just too tight, you
234% can adjust by setting the length |\PreviewBorder| to a different
235% value by using \cmd{\setlength}. The default value is
236% |0.50001bp|, which is half of a usual PostScript point, rounded
237% up. If you go below this value, the resulting page size may drop
238% below |1bp|, and Ghostscript does not seem to like that. If you
239% need finer control, you can adjust the bounding box dimensions
240% individually by changing the macro |\PreviewBbAdjust| with the
241% help of |\renewcommand|. Its default value is
242% \begin{quote}
243% \raggedright
244% |\newcommand| |\PreviewBbAdjust|
245% |{-\PreviewBorder| |-\PreviewBorder|
246% |\PreviewBorder| |\PreviewBorder}|
247% \end{quote}
248% This adjusts the left, lower, right and upper borders by the given
249% amount. The macro must contain 4~\TeX\ dimensions after another,
250% and you may not omit the units if you specify them explicitly
251% instead of by register. PostScript points have the unit~|bp|.
252% \item[|lyx|] This option is for the sake of LyX developers. It will
253% output a few diagnostics relevant for the sake of LyX' preview
254% functionality (at the time of writing, mostly implemented for math
255% insets, in versions of LyX starting with 1.3.0).
256% \item[|counters|] This writes out diagnostics at the start and the
257% end of previews. Only the counters changed since the last output
258% get written, and if no counters changed, nothing gets written at
259% all. The list consists of counter name and value, both enclosed
260% in |{}| braces, followed by a space. The last such pair is
261% followed by a colon (|:|) if it is at the start of the preview
262% snippet, and by a period (|.|) if it is at the end. The order of
263% different diagnostics like this being issued depends on the order
264% of the specification of the options when calling the package.
265%
266% Systems like \previewlatex\ use this for keeping counters accurate
267% when single previews are regenerated.
268% \item[|footnotes|] This makes footnotes render as previews, and only
269% as their footnote symbol. A convenient editing feature inside of
270% Emacs.
271% \end{description}
272% The following options are just for debugging purposes of the package
273% and similar to the corresponding \TeX\ commands they allude to:
274% \begin{description}
275% \item[|tracingall|] causes lots of diagnostic output to appear in
276% the log file during the preview collecting phases of \TeX's
277% operation. In contrast to the similarly named \TeX\ command, it
278% will not switch to |\errorstopmode|, nor will it change the
279% setting of |\tracingonline|.
280% \item[|showbox|] This option will show the contents of the boxes
281% shipped out to the DVI files. It also sets |\showboxbreadth| and
282% |\showboxdepth| to their maximum values at the end of loading this
283% package, but you may reset them if you don't like that.
284% \end{description}
285% \section{Provided Commands}
286% \DescribeEnv{preview} The |preview| environment causes its contents
287% to be set as a single preview image. Insertions like figures and
288% footnotes (except those included in minipages) will typically lead
289% to error messages or be lost. In case the |preview| package has not
290% been activated, the contents of this environment will be typeset
291% normally.
292%
293% \DescribeEnv{nopreview} The |nopreview| environment will cause its
294% contents not to undergo any special treatment by the |preview|
295% package. When |preview| is active, the contents will be discarded
296% like all main text that does not trigger the |preview| hooks. When
297% |preview| is not active, the contents will be typeset just like the
298% main text.
299%
300% Note that both of these environments typeset things as usual when
301% preview is not active. If you need something typeset conditionally,
302% use the \cmd{\ifPreview} conditional for it.
303%
304% \DescribeMacro{\PreviewMacro} If you want to make a macro like
305% \cmd{\includegraphics} (actually, this is what is done by the
306% |graphics| option to |preview|) produce a preview image, you put a
307% declaration like
308% \begin{quote}
309% |\PreviewMacro[*[[!]{\includegraphics}|
310% \end{quote}
311% or, more readable,
312% \begin{quote}
313% |\PreviewMacro[{*[][]{}}]{\includegraphics}|
314% \end{quote}
315% into your preamble. The optional argument to \cmd{\PreviewMacro}
316% specifies the arguments \cmd{\includegraphics} accepts, since this
317% is necessary information for properly ending the preview box. Note
318% that if you are using the more readable form, you have to enclose
319% the argument in a |[{| and |}]| pair. The inner braces are
320% necessary to stop any included |[]| pairs from prematurely ending
321% the optional argument, and to make a single |{}|
322% denoting an optional argument not get stripped away by \TeX's
323% argument parsing.
324%
325% The letters simply mean
326% \begin{description}
327% \item[|*|] indicates an optional |*| modifier, as in
328% |\includegraphics*|.
329% \item[|[|]^^A]
330% indicates an optional argument in brackets. This syntax
331% is somewhat baroque, but brief.
332% \item[{|[]|}] also indicates an optional argument in brackets. Be
333% sure to have encluded the entire optional argument specification
334% in an additional pair of braces as described above.
335% \item[|!|] indicates a mandatory argument.
336% \item[|\char`{\char`}|] indicates the same. Again, be sure to have
337% that additional level of braces around the whole argument
338% specification.
339% \item[|?|\meta{delimiter}\marg{true case}\marg{false case}] is a
340% conditional. The next character is checked against being equal to
341% \meta{delimiter}. If it is, the specification \meta{true case} is
342% used for the further parsing, otherwise \meta{false case} will be
343% employed. In neither case is something consumed from the input,
344% so \marg{true case} will still have to deal with the upcoming
345% delimiter.
346% \item[|@|\marg{literal sequence}] will insert the given sequence
347% literally into the executed call of the command.
348% \item[|-|] will just drop the next token. It will probably be most
349% often used in the true branch of a |?| specification.
350% \item[|\#|\marg{argument}\marg{replacement}] is a transformation
351% rule that calls a macro with the given argument and replacement
352% text on the rest of the argument list. The replacement is used in
353% the executed call of the command. This can be used for parsing
354% arbitrary constructs. For example, the |[]| option could manually
355% be implemented with the option string |?[{#{[#1]}{[{#1}]}}{}|.
356% PStricks users might enjoy this sort of flexibility.
357% \item[|:|\marg{argument}\marg{replacement}] is again a
358% transformation rule. As opposed to |#|, however, the result of
359% the transformation is parsed again. You'll rarely need this.
360% \end{description}
361%
362% There is a second optional argument in brackets that can be used to
363% declare any default action to be taken instead. This is mostly for
364% the sake of macros that influence numbering: you would want to keep
365% their effects in that respect. The default action should use |#1|
366% for referring to the original (not the patched) command with the
367% parsed options appended. Not specifying a second optional argument
368% here is equivalent to specifying~|[#1]|.
369%
370% \DescribeMacro{\PreviewMacro*} A similar invocation
371% \cmd{\PreviewMacro*} simply throws the macro and all of its
372% arguments declared in the manner above away. This is mostly useful
373% for having things like \cmd{\footnote} not do their magic on their
374% arguments. More often than not, you don't want to declare any
375% arguments to scan to \cmd{\PreviewMacro*} since you would want the
376% remaining arguments to be treated as usual text and typeset in that
377% manner instead of being thrown away. An exception might be, say,
378% sort keys for \cmd{\cite}.
379%
380% A second optional argument in brackets can be used to declare any
381% default action to be taken instead. This is for the sake of macros
382% that influence numbering: you would want to keep their effects in
383% that respect. The default action might use |#1| for referring to
384% the original (not the patched) command with the parsed options
385% appended. Not specifying a second optional argument here is
386% equivalent to specifying~|[]| since the command usually gets thrown
387% away.
388%
389% As an example for using this argument, you might want to specify
390% \begin{quote}
391% |\PreviewMacro*\footnote[{[]}][#1{}]|
392% \end{quote}
393% This will replace a footnote by an empty footnote, but taking any
394% optional parameter into account, since an optional paramter changes
395% the numbering scheme. That way the real argument for the footnote
396% remains for processing by \previewlatex.
397%
398% \DescribeMacro{\PreviewEnvironment} The macro
399% \cmd{\PreviewEnvironment} works just as \cmd{\PreviewMacro} does,
400% only for environments. \DescribeMacro{\PreviewEnvironment*} And the
401% same goes for \cmd{\PreviewEnvironment*} as compared to
402% \cmd{\PreviewMacro*}.
403%
404% \DescribeMacro{\PreviewSnarfEnvironment} This macro does not typeset
405% the original environment inside of a preview box, but instead
406% typesets just the contents of the original environment inside of the
407% preview box, leaving nothing for the original environment. This has
408% to be used for figures, for example, since they would
409% \begin{enumerate}
410% \item produce insertion material that cannot be extracted to the
411% preview properly,
412% \item complain with an error message about not being in outer par
413% mode.
414% \end{enumerate}
415%
416% \DescribeMacro{\PreviewOpen}
417% \DescribeMacro{\PreviewClose}
418% Those Macros form a matched preview pair. This is for macros that
419% behave similar as \cmd{\begin} and \cmd{\end} of an environment. It
420% is essential for the operation of \cmd{\PreviewOpen} that the macro
421% treated with it will open an additional group even when the preview
422% falls inside of another preview or inside of a |nopreview|
423% environment. Similarly, the macro treated with \cmd{PreviewClose}
424% will close an environment even when inactive.
425%
426% \DescribeMacro{\ifPreview} In case you need to know whether
427% |preview| is active, you can use the conditional \cmd{\ifPreview}
428% together with |\else| and |\fi|.
429%
430% \StopEventually{}
431% \section{The Implementation}
432% Here we go: the start is somewhat obtuse since we figure out version
433% number and date from RCS strings. This should really be done at
434% docstrip time instead. Takers?
435% \begin{macro}{\pr@version}
436% \begin{macrocode}
437%<*style>
438%<*!active>
439\NeedsTeXFormat{LaTeX2e} \def\reserved@a #1#2$#3:
440#4${\xdef#1{\reserved@c #2#4 $}} \def\reserved@c #1 #2${#1}
441\begingroup \catcode`\_=12
442\reserved@a\pr@version $Name: release_11_88 $ \ifx\pr@version\@empty
443\reserved@a\pr@version CVS-$Revision: 1.126 $ \endgroup \else
444 \def\next release_{} \lccode`\_=`.
445 \edef\next{\lowercase{\endgroup
446 \def\noexpand\pr@version{\expandafter\next\pr@version}}} \next \fi
447\reserved@a\next $Date: 2010/02/14 16:19:00 $
448\edef\next{\noexpand\ProvidesPackage{preview}%
449 [\next\space \pr@version\space (AUCTeX/preview-latex)]}
450\next
451% \end{macrocode}
452% \end{macro}
453% Since many parts here will not be needed as long as the package is
454% inactive, we will include them enclosed with |<*active>| and
455% |</active>| guards. That way, we can append all of this stuff at a
456% place where it does not get loaded if not necessary.
457%
458%\begin{macro}{\ifPreview}
459% Setting the \cmd{\ifPreview} command should not be done by the
460% user, so we don't use \cmd{\newif} here. As a consequence, there
461% are no \cmd{\Previewtrue} and \cmd{\Previewfalse} commands.
462% \begin{macrocode}
463\let\ifPreview\iffalse
464%</!active>
465% \end{macrocode}
466%\end{macro}
467%\begin{macro}{\ifpr@outer}
468% We don't allow previews inside of previews. The macro
469% \cmd{\ifpr@outer} can be used for checking whether we are outside
470% of any preview code.
471% \begin{macrocode}
472%<*active>
473\newif\ifpr@outer
474\pr@outertrue
475%</active>
476% \end{macrocode}
477%\end{macro}
478%
479%\begin{macro}{\preview@delay}
480% The usual meaning of \cmd{\preview@delay} is to just echo its
481% argument in normal |preview| operation. If |preview| is inactive,
482% it swallows its argument. If the |delayed| option is active, the
483% contents will be passed to the \cmd{\AtBeginDocument} hook.
484%\begin{macro}{\pr@advise}
485% The core macro for modifying commands is \cmd{\pr@advise}. You
486% pass it the original command name as first argument and what should
487% be executed before the saved original command as second argument.
488%\begin{macro}{\pr@advise@ship}
489% The most often used macro for modifying commands is
490% \cmd{\pr@advise@ship}. It receives three arguments. The first is
491% the macro to modify, the second specifies some actions to be done
492% inside of a box to be created before the original macro gets
493% executed, the third one specifies actions after the original macro
494% got executed.
495%\begin{macro}{\pr@loadcfg}
496% The macro \cmd{\pr@loadcfg} is used for loading in configuration
497% files, unless disabled by the |noconfig| option.
498% \begin{macrocode}
499%<*!active>
500\let\preview@delay=\@gobble
501\let\pr@advise=\@gobbletwo
502\long\def\pr@advise@ship#1#2#3{}
503\def\pr@loadcfg#1{\InputIfFileExists{#1.cfg}{}{}}
504\DeclareOption{noconfig}{\let\pr@loadcfg=\@gobble}
505% \end{macrocode}
506%\begin{macro}{\pr@addto@front}
507% This adds code globally to the front of a macro.
508% \begin{macrocode}
509\long\def\pr@addto@front#1#2{%
510 \toks@{#2}\toks@\expandafter{\the\expandafter\toks@#1}%
511 \xdef#1{\the\toks@}}
512% \end{macrocode}
513% \end{macro}
514% These commands get more interesting when |preview| is active:
515% \begin{macrocode}
516\DeclareOption{active}{%
517 \let\ifPreview\iftrue
518 \def\pr@advise#1{%
519 \expandafter\pr@adviseii\csname pr@\string#1\endcsname#1}%
520 \long\def\pr@advise@ship#1#2#3{\pr@advise#1{\pr@protect@ship{#2}{#3}}}%
521 \let\preview@delay\@firstofone}
522% \end{macrocode}
523% \end{macro}
524% \end{macro}
525% \end{macro}
526% \end{macro}
527%
528% \begin{macro}{\pr@adviseii}
529% Now \cmd{\pr@advise} needs its helper macro. In order to avoid
530% recursive definitions, we advise only macros that are not yet
531% advised. Or, more exactly, we throw away the old advice and only
532% take the new one. We use e\TeX's \cmd{\protected} where available
533% for some extra robustness.
534% \begin{macrocode}
535\long\def\pr@adviseii#1#2#3{\preview@delay{%
536 \ifx#1\relax \let#1#2\fi
537 \toks@{#3#1}%
538 \ifx\@undefined\protected \else \protected\fi
539 \long\edef#2{\the\toks@}}}
540% \end{macrocode}
541%\end{macro}
542%
543% The |delayed| option is easy to implement: this is \emph{not} done
544% with \cmd{\let} since at the course of document processing, \LaTeX\
545% redefines \cmd{\AtBeginDocument} and we want to follow that
546% redefinition.
547% \begin{macrocode}
548\DeclareOption{delayed}{%
549 \ifPreview \def\preview@delay{\AtBeginDocument}\fi
550}
551% \end{macrocode}
552%
553%\begin{macro}{\ifpr@fixbb}
554% Another conditional. \cmd{\ifpr@fixbb} tells us whether we want to
555% surround the typeset materials with invisible rules so that Dvips
556% gets the bounding boxes right for, say, pure PostScript inclusions.
557%
558% If you are installing this on an operating system different from
559% the one |preview| has been developed on, you might want to redefine
560% |\pr@markerbox| in your |prdefault.cfg| file to use a file known to
561% be empty, like |/dev/null| is under Unix. Make this redefinition
562% depend on \cmd{\ifpr@fixbb} since only then |\pr@markerbox| will be
563% defined.
564% \begin{macrocode}
565\newif\ifpr@fixbb
566\pr@fixbbfalse
567\DeclareOption{psfixbb}{\ifPreview%
568 \pr@fixbbtrue
569 \newbox\pr@markerbox
570 \setbox\pr@markerbox\hbox{\special{psfile=/dev/null}}\fi
571}
572% \end{macrocode}
573% \end{macro}
574% \begin{macro}{\pr@graphicstype}
575% The |dvips| option redefines the |bop-hook| to reset the page
576% size.
577% \begin{macrocode}
578\let\pr@graphicstype=\z@
579\DeclareOption{dvips}{%
580 \let\pr@graphicstype\@ne
581 \preview@delay{\AtBeginDvi{%
582 \special{!/preview@version(\pr@version)def}
583 \special{!userdict begin/preview-bop-level 0 def%
584 /bop-hook{/preview-bop-level dup load dup 0 le{/isls false def%
585 /vsize 792 def/hsize 612 def}if 1 add store}bind def%
586 /eop-hook{/preview-bop-level dup load dup 0 gt{1 sub}if
587 store}bind def end}}}}
588% \end{macrocode}
589% The |pdftex| option just sets \cmd{\pr@graphicstype}.
590% \begin{macrocode}
591\DeclareOption{pdftex}{%
592 \let\pr@graphicstype\tw@}
593% \end{macrocode}
594% And so does the |xetex| option.
595% \begin{macrocode}
596\DeclareOption{xetex}{%
597 \let\pr@graphicstype\thr@@}
598%</!active>
599% \end{macrocode}
600% \end{macro}
601% \subsection{The internals}
602%
603% Those are only needed if |preview| is active.
604% \begin{macrocode}
605%<*active>
606% \end{macrocode}
607% \begin{macro}{\pr@snippet}
608% \cmd{\pr@snippet} is the current snippet number. We need a
609% separate counter to \cmd{\c@page} since several other commands
610% might fiddle with the page number.
611% \begin{macrocode}
612\newcount\pr@snippet
613\global\pr@snippet=1
614% \end{macrocode}
615% \end{macro}
616% \begin{macro}{\pr@protect}
617% This macro gets one argument which is unpacked and executed in
618% typesetting situations where we are not yet inside of a preview.
619% \begin{macrocode}
620\def\pr@protect{\ifx\protect\@typeset@protect
621 \ifpr@outer \expandafter\expandafter\expandafter
622 \@secondoftwo\fi\fi\@gobble}
623% \end{macrocode}
624% \end{macro}
625% \begin{macro}{\pr@protect@ship}
626% Now for the above mentioned \cmd{\pr@protect@ship}. This gets
627% three arguments. The first is what to do at the beginning of the
628% preview, the second what to do at the end, the third is the macro
629% where we stored the original definition.
630%
631% In case we are not in a typesetting situation,
632% \cmd{\pr@protect@ship} leaves the stored macro to fend for its
633% own. No better or worse protection than the original. And we
634% only do anything different when \cmd{\ifpr@outer} turns out to be
635% true.
636% \begin{macrocode}
637\def\pr@protect@ship{\pr@protect{\@firstoftwo\pr@startbox}%
638 \@gobbletwo}
639% \end{macrocode}
640% \end{macro}
641% \begin{macro}{\pr@insert}
642% \begin{macro}{\pr@mark}
643% \begin{macro}{\pr@marks}
644% We don't want insertions to end up on our lists. So we disable
645% them right now by replacing them with the following:
646% \begin{macrocode}
647\def\pr@insert{\begingroup\afterassignment\pr@insertii\count@}
648\def\pr@insertii{\endgroup\setbox\pr@box\vbox}
649% \end{macrocode}
650% Similar things hold for marks.
651% \begin{macrocode}
652\def\pr@mark{{\afterassignment}\toks@}
653\def\pr@marks{{\aftergroup\pr@mark\afterassignment}\count@}
654% \end{macrocode}
655% \end{macro}
656% \end{macro}
657% \end{macro}
658% \begin{macro}{\pr@box}
659% \begin{macro}{\pr@startbox}
660% Previews will be stored in \cmd{\box}\cmd{\pr@box}.
661% \cmd{\pr@startbox} gets two arguments: code to execute immediately
662% before the following stuff, code to execute afterwards. You have
663% to cater for \cmd{\pr@endbox} being called at the right time
664% yourself. We will use a \cmd{\vsplit} on the box later in order
665% to remove any leading glues, penalties and similar stuff. For
666% this reason we start off the box with an optimal break point.
667% \begin{macrocode}
668\newbox\pr@box
669\long\def\pr@startbox#1#2{%
670 \ifpr@outer
671 \toks@{#2}%
672 \edef\pr@cleanup{\the\toks@}%
673 \setbox\pr@box\vbox\bgroup
674 \break
675 \pr@outerfalse\@arrayparboxrestore
676 \let\insert\pr@insert
677 \let\mark\pr@mark
678 \let\marks\pr@marks
679 \expandafter\expandafter\expandafter
680 \pr@ship@start
681 \expandafter\@firstofone
682 \else
683 \expandafter \@gobble
684 \fi{#1}}
685% \end{macrocode}
686% \end{macro}
687% \end{macro}
688% \begin{macro}{\pr@endbox}
689% Cleaning up also is straightforward. If we have to watch the
690% bounding \TeX\ box, we want to remove spurious skips. We also
691% want to unwrap a possible single line paragraph, so that the box
692% is not full line length. We use \cmd{\vsplit} to clean up leading
693% glue and stuff, and we make some attempt of removing trailing
694% ones. After that, we wrap up the box including possible material
695% from \cmd{\AtBeginDvi}. If the |psfixbb| option is active, we
696% adorn the upper left and lower right corners with copies of
697% \cmd{\pr@markerbox}. The first few lines cater for \LaTeX\ hiding
698% things like like the code for \cmd{\paragraph} in \cmd{\everypar}.
699% \begin{macrocode}
700\def\pr@endbox{%
701 \let\reserved@a\relax
702 \ifvmode \edef\reserved@a{\the\everypar}%
703 \ifx\reserved@a\@empty\else
704 \dimen@\prevdepth
705 \noindent\par
706 \setbox\z@\lastbox\unskip\unpenalty
707 \prevdepth\dimen@
708 \setbox\z@\hbox\bgroup\penalty-\maxdimen\unhbox\z@
709 \ifnum\lastpenalty=-\maxdimen\egroup
710 \else\egroup\box\z@ \fi\fi\fi
711 \ifhmode \par\unskip\setbox\z@\lastbox
712 \nointerlineskip\hbox{\unhbox\z@\/}%
713 \else \unskip\unpenalty\unskip \fi
714 \egroup
715 \setbox\pr@box\vbox{%
716 \baselineskip\z@skip \lineskip\z@skip \lineskiplimit\z@
717 \@begindvi
718 \nointerlineskip
719 \splittopskip\z@skip\setbox\z@\vsplit\pr@box to\z@
720 \unvbox\z@
721 \nointerlineskip
722 %\color@setgroup
723 \box\pr@box
724 %\color@endgroup
725 }%
726% \end{macrocode}
727% \begin{macro}{\pr@ship@end}
728% \label{sec:prshipend}At this point, \cmd{\pr@ship@end} gets
729% called. You must not under any circumstances change |\box\pr@box|
730% in any way that would add typeset material at the front of it,
731% except for PostScript header specials, since the front of
732% |\box\pr@box| may contain stuff from \cmd{\AtBeginDvi}.
733% \cmd{\pr@ship@end} contains two types of code additions: stuff
734% that adds to |\box\pr@box|, like the |labels| option does, and
735% stuff that measures out things or otherwise takes a look at the
736% finished |\box\pr@box|, like the |auctex| or |showbox| option do.
737% The former should use \cmd{pr@addto@front} for adding to this
738% hook, the latter use \cmd{g@addto@macro} for adding at the end of
739% this hook.
740%
741% Note that we shift the output box up by its height via
742% \cmd{\voffset}. This has three reasons: first we make sure that
743% no package-inflicted non-zero value of \cmd{\voffset} or
744% \cmd{\hoffset} will have any influence on the positioning of our
745% box. Second we shift the box such that its basepoint will exactly
746% be at the (1in,1in)~mark defined by \TeX. That way we can
747% properly take ascenders into account. And the third reason is
748% that \TeX\ treats a \cmd{\hbox} and a \cmd{\vbox} differently with
749% regard to the treating of its depth. Shifting \cmd{\voffset} and
750% \cmd{\hoffset} can be inhibited by setting |\pr@offset@override|.
751% \begin{macrocode}
752 \pr@ship@end
753 {\let\protect\noexpand
754 \ifx\pr@offset@override\@undefined
755 \voffset=-\ht\pr@box
756 \hoffset=\z@
757 \fi
758 \c@page=\pr@snippet
759 \pr@shipout
760 \ifpr@fixbb\hbox{%
761 \dimen@\wd\pr@box
762 \@tempdima\ht\pr@box
763 \@tempdimb\dp\pr@box
764 \box\pr@box
765 \llap{\raise\@tempdima\copy\pr@markerbox\kern\dimen@}%
766 \lower\@tempdimb\copy\pr@markerbox}%
767 \else \box\pr@box \fi}%
768 \global\advance\pr@snippet\@ne
769 \pr@cleanup
770}
771% \end{macrocode}
772% \end{macro}
773% \end{macro}
774% Oh, and we kill off the usual meaning of \cmd{\shipout} in case
775% somebody makes a special output routine. The following test is
776% pretty much the same as in |everyshi.sty|. One of its implications
777% is that if someone does a \cmd{\shipout} of a \emph{void} box,
778% things will go horribly wrong.
779% \begin{macro}{\shipout}
780% \begin{macrocode}
781\let\pr@shipout=\shipout
782\def\shipout{\deadcycles\z@\bgroup\setbox\z@\box\voidb@x
783 \afterassignment\pr@shipoutegroup\setbox\z@}
784\def\pr@shipoutegroup{\ifvoid\z@ \expandafter\aftergroup\fi \egroup}
785% \end{macrocode}
786% \end{macro}
787% \subsection{Parsing commands}
788% \begin{macro}{\pr@parseit}
789% \begin{macro}{\pr@endparse}
790% \begin{macro}{\pr@callafter}
791% The following stuff is for parsing the arguments of commands we
792% want to somehow surround with stuff. Usage is
793% \begin{quote}
794% \cmd{\pr@callafter}\meta{aftertoken}\meta{parsestring}\cmd{\pr@endparse}\\
795% \qquad\meta{macro}\meta{parameters}
796% \end{quote}
797% \meta{aftertoken} is stored away and gets executed once parsing
798% completes, with its first argument being the parsed material.
799% \meta{parsestring} would be, for example for the
800% \cmd{\includegraphics} macro, |*[[!|, an optional |*| argument
801% followed by two optional arguments enclosed in |[]|, followed by
802% one mandatory argument.
803%
804% For the sake of a somewhat more intuitive syntax, we now support
805% also the syntax |{*[]{}}| in the optional argument. Since \TeX\
806% strips redundant braces, we have to write |[{{}}]| in this syntax
807% for a single mandatory argument. Hard to avoid. We use an
808% unusual character for ending the parsing. The implementation is
809% rather trivial.
810% \begin{macrocode}
811\def\pr@parseit#1{\csname pr@parse#1\endcsname}
812\let\pr@endparse=\@percentchar
813\def\next#1{%
814\def\pr@callafter{%
815 \afterassignment\pr@parseit
816 \let#1= }}
817\expandafter\next\csname pr@parse\pr@endparse\endcsname
818% \end{macrocode}
819% \end{macro}
820% \end{macro}
821% \end{macro}
822% \begin{macro}{\pr@parse*}
823% Straightforward, same mechanism \LaTeX\ itself employs. We take
824% some care not to pass potential |#| tokens unprotected through
825% macros.
826% \begin{macrocode}
827\long\expandafter\def\csname pr@parse*\endcsname#1\pr@endparse#2{%
828 \begingroup\toks@{#1\pr@endparse{#2}}%
829 \edef\next##1{\endgroup##1\the\toks@}%
830 \@ifstar{\next{\pr@parse@*}}{\next\pr@parseit}}
831% \end{macrocode}
832% \end{macro}
833% \begin{macro}{\pr@parse[}
834% \begin{macro}{\pr@brace}
835% Copies optional parameters in brackets if present. The additional
836% level of braces is necessary to ensure that braces the user might
837% have put to hide a~|]| bracket in an optional argument don't get
838% lost. There will be no harm if such braces were not there at the
839% start.
840% \begin{macrocode}
841\long\expandafter\def\csname pr@parse[\endcsname#1\pr@endparse#2{%
842 \begingroup\toks@{#1\pr@endparse{#2}}%
843 \edef\next##1{\endgroup##1\the\toks@}%
844 \@ifnextchar[{\next\pr@bracket}{\next\pr@parseit}}
845\long\def\pr@bracket#1\pr@endparse#2[#3]{%
846 \pr@parseit#1\pr@endparse{#2[{#3}]}}
847% \end{macrocode}
848% \end{macro}
849% \end{macro}
850% \begin{macro}{\pr@parse]}
851% This is basically a do-nothing, so that we may use the syntax
852% |{*[][]!}| in the optional argument instead of the more concise
853% but ugly |*[[!| which confuses the brace matchers of editors.
854% \begin{macrocode}
855\expandafter\let\csname pr@parse]\endcsname=\pr@parseit
856% \end{macrocode}
857% \end{macro}
858% \begin{macro}{\pr@parse}
859% \begin{macro}{\pr@parse!}
860% Mandatory arguments are perhaps easiest to parse.
861% \begin{macrocode}
862\long\def\pr@parse#1\pr@endparse#2#3{%
863 \pr@parseit#1\pr@endparse{#2{#3}}}
864\expandafter\let\csname pr@parse!\endcsname=\pr@parse
865% \end{macrocode}
866% \end{macro}
867% \end{macro}
868% \begin{macro}{\pr@parse?}
869% \begin{macro}{\pr@parsecond}
870% This does an explicit call of |\@ifnextchar| and forks into the
871% given two alternatives as a result.
872% \begin{macrocode}
873\long\expandafter\def\csname pr@parse?\endcsname#1#2\pr@endparse#3{%
874 \begingroup\toks@{#2\pr@endparse{#3}}%
875 \@ifnextchar#1{\pr@parsecond\@firstoftwo}%
876 {\pr@parsecond\@secondoftwo}}
877\def\pr@parsecond#1{\expandafter\endgroup
878 \expandafter\expandafter\expandafter\pr@parseit
879 \expandafter#1\the\toks@}
880% \end{macrocode}
881% \end{macro}
882% \end{macro}
883% \begin{macro}{\pr@parse@}
884% This makes it possible to insert literal material into the
885% argument list.
886% \begin{macrocode}
887 \long\def\pr@parse@#1#2\pr@endparse#3{%
888 \pr@parseit #2\pr@endparse{#3#1}}
889% \end{macrocode}
890% \end{macro}
891% \begin{macro}{\pr@parse-}
892% This will just drop the next token.
893% \begin{macrocode}
894\long\expandafter\def\csname pr@parse-\endcsname
895 #1\pr@endparse#2{\begingroup
896 \toks@{\endgroup\pr@parseit #1\pr@endparse{#2}}%
897 {\aftergroup\the\aftergroup\toks@ \afterassignment}%
898 \let\next= }
899% \end{macrocode}
900% \end{macro}
901% \begin{macro}{\pr@parse:}
902% The following is a transform rule. A macro is being defined with
903% the given argument list and replacement, and the transformed
904% version replaces the original. The result of the transform is
905% still subject to being parsed.
906% \begin{macrocode}
907\long\expandafter\def\csname pr@parse:\endcsname
908 #1#2#3\pr@endparse#4{\begingroup
909 \toks@{\endgroup \pr@parseit#3\pr@endparse{#4}}%
910 \long\def\next#1{#2}%
911 \the\expandafter\toks@\next}
912% \end{macrocode}
913% \end{macro}
914% \edef\next{\noexpand\begin{macro}{\noexpand
915% \pr@parse\string#}}
916% \next
917% Another transform rule, but this passes the transformed material
918% into the token list.
919% \begin{macrocode}
920\long\expandafter\def\csname pr@parse#\endcsname
921 #1#2#3\pr@endparse#4{\begingroup
922 \toks@{#4}%
923 \long\edef\next##1{\toks@{\the\toks@##1}}%
924 \toks@{\endgroup \pr@parseit#3\pr@endparse}%
925 \long\def\reserved@a#1{{#2}}%
926 \the\expandafter\next\reserved@a}
927%</active>
928% \end{macrocode}
929% \end{macro}
930%
931% \subsection{Selection options}
932% The |displaymath| option. The |equation| environments in AMS\LaTeX\
933% already do too much before our hook gets to interfere, so we hook
934% earlier. Some juggling is involved to ensure we get the original
935% |\everydisplay| tokens only once and where appropriate.
936%
937% The incredible hack with |\dt@ptrue| is necessary for working around
938% bug `amslatex/3425'.
939% \begin{macrocode}
940%<*!active>
941\begingroup
942\catcode`\*=11
943\@firstofone{\endgroup
944\DeclareOption{displaymath}{%
945 \preview@delay{\toks@{%
946 \pr@startbox{\noindent$$%
947 \aftergroup\pr@endbox\@gobbletwo}{$$}\@firstofone}%
948 \everydisplay\expandafter{\the\expandafter\toks@
949 \expandafter{\the\everydisplay}}}%
950 \pr@advise@ship\equation{\begingroup\aftergroup\pr@endbox
951 \def\dt@ptrue{\m@ne=\m@ne}\noindent}%
952 {\endgroup}%
953 \pr@advise@ship\equation*{\begingroup\aftergroup\pr@endbox
954 \def\dt@ptrue{\m@ne=\m@ne}\noindent}%
955 {\endgroup}%
956 \PreviewOpen[][\def\dt@ptrue{\m@ne=\m@ne}\noindent#1]\[%
957 \PreviewClose\]%
958 \PreviewEnvironment[][\noindent#1]{eqnarray}%
959 \PreviewEnvironment[][\noindent#1]{eqnarray*}%
960 \PreviewEnvironment{displaymath}%
961}}
962% \end{macrocode}
963%
964% The |textmath| option. Some folderol in order to define the active
965% |$|
966% math mode delimiter. \cmd\pr@textmathcheck is used for checking
967% whether we have a single |$| or double |$$|.
968% In the latter case, we enter display math (this sort of display math
969% is not allowed inside of \LaTeX\ because of inconsistent spacing,
970% but surprisingly many people use it nevertheless). Strictly
971% speaking, this is incorrect, since not every
972% |$$| actually means display math. For example, |\hbox{$$}| will
973% because of restricted horizontal mode rather yield an empty text
974% math formula. Since our implementation moved the sequence inside of
975% a |\vbox|, the interpretation will change. People should just not
976% enter rubbish like that.
977% \begin{macrocode}
978\begingroup
979\def\next#1#2{%
980 \endgroup
981 \DeclareOption{textmath}{%
982 \PreviewEnvironment{math}%
983 \preview@delay{\ifx#1\@undefined \let#1=$%$
984 \fi\catcode`\$=\active
985 \ifx\xyreuncatcodes\@undefined\else
986 \edef\next{\catcode`@=\the\catcode`@\relax}%
987 \makeatother\expandafter\xyreuncatcodes\next\fi}%
988 \pr@advise@ship\(\pr@endaftergroup{}% \)
989 \pr@advise@ship#1{\@firstoftwo{\let#1=#2%
990 \futurelet\reserved@a\pr@textmathcheck}}{}}%
991 \def\pr@textmathcheck{\expandafter\pr@endaftergroup
992 \ifx\reserved@a#1{#2#2}\expandafter\@gobbletwo\fi#2}}
993\lccode`\~=`\$
994\lowercase{\expandafter\next\expandafter~}%
995 \csname pr@\string$%$
996 \endcsname
997%</!active>
998% \end{macrocode}
999% \begin{macro}{\pr@endaftergroup}
1000% This justs ends the box after the group opened by |#1| is closed
1001% again.
1002% \begin{macrocode}
1003%<*active>
1004\def\pr@endaftergroup#1{#1\aftergroup\pr@endbox}
1005%</active>
1006% \end{macrocode}
1007% \end{macro}
1008%
1009% The |graphics| option.
1010% \begin{macrocode}
1011%<*!active>
1012\DeclareOption{graphics}{%
1013 \PreviewMacro[*[[!]{\includegraphics}%]]
1014}
1015% \end{macrocode}
1016% The |floats| option. The complications here are merely to spare us
1017% bug reports about broken document classes that use |\let| on
1018% |\endfigure| and similar. Notable culprits that have not been
1019% changed in years in spite of reports are |elsart.cls| and
1020% |IEEEtran.cls|. Complain when you are concerned.
1021% \begin{macrocode}
1022\def\pr@floatfix#1#2{\ifx#1#2%
1023 \ifx#1\@undefined\else
1024 \PackageWarningNoLine{preview}{%
1025Your document class has a bad definition^^J
1026of \string#1, most likely^^J
1027\string\let\string#1=\string#2^^J
1028which has now been changed to^^J
1029\string\def\string#1{\string#2}^^J
1030because otherwise subsequent changes to \string#2^^J
1031(like done by several packages changing float behaviour)^^J
1032can't take effect on \string#1.^^J
1033Please complain to your document class author}%
1034 \def#1{#2}\fi\fi}
1035\begingroup
1036\def\next#1#2{\endgroup
1037 \DeclareOption{floats}{%
1038 \pr@floatfix\endfigure\end@float
1039 \pr@floatfix\endtable\end@float
1040 \pr@floatfix#1\end@dblfloat
1041 \pr@floatfix#2\end@dblfloat
1042 \PreviewSnarfEnvironment[![]{@float}%]
1043 \PreviewSnarfEnvironment[![]{@dblfloat}%]
1044 }}
1045\expandafter\next\csname endfigure*\expandafter\endcsname
1046 \csname endtable*\endcsname
1047% \end{macrocode}
1048% The |sections| option. Two optional parameters might occur in
1049% |memoir.cls|.
1050% \begin{macrocode}
1051\DeclareOption{sections}{%
1052 \PreviewMacro[!!!!!!*[[!]{\@startsection}%]]
1053 \PreviewMacro[*[[!]{\chapter}%]]
1054}
1055% \end{macrocode}
1056% We now interpret any further options as driver files we load. Note
1057% that these driver files are loaded even when |preview| is not
1058% active. The reason is that they might define commands (like
1059% \cmd{\PreviewCommand}) that should be available even in case of an
1060% inactive package. Large parts of the |preview| package will not
1061% have been loaded in this case: you have to cater for that.
1062% \begin{macrocode}
1063\DeclareOption*
1064 {\InputIfFileExists{pr\CurrentOption.def}{}{\OptionNotUsed}}
1065% \end{macrocode}
1066%
1067% \subsection{Preview attaching commands}
1068% \begin{macro}{\PreviewMacro}
1069% As explained above. Detect possible |*| and call appropriate
1070% macro.
1071% \begin{macrocode}
1072\def\PreviewMacro{\@ifstar\pr@starmacro\pr@macro}
1073% \end{macrocode}
1074% The version without |*| is now rather straightforward.
1075% \begin{macro}{\pr@macro}
1076% \begin{macro}{\pr@domacro}
1077% \begin{macro}{\pr@macroii}
1078% \begin{macro}{\pr@endmacro}
1079% \begin{macrocode}
1080\long\def\pr@domacro#1#2{%
1081 \long\def\next##1{#2}%
1082 \pr@callafter\next#1]\pr@endparse}
1083\newcommand\pr@macro[1][]{%
1084 \toks@{\pr@domacro{#1}}%
1085 \long\edef\next[##1]##2{%
1086 \noexpand\pr@advise@ship{##2}{\the\toks@{##1\noexpand\pr@endbox}}{}}%
1087 \@ifnextchar[\next\pr@macroii}
1088\def\pr@macroii{\next[##1]}
1089\long\def\pr@endmacro#1{#1\pr@endbox}
1090% \end{macrocode}
1091% \end{macro}
1092% \end{macro}
1093% \end{macro}
1094% \end{macro}
1095% \end{macro}
1096% \begin{macro}{PreviewMacro*}
1097% \begin{macro}{\pr@protect@domacro}
1098% \begin{macro}{\pr@starmacro}
1099% The version with |*| has to parse the arguments, then throw them
1100% away. Some internal macros first, then the interface call.
1101% \begin{macrocode}
1102\long\def\pr@protect@domacro#1#2{\pr@protect{%
1103 \long\def\next##1{#2}%
1104 \pr@callafter\next#1]\pr@endparse}}
1105\newcommand\pr@starmacro[1][]{\toks@{\pr@protect@domacro{#1}}%
1106 \long\edef\next[##1]##2{%
1107 \noexpand\pr@advise##2{\the\toks@{##1}}}%
1108 \@ifnextchar[\next{\next[]}}
1109% \end{macrocode}
1110% \end{macro}
1111% \end{macro}
1112% \end{macro}
1113% \begin{macro}{\PreviewOpen}
1114% As explained above. Detect possible |*| and call appropriate macro.
1115% \begin{macrocode}
1116\def\PreviewOpen{\@ifstar\pr@starmacro\pr@open}
1117% \end{macrocode}
1118% The version without |*| is now rather straightforward.
1119% \begin{macro}{\pr@open}
1120% \begin{macrocode}
1121\newcommand\pr@open[1][]{%
1122 \toks@{\pr@domacro{#1}}%
1123 \long\edef\next[##1]##2{%
1124 \noexpand\pr@advise##2{\begingroup
1125 \noexpand\pr@protect@ship
1126 {\the\toks@{\begingroup\aftergroup\noexpand\pr@endbox##1}}%
1127 {\endgroup}}}%
1128 \@ifnextchar[\next\pr@macroii}
1129% \end{macrocode}
1130% \end{macro}
1131% \end{macro}
1132% \begin{macro}{\PreviewClose}
1133% As explained above. Detect possible |*| and call appropriate
1134% macro.
1135% \begin{macrocode}
1136\def\PreviewClose{\@ifstar\pr@starmacro\pr@close}
1137% \end{macrocode}
1138% The version without |*| is now rather straightforward.
1139% \begin{macro}{\pr@close}
1140% \begin{macrocode}
1141\newcommand\pr@close[1][]{%
1142 \toks@{\pr@domacro{#1}}%
1143 \long\edef\next[##1]##2{%
1144 \noexpand\pr@advise{##2}{\the\toks@{##1\endgroup}}}%
1145 \@ifnextchar[\next\pr@macroii}
1146% \end{macrocode}
1147% \end{macro}
1148% \end{macro}
1149% \begin{macro}{\PreviewEnvironment}
1150% Actually, this ignores any syntax argument. But don't tell
1151% anybody. Except for the |*|~variant, it respects (actually
1152% ignores) any argument! Of course, we'll need to deactivate
1153% |\end{|\meta{environment}|}| as well.
1154% \begin{macrocode}
1155\def\PreviewEnvironment{\@ifstar\pr@starenv\pr@env}
1156\newcommand\pr@starenv[1][]{\toks@{\pr@starmacro[{#1}]}%
1157 \long\edef\next##1##2{%
1158 \the\toks@[{##2}]##1}%
1159 \begingroup\pr@starenvii}
1160\newcommand\pr@starenvii[2][]{\endgroup
1161 \expandafter\next\csname#2\endcsname{#1}%
1162 \expandafter\pr@starmacro\csname end#2\endcsname}
1163\newcommand\pr@env[1][]{%
1164 \toks@{\pr@domacro{#1}}%
1165 \long\edef\next[##1]##2{%
1166 \noexpand\expandafter\noexpand\pr@advise@ship
1167 \noexpand\csname##2\noexpand\endcsname{\the\toks@
1168 {\begingroup\aftergroup\noexpand\pr@endbox##1}}{\endgroup}}%
1169 \@ifnextchar[\next\pr@macroii %]
1170 }
1171% \end{macrocode}
1172% \end{macro}
1173% \begin{macro}{\PreviewSnarfEnvironment}
1174% This is a nuisance since we have to advise \emph{both} the
1175% environment and its end.
1176% \begin{macrocode}
1177\newcommand{\PreviewSnarfEnvironment}[2][]{%
1178 \expandafter\pr@advise
1179 \csname #2\endcsname{\pr@snarfafter{#1}}%
1180 \expandafter\pr@advise
1181 \csname end#2\endcsname{\pr@endsnarf}}
1182%</!active>
1183% \end{macrocode}
1184% \end{macro}
1185% \begin{macro}{\pr@snarfafter}
1186% \begin{macro}{\pr@startsnarf}
1187% \begin{macro}{\pr@endsnarf}
1188% Ok, this looks complicated, but we have to start a group in order
1189% to be able to hook \cmd{\pr@endbox} into the game only when
1190% \cmd{\ifpr@outer} has triggered the start. And we need to get our
1191% start messages out before parsing the arguments.
1192% \begin{macrocode}
1193%<*active>
1194\let\pr@endsnarf\relax
1195\long\def\pr@snarfafter#1{\ifpr@outer
1196 \pr@ship@start
1197 \let\pr@ship@start\relax
1198 \let\pr@endsnarf\endgroup
1199 \else
1200 \let\pr@endsnarf\relax
1201 \fi
1202 \pr@protect{\pr@callafter\pr@startsnarf#1]\pr@endparse}}
1203\def\pr@startsnarf#1{#1\begingroup
1204 \pr@startbox{\begingroup\aftergroup\pr@endbox}{\endgroup}%
1205 \ignorespaces}
1206%</active>
1207% \end{macrocode}
1208% \end{macro}
1209% \end{macro}
1210% \end{macro}
1211% \begin{macro}{\pr@ship@start}
1212% \begin{macro}{\pr@ship@end}
1213% The hooks \cmd{\pr@ship@start} and \cmd{\pr@ship@end} can be added
1214% to by option files by the help of the \cmd{\g@addto@macro} command
1215% from \LaTeX, and by the \cmd{\pr@addto@front} command from
1216% |preview.sty| itself. They are called just before starting to
1217% process some preview, and just after it. Here is the policy for
1218% adding to them: \cmd{\pr@ship@start} is called inside of the vbox
1219% |\pr@box| before typeset material gets produced. It is, however,
1220% preceded by a break command that is intended for usage in
1221% \cmd{\vsplit}, so that any following glue might disappear. In
1222% case you want to add any material on the list, you have to precede
1223% it with \cmd{\unpenalty} and have to follow it with \cmd{\break}.
1224% You have make sure that under no circumstances any other legal
1225% breakpoints appear before that, and your material should
1226% contribute no nonzero dimensions to the page. For the policies of
1227% the \cmd{\pr@ship@end} hook, see the description on
1228% page~\pageref{sec:prshipend}.
1229% \begin{macrocode}
1230%<*!active>
1231\let\pr@ship@start\@empty
1232\let\pr@ship@end\@empty
1233% \end{macrocode}
1234% \end{macro}
1235% \end{macro}
1236% \begin{environment}{preview}
1237% \begin{environment}{nopreview}
1238% First we write the definitions of these environments when
1239% |preview| is inactive. We will redefine them if |preview| gets
1240% activated.
1241% \begin{macrocode}
1242\newenvironment{preview}{\ignorespaces}{\ifhmode\unskip\fi}
1243\newenvironment{nopreview}{\ignorespaces}{\ifhmode\unskip\fi}
1244% \end{macrocode}
1245% \end{environment}
1246% \end{environment}
1247%
1248% We now process the options and finish in case we are not active.
1249% \begin{macrocode}
1250\ProcessOptions\relax
1251\ifPreview\else\expandafter\endinput\fi
1252%</!active>
1253% \end{macrocode}
1254% Now for the redefinition of the |preview| and |endpreview|
1255% environments:
1256% \begin{macrocode}
1257%<*active>
1258\renewenvironment{preview}{\begingroup
1259 \pr@startbox{\begingroup\aftergroup\pr@endbox}%
1260 {\endgroup}%
1261 \ignorespaces}%
1262 {\ifhmode\unskip\fi\endgroup}
1263\renewenvironment{nopreview}{\pr@outerfalse\ignorespaces}%
1264 {\ifhmode\unskip\fi}
1265% \end{macrocode}
1266% We use the normal output routine, but hijack it a bit for our
1267% purposes to preserve \cmd{\AtBeginDvi} hooks and not get previews
1268% while in output: that could become rather ugly.
1269%
1270% The main work of disabling normal output relies on a \cmd{\shipout}
1271% redefinition.
1272% \begin{macro}{\pr@output}
1273% \begin{macrocode}
1274\newtoks\pr@output
1275\pr@output\output
1276\output{%
1277 \pr@outerfalse
1278 \let\@begindvi\@empty
1279 \the\pr@output}
1280\let\output\pr@output
1281% \end{macrocode}
1282% \end{macro}
1283% \begin{macro}{\pr@typeinfos}
1284% Then we have some document info that style files might want to
1285% output.
1286% \begin{macrocode}
1287\def\pr@typeinfos{\typeout{Preview: Fontsize \f@size pt}%
1288 \ifnum\mag=\@m\else\typeout{Preview: Magnification \number\mag}\fi
1289 \ifx\pdfoutput\@undefined
1290 \ifx\XeTeXversion\@undefined \else
1291 % FIXME: The message should not be emitted if XeTeX does not produce
1292 % PDF. There does not seem to be a primitive for that, though.
1293 \typeout{Preview: PDFoutput 1}%
1294 \fi
1295 \else
1296 \ifx\pdfoutput\relax \else
1297 \ifnum\pdfoutput>\z@
1298 \typeout{Preview: PDFoutput 1}%
1299 \fi
1300 \fi
1301 \fi
1302}
1303\AtBeginDocument{\pr@typeinfos}
1304% \end{macrocode}
1305% \end{macro}
1306% And at the end we load the default configuration file, so that it
1307% may override settings from this package:
1308% \begin{macrocode}
1309\pr@loadcfg{prdefault}
1310%</active>
1311%</style>
1312% \end{macrocode}
1313%
1314% \section{The option files}
1315% \subsection{The \texttt{auctex} option}
1316% The AUC\TeX\ option will cause error messages to spew. We want them
1317% on the terminal, but we don't want \LaTeX\ to stop its automated
1318% run. We delay \cmd{\nonstopmode} in case the user has any
1319% pseudo-interactive folderol like reading in of file names in his
1320% preamble. Because we are so good-hearted, we will not break this as
1321% long as the document has not started, but after that we need the
1322% error message mechanism operative.
1323%
1324% The |\nofiles| command here tries to avoid clobbering input files
1325% used for references and similar. It will come too late if you call
1326% the package with \cmd{\AtBeginDocument}, so you'll need to issue
1327% |\nofiles| yourself in that case. Previously, this was done
1328% unconditionally in the main style file, but since we don't know what
1329% the package may be used for, this was inappropriate.
1330%
1331% So here is the contents of the |prauctex.def| file:
1332% \begin{macrocode}
1333%<auctex>\ifPreview\else\expandafter\endinput\fi
1334%<auctex>\nofiles
1335%<auctex>\preview@delay{\nonstopmode}
1336% \end{macrocode}
1337% Ok, here comes creative error message formatting. It turns out a
1338% sizable portion of the runtime is spent in I/O. Making the error
1339% messages short is an advantage. It is not possible to convince
1340% \TeX\ to make shorter error messages than this: \TeX\ always wants
1341% to include context. This is about the shortest \ae sthetic one we
1342% can muster.
1343% \begin{macrocode}
1344%<auctex>\begingroup
1345%<auctex>\lccode`\~=`\-
1346%<auctex>\lccode`\{=`\<
1347%<auctex>\lccode`\}=`\>
1348%<auctex>\lowercase{\endgroup
1349%<auctex> \def\pr@msgi{{~}}}
1350%<auctex>\def\pr@msgii{Preview:
1351%<auctex> Snippet \number\pr@snippet\space}
1352%<auctex>\begingroup
1353%<auctex>\catcode`\-=13
1354%<auctex>\catcode`\<=13
1355%<auctex>\@firstofone{\endgroup
1356%<auctex>\def\pr@msg#1{{%
1357%<auctex> \let<\pr@msgi
1358%<auctex> \def-{\pr@msgii#1}%
1359%<auctex> \errhelp{Not a real error.}%
1360%<auctex> \errmessage<}}}
1361%<auctex>\g@addto@macro\pr@ship@start{\pr@msg{started}}
1362%<auctex>\g@addto@macro\pr@ship@end{\pr@msg{ended.%
1363%<auctex> (\number\ht\pr@box+\number\dp\pr@box x\number\wd\pr@box)}}
1364% \end{macrocode}
1365% This looks pretty baffling, but it produces something short and
1366% semi-graphical, namely |<-><->|. That is a macro |<| that expands
1367% into |<->|, where |<| and |>| are the braces around an
1368% \cmd{\errmessage} argument and |-| is a macro expanding to the full
1369% text of the error message. Cough cough. You did not really want to
1370% know, did you?
1371%
1372% Since over/underfull boxes are about the messiest things to parse,
1373% we disable them by setting the appropriate badness limits and making
1374% the variables point to junk. We also disable other stuff. While we
1375% set \cmd{\showboxbreadth} and \cmd{\showboxdepth} to indicate as
1376% little diagnostic output as possible, we keep them operative, so
1377% that the user retains the option of debugging using this stuff. The
1378% other variables concerning the generation of warnings and
1379% daignostics, however, are more often set by commonly employed
1380% packages and macros such as \cmd{\sloppy}. So we kill them off for
1381% good.
1382% \begin{macrocode}
1383%<auctex>\hbadness=\maxdimen
1384%<auctex>\newcount\hbadness
1385%<auctex>\vbadness=\maxdimen
1386%<auctex>\let\vbadness=\hbadness
1387%<auctex>\hfuzz=\maxdimen
1388%<auctex>\newdimen\hfuzz
1389%<auctex>\vfuzz=\maxdimen
1390%<auctex>\let\vfuzz=\hfuzz
1391%<auctex>\showboxdepth=-1
1392%<auctex>\showboxbreadth=-1
1393% \end{macrocode}
1394% Ok, now we load a possible configuration file.
1395% \begin{macrocode}
1396%<auctex>\pr@loadcfg{prauctex}
1397% \end{macrocode}
1398% And here we cater for several frequently used commands in
1399% |prauctex.cfg|:
1400% \begin{macrocode}
1401%<auccfg>\PreviewMacro*[[][#1{}]\footnote
1402%<auccfg>\PreviewMacro*[?[{@{[]}}{}][#1]\item
1403%<auccfg>\PreviewMacro*\emph
1404%<auccfg>\PreviewMacro*\textrm
1405%<auccfg>\PreviewMacro*\textit
1406%<auccfg>\PreviewMacro*\textsc
1407%<auccfg>\PreviewMacro*\textsf
1408%<auccfg>\PreviewMacro*\textsl
1409%<auccfg>\PreviewMacro*\texttt
1410%<auccfg>\PreviewMacro*\textcolor
1411%<auccfg>\PreviewMacro*\mbox
1412%<auccfg>\PreviewMacro*[][#1{}]\author
1413%<auccfg>\PreviewMacro*[][#1{}]\title
1414%<auccfg>\PreviewMacro*\and
1415%<auccfg>\PreviewMacro*\thanks
1416%<auccfg>\PreviewMacro*[][#1{}]\caption
1417%<auccfg>\preview@delay{\@ifundefined{pr@\string\@startsection}{%
1418%<auccfg> \PreviewMacro*[!!!!!!*][#1{}]\@startsection}{}}
1419%<auccfg>\preview@delay{\@ifundefined{pr@\string\chapter}{%
1420%<auccfg> \PreviewMacro*[*][#1{}]\chapter}{}}
1421%<auccfg>\PreviewMacro*\index
1422% \end{macrocode}
1423%
1424% \subsection{The \texttt{lyx} option}
1425% The following is the option providing LyX with info for its preview
1426% implementation.
1427% \begin{macrocode}
1428%<lyx>\ifPreview\else\expandafter\endinput\fi
1429%<lyx>\pr@loadcfg{prlyx}
1430%<lyx>\g@addto@macro\pr@ship@end{\typeout{Preview:
1431%<lyx> Snippet \number\pr@snippet\space
1432%<lyx> \number\ht\pr@box\space \number\dp\pr@box \space\number\wd\pr@box}}
1433% \end{macrocode}
1434%
1435% \subsection{The \texttt{counters} option}
1436% This outputs a checkpoint. We do this by saving all counter
1437% registers in backup macros starting with |\pr@c@| in their name. A
1438% checkpoint first writes out all changed counters (previously
1439% unchecked counters are not written out unless different from zero),
1440% then saves all involved counter values. \LaTeX\ tracks its counters
1441% in the global variable \cmd{\cl@ckpt}.
1442% \begin{macrocode}
1443%<counters>\ifPreview\else\expandafter\endinput\fi
1444%<counters>\def\pr@eltprint#1{\expandafter\@gobble\ifnum\value{#1}=0%
1445%<counters> \csname pr@c@#1\endcsname\else\relax
1446%<counters> \space{#1}{\arabic{#1}}\fi}
1447%<counters>\def\pr@eltdef#1{\expandafter\xdef
1448%<counters> \csname pr@c@#1\endcsname{\arabic{#1}}}
1449%<counters>\def\pr@ckpt#1{{\let\@elt\pr@eltprint\edef\next{\cl@@ckpt}%
1450%<counters> \ifx\next\@empty\else\typeout{Preview: Counters\next#1}%
1451%<counters> \let\@elt\pr@eltdef\cl@@ckpt\fi}}
1452%<counters>\pr@addto@front\pr@ship@start{\pr@ckpt:}
1453%<counters>\pr@addto@front\pr@ship@end{\pr@ckpt.}
1454% \end{macrocode}
1455%
1456% \subsection{Debugging options}
1457% Those are for debugging the operation of |preview|, and thus are
1458% mostly of interest for people that want to use |preview| for their
1459% own purposes. Since debugging output is potentially confusing to
1460% the error message parsing from AUC\TeX, you should not turn on
1461% |\tracingonline| or switch from |\nonstopmode| unless you are
1462% certain your package will never be used with \previewlatex.
1463%
1464% \paragraph{The \texttt{showbox} option} will generate diagnostic
1465% output for every produced box. It does not delay the resetting of
1466% the |\showboxbreadth| and |\showboxdepth| parameters so that you can
1467% still change them after the loading of the package. It does,
1468% however, move them to the end of the package loading, so that they
1469% will not be affected by the |auctex| option.
1470% \begin{macrocode}
1471%<showbox>\ifPreview\else\expandafter\endinput\fi
1472%<showbox>\AtEndOfPackage{%
1473%<showbox> \showboxbreadth\maxdimen
1474%<showbox> \showboxdepth\maxdimen}
1475%<showbox>\g@addto@macro\pr@ship@end{\showbox\pr@box}
1476% \end{macrocode}
1477%
1478% \paragraph{The \texttt{tracingall} option} is for the really heavy
1479% diagnostic stuff. For the reasons mentioned above, we do not want
1480% to change the setting of the interaction mode, nor of the
1481% |tracingonline| flag. If the user wants them different, he should
1482% set them outside of the preview boxes.
1483% \begin{macrocode}
1484%<tracingall>\ifPreview\else\expandafter\endinput\fi
1485%<tracingall>\pr@addto@front\pr@ship@start{\let\tracingonline\count@
1486%<tracingall> \let\errorstopmode\@empty\tracingall}
1487% \end{macrocode}
1488%
1489% \subsection{Supporting conversions}
1490% It is not uncommon to want to use the results of |preview| as
1491% images. One possibility is to generate a flurry of EPS files with
1492% \begin{quote}
1493% |dvips -E -i -Ppdf -o| \meta{outputfile}|.000| \meta{inputfile}
1494% \end{quote}
1495% However, in case those are to be processed further into graphic
1496% image files by Ghostscript, this process is inefficient. One cannot
1497% use Ghostscript in a single run for generating the files, however,
1498% since one needs to set the page size (or full size pages will be
1499% produced). The |tightpage| option will set the page dimensions at
1500% the start of each PostScript page so that the output will be sized
1501% appropriately. That way, a single pass of Dvips followed by a
1502% single pass of Ghostscript will be sufficient for generating all
1503% images.
1504%
1505% You will have to specify the output driver to be used, either
1506% |dvips| or |pdftex|.
1507%
1508% \begin{macro}{\PreviewBorder}
1509% \begin{macro}{\PreviewBbAdjust}
1510% We start this off with the user tunable parameters which get
1511% defined even in the case of an inactive package, so that
1512% redefinitions and assignments to them will always work:
1513% \begin{macrocode}
1514%<tightpage>\ifx\PreviewBorder\@undefined
1515%<tightpage> \newdimen\PreviewBorder
1516%<tightpage> \PreviewBorder=0.50001bp
1517%<tightpage>\fi
1518%<tightpage>\ifx\PreviewBbAdjust\@undefined
1519%<tightpage> \def\PreviewBbAdjust{-\PreviewBorder -\PreviewBorder
1520%<tightpage> \PreviewBorder \PreviewBorder}
1521%<tightpage>\fi
1522% \end{macrocode}
1523% \end{macro}
1524% \end{macro}
1525% Here is stuff used for parsing this:
1526% \begin{macrocode}
1527%<tightpage>\ifPreview\else\expandafter\endinput\fi
1528%<tightpage>\def\pr@nextbb{\edef\next{\next\space\number\dimen@}%
1529%<tightpage> \expandafter\xdef\csname pr@bb@%
1530%<tightpage> \romannumeral\count@\endcsname{\the\dimen@}%
1531%<tightpage> \advance\count@\@ne\ifnum\count@<5
1532%<tightpage> \afterassignment\pr@nextbb\dimen@=\fi}
1533% \end{macrocode}
1534% And here is the stuff that we fudge into our hook. Of course, we
1535% have to do it in a box, and we start this box off with our special.
1536% There is one small consideration here: it might come before any
1537% |\AtBeginDvi| stuff containing header specials. It turns out Dvips
1538% rearranges this amicably: header code specials get transferred to
1539% the appropriate header section, anyhow, so this ensures that we come
1540% right after the bop section. We insert the 7~numbers here: the
1541% 4~bounding box adjustments, and the 3~\TeX\ box dimensions. In case
1542% the box adjustments have changed since the last time, we write them
1543% out to the console.
1544% \begin{macrocode}
1545%<tightpage>\ifnum\pr@graphicstype=\z@
1546%<tightpage> \ifcase
1547%<tightpage> \ifx\XeTeXversion\@undefined
1548%<tightpage> \ifx\pdfoutput\@undefined \@ne\fi
1549%<tightpage> \ifx\pdfoutput\relax \@ne\fi
1550%<tightpage> \ifnum\pdfoutput>\z@ \tw@\fi \@ne
1551%<tightpage> \else \thr@@\fi
1552%<tightpage> \or \ExecuteOptions{dvips}\relax
1553%<tightpage> \or \ExecuteOptions{pdftex}\relax
1554%<tightpage> \or \ExecuteOptions{xetex}\relax\fi\fi
1555%<tightpage>\global\let\pr@bbadjust\@empty
1556%<tightpage>\pr@addto@front\pr@ship@end{\begingroup
1557%<tightpage> \let\next\@gobble
1558%<tightpage> \count@\@ne\afterassignment\pr@nextbb
1559%<tightpage> \dimen@\PreviewBbAdjust
1560%<tightpage> \ifx\pr@bbadjust\next
1561%<tightpage> \else \global\let\pr@bbadjust\next
1562%<tightpage> \typeout{Preview: Tightpage \pr@bbadjust}%
1563%<tightpage> \fi\endgroup}
1564%<tightpage>\ifcase\pr@graphicstype
1565%<tightpage>\or
1566%<tightpage> \g@addto@macro\pr@ship@end{\setbox\pr@box\hbox{%
1567%<tightpage> \special{ps::\pr@bbadjust\space
1568%<tightpage> \number\ifdim\ht\pr@box>\z@ \ht\pr@box
1569%<tightpage> \else \z@
1570%<tightpage> \fi \space
1571%<tightpage> \number\ifdim\dp\pr@box>\z@ \dp\pr@box
1572%<tightpage> \else \z@
1573%<tightpage> \fi \space
1574%<tightpage> \number\ifdim\wd\pr@box>\z@ \wd\pr@box
1575%<tightpage> \else \z@
1576%<tightpage> \fi}\box\pr@box}}
1577%<tightpage>\or
1578%<tightpage> \g@addto@macro\pr@ship@end{{\dimen@\ht\pr@box
1579%<tightpage> \ifdim\dimen@<\z@ \dimen@\z@\fi
1580%<tightpage> \advance\dimen@\pr@bb@iv
1581%<tightpage> \dimen@ii=\dimen@
1582%<tightpage> \global\pdfvorigin\dimen@
1583%<tightpage> \dimen@\dp\pr@box
1584%<tightpage> \ifdim\dimen@<\z@ \dimen@\z@\fi
1585%<tightpage> \advance\dimen@-\pr@bb@ii
1586%<tightpage> \advance\dimen@\dimen@ii
1587%<tightpage> \global\pdfpageheight\dimen@
1588%<tightpage> \dimen@\wd\pr@box
1589%<tightpage> \ifdim\dimen@<\z@ \dimen@=\z@\fi
1590%<tightpage> \advance\dimen@-\pr@bb@i
1591%<tightpage> \advance\dimen@\pr@bb@iii
1592%<tightpage> \global\pdfpagewidth\dimen@
1593%<tightpage> \global\pdfhorigin-\pr@bb@i}}
1594%<tightpage>\or
1595%<tightpage> \g@addto@macro\pr@ship@end{\dimen@\ht\pr@box
1596%<tightpage> \ifdim\dimen@<\z@ \dimen@\z@\fi
1597%<tightpage> \advance\dimen@\pr@bb@iv
1598%<tightpage> \dimen@ii=\dimen@
1599%<tightpage> \voffset=-1in
1600%<tightpage> \advance\voffset\dimen@
1601%<tightpage> \advance\voffset-\ht\pr@box
1602%<tightpage> \dimen@\dp\pr@box
1603%<tightpage> \ifdim\dimen@<\z@ \dimen@\z@\fi
1604%<tightpage> \advance\dimen@-\pr@bb@ii
1605%<tightpage> \advance\dimen@\dimen@ii
1606%<tightpage> \global\pdfpageheight\dimen@
1607%<tightpage> \global\paperheight\dimen@
1608%<tightpage> \dimen@\wd\pr@box
1609%<tightpage> \ifdim\dimen@<\z@ \dimen@=\z@\fi
1610%<tightpage> \advance\dimen@-\pr@bb@i
1611%<tightpage> \advance\dimen@\pr@bb@iii
1612%<tightpage> \global\pdfpagewidth\dimen@
1613%<tightpage> \hoffset=-1in
1614%<tightpage> \advance\hoffset-\pr@bb@i
1615%<tightpage> \let\pr@offset@override\@empty}
1616%<tightpage>\fi
1617% \end{macrocode}
1618% Ok, here comes the beef. First we fish the 7~numbers from the file
1619% with |token| and convert them from \TeX~|sp| to PostScript points.
1620% \begin{macrocode}
1621%<tightpage>\ifnum\pr@graphicstype=\@ne
1622%<tightpage>\preview@delay{\AtBeginDvi{%
1623% \end{macrocode}
1624% Backwards-compatibility. Once we are certain that dvipng-1.6 or
1625% later is widely used, the three following specials can be exchanged
1626% for the simple |\special{!/preview@tightpage true def}|
1627% \begin{macrocode}
1628%<tightpage> \special{!/preview@tightpage true def (%
1629%<tightpage> compatibility PostScript comment for dvipng<=1.5 }
1630%<tightpage> \special{!userdict begin/bop-hook{%
1631%<tightpage> 7{currentfile token not{stop}if
1632%<tightpage> 65781.76 div DVImag mul}repeat
1633%<tightpage> 72 add 72 2 copy gt{exch}if 4 2 roll
1634%<tightpage> neg 2 copy lt{exch}if dup 0 gt{pop 0 exch}%
1635%<tightpage> {exch dup 0 lt{pop 0}if}ifelse 720 add exch 720 add
1636%<tightpage> 3 1 roll
1637%<tightpage> 4{5 -1 roll add 4 1 roll}repeat
1638%<tightpage> <</PageSize[5 -1 roll 6 index sub 5 -1 roll 5 index sub]%
1639%<tightpage> /PageOffset[7 -2 roll [1 1 dtransform exch]%
1640%<tightpage> {0 ge{neg}if exch}forall]>>setpagedevice%
1641%<tightpage> //bop-hook exec}bind def end}
1642%<tightpage> \special{!userdict (some extra code to avoid
1643%<tightpage> dvipng>=1.6 unknown special:
1644%<tightpage> 7{currentfile token not{stop}if 65781.76 div })) pop}
1645% \end{macrocode}
1646% The ``userdict'' at the start of the last special is also there to
1647% avoid an unknown special in dvipng<=1.6. This is the end of the
1648% backwards-compatibility code.
1649% \begin{macrocode}
1650%<tightpage> \special{!userdict begin/bop-hook{%
1651%<tightpage> preview-bop-level 0 le{%
1652%<tightpage> 7{currentfile token not{stop}if
1653%<tightpage> 65781.76 div DVImag mul}repeat
1654% \end{macrocode}
1655% Next we produce the horizontal part of the bounding box as
1656% \[ (1\mathrm{in},1\mathrm{in}) +
1657% \bigl(\min(|\wd\pr@box|,0),\max(|\wd\pr@box|,0)\bigr) \]
1658% and roll it to the bottom of the stack:
1659% \begin{macrocode}
1660%<tightpage> 72 add 72 2 copy gt{exch}if 4 2 roll
1661% \end{macrocode}
1662% Next is the vertical part of the bounding box. Depth counts in
1663% negatively, and we again take $\min$ and $\max$ of possible extents
1664% in the vertical direction, limited by 0. 720 corresponds to
1665% $10\,\mathrm{in}$ and is the famous $1\,\mathrm{in}$ distance away
1666% from the edge of letterpaper.
1667% \begin{macrocode}
1668%<tightpage> neg 2 copy lt{exch}if dup 0 gt{pop 0 exch}%
1669%<tightpage> {exch dup 0 lt{pop 0}if}ifelse 720 add exch 720 add
1670%<tightpage> 3 1 roll
1671% \end{macrocode}
1672% Ok, we now have the bounding box on the stack in the proper order
1673% llx, lly, urx, ury. We add the adjustments:
1674% \begin{macrocode}
1675%<tightpage> 4{5 -1 roll add 4 1 roll}repeat
1676% \end{macrocode}
1677% The page size is calculated as the appropriate differences, the page
1678% offset consists of the coordinates of the lower left corner, with
1679% those coordinates negated that would be reckoned positive in the
1680% device coordinate system.
1681% \begin{macrocode}
1682%<tightpage> <</PageSize[5 -1 roll 6 index sub 5 -1 roll 5 index sub]%
1683%<tightpage> /PageOffset[7 -2 roll [1 1 dtransform exch]%
1684%<tightpage> {0 ge{neg}if exch}forall]>>setpagedevice}if%
1685% \end{macrocode}
1686% So we now bind the old definition of |bop-hook| into our new
1687% definition and finish it.
1688% \begin{macrocode}
1689%<tightpage> //bop-hook exec}bind def end}}}
1690%<tightpage>\fi
1691% \end{macrocode}
1692%
1693% \subsection{The \texttt{showlabels} option}
1694% During the editing process, some people like to see the label names
1695% in their equations, figures and the like. Now if you are using
1696% Emacs for editing, and in particular \previewlatex, I'd strongly
1697% recommend that you check out the Ref\TeX\ package which pretty much
1698% obliterates the need for this kind of functionality. If you still
1699% want it, standard \LaTeX\ provides it with the |showkeys| package,
1700% and there is also the less encompassing |showlabels| package.
1701% Unfortunately, since those go to some pain not to change the page
1702% layout and spacing, they also don't change |preview|'s idea of the
1703% \TeX\ dimensions of the involved boxes.
1704%
1705% So those packages are mostly useless. So we present here an
1706% alternative hack that will get the labels through.
1707% \begin{macro}{\pr@labelbox}
1708% This works by collecting them into a separate box which we then
1709% tack to the right of the previews.
1710% \begin{macrocode}
1711%<showlabels>\ifPreview\else\expandafter\endinput\fi
1712%<showlabels>\newbox\pr@labelbox
1713% \end{macrocode}
1714% \end{macro}
1715% \begin{macro}{\pr@label}
1716% We follow up with our own definition of the \cmd{\label} macro
1717% which will be active only in previews. The original definition is
1718% stored in |\pr@@label|. |\pr@lastlabel| contains the last typeset
1719% label in order to avoid duplication in certain environments, and
1720% we keep the stuff in |\pr@labelbox|.
1721% \begin{macrocode}
1722%<showlabels>\def\pr@label#1{\pr@@label{#1}%
1723% \end{macrocode}
1724% Ok, now we generate the box, by placing the label below any existing
1725% stuff.
1726% \begin{macrocode}
1727%<showlabels> \ifpr@setbox\z@{#1}%
1728%<showlabels> \global\setbox\pr@labelbox\vbox{\unvbox\pr@labelbox
1729%<showlabels> \box\z@}\egroup\fi}
1730% \end{macrocode}
1731% \end{macro}
1732% \begin{macro}{\ifpr@setbox}
1733% |\ifpr@setbox| receives two arguments, |#1| is the box into which
1734% to set a label, |#2| is the label text itself. If a label needs
1735% to be set (if it is not a duplicate in the current box, and is
1736% nonempty, and we are in the course of typesetting and so on), we
1737% are left in a true conditional and an open group with the preset
1738% box. If nothing should be set, no group is opened, and we get
1739% into skipping to the closing of the conditional. Since
1740% |\ifpr@setbox| is a macro, you should not place the call to it
1741% into conditional text, since it will not pair up with |\fi| until
1742% being expanded.
1743%
1744% We have some trickery involved here. |\romannumeral\z@| expands
1745% to empty, and will also remove everything between the two of them
1746% that also expands to empty, like a chain of |\fi|.
1747% \begin{macrocode}
1748%<showlabels>\def\ifpr@setbox#1#2{%
1749%<showlabels> \romannumeral%
1750%<showlabels> \ifx\protect\@typeset@protect\ifpr@outer\else
1751% \end{macrocode}
1752% Ignore empty labels\dots
1753% \begin{macrocode}
1754%<showlabels> \z@\bgroup
1755%<showlabels> \protected@edef\next{#2}\@onelevel@sanitize\next
1756%<showlabels> \ifx\next\@empty\egroup\romannumeral\else
1757% \end{macrocode}
1758% and labels equal to the last one.
1759% \begin{macrocode}
1760%<showlabels> \ifx\next\pr@lastlabel\egroup\romannumeral\else
1761%<showlabels> \global\let\pr@lastlabel\next
1762%<showlabels> \setbox#1\pr@boxlabel\pr@lastlabel
1763%<showlabels> \expandafter\expandafter\romannumeral\fi\fi\fi\fi
1764%<showlabels> \z@\iffalse\iftrue\fi}
1765% \end{macrocode}
1766% \end{macro}
1767% \begin{macro}{\pr@boxlabel}
1768% Now the actual typesetting of a label box is done. We use a small
1769% typewriter font inside of a framed box (the default frame/box
1770% separating distance is a bit large).
1771% \begin{macrocode}
1772%<showlabels>\def\pr@boxlabel#1{\hbox{\normalfont
1773%<showlabels> \footnotesize\ttfamily\fboxsep0.4ex\relax\fbox{#1}}}
1774% \end{macrocode}
1775% \end{macro}
1776% \begin{macro}{\pr@maketag}
1777% And here is a version for |amsmath| equations. They look better
1778% when the label is right beside the tag, so we place it there, but
1779% augment |\box\pr@labelbox| with an appropriate placeholder.
1780% \begin{macrocode}
1781%<showlabels>\def\pr@maketag#1{\pr@@maketag{#1}%
1782%<showlabels> \ifpr@setbox\z@{\df@label}%
1783%<showlabels> \global\setbox\pr@labelbox\vbox{%
1784%<showlabels> \hrule\@width\wd\z@\@height\z@
1785%<showlabels> \unvbox\pr@labelbox}%
1786% \end{macrocode}
1787% Set the width of the box to empty so that the label placement gets
1788% not disturbed, then append it.
1789% \begin{macrocode}
1790%<showlabels> \wd\z@\z@\box\z@ \egroup\fi}
1791% \end{macrocode}
1792% \end{macro}
1793% \begin{macro}{\pr@lastlabel}
1794% Ok, here is how we activate this: we clear out box and label info
1795% \begin{macrocode}
1796%<showlabels>\g@addto@macro\pr@ship@start{%
1797%<showlabels> \global\setbox\pr@labelbox\box\voidb@x
1798%<showlabels> \xdef\pr@lastlabel{}%
1799% \end{macrocode}
1800% The definitions above are global because we might be in any amount
1801% of nesting. We then reassign the appropriate labelling macros:
1802% \begin{macrocode}
1803%<showlabels> \global\let\pr@@label\label \let\label\pr@label
1804%<showlabels> \global\let\pr@@maketag\maketag@@@
1805%<showlabels> \let\maketag@@@\pr@maketag
1806%<showlabels>}
1807% \end{macrocode}
1808% \end{macro}
1809% Now all we have to do is to add the stuff to the box in question.
1810% The stuff at the front works around a bug in |ntheorem.sty|.
1811% \begin{macrocode}
1812%<showlabels>\pr@addto@front\pr@ship@end{%
1813%<showlabels> \ifx \label\pr@label \global\let\label\pr@@label \fi
1814%<showlabels> \ifx \maketag@@@\pr@maketag
1815%<showlabels> \global\let\maketag@@@\pr@@maketag \fi
1816%<showlabels> \ifvoid\pr@labelbox
1817%<showlabels> \else \setbox\pr@box\hbox{%
1818%<showlabels> \box\pr@box\,\box\pr@labelbox}%
1819%<showlabels> \fi}
1820% \end{macrocode}
1821% \subsection{The \texttt{footnotes} option}
1822% This is rather simplistic right now. It overrides the default
1823% footnote action (which is to disable footnotes altogether for better
1824% visibility).
1825% \begin{macrocode}
1826%<footnotes>\PreviewMacro[[!]\footnote %]
1827% \end{macrocode}
1828%
1829% \section{Various driver files}
1830% The installer, in case it is missing. If it is to be used via
1831% |make|, we don't specify an installation path, since
1832% \begin{quote}
1833% |make install|
1834% \end{quote}
1835% is supposed to cater for the installation itself.
1836% \begin{macrocode}
1837%<installer> \input docstrip
1838%<installer&make> \askforoverwritefalse
1839%<installer> \generate{
1840%<installer> \file{preview.drv}{\from{preview.dtx}{driver}}
1841%<installer&!make> \usedir{tex/latex/preview}
1842%<installer> \file{preview.sty}{\from{preview.dtx}{style}
1843%<installer> \from{preview.dtx}{style,active}}
1844%<installer> \file{prauctex.def}{\from{preview.dtx}{auctex}}
1845%<installer> \file{prauctex.cfg}{\from{preview.dtx}{auccfg}}
1846%<installer> \file{prshowbox.def}{\from{preview.dtx}{showbox}}
1847%<installer> \file{prshowlabels.def}{\from{preview.dtx}{showlabels}}
1848%<installer> \file{prtracingall.def}{\from{preview.dtx}{tracingall}}
1849%<installer> \file{prtightpage.def}{\from{preview.dtx}{tightpage}}
1850%<installer> \file{prlyx.def}{\from{preview.dtx}{lyx}}
1851%<installer> \file{prcounters.def}{\from{preview.dtx}{counters}}
1852%<installer> \file{prfootnotes.def}{\from{preview.dtx}{footnotes}}
1853%<installer> }
1854%<installer> \endbatchfile
1855% \end{macrocode}
1856% And here comes the documentation driver.
1857% \begin{macrocode}
1858%<driver> \documentclass{ltxdoc}
1859%<driver> \usepackage{preview}
1860%<driver> \let\ifPreview\relax
1861%<driver> \newcommand\previewlatex{\texttt{preview-latex}}
1862%<driver> \begin{document}
1863%<driver> \DocInput{preview.dtx}
1864%<driver> \end{document}
1865% \end{macrocode}
1866% \Finale{}
1867% \iffalse
1868% Local Variables:
1869% mode: doctex
1870% TeX-master: "preview.drv"
1871% End:
1872% \fi
diff --git a/build/preview/preview.ins b/build/preview/preview.ins
new file mode 100644
index 0000000..1d4229d
--- /dev/null
+++ b/build/preview/preview.ins
@@ -0,0 +1,44 @@
1%%
2%% This is file `preview.ins',
3%% generated with the docstrip utility.
4%%
5%% The original source files were:
6%%
7%% preview.dtx (with options: `installer')
8%%
9%% IMPORTANT NOTICE:
10%%
11%% For the copyright see the source file.
12%%
13%% Any modified versions of this file must be renamed
14%% with new filenames distinct from preview.ins.
15%%
16%% For distribution of the original source see the terms
17%% for copying and modification in the file preview.dtx.
18%%
19%% This generated file may be distributed as long as the
20%% original source files, as listed above, are part of the
21%% same distribution. (The sources need not necessarily be
22%% in the same archive or directory.)
23%% The preview style for extracting previews from LaTeX documents.
24%% Developed as part of AUCTeX <URL:http://www.gnu.org/software/auctex>.
25 \input docstrip
26 \generate{
27 \file{preview.drv}{\from{preview.dtx}{driver}}
28 \usedir{tex/latex/preview}
29 \file{preview.sty}{\from{preview.dtx}{style}
30 \from{preview.dtx}{style,active}}
31 \file{prauctex.def}{\from{preview.dtx}{auctex}}
32 \file{prauctex.cfg}{\from{preview.dtx}{auccfg}}
33 \file{prshowbox.def}{\from{preview.dtx}{showbox}}
34 \file{prshowlabels.def}{\from{preview.dtx}{showlabels}}
35 \file{prtracingall.def}{\from{preview.dtx}{tracingall}}
36 \file{prtightpage.def}{\from{preview.dtx}{tightpage}}
37 \file{prlyx.def}{\from{preview.dtx}{lyx}}
38 \file{prcounters.def}{\from{preview.dtx}{counters}}
39 \file{prfootnotes.def}{\from{preview.dtx}{footnotes}}
40 }
41 \endbatchfile
42\endinput
43%%
44%% End of file `preview.ins'.
diff --git a/build/preview/preview.sty.do b/build/preview/preview.sty.do
new file mode 100644
index 0000000..20af68c
--- /dev/null
+++ b/build/preview/preview.sty.do
@@ -0,0 +1,4 @@
1redo-ifchange preview.dtx preview.ins
2KEEP="preview.dtx preview.ins preview.sty.do"
3find * -maxdepth 0 $(for x in $KEEP; do echo "-not -name $x"; done) | xargs rm
4latex -interaction=batchmode preview.ins >&2
diff --git a/build/template.html5 b/build/template.html5
new file mode 100644
index 0000000..3d4f74b
--- /dev/null
+++ b/build/template.html5
@@ -0,0 +1,61 @@
1<!DOCTYPE html>
2<html$if(lang)$ lang="$lang$"$endif$>
3<head>
4 <meta charset="utf-8">
5 <meta name="generator" content="pandoc">
6 <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
7$for(author-meta)$
8 <meta name="author" content="$author-meta$">
9$endfor$
10$if(date-meta)$
11 <meta name="dcterms.date" content="$date-meta$">
12$endif$
13 <title>$if(title-prefix)$$title-prefix$ - $endif$$pagetitle$</title>
14 <style type="text/css">code{white-space: pre;}</style>
15 <!--[if lt IE 9]>
16 <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
17 <![endif]-->
18$if(quotes)$
19 <style type="text/css">q { quotes: "“" "”" "‘" "’"; }</style>
20$endif$
21$if(highlighting-css)$
22 <style type="text/css">
23$highlighting-css$
24 </style>
25$endif$
26$for(css)$
27 <link rel="stylesheet" href="$css$">
28$endfor$
29$if(math)$
30 $math$
31$endif$
32$for(header-includes)$
33 $header-includes$
34$endfor$
35</head>
36<body>
37$for(include-before)$
38$include-before$
39$endfor$
40$if(title)$
41<header>
42 <h1 class="title"><a href="/" title="math.kleen.org">math.kleen.org</a>: $title$</h1>
43 <nav id="top-level">
44 <ul>
45 <li><a href="/index.html" title="Index">Index</a></li>
46 <li><a href="/about.html" title="About">About</a></li>
47 </ul>
48 </nav>
49</header>
50$endif$
51$if(toc)$
52<nav id="$idprefix$TOC">
53$toc$
54</nav>
55$endif$
56$body$
57$for(include-after)$
58$include-after$
59$endfor$
60</body>
61</html>
diff --git a/build/tex-filter.hs b/build/tex-filter.hs
new file mode 100755
index 0000000..67cc88c
--- /dev/null
+++ b/build/tex-filter.hs
@@ -0,0 +1,58 @@
1#!/usr/bin/env runhaskell
2{-# LANGUAGE OverloadedStrings #-}
3
4import Text.Pandoc.JSON
5
6import Control.Monad
7import Control.Applicative
8import qualified Data.ByteString.Char8 as BS
9import Crypto.Hash
10import System.IO
11import System.Directory
12import System.FilePath
13import Text.Printf
14
15import qualified Data.Text
16
17type TeX = String
18type RawHTML = String
19
20texToPath :: FilePath -> TeX -> FilePath
21texToPath base s = base </> "tex" </> (show ( hash (BS.pack s) :: Digest SHA1))
22
23texToSVGPath :: FilePath -> TeX -> FilePath
24texToSVGPath b s = texToPath b s </> "image.svg"
25
26texToAlignPath :: FilePath -> TeX -> FilePath
27texToAlignPath b s = texToPath b s </> "vertical-align"
28
29texToExprPath :: FilePath -> TeX -> FilePath
30texToExprPath b s = texToPath b s </> "image.expr"
31
32compileToSVG :: FilePath -> MathType -> TeX -> IO RawHTML
33compileToSVG basepath t s = let tex = Data.Text.unpack $ Data.Text.strip $ Data.Text.pack s
34 path = texToPath basepath tex
35 svg_path = texToSVGPath basepath tex
36 svg_web_path = texToSVGPath "" tex
37 align_path = texToAlignPath basepath tex
38 expr_path = texToExprPath basepath tex
39
40 display DisplayMath = "\\displaystyle\n"
41 display InlineMath = ""
42 in do createDirectoryIfMissing True path
43 any (/= True) <$> mapM doesFileExist [svg_path, align_path, expr_path] >>= (flip when)
44 (do writeFile expr_path $ (display t) ++ tex
45 writeFile align_path "0")
46 alignment <- head.lines <$> readFile align_path
47 hPutStrLn stderr path
48 return $ printf "<object data=\"/%s\" type=\"image/svg+xml\" style=\"vertical-align:-%s\">%s</object>" svg_web_path alignment tex
49
50texify :: [String] -> Inline -> IO Inline
51texify [basepath] (Math t s) = do svg <- compileToSVG basepath t s
52 return $ Span ("", [classOf t], []) [RawInline (Format "html") svg]
53 where classOf DisplayMath = "display-math"
54 classOf InlineMath = "inline-math"
55texify [_] x = return x
56
57main :: IO ()
58main = toJSONFilter texify
diff --git a/clean.do b/clean.do
new file mode 100644
index 0000000..b5a851a
--- /dev/null
+++ b/clean.do
@@ -0,0 +1,3 @@
1find -name '*.html' -not -path './nginx/*' -not -path './htdocs/*' -delete
2find -name '*.md' -not -path './posts/*' -delete
3rm tex -rf \ No newline at end of file
diff --git a/default.do b/default.do
new file mode 100644
index 0000000..cdf8ef8
--- /dev/null
+++ b/default.do
@@ -0,0 +1,2 @@
1redo-ifchange index.html
2rsync -Rv style.css *.html lists/*.html posts/*.html tex/*/*.svg htdocs/
diff --git a/default.html.do b/default.html.do
new file mode 100644
index 0000000..d2b1ed2
--- /dev/null
+++ b/default.html.do
@@ -0,0 +1,13 @@
1redo-ifchange $2.md build/tex-filter.hs build/template.html5
2
3CSS=/style.css
4
5pandoc -t json $2.md | build/tex-filter.hs "$(pwd)" 2>&1 >/dev/null \
6 | while read -r x; do
7 echo $x/image.svg
8 done \
9 | xargs -d '\n' redo-ifchange
10
11pandoc -f markdown -t json $2.md \
12 | build/tex-filter.hs "$(pwd)" 2>/dev/null \
13 | pandoc --template=build/template.html5 --base-header-level=3 --standalone -S -f json -t html5 -c $CSS >$3 2>/dev/null
diff --git a/default.svg.do b/default.svg.do
new file mode 100644
index 0000000..5fc067e
--- /dev/null
+++ b/default.svg.do
@@ -0,0 +1,20 @@
1redo-ifchange $2.expr build/preview/preview.sty build/preview/prtightpage.def build/preamble.tex
2INPUT=$(realpath $2.expr)
3TDIR=$(mktemp -d --tmpdir=/tmp)
4
5cp build/preview/preview.sty build/preview/prtightpage.def build/preamble.tex $TDIR
6
7pushd $TDIR
8latex -jobname=image <<EOF
9\input{preamble.tex}
10\begin{document}
11\begin{preview}
12\(
13\input{$INPUT}
14\)
15\end{preview}
16\end{document}
17EOF
18popd
19
20dvisvgm --exact --no-fonts -o $3 $TDIR/image.dvi 2>&1 | sed -e '/depth=/!d;s/^.*depth=\(.*\)$/\1/' > $(dirname $2)/vertical-align
diff --git a/do b/do
new file mode 100755
index 0000000..5f20bb8
--- /dev/null
+++ b/do
@@ -0,0 +1,177 @@
1#!/bin/sh
2#
3# A minimal alternative to djb redo that doesn't support incremental builds.
4# For the full version, visit http://github.com/apenwarr/redo
5#
6# The author disclaims copyright to this source file and hereby places it in
7# the public domain. (2010 12 14)
8#
9
10# By default, no output coloring.
11green=""
12bold=""
13plain=""
14
15if [ -n "$TERM" -a "$TERM" != "dumb" ] && tty <&2 >/dev/null 2>&1; then
16 green="$(printf '\033[32m')"
17 bold="$(printf '\033[1m')"
18 plain="$(printf '\033[m')"
19fi
20
21_dirsplit()
22{
23 base=${1##*/}
24 dir=${1%$base}
25}
26
27dirname()
28(
29 _dirsplit "$1"
30 dir=${dir%/}
31 echo "${dir:-.}"
32)
33
34_dirsplit "$0"
35export REDO=$(cd "${dir:-.}" && echo "$PWD/$base")
36
37DO_TOP=
38if [ -z "$DO_BUILT" ]; then
39 DO_TOP=1
40 [ -n "$*" ] || set all # only toplevel redo has a default target
41 export DO_BUILT=$PWD/.do_built
42 : >>"$DO_BUILT"
43 echo "Removing previously built files..." >&2
44 sort -u "$DO_BUILT" | tee "$DO_BUILT.new" |
45 while read f; do printf "%s\0%s.did\0" "$f" "$f"; done |
46 xargs -0 rm -f 2>/dev/null
47 mv "$DO_BUILT.new" "$DO_BUILT"
48 DO_PATH=$DO_BUILT.dir
49 export PATH=$DO_PATH:$PATH
50 rm -rf "$DO_PATH"
51 mkdir "$DO_PATH"
52 for d in redo redo-ifchange; do
53 ln -s "$REDO" "$DO_PATH/$d";
54 done
55 [ -e /bin/true ] && TRUE=/bin/true || TRUE=/usr/bin/true
56 for d in redo-ifcreate redo-stamp redo-always; do
57 ln -s $TRUE "$DO_PATH/$d";
58 done
59fi
60
61
62_find_dofile_pwd()
63{
64 dofile=default.$1.do
65 while :; do
66 dofile=default.${dofile#default.*.}
67 [ -e "$dofile" -o "$dofile" = default.do ] && break
68 done
69 ext=${dofile#default}
70 ext=${ext%.do}
71 base=${1%$ext}
72}
73
74
75_find_dofile()
76{
77 local prefix=
78 while :; do
79 _find_dofile_pwd "$1"
80 [ -e "$dofile" ] && break
81 [ "$PWD" = "/" ] && break
82 target=${PWD##*/}/$target
83 tmp=${PWD##*/}/$tmp
84 prefix=${PWD##*/}/$prefix
85 cd ..
86 done
87 base=$prefix$base
88}
89
90
91_run_dofile()
92{
93 export DO_DEPTH="$DO_DEPTH "
94 export REDO_TARGET=$PWD/$target
95 local line1
96 set -e
97 read line1 <"$PWD/$dofile" || true
98 cmd=${line1#"#!/"}
99 if [ "$cmd" != "$line1" ]; then
100 /$cmd "$PWD/$dofile" "$@" >"$tmp.tmp2"
101 else
102 :; . "$PWD/$dofile" >"$tmp.tmp2"
103 fi
104}
105
106
107_do()
108{
109 local dir=$1 target=$2 tmp=$3
110 if [ ! -e "$target" ] || [ -d "$target" -a ! -e "$target.did" ]; then
111 printf '%sdo %s%s%s%s\n' \
112 "$green" "$DO_DEPTH" "$bold" "$dir$target" "$plain" >&2
113 echo "$PWD/$target" >>"$DO_BUILT"
114 dofile=$target.do
115 base=$target
116 ext=
117 [ -e "$target.do" ] || _find_dofile "$target"
118 if [ ! -e "$dofile" ]; then
119 echo "do: $target: no .do file" >&2
120 return 1
121 fi
122 [ ! -e "$DO_BUILT" ] || [ ! -d "$(dirname "$target")" ] ||
123 : >>"$target.did"
124 ( _run_dofile "$target" "$base" "$tmp.tmp" )
125 rv=$?
126 if [ $rv != 0 ]; then
127 printf "do: %s%s\n" "$DO_DEPTH" \
128 "$dir$target: got exit code $rv" >&2
129 rm -f "$tmp.tmp" "$tmp.tmp2"
130 return $rv
131 fi
132 mv "$tmp.tmp" "$target" 2>/dev/null ||
133 ! test -s "$tmp.tmp2" ||
134 mv "$tmp.tmp2" "$target" 2>/dev/null
135 rm -f "$tmp.tmp2"
136 else
137 echo "do $DO_DEPTH$target exists." >&2
138 fi
139}
140
141
142# Make corrections for directories that don't actually exist yet.
143_dir_shovel()
144{
145 local dir base
146 xdir=$1 xbase=$2 xbasetmp=$2
147 while [ ! -d "$xdir" -a -n "$xdir" ]; do
148 _dirsplit "${xdir%/}"
149 xbasetmp=${base}__$xbase
150 xdir=$dir xbase=$base/$xbase
151 echo "xbasetmp='$xbasetmp'" >&2
152 done
153}
154
155
156_redo()
157{
158 set +e
159 for i in "$@"; do
160 _dirsplit "$i"
161 _dir_shovel "$dir" "$base"
162 dir=$xdir base=$xbase basetmp=$xbasetmp
163 ( cd "$dir" && _do "$dir" "$base" "$basetmp" )
164 [ "$?" = 0 ] || return 1
165 done
166}
167
168
169_redo "$@"
170[ "$?" = 0 ] || exit 1
171
172if [ -n "$DO_TOP" ]; then
173 echo "Removing stamp files..." >&2
174 [ ! -e "$DO_BUILT" ] ||
175 while read f; do printf "%s.did\0" "$f"; done <"$DO_BUILT" |
176 xargs -0 rm -f 2>/dev/null
177fi
diff --git a/index.md.do b/index.md.do
new file mode 100644
index 0000000..02c10af
--- /dev/null
+++ b/index.md.do
@@ -0,0 +1,18 @@
1#!/usr/bin/env bash
2LISTS=()
3while read -r -d $'\0'; do
4 LISTS+=("$REPLY")
5done < <(find lists -maxdepth 1 -mindepth 1 -type d -not -name '.*' -print0 | sort -z)
6
7for x in "${LISTS[@]}"; do
8 printf "%s.html\0" "$x"
9done | xargs -r -0 redo-ifchange
10
11cat <<EOF
12% Index
13
14EOF
15
16for x in "${LISTS[@]}"; do
17 printf "* [%s](%s)\n" "$(<$x/title)" "$x.html"
18done
diff --git a/lists/all/001 b/lists/all/001
new file mode 120000
index 0000000..1ce79c6
--- /dev/null
+++ b/lists/all/001
@@ -0,0 +1 @@
../../posts/blub.md \ No newline at end of file
diff --git a/lists/all/002 b/lists/all/002
new file mode 120000
index 0000000..1ca4d2f
--- /dev/null
+++ b/lists/all/002
@@ -0,0 +1 @@
../../posts/blub2.md \ No newline at end of file
diff --git a/lists/all/003 b/lists/all/003
new file mode 120000
index 0000000..5df958a
--- /dev/null
+++ b/lists/all/003
@@ -0,0 +1 @@
../../posts/blub3.md \ No newline at end of file
diff --git a/lists/all/title b/lists/all/title
new file mode 100644
index 0000000..73a5267
--- /dev/null
+++ b/lists/all/title
@@ -0,0 +1 @@
All Posts
diff --git a/lists/default.md.do b/lists/default.md.do
new file mode 100644
index 0000000..94636df
--- /dev/null
+++ b/lists/default.md.do
@@ -0,0 +1,24 @@
1#!/usr/bin/env bash
2redo-ifchange "$2/title"
3
4POSTS=()
5while read -r -d $'\0'; do
6 post=$(realpath --relative-to=. "$REPLY")
7 POSTS+=("$post")
8done < <(find "$2" -maxdepth 1 -mindepth 1 -not -name 'title' -print0 | sort -z)
9
10for x in "${POSTS[@]}"; do
11 printf "%s\0%s\0" "$x" "${x%.md}.html"
12done | xargs -r -0 redo-ifchange
13
14TITLE=$(< $2/title)
15
16cat <<EOF
17% $(< "$2/title")
18
19EOF
20
21for x in "${POSTS[@]}"; do
22 title=$(pandoc -t json "$x" | ../build/extract-title.hs 2>&1 >/dev/null)
23 printf "* [%s](%s)\n" "$title" "${x%.md}.html"
24done
diff --git a/lists/stuff/001 b/lists/stuff/001
new file mode 120000
index 0000000..1ce79c6
--- /dev/null
+++ b/lists/stuff/001
@@ -0,0 +1 @@
../../posts/blub.md \ No newline at end of file
diff --git a/lists/stuff/002 b/lists/stuff/002
new file mode 120000
index 0000000..5df958a
--- /dev/null
+++ b/lists/stuff/002
@@ -0,0 +1 @@
../../posts/blub3.md \ No newline at end of file
diff --git a/lists/stuff/title b/lists/stuff/title
new file mode 100644
index 0000000..9d43527
--- /dev/null
+++ b/lists/stuff/title
@@ -0,0 +1 @@
Stuff
diff --git a/posts/blub.md b/posts/blub.md
new file mode 100644
index 0000000..96b7125
--- /dev/null
+++ b/posts/blub.md
@@ -0,0 +1,40 @@
1% Blub post
2
3# This is a post #
4
5## This is the first section ##
6
7So apparently this is a post now. Well, hope you're happy. Look at what you've
8done. Great work. Here, have some inline $a=b$ math.
9
10The European languages are members of the same family. Their separate existence
11is a myth. For science, music, sport, etc, Europe uses the same vocabulary. The
12languages only differ in their grammar, their pronunciation and their most
13common words. Everyone realizes why a new common language would be desirable:
14one could refuse to pay expensive translators.
15
16To achieve this, it would be necessary to have uniform grammar, pronunciation
17and more common words. If several languages coalesce, the grammar of the
18resulting language is more simple and regular than that of the individual
19languages. The new common language will be more simple and regular than the
20existing European languages. It will be as simple as Occidental; in fact, it
21will be Occidental. To an English person, it will seem like simplified English,
22as a skeptical Cambridge friend of mine told me what Occidental is.
23
24## This is the second section ##
25
26Oh god! You're still going. But why? This is not normal!
27
28The European languages are members of the same family. Their separate existence
29is a myth. For science, music, sport, etc, Europe uses the same vocabulary. The
30languages only differ in their grammar, their pronunciation and their most
31common words. Everyone realizes why a new common language would be desirable:
32one could refuse to pay expensive translators.
33
34To achieve this, it would be necessary to have uniform grammar, pronunciation
35and more common words. If several languages coalesce, the grammar of the
36resulting language is more simple and regular than that of the individual
37languages. The new common language will be more simple and regular than the
38existing European languages. It will be as simple as Occidental; in fact, it
39will be Occidental. To an English person, it will seem like simplified English,
40as a skeptical Cambridge friend of mine told me what Occidental is.
diff --git a/posts/blub2.md b/posts/blub2.md
new file mode 100644
index 0000000..4cd7606
--- /dev/null
+++ b/posts/blub2.md
@@ -0,0 +1,40 @@
1% The Second Post
2
3# This the second post #
4
5## This is the first section of the second post ##
6
7So apparently this is a post now. Well, hope you're happy. Look at what you've
8done. Great work.
9
10The European languages are members of the same family. Their separate existence
11is a myth. For science, music, sport, etc, Europe uses the same vocabulary. The
12languages only differ in their grammar, their pronunciation and their most
13common words. Everyone realizes why a new common language would be desirable:
14one could refuse to pay expensive translators.
15
16To achieve this, it would be necessary to have uniform grammar, pronunciation
17and more common words. If several languages coalesce, the grammar of the
18resulting language is more simple and regular than that of the individual
19languages. The new common language will be more simple and regular than the
20existing European languages. It will be as simple as Occidental; in fact, it
21will be Occidental. To an English person, it will seem like simplified English,
22as a skeptical Cambridge friend of mine told me what Occidental is.
23
24## This is the second section ##
25
26Oh god! You're still going. But why? This is not normal!
27
28The European languages are members of the same family. Their separate existence
29is a myth. For science, music, sport, etc, Europe uses the same vocabulary. The
30languages only differ in their grammar, their pronunciation and their most
31common words. Everyone realizes why a new common language would be desirable:
32one could refuse to pay expensive translators.
33
34To achieve this, it would be necessary to have uniform grammar, pronunciation
35and more common words. If several languages coalesce, the grammar of the
36resulting language is more simple and regular than that of the individual
37languages. The new common language will be more simple and regular than the
38existing European languages. It will be as simple as Occidental; in fact, it
39will be Occidental. To an English person, it will seem like simplified English,
40as a skeptical Cambridge friend of mine told me what Occidental is.
diff --git a/posts/blub3.md b/posts/blub3.md
new file mode 100644
index 0000000..a6433d4
--- /dev/null
+++ b/posts/blub3.md
@@ -0,0 +1,40 @@
1% A Post!
2
3# A Post! #
4
5## What? ##
6
7So apparently this is a post now. Well, hope you're happy. Look at what you've
8done. Great work.
9
10The European languages are members of the same family. Their separate existence
11is a myth. For science, music, sport, etc, Europe uses the same vocabulary. The
12languages only differ in their grammar, their pronunciation and their most
13common words. Everyone realizes why a new common language would be desirable:
14one could refuse to pay expensive translators.
15
16To achieve this, it would be necessary to have uniform grammar, pronunciation
17and more common words. If several languages coalesce, the grammar of the
18resulting language is more simple and regular than that of the individual
19languages. The new common language will be more simple and regular than the
20existing European languages. It will be as simple as Occidental; in fact, it
21will be Occidental. To an English person, it will seem like simplified English,
22as a skeptical Cambridge friend of mine told me what Occidental is.
23
24## But but! ##
25
26Oh god! You're still going. But why? This is not normal!
27
28The European languages are members of the same family. Their separate existence
29is a myth. For science, music, sport, etc, Europe uses the same vocabulary. The
30languages only differ in their grammar, their pronunciation and their most
31common words. Everyone realizes why a new common language would be desirable:
32one could refuse to pay expensive translators.
33
34To achieve this, it would be necessary to have uniform grammar, pronunciation
35and more common words. If several languages coalesce, the grammar of the
36resulting language is more simple and regular than that of the individual
37languages. The new common language will be more simple and regular than the
38existing European languages. It will be as simple as Occidental; in fact, it
39will be Occidental. To an English person, it will seem like simplified English,
40as a skeptical Cambridge friend of mine told me what Occidental is.
diff --git a/style.css b/style.css
new file mode 100644
index 0000000..b86b20c
--- /dev/null
+++ b/style.css
@@ -0,0 +1,64 @@
1body {
2 margin: auto;
3 padding-right: 1em;
4 padding-left: 1em;
5 font: normal 1.1em/1.3em monospace;
6 width: 60em;
7 text-align: justify;
8}
9
10.display-math {
11 display: block;
12 margin-top: 0.2em;
13 margin-bottm: 0.2em;
14 text-align: center;
15}
16
17.inline-math {
18 display: inline;
19}
20
21a {
22 color: inherit;
23}
24
25p {
26 margin-bottom: 0
27}
28
29p + p {
30 text-indent: 1.5em;
31 margin-top: 0
32}
33
34nav#top-level {
35 border-bottom: 1px solid grey;
36 border-top: 1px solid grey;
37 display: table;
38 text-align: center;
39 width: 100%;
40}
41
42nav#top-level ul {
43 display: table-row;
44}
45
46nav#top-level ul li {
47 display: table-cell;
48}
49
50nav#top-level ul li a {
51 display: inline-block;
52 width: 100%;
53 text-align: center;
54 text-decoration: none;
55 color: inherit;
56 text-transform: uppercase;
57}
58
59nav#top-level ul li a:hover {
60 display: inline-block;
61 width: 100%;
62 text-align: center;
63 background: lightgrey;
64}