diff options
| -rw-r--r-- | .gitignore | 7 | ||||
| -rwxr-xr-x | build/add-math-kleen-org.hs | 13 | ||||
| -rwxr-xr-x | build/extract-title.hs | 16 | ||||
| -rw-r--r-- | build/preamble.tex | 253 | ||||
| -rw-r--r-- | build/preview/preview.dtx | 1872 | ||||
| -rw-r--r-- | build/preview/preview.ins | 44 | ||||
| -rw-r--r-- | build/preview/preview.sty.do | 4 | ||||
| -rw-r--r-- | build/template.html5 | 61 | ||||
| -rwxr-xr-x | build/tex-filter.hs | 58 | ||||
| -rw-r--r-- | clean.do | 3 | ||||
| -rw-r--r-- | default.do | 2 | ||||
| -rw-r--r-- | default.html.do | 13 | ||||
| -rw-r--r-- | default.svg.do | 20 | ||||
| -rwxr-xr-x | do | 177 | ||||
| -rw-r--r-- | index.md.do | 18 | ||||
| l--------- | lists/all/001 | 1 | ||||
| l--------- | lists/all/002 | 1 | ||||
| l--------- | lists/all/003 | 1 | ||||
| -rw-r--r-- | lists/all/title | 1 | ||||
| -rw-r--r-- | lists/default.md.do | 24 | ||||
| l--------- | lists/stuff/001 | 1 | ||||
| l--------- | lists/stuff/002 | 1 | ||||
| -rw-r--r-- | lists/stuff/title | 1 | ||||
| -rw-r--r-- | posts/blub.md | 40 | ||||
| -rw-r--r-- | posts/blub2.md | 40 | ||||
| -rw-r--r-- | posts/blub3.md | 40 | ||||
| -rw-r--r-- | style.css | 64 |
27 files changed, 2776 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..936b9f9 --- /dev/null +++ b/.gitignore | |||
| @@ -0,0 +1,7 @@ | |||
| 1 | .do_built* | ||
| 2 | build/preview/* | ||
| 3 | !build/preview/preview.dtx | ||
| 4 | !build/preview/preview.ins | ||
| 5 | !build/preview/preview.sty.do | ||
| 6 | htdocs | ||
| 7 | nginx \ No newline at end of file | ||
diff --git a/build/add-math-kleen-org.hs b/build/add-math-kleen-org.hs new file mode 100755 index 0000000..e564149 --- /dev/null +++ b/build/add-math-kleen-org.hs | |||
| @@ -0,0 +1,13 @@ | |||
| 1 | #!/usr/bin/env runhaskell | ||
| 2 | |||
| 3 | import Data.Map | ||
| 4 | import Text.Pandoc.Pretty | ||
| 5 | import Text.Pandoc.JSON | ||
| 6 | import System.IO | ||
| 7 | |||
| 8 | add_title :: Pandoc -> Pandoc | ||
| 9 | add_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 | |||
| 12 | main :: IO () | ||
| 13 | main = 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 | |||
| 3 | import Text.Pandoc.Pretty | ||
| 4 | import Text.Pandoc.JSON | ||
| 5 | import System.IO | ||
| 6 | |||
| 7 | extract_title :: Pandoc -> IO Pandoc | ||
| 8 | extract_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 | |||
| 15 | main :: IO () | ||
| 16 | main = 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}{% | ||
| 1025 | Your document class has a bad definition^^J | ||
| 1026 | of \string#1, most likely^^J | ||
| 1027 | \string\let\string#1=\string#2^^J | ||
| 1028 | which has now been changed to^^J | ||
| 1029 | \string\def\string#1{\string#2}^^J | ||
| 1030 | because otherwise subsequent changes to \string#2^^J | ||
| 1031 | (like done by several packages changing float behaviour)^^J | ||
| 1032 | can't take effect on \string#1.^^J | ||
| 1033 | Please 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 @@ | |||
| 1 | redo-ifchange preview.dtx preview.ins | ||
| 2 | KEEP="preview.dtx preview.ins preview.sty.do" | ||
| 3 | find * -maxdepth 0 $(for x in $KEEP; do echo "-not -name $x"; done) | xargs rm | ||
| 4 | latex -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 | |||
| 4 | import Text.Pandoc.JSON | ||
| 5 | |||
| 6 | import Control.Monad | ||
| 7 | import Control.Applicative | ||
| 8 | import qualified Data.ByteString.Char8 as BS | ||
| 9 | import Crypto.Hash | ||
| 10 | import System.IO | ||
| 11 | import System.Directory | ||
| 12 | import System.FilePath | ||
| 13 | import Text.Printf | ||
| 14 | |||
| 15 | import qualified Data.Text | ||
| 16 | |||
| 17 | type TeX = String | ||
| 18 | type RawHTML = String | ||
| 19 | |||
| 20 | texToPath :: FilePath -> TeX -> FilePath | ||
| 21 | texToPath base s = base </> "tex" </> (show ( hash (BS.pack s) :: Digest SHA1)) | ||
| 22 | |||
| 23 | texToSVGPath :: FilePath -> TeX -> FilePath | ||
| 24 | texToSVGPath b s = texToPath b s </> "image.svg" | ||
| 25 | |||
| 26 | texToAlignPath :: FilePath -> TeX -> FilePath | ||
| 27 | texToAlignPath b s = texToPath b s </> "vertical-align" | ||
| 28 | |||
| 29 | texToExprPath :: FilePath -> TeX -> FilePath | ||
| 30 | texToExprPath b s = texToPath b s </> "image.expr" | ||
| 31 | |||
| 32 | compileToSVG :: FilePath -> MathType -> TeX -> IO RawHTML | ||
| 33 | compileToSVG 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 | |||
| 50 | texify :: [String] -> Inline -> IO Inline | ||
| 51 | texify [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" | ||
| 55 | texify [_] x = return x | ||
| 56 | |||
| 57 | main :: IO () | ||
| 58 | main = toJSONFilter texify | ||
diff --git a/clean.do b/clean.do new file mode 100644 index 0000000..b5a851a --- /dev/null +++ b/clean.do | |||
| @@ -0,0 +1,3 @@ | |||
| 1 | find -name '*.html' -not -path './nginx/*' -not -path './htdocs/*' -delete | ||
| 2 | find -name '*.md' -not -path './posts/*' -delete | ||
| 3 | rm tex -rf \ No newline at end of file | ||
diff --git a/default.do b/default.do new file mode 100644 index 0000000..cdf8ef8 --- /dev/null +++ b/default.do | |||
| @@ -0,0 +1,2 @@ | |||
| 1 | redo-ifchange index.html | ||
| 2 | rsync -Rv style.css *.html lists/*.html posts/*.html tex/*/*.svg htdocs/ | ||
diff --git a/default.html.do b/default.html.do new file mode 100644 index 0000000..d2b1ed2 --- /dev/null +++ b/default.html.do | |||
| @@ -0,0 +1,13 @@ | |||
| 1 | redo-ifchange $2.md build/tex-filter.hs build/template.html5 | ||
| 2 | |||
| 3 | CSS=/style.css | ||
| 4 | |||
| 5 | pandoc -t json $2.md | build/tex-filter.hs "$(pwd)" 2>&1 >/dev/null \ | ||
| 6 | | while read -r x; do | ||
| 7 | echo $x/image.svg | ||
| 8 | done \ | ||
| 9 | | xargs -d '\n' redo-ifchange | ||
| 10 | |||
| 11 | pandoc -f markdown -t json $2.md \ | ||
| 12 | | build/tex-filter.hs "$(pwd)" 2>/dev/null \ | ||
| 13 | | pandoc --template=build/template.html5 --base-header-level=3 --standalone -S -f json -t html5 -c $CSS >$3 2>/dev/null | ||
diff --git a/default.svg.do b/default.svg.do new file mode 100644 index 0000000..5fc067e --- /dev/null +++ b/default.svg.do | |||
| @@ -0,0 +1,20 @@ | |||
| 1 | redo-ifchange $2.expr build/preview/preview.sty build/preview/prtightpage.def build/preamble.tex | ||
| 2 | INPUT=$(realpath $2.expr) | ||
| 3 | TDIR=$(mktemp -d --tmpdir=/tmp) | ||
| 4 | |||
| 5 | cp build/preview/preview.sty build/preview/prtightpage.def build/preamble.tex $TDIR | ||
| 6 | |||
| 7 | pushd $TDIR | ||
| 8 | latex -jobname=image <<EOF | ||
| 9 | \input{preamble.tex} | ||
| 10 | \begin{document} | ||
| 11 | \begin{preview} | ||
| 12 | \( | ||
| 13 | \input{$INPUT} | ||
| 14 | \) | ||
| 15 | \end{preview} | ||
| 16 | \end{document} | ||
| 17 | EOF | ||
| 18 | popd | ||
| 19 | |||
| 20 | dvisvgm --exact --no-fonts -o $3 $TDIR/image.dvi 2>&1 | sed -e '/depth=/!d;s/^.*depth=\(.*\)$/\1/' > $(dirname $2)/vertical-align | ||
| @@ -0,0 +1,177 @@ | |||
| 1 | #!/bin/sh | ||
| 2 | # | ||
| 3 | # A minimal alternative to djb redo that doesn't support incremental builds. | ||
| 4 | # For the full version, visit http://github.com/apenwarr/redo | ||
| 5 | # | ||
| 6 | # The author disclaims copyright to this source file and hereby places it in | ||
| 7 | # the public domain. (2010 12 14) | ||
| 8 | # | ||
| 9 | |||
| 10 | # By default, no output coloring. | ||
| 11 | green="" | ||
| 12 | bold="" | ||
| 13 | plain="" | ||
| 14 | |||
| 15 | if [ -n "$TERM" -a "$TERM" != "dumb" ] && tty <&2 >/dev/null 2>&1; then | ||
| 16 | green="$(printf '\033[32m')" | ||
| 17 | bold="$(printf '\033[1m')" | ||
| 18 | plain="$(printf '\033[m')" | ||
| 19 | fi | ||
| 20 | |||
| 21 | _dirsplit() | ||
| 22 | { | ||
| 23 | base=${1##*/} | ||
| 24 | dir=${1%$base} | ||
| 25 | } | ||
| 26 | |||
| 27 | dirname() | ||
| 28 | ( | ||
| 29 | _dirsplit "$1" | ||
| 30 | dir=${dir%/} | ||
| 31 | echo "${dir:-.}" | ||
| 32 | ) | ||
| 33 | |||
| 34 | _dirsplit "$0" | ||
| 35 | export REDO=$(cd "${dir:-.}" && echo "$PWD/$base") | ||
| 36 | |||
| 37 | DO_TOP= | ||
| 38 | if [ -z "$DO_BUILT" ]; then | ||
| 39 | DO_TOP=1 | ||
| 40 | [ -n "$*" ] || set all # only toplevel redo has a default target | ||
| 41 | export DO_BUILT=$PWD/.do_built | ||
| 42 | : >>"$DO_BUILT" | ||
| 43 | echo "Removing previously built files..." >&2 | ||
| 44 | sort -u "$DO_BUILT" | tee "$DO_BUILT.new" | | ||
| 45 | while read f; do printf "%s\0%s.did\0" "$f" "$f"; done | | ||
| 46 | xargs -0 rm -f 2>/dev/null | ||
| 47 | mv "$DO_BUILT.new" "$DO_BUILT" | ||
| 48 | DO_PATH=$DO_BUILT.dir | ||
| 49 | export PATH=$DO_PATH:$PATH | ||
| 50 | rm -rf "$DO_PATH" | ||
| 51 | mkdir "$DO_PATH" | ||
| 52 | for d in redo redo-ifchange; do | ||
| 53 | ln -s "$REDO" "$DO_PATH/$d"; | ||
| 54 | done | ||
| 55 | [ -e /bin/true ] && TRUE=/bin/true || TRUE=/usr/bin/true | ||
| 56 | for d in redo-ifcreate redo-stamp redo-always; do | ||
| 57 | ln -s $TRUE "$DO_PATH/$d"; | ||
| 58 | done | ||
| 59 | fi | ||
| 60 | |||
| 61 | |||
| 62 | _find_dofile_pwd() | ||
| 63 | { | ||
| 64 | dofile=default.$1.do | ||
| 65 | while :; do | ||
| 66 | dofile=default.${dofile#default.*.} | ||
| 67 | [ -e "$dofile" -o "$dofile" = default.do ] && break | ||
| 68 | done | ||
| 69 | ext=${dofile#default} | ||
| 70 | ext=${ext%.do} | ||
| 71 | base=${1%$ext} | ||
| 72 | } | ||
| 73 | |||
| 74 | |||
| 75 | _find_dofile() | ||
| 76 | { | ||
| 77 | local prefix= | ||
| 78 | while :; do | ||
| 79 | _find_dofile_pwd "$1" | ||
| 80 | [ -e "$dofile" ] && break | ||
| 81 | [ "$PWD" = "/" ] && break | ||
| 82 | target=${PWD##*/}/$target | ||
| 83 | tmp=${PWD##*/}/$tmp | ||
| 84 | prefix=${PWD##*/}/$prefix | ||
| 85 | cd .. | ||
| 86 | done | ||
| 87 | base=$prefix$base | ||
| 88 | } | ||
| 89 | |||
| 90 | |||
| 91 | _run_dofile() | ||
| 92 | { | ||
| 93 | export DO_DEPTH="$DO_DEPTH " | ||
| 94 | export REDO_TARGET=$PWD/$target | ||
| 95 | local line1 | ||
| 96 | set -e | ||
| 97 | read line1 <"$PWD/$dofile" || true | ||
| 98 | cmd=${line1#"#!/"} | ||
| 99 | if [ "$cmd" != "$line1" ]; then | ||
| 100 | /$cmd "$PWD/$dofile" "$@" >"$tmp.tmp2" | ||
| 101 | else | ||
| 102 | :; . "$PWD/$dofile" >"$tmp.tmp2" | ||
| 103 | fi | ||
| 104 | } | ||
| 105 | |||
| 106 | |||
| 107 | _do() | ||
| 108 | { | ||
| 109 | local dir=$1 target=$2 tmp=$3 | ||
| 110 | if [ ! -e "$target" ] || [ -d "$target" -a ! -e "$target.did" ]; then | ||
| 111 | printf '%sdo %s%s%s%s\n' \ | ||
| 112 | "$green" "$DO_DEPTH" "$bold" "$dir$target" "$plain" >&2 | ||
| 113 | echo "$PWD/$target" >>"$DO_BUILT" | ||
| 114 | dofile=$target.do | ||
| 115 | base=$target | ||
| 116 | ext= | ||
| 117 | [ -e "$target.do" ] || _find_dofile "$target" | ||
| 118 | if [ ! -e "$dofile" ]; then | ||
| 119 | echo "do: $target: no .do file" >&2 | ||
| 120 | return 1 | ||
| 121 | fi | ||
| 122 | [ ! -e "$DO_BUILT" ] || [ ! -d "$(dirname "$target")" ] || | ||
| 123 | : >>"$target.did" | ||
| 124 | ( _run_dofile "$target" "$base" "$tmp.tmp" ) | ||
| 125 | rv=$? | ||
| 126 | if [ $rv != 0 ]; then | ||
| 127 | printf "do: %s%s\n" "$DO_DEPTH" \ | ||
| 128 | "$dir$target: got exit code $rv" >&2 | ||
| 129 | rm -f "$tmp.tmp" "$tmp.tmp2" | ||
| 130 | return $rv | ||
| 131 | fi | ||
| 132 | mv "$tmp.tmp" "$target" 2>/dev/null || | ||
| 133 | ! test -s "$tmp.tmp2" || | ||
| 134 | mv "$tmp.tmp2" "$target" 2>/dev/null | ||
| 135 | rm -f "$tmp.tmp2" | ||
| 136 | else | ||
| 137 | echo "do $DO_DEPTH$target exists." >&2 | ||
| 138 | fi | ||
| 139 | } | ||
| 140 | |||
| 141 | |||
| 142 | # Make corrections for directories that don't actually exist yet. | ||
| 143 | _dir_shovel() | ||
| 144 | { | ||
| 145 | local dir base | ||
| 146 | xdir=$1 xbase=$2 xbasetmp=$2 | ||
| 147 | while [ ! -d "$xdir" -a -n "$xdir" ]; do | ||
| 148 | _dirsplit "${xdir%/}" | ||
| 149 | xbasetmp=${base}__$xbase | ||
| 150 | xdir=$dir xbase=$base/$xbase | ||
| 151 | echo "xbasetmp='$xbasetmp'" >&2 | ||
| 152 | done | ||
| 153 | } | ||
| 154 | |||
| 155 | |||
| 156 | _redo() | ||
| 157 | { | ||
| 158 | set +e | ||
| 159 | for i in "$@"; do | ||
| 160 | _dirsplit "$i" | ||
| 161 | _dir_shovel "$dir" "$base" | ||
| 162 | dir=$xdir base=$xbase basetmp=$xbasetmp | ||
| 163 | ( cd "$dir" && _do "$dir" "$base" "$basetmp" ) | ||
| 164 | [ "$?" = 0 ] || return 1 | ||
| 165 | done | ||
| 166 | } | ||
| 167 | |||
| 168 | |||
| 169 | _redo "$@" | ||
| 170 | [ "$?" = 0 ] || exit 1 | ||
| 171 | |||
| 172 | if [ -n "$DO_TOP" ]; then | ||
| 173 | echo "Removing stamp files..." >&2 | ||
| 174 | [ ! -e "$DO_BUILT" ] || | ||
| 175 | while read f; do printf "%s.did\0" "$f"; done <"$DO_BUILT" | | ||
| 176 | xargs -0 rm -f 2>/dev/null | ||
| 177 | fi | ||
diff --git a/index.md.do b/index.md.do new file mode 100644 index 0000000..02c10af --- /dev/null +++ b/index.md.do | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | #!/usr/bin/env bash | ||
| 2 | LISTS=() | ||
| 3 | while read -r -d $'\0'; do | ||
| 4 | LISTS+=("$REPLY") | ||
| 5 | done < <(find lists -maxdepth 1 -mindepth 1 -type d -not -name '.*' -print0 | sort -z) | ||
| 6 | |||
| 7 | for x in "${LISTS[@]}"; do | ||
| 8 | printf "%s.html\0" "$x" | ||
| 9 | done | xargs -r -0 redo-ifchange | ||
| 10 | |||
| 11 | cat <<EOF | ||
| 12 | % Index | ||
| 13 | |||
| 14 | EOF | ||
| 15 | |||
| 16 | for x in "${LISTS[@]}"; do | ||
| 17 | printf "* [%s](%s)\n" "$(<$x/title)" "$x.html" | ||
| 18 | done | ||
diff --git a/lists/all/001 b/lists/all/001 new file mode 120000 index 0000000..1ce79c6 --- /dev/null +++ b/lists/all/001 | |||
| @@ -0,0 +1 @@ | |||
| ../../posts/blub.md \ No newline at end of file | |||
diff --git a/lists/all/002 b/lists/all/002 new file mode 120000 index 0000000..1ca4d2f --- /dev/null +++ b/lists/all/002 | |||
| @@ -0,0 +1 @@ | |||
| ../../posts/blub2.md \ No newline at end of file | |||
diff --git a/lists/all/003 b/lists/all/003 new file mode 120000 index 0000000..5df958a --- /dev/null +++ b/lists/all/003 | |||
| @@ -0,0 +1 @@ | |||
| ../../posts/blub3.md \ No newline at end of file | |||
diff --git a/lists/all/title b/lists/all/title new file mode 100644 index 0000000..73a5267 --- /dev/null +++ b/lists/all/title | |||
| @@ -0,0 +1 @@ | |||
| All Posts | |||
diff --git a/lists/default.md.do b/lists/default.md.do new file mode 100644 index 0000000..94636df --- /dev/null +++ b/lists/default.md.do | |||
| @@ -0,0 +1,24 @@ | |||
| 1 | #!/usr/bin/env bash | ||
| 2 | redo-ifchange "$2/title" | ||
| 3 | |||
| 4 | POSTS=() | ||
| 5 | while read -r -d $'\0'; do | ||
| 6 | post=$(realpath --relative-to=. "$REPLY") | ||
| 7 | POSTS+=("$post") | ||
| 8 | done < <(find "$2" -maxdepth 1 -mindepth 1 -not -name 'title' -print0 | sort -z) | ||
| 9 | |||
| 10 | for x in "${POSTS[@]}"; do | ||
| 11 | printf "%s\0%s\0" "$x" "${x%.md}.html" | ||
| 12 | done | xargs -r -0 redo-ifchange | ||
| 13 | |||
| 14 | TITLE=$(< $2/title) | ||
| 15 | |||
| 16 | cat <<EOF | ||
| 17 | % $(< "$2/title") | ||
| 18 | |||
| 19 | EOF | ||
| 20 | |||
| 21 | for x in "${POSTS[@]}"; do | ||
| 22 | title=$(pandoc -t json "$x" | ../build/extract-title.hs 2>&1 >/dev/null) | ||
| 23 | printf "* [%s](%s)\n" "$title" "${x%.md}.html" | ||
| 24 | done | ||
diff --git a/lists/stuff/001 b/lists/stuff/001 new file mode 120000 index 0000000..1ce79c6 --- /dev/null +++ b/lists/stuff/001 | |||
| @@ -0,0 +1 @@ | |||
| ../../posts/blub.md \ No newline at end of file | |||
diff --git a/lists/stuff/002 b/lists/stuff/002 new file mode 120000 index 0000000..5df958a --- /dev/null +++ b/lists/stuff/002 | |||
| @@ -0,0 +1 @@ | |||
| ../../posts/blub3.md \ No newline at end of file | |||
diff --git a/lists/stuff/title b/lists/stuff/title new file mode 100644 index 0000000..9d43527 --- /dev/null +++ b/lists/stuff/title | |||
| @@ -0,0 +1 @@ | |||
| Stuff | |||
diff --git a/posts/blub.md b/posts/blub.md new file mode 100644 index 0000000..96b7125 --- /dev/null +++ b/posts/blub.md | |||
| @@ -0,0 +1,40 @@ | |||
| 1 | % Blub post | ||
| 2 | |||
| 3 | # This is a post # | ||
| 4 | |||
| 5 | ## This is the first section ## | ||
| 6 | |||
| 7 | So apparently this is a post now. Well, hope you're happy. Look at what you've | ||
| 8 | done. Great work. Here, have some inline $a=b$ math. | ||
| 9 | |||
| 10 | The European languages are members of the same family. Their separate existence | ||
| 11 | is a myth. For science, music, sport, etc, Europe uses the same vocabulary. The | ||
| 12 | languages only differ in their grammar, their pronunciation and their most | ||
| 13 | common words. Everyone realizes why a new common language would be desirable: | ||
| 14 | one could refuse to pay expensive translators. | ||
| 15 | |||
| 16 | To achieve this, it would be necessary to have uniform grammar, pronunciation | ||
| 17 | and more common words. If several languages coalesce, the grammar of the | ||
| 18 | resulting language is more simple and regular than that of the individual | ||
| 19 | languages. The new common language will be more simple and regular than the | ||
| 20 | existing European languages. It will be as simple as Occidental; in fact, it | ||
| 21 | will be Occidental. To an English person, it will seem like simplified English, | ||
| 22 | as a skeptical Cambridge friend of mine told me what Occidental is. | ||
| 23 | |||
| 24 | ## This is the second section ## | ||
| 25 | |||
| 26 | Oh god! You're still going. But why? This is not normal! | ||
| 27 | |||
| 28 | The European languages are members of the same family. Their separate existence | ||
| 29 | is a myth. For science, music, sport, etc, Europe uses the same vocabulary. The | ||
| 30 | languages only differ in their grammar, their pronunciation and their most | ||
| 31 | common words. Everyone realizes why a new common language would be desirable: | ||
| 32 | one could refuse to pay expensive translators. | ||
| 33 | |||
| 34 | To achieve this, it would be necessary to have uniform grammar, pronunciation | ||
| 35 | and more common words. If several languages coalesce, the grammar of the | ||
| 36 | resulting language is more simple and regular than that of the individual | ||
| 37 | languages. The new common language will be more simple and regular than the | ||
| 38 | existing European languages. It will be as simple as Occidental; in fact, it | ||
| 39 | will be Occidental. To an English person, it will seem like simplified English, | ||
| 40 | as a skeptical Cambridge friend of mine told me what Occidental is. | ||
diff --git a/posts/blub2.md b/posts/blub2.md new file mode 100644 index 0000000..4cd7606 --- /dev/null +++ b/posts/blub2.md | |||
| @@ -0,0 +1,40 @@ | |||
| 1 | % The Second Post | ||
| 2 | |||
| 3 | # This the second post # | ||
| 4 | |||
| 5 | ## This is the first section of the second post ## | ||
| 6 | |||
| 7 | So apparently this is a post now. Well, hope you're happy. Look at what you've | ||
| 8 | done. Great work. | ||
| 9 | |||
| 10 | The European languages are members of the same family. Their separate existence | ||
| 11 | is a myth. For science, music, sport, etc, Europe uses the same vocabulary. The | ||
| 12 | languages only differ in their grammar, their pronunciation and their most | ||
| 13 | common words. Everyone realizes why a new common language would be desirable: | ||
| 14 | one could refuse to pay expensive translators. | ||
| 15 | |||
| 16 | To achieve this, it would be necessary to have uniform grammar, pronunciation | ||
| 17 | and more common words. If several languages coalesce, the grammar of the | ||
| 18 | resulting language is more simple and regular than that of the individual | ||
| 19 | languages. The new common language will be more simple and regular than the | ||
| 20 | existing European languages. It will be as simple as Occidental; in fact, it | ||
| 21 | will be Occidental. To an English person, it will seem like simplified English, | ||
| 22 | as a skeptical Cambridge friend of mine told me what Occidental is. | ||
| 23 | |||
| 24 | ## This is the second section ## | ||
| 25 | |||
| 26 | Oh god! You're still going. But why? This is not normal! | ||
| 27 | |||
| 28 | The European languages are members of the same family. Their separate existence | ||
| 29 | is a myth. For science, music, sport, etc, Europe uses the same vocabulary. The | ||
| 30 | languages only differ in their grammar, their pronunciation and their most | ||
| 31 | common words. Everyone realizes why a new common language would be desirable: | ||
| 32 | one could refuse to pay expensive translators. | ||
| 33 | |||
| 34 | To achieve this, it would be necessary to have uniform grammar, pronunciation | ||
| 35 | and more common words. If several languages coalesce, the grammar of the | ||
| 36 | resulting language is more simple and regular than that of the individual | ||
| 37 | languages. The new common language will be more simple and regular than the | ||
| 38 | existing European languages. It will be as simple as Occidental; in fact, it | ||
| 39 | will be Occidental. To an English person, it will seem like simplified English, | ||
| 40 | as a skeptical Cambridge friend of mine told me what Occidental is. | ||
diff --git a/posts/blub3.md b/posts/blub3.md new file mode 100644 index 0000000..a6433d4 --- /dev/null +++ b/posts/blub3.md | |||
| @@ -0,0 +1,40 @@ | |||
| 1 | % A Post! | ||
| 2 | |||
| 3 | # A Post! # | ||
| 4 | |||
| 5 | ## What? ## | ||
| 6 | |||
| 7 | So apparently this is a post now. Well, hope you're happy. Look at what you've | ||
| 8 | done. Great work. | ||
| 9 | |||
| 10 | The European languages are members of the same family. Their separate existence | ||
| 11 | is a myth. For science, music, sport, etc, Europe uses the same vocabulary. The | ||
| 12 | languages only differ in their grammar, their pronunciation and their most | ||
| 13 | common words. Everyone realizes why a new common language would be desirable: | ||
| 14 | one could refuse to pay expensive translators. | ||
| 15 | |||
| 16 | To achieve this, it would be necessary to have uniform grammar, pronunciation | ||
| 17 | and more common words. If several languages coalesce, the grammar of the | ||
| 18 | resulting language is more simple and regular than that of the individual | ||
| 19 | languages. The new common language will be more simple and regular than the | ||
| 20 | existing European languages. It will be as simple as Occidental; in fact, it | ||
| 21 | will be Occidental. To an English person, it will seem like simplified English, | ||
| 22 | as a skeptical Cambridge friend of mine told me what Occidental is. | ||
| 23 | |||
| 24 | ## But but! ## | ||
| 25 | |||
| 26 | Oh god! You're still going. But why? This is not normal! | ||
| 27 | |||
| 28 | The European languages are members of the same family. Their separate existence | ||
| 29 | is a myth. For science, music, sport, etc, Europe uses the same vocabulary. The | ||
| 30 | languages only differ in their grammar, their pronunciation and their most | ||
| 31 | common words. Everyone realizes why a new common language would be desirable: | ||
| 32 | one could refuse to pay expensive translators. | ||
| 33 | |||
| 34 | To achieve this, it would be necessary to have uniform grammar, pronunciation | ||
| 35 | and more common words. If several languages coalesce, the grammar of the | ||
| 36 | resulting language is more simple and regular than that of the individual | ||
| 37 | languages. The new common language will be more simple and regular than the | ||
| 38 | existing European languages. It will be as simple as Occidental; in fact, it | ||
| 39 | will be Occidental. To an English person, it will seem like simplified English, | ||
| 40 | as a skeptical Cambridge friend of mine told me what Occidental is. | ||
diff --git a/style.css b/style.css new file mode 100644 index 0000000..b86b20c --- /dev/null +++ b/style.css | |||
| @@ -0,0 +1,64 @@ | |||
| 1 | body { | ||
| 2 | margin: auto; | ||
| 3 | padding-right: 1em; | ||
| 4 | padding-left: 1em; | ||
| 5 | font: normal 1.1em/1.3em monospace; | ||
| 6 | width: 60em; | ||
| 7 | text-align: justify; | ||
| 8 | } | ||
| 9 | |||
| 10 | .display-math { | ||
| 11 | display: block; | ||
| 12 | margin-top: 0.2em; | ||
| 13 | margin-bottm: 0.2em; | ||
| 14 | text-align: center; | ||
| 15 | } | ||
| 16 | |||
| 17 | .inline-math { | ||
| 18 | display: inline; | ||
| 19 | } | ||
| 20 | |||
| 21 | a { | ||
| 22 | color: inherit; | ||
| 23 | } | ||
| 24 | |||
| 25 | p { | ||
| 26 | margin-bottom: 0 | ||
| 27 | } | ||
| 28 | |||
| 29 | p + p { | ||
| 30 | text-indent: 1.5em; | ||
| 31 | margin-top: 0 | ||
| 32 | } | ||
| 33 | |||
| 34 | nav#top-level { | ||
| 35 | border-bottom: 1px solid grey; | ||
| 36 | border-top: 1px solid grey; | ||
| 37 | display: table; | ||
| 38 | text-align: center; | ||
| 39 | width: 100%; | ||
| 40 | } | ||
| 41 | |||
| 42 | nav#top-level ul { | ||
| 43 | display: table-row; | ||
| 44 | } | ||
| 45 | |||
| 46 | nav#top-level ul li { | ||
| 47 | display: table-cell; | ||
| 48 | } | ||
| 49 | |||
| 50 | nav#top-level ul li a { | ||
| 51 | display: inline-block; | ||
| 52 | width: 100%; | ||
| 53 | text-align: center; | ||
| 54 | text-decoration: none; | ||
| 55 | color: inherit; | ||
| 56 | text-transform: uppercase; | ||
| 57 | } | ||
| 58 | |||
| 59 | nav#top-level ul li a:hover { | ||
| 60 | display: inline-block; | ||
| 61 | width: 100%; | ||
| 62 | text-align: center; | ||
| 63 | background: lightgrey; | ||
| 64 | } | ||
