summaryrefslogtreecommitdiff
path: root/build
diff options
context:
space:
mode:
authorViktor Kleen <viktor@kleen.org>2015-01-02 09:29:04 +0000
committerViktor Kleen <viktor@kleen.org>2015-01-02 09:29:04 +0000
commitf7d4ba2023ab18b9d7c5fad85cbb863c61e6272c (patch)
tree7ffe93f3629546f8a0cb4ca7c7c7ce70196e4387 /build
downloaddirty-haskell.org-f7d4ba2023ab18b9d7c5fad85cbb863c61e6272c.tar
dirty-haskell.org-f7d4ba2023ab18b9d7c5fad85cbb863c61e6272c.tar.gz
dirty-haskell.org-f7d4ba2023ab18b9d7c5fad85cbb863c61e6272c.tar.bz2
dirty-haskell.org-f7d4ba2023ab18b9d7c5fad85cbb863c61e6272c.tar.xz
dirty-haskell.org-f7d4ba2023ab18b9d7c5fad85cbb863c61e6272c.zip
initial commit
Diffstat (limited to 'build')
-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
8 files changed, 2321 insertions, 0 deletions
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