ptex2tex-0.4/0000755000000000000000000000000011633377046011650 5ustar rootrootptex2tex-0.4/bin/0000755000000000000000000000000011633377046012420 5ustar rootrootptex2tex-0.4/bin/testconfig.py0000644000000000000000000001145211442451030015122 0ustar rootroot#!/usr/bin/env python """ This script reads a .ptex2tex.cfg file, finds all the defined environments, writes out a [names] section with all environments and thereafter a LaTeX code testing all names. (The code must be inserted in a document with proper heading and footer.) The script is useful for testing everything that is defined in a .ptex2tex.cfg config file. """ snippets = { 'smallpy': r''' \noindent Here is a demo of the environment \code{%s}: \bn%d # Here is some short Python code def height_and_velocity(t, v0): """Invoke some advanced math computations.""" g = 9.81 # acceleration of gravity y = v0*t - 0.5*g*t**2 # vertical position v = v0 - g*t # vertical velocity return y, v print height_and_velocity(initial_velocity=0.5, time=1) \en%d ''', 'Python': r''' \noindent Here is a demo of the environment \code{%s}: \bn%d # Here is some Python code def height_and_velocity(t, v0): """Invoke some advanced math computations.""" g = 9.81 # acceleration of gravity y = v0*t - 0.5*g*t**2 # vertical position v = v0 - g*t # vertical velocity return y, v class Wrapper: def __init__(self, func, alternative_kwarg_names={}): self.func = func self.help = alternative_kwarg_names def __call__(self, *args, **kwargs): # Translate possible alternative keyword argument # names in kwargs to those accepted by self.func: func_kwargs = {} for name in kwargs: if name in self.help: func_kwargs[self.help[name]] = kwargs[name] else: func_kwargs[name] = kwargs[name] return self.func(*args, **func_kwargs) height_and_velocity = Wrapper(height_and_velocity, {'time': 't', 'velocity': 'v0', 'initial_velocity': 'v0'}) print height_and_velocity(initial_velocity=0.5, time=1) \en%d ''', 'box': r""" \noindent Here is a demo of the environment \code{%s}: \bn%d Some message can be written here as ordinary text. \en%d """, 'Cpp': r""" \noindent Here is a demo of the environment \code{%s}: \bn%d # Here is some C++ code void height_and_velocity(double& y, double& v, double t, double v0) { /* Invoke some advanced math computations. */ double g = 9.81; // acceleration of gravity y = v0*t - 0.5*g*pow(t,2); // vertical position v = v0 - g*t; // vertical velocity } double initial_velocity = 0.5; double time = 0.6; double velocity, height; height_and_velocity(height, velocity, time, initial_velocity); \en%d """, 'C': r""" \noindent Here is a demo of the environment \code{%s}: \bn%d # Here is some C code double initial_velocity, time, velocity, height; void height_and_velocity(double* y, double* v, double t, double v0) { /* Invoke some advanced math computations. */ double g = 9.81; /* acceleration of gravity */ *y = v0*t - 0.5*g*pow(t,2); /* vertical position */ *v = v0 - g*t; /* vertical velocity */ } height_and_velocity(&height, &velocity, 0.5, 0.143); \en%d """, 'Fortran': r""" \noindent Here is a demo of the environment \code{%s}: \bn%d C Here is some Fortran 77 code program ball real*8 v0, time, v, h v0 = 0.5 time = 0.6 call hgtvel(h, v, time, v0) subroutine hgtvel(y, v, t, v0) real*8 y, v, t, v0 C Invoke some advanced math computations real*8 g g = 9.81 C height: y = v0*t - 0.5*g*t**2 C velocity: v = v0 - g*t \en%d """, } f = open('.ptex2tex.cfg') envir_types = [] for line in f: if line.startswith('['): envir_type = line.strip()[1:-1] if envir_type not in ('preprocess', 'inline_code', 'names'): envir_types.append(envir_type) f.close() names = open('tmp_names', 'w') index = 1 for e in envir_types: names.write('n%d = %s\n' % (index, e)) index += 1 names.close() print """ A [names] section is written to the file tmp_names and should be appended to the .ptex2tex.cfg file in the current directory. """ latex = open('tmp_latex', 'w') for i in range(1, index): envir = envir_types[i-1] if envir in ('Warnings', 'Tip', 'Note'): code = snippets['box'] elif envir in ('CodeRule', 'CodeTerminal'): code = snippets['smallpy'] elif envir.startswith('Minted_'): code = snippets[envir[7:]] else: code = snippets['Python'] latex.write(code % (envir, i, i)) latex.close() print """\ A LaTeX demo code of all environments defined in .ptex2tex.cfg is written to the file tmp_latex and should be included in some LaTeX document (usually the doc.p.tex documentation of ptex2tex). """ ptex2tex-0.4/bin/ptex2tex0000755000000000000000000000113011514345500014110 0ustar rootroot#!/usr/bin/env python """Executable script associated with ptex2tex module.""" import sys, os if len(sys.argv) < 2 or '-h' in sys.argv or '--help' in sys.argv: print 'ptex2tex [-v -Dvar -Uvar -I dir1 -I dir2 --substitute -s ] file' print '-D and -U turn on or off preprocessor variables (can be many)' print '-v denotes verbose mode' print '-I specifies directories for include statements' print 'file is given as basename, or with the .p.tex extension' print 'other options are given in the config file .ptex2tex.cfg' sys.exit(1) import ptex2tex ptex2tex.init(sys.argv) ptex2tex-0.4/CHANGELOG0000644000000000000000000000256711633376756013103 0ustar rootrootVersion 0.4 =========== - Added new styles. - Added manpage. Version 0.31 ============ - Added support for specifying spaces rounde start and stop keywords for @@@CODE and @@@DATA. Use '~' character. - Added support for specifying font size for inline code (\code{}), set in config file. Can be 'smaller' or integer. - Added check for consistant use of renewenvironments. Also, added script testconfig.py for creating tests of all environments. - Added support for specifying preprocess options in config file. - Add warning in case environment keyword starts with space, do not remove temporary files. Version 0.3 ============ - In case preprocess is unavailable, print message and continue, do not exit. - CODE gives an error, not throw an exception, when 'to' or 'from' are not found. - Added a space character after \noindent so that one can write a string immidiately after: '\noindentThis is important' - Added a way to define wether an environment should be defined every time it is used, it should be defined once per file or if it defined somewhere else (main .tex file) - Add support for defining LaTeX environments for multiple, instead of assuming they are defined in an external file (when using define=False in the config file). Note that the names of environments can only contain letters, hence shaded2 is not valid unless shaded is undefined. ptex2tex-0.4/README0000644000000000000000000000752311632137704012531 0ustar rootrootInstalling ptex2tex =================== Installing latexslides is done by python setup.py install with the usual Distutils options available. The next sections are for those who know Distutils and LaTeX, and explains how to make LaTeX know about the style files that comes with ptex2tex. If this gets too complicated, there are two options that should be quite simple: 1) copy the contents of the folder latex to the folder you are running ptex2tex from 2) add the folder latex to the environment variable TEXINPUTS, here demonstrated for the Bash shell: export TEXINPUTS=:.:/path/to/style_files:$TEXINPUTS Note the first semi-colon; it ensures that the systemwide directories are searched first. Location of LaTeX files ======================= As part of ptex2tex, a style file (ptex2tex.sty) and several Encapsulated Postscript files (*.eps) are provided in the folder 'latex'. When running the above installation command, the style files are written to os.path.join(sys.prefix, 'share', 'texmf', 'tex','latex', 'ptex2tex'). How latex will find the files when running is explained in the next section. Here, os.path.join(sys.prefix, 'foo', 'bar'), is Python code and results in the directory /usr/foo/bar on Linux, assuming Python is installed in /usr. The location of the files can be changed in the following ways: python setup.py install --install-data=/foo The style files are now written to os.path.join('/foo', 'share', 'texmf', 'tex', 'latex', 'ptex2tex'). python setup.py install --home=/bar and python setup.py install --prefix=/bar work as usual, the style files are then written to os.path.join('/bar', 'share', 'texmf', 'tex', 'latex', 'ptex2tex') as well. Notice that when using --home and --prefix, not only the LaTeX files, but also all other package files are affected, see the Distutils manual. Note that the option --install-data only works for the latex files, and overwrite the options --home and --prefix for these files if it is given in addition to those (as it should). If none of these options behaves as required (for instance, you would like to install them to $HOME/texmf), then the variable 'latex_dir' in setup.py should be set to this directory. Installation of additional software =================================== Ptex2tex requires the preprocess tool by Trent Mick, found at http://code.google.com/p/preprocess/ If the minted environments in the default Ptex2tex configuration file are used, the pygments Python package must be installed: http://pygments.org/ (see also http://minted.googlecode.com). Several LaTeX styles are needed: fancyvrb, moreverb, pythonhighlights, and minted. Some of these are included in the latex/styles subdirectory, while the others are available for download from http://www.ctan.org. Users on Debian based systems (like Ubuntu) can install the required LaTeX styles via the packages texlive-latex-base, texlive-latex-recommended, and texlive-latex-extra. Making sure LaTeX finds the files at runtime ============================================ After the script finishes, you should make sure that the latex command can find the files. If the files are located in one of the directories where LaTeX knows about them, it should suffice to run the following command: texconfig rehash To check which directories are available to LaTeX, you can use one of the following two commands: texconfig conf or kpsepath tex As a last resort, it is possible to set the environment variable TEXINPUTS, see the first section of this file. Authors ======= ptex2tex is based on a package called ctex2tex, developed by Hans Petter Langtangen. Ilmar Wilbers redesigned and reimplemented that package. New features were also added. Both authors work at Simula Research Laboratory in Norway, www.simula.no. License ======= ptex2tex is licensed under the new BSD license, see the LICENSE file. ptex2tex-0.4/latex/0000755000000000000000000000000011633377046012765 5ustar rootrootptex2tex-0.4/latex/warning.eps0000644000000000000000000000674311156446067015155 0ustar rootroot%!PS-Adobe-2.0 EPSF-2.0 %%Title: warning.fig %%Creator: fig2dev Version 3.2 Patchlevel 4 %%CreationDate: Wed Aug 24 00:00:52 2005 %%For: oliphant@den.local.net (Travis Oliphant) %%BoundingBox: 0 0 88 88 %%Magnification: 1.0000 %%EndComments /$F2psDict 200 dict def $F2psDict begin $F2psDict /mtrx matrix put /col-1 {0 setgray} bind def /col0 {0.000 0.000 0.000 srgb} bind def /col1 {0.000 0.000 1.000 srgb} bind def /col2 {0.000 1.000 0.000 srgb} bind def /col3 {0.000 1.000 1.000 srgb} bind def /col4 {1.000 0.000 0.000 srgb} bind def /col5 {1.000 0.000 1.000 srgb} bind def /col6 {1.000 1.000 0.000 srgb} bind def /col7 {1.000 1.000 1.000 srgb} bind def /col8 {0.000 0.000 0.560 srgb} bind def /col9 {0.000 0.000 0.690 srgb} bind def /col10 {0.000 0.000 0.820 srgb} bind def /col11 {0.530 0.810 1.000 srgb} bind def /col12 {0.000 0.560 0.000 srgb} bind def /col13 {0.000 0.690 0.000 srgb} bind def /col14 {0.000 0.820 0.000 srgb} bind def /col15 {0.000 0.560 0.560 srgb} bind def /col16 {0.000 0.690 0.690 srgb} bind def /col17 {0.000 0.820 0.820 srgb} bind def /col18 {0.560 0.000 0.000 srgb} bind def /col19 {0.690 0.000 0.000 srgb} bind def /col20 {0.820 0.000 0.000 srgb} bind def /col21 {0.560 0.000 0.560 srgb} bind def /col22 {0.690 0.000 0.690 srgb} bind def /col23 {0.820 0.000 0.820 srgb} bind def /col24 {0.500 0.190 0.000 srgb} bind def /col25 {0.630 0.250 0.000 srgb} bind def /col26 {0.750 0.380 0.000 srgb} bind def /col27 {1.000 0.500 0.500 srgb} bind def /col28 {1.000 0.630 0.630 srgb} bind def /col29 {1.000 0.750 0.750 srgb} bind def /col30 {1.000 0.880 0.880 srgb} bind def /col31 {1.000 0.840 0.000 srgb} bind def /col32 {0.875 0.953 0.996 srgb} bind def /col33 {0.996 0.820 0.820 srgb} bind def /col34 {0.984 0.961 0.859 srgb} bind def end save newpath 0 88 moveto 0 0 lineto 88 0 lineto 88 88 lineto closepath clip newpath % Fill background color 0 0 moveto 88 0 lineto 88 88 lineto 0 88 lineto closepath 1.00 0.82 0.82 setrgbcolor fill -172.3 187.6 translate 1 -1 scale /cp {closepath} bind def /ef {eofill} bind def /gr {grestore} bind def /gs {gsave} bind def /sa {save} bind def /rs {restore} bind def /l {lineto} bind def /m {moveto} bind def /rm {rmoveto} bind def /n {newpath} bind def /s {stroke} bind def /sh {show} bind def /slc {setlinecap} bind def /slj {setlinejoin} bind def /slw {setlinewidth} bind def /srgb {setrgbcolor} bind def /rot {rotate} bind def /sc {scale} bind def /sd {setdash} bind def /ff {findfont} bind def /sf {setfont} bind def /scf {scalefont} bind def /sw {stringwidth} bind def /tr {translate} bind def /tnt {dup dup currentrgbcolor 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} bind def /shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul 4 -2 roll mul srgb} bind def /DrawEllipse { /endangle exch def /startangle exch def /yrad exch def /xrad exch def /y exch def /x exch def /savematrix mtrx currentmatrix def x y tr xrad yrad sc 0 0 1 startangle endangle arc closepath savematrix setmatrix } def /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def $F2psBegin 10 setmiterlimit 0 slj 0 slc 0.06000 0.06000 sc % % Fig objects follow % % % here starts figure with depth 50 % Ellipse 7.500 slw n 3600 2400 720 720 0 360 DrawEllipse gs col20 1.00 shd ef gr gs col20 s gr % Polyline n 3096 2268 m 4104 2268 l 4104 2532 l 3096 2532 l cp gs col7 1.00 shd ef gr gs col7 s gr % here ends figure; $F2psEnd rs showpage ptex2tex-0.4/latex/styles/0000755000000000000000000000000011633377046014310 5ustar rootrootptex2tex-0.4/latex/styles/pythonhighlight.sty0000644000000000000000000000777211437750340020271 0ustar rootroot\NeedsTeXFormat{LaTeX2e} \ProvidesPackage{pythonhighlight}[2009/03/28 python code highlighting; provided by Olivier Verdier ] \RequirePackage{listings} \RequirePackage{xcolor} \renewcommand{\lstlistlistingname}{Code Listings} \renewcommand{\lstlistingname}{Code Listing} \definecolor{gray}{gray}{0.5} \colorlet{commentcolour}{green!50!black} \colorlet{stringcolour}{red!60!black} \colorlet{keywordcolour}{magenta!90!black} \colorlet{exceptioncolour}{yellow!50!red} \colorlet{commandcolour}{blue!60!black} \colorlet{numpycolour}{blue!60!green} \colorlet{literatecolour}{magenta!90!black} \colorlet{promptcolour}{green!50!black} \colorlet{specmethodcolour}{violet} %\newcommand{\Matlab}{Matlab} %\setbeamercolor{background canvas}{bg=red!10!} \lstnewenvironment{matlab}[1][]{ \lstset{ language=matlab, basicstyle=\ttfamily\small,%\setstretch{.5}, backgroundcolor=\color{blue!10}, frame=trbl, rulecolor=\color{black!40}, emphstyle=\color{blue}, commentstyle=\color{commentcolour}\slshape, keywordstyle=\color{keywordcolour}\bfseries, }}{} \newcommand{\framemargin}{3ex} \newcommand{\literatecolour}{\textcolor{literatecolour}} \lstdefinestyle{mypython}{ %\lstset{ %keepspaces=true, language=python, showtabs=true, tab=, tabsize=2, basicstyle=\ttfamily\footnotesize,%\setstretch{.5}, stringstyle=\color{stringcolour}, showstringspaces=false, alsoletter={1234567890}, otherkeywords={\ , \}, \{, \%, \&, \|}, keywordstyle=\color{keywordcolour}\bfseries, emph={and,break,class,continue,def,yield,del,elif ,else,% except,exec,finally,for,from,global,if,import,in,% lambda,not,or,pass,print,raise,return,try,while,assert}, emphstyle=\color{blue}\bfseries, emph={[2]True, False, None}, emphstyle=[2]\color{keywordcolour}, emph={[3]object,type,isinstance,copy,deepcopy,zip,enumerate,reversed,list,len,dict,tuple,xrange,append,execfile,real,imag,reduce,str,repr}, emphstyle=[3]\color{commandcolour}, emph={Exception,NameError,IndexError,SyntaxError,TypeError,ValueError,OverflowError,ZeroDivisionError}, emphstyle=\color{exceptioncolour}\bfseries, %upquote=true, morecomment=[s]{"""}{"""}, commentstyle=\color{commentcolour}\slshape, %emph={[4]1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, emph={[4]ode, fsolve, sqrt, exp, sin, cos, arccos, pi, array, norm, solve, dot, arange, , isscalar, max, sum, flatten, shape, reshape, find, any, all, abs, plot, linspace, legend, quad, polyval,polyfit, hstack, concatenate,vstack,column_stack,empty,zeros,ones,rand,vander,grid,pcolor,eig,eigs,eigvals,svd,qr,tan,det,logspace,roll,min,mean,cumsum,cumprod,diff,vectorize,lstsq,cla,eye,xlabel,ylabel,squeeze}, emphstyle=[4]\color{numpycolour}, emph={[5]__init__,__add__,__mul__,__div__,__sub__,__call__,__getitem__,__setitem__,__eq__,__ne__,__nonzero__,__rmul__,__radd__,__repr__,__str__,__get__,__truediv__,__pow__,__name__,__future__,__all__}, emphstyle=[5]\color{specmethodcolour}, emph={[6]assert,range,yield}, emphstyle=[6]\color{keywordcolour}\bfseries, % emph={[7]self}, % emphstyle=[7]\bfseries, literate=*% {:}{{\literatecolour:}}{1}% {=}{{\literatecolour=}}{1}% {-}{{\literatecolour-}}{1}% {+}{{\literatecolour+}}{1}% {*}{{\literatecolour*}}{1}% {/}{{\literatecolour/}}{1}% {!}{{\literatecolour!}}{1}% %{(}{{\literatecolour(}}{1}% %{)}{{\literatecolour)}}{1}% {[}{{\literatecolour[}}{1}% {]}{{\literatecolour]}}{1}% {<}{{\literatecolour<}}{1}% {>}{{\literatecolour>}}{1}% {>>>}{{\textcolor{promptcolour}{>>>}}}{1}% ,% %aboveskip=.5ex, frame=trbl, %frameround=tttt, %framesep=.3ex, rulecolor=\color{black!40}, %framexleftmargin=\framemargin, %framextopmargin=.1ex, %framexbottommargin=.1ex, %framexrightmargin=\framemargin, %framexleftmargin=1mm, framextopmargin=1mm, frame=shadowbox, rulesepcolor=\color{blue},#1 %frame=tb, backgroundcolor=\color{yellow!10} %} } \newcommand{\inputpython}[3]{\lstinputlisting[firstline=#1,lastline=#2,firstnumber=#1,frame=single,breakindent=.5\textwidth,frame=single,breaklines=true,style=mypython]{#3}} \lstnewenvironment{python}[1][]{\lstset{style=mypython}}{} \newcommand{\pyth}{\lstinline[style=mypython,basicstyle=\ttfamily]} \def\command{\pyth} ptex2tex-0.4/latex/styles/minted.sty0000644000000000000000000001722711437750340016334 0ustar rootroot%% %% This is file `minted.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% minted.dtx (with options: `package') %% Copyright 2010 Konrad Rudolph %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3 %% of this license or (at your option) any later version. %% The latest version of this license is in %% http://www.latex-project.org/lppl.txt %% and version 1.3 or later is part of all distributions of LaTeX %% version 2005/12/01 or later. %% %% Additionally, the project may be distributed under the terms of the new BSD %% license. %% %% This work has the LPPL maintenance status `maintained'. %% %% The Current Maintainer of this work is Konrad Rudolph. %% %% This work consists of the files mints.dtx and mints.ins %% and the derived file mints.sty. \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{minted}[2010/01/27 v1.6 Yet another Pygments shim for LaTeX] \RequirePackage{keyval} \RequirePackage{fancyvrb} \RequirePackage{color} \RequirePackage{float} \RequirePackage{ifthen} \RequirePackage{calc} \RequirePackage{ifplatform} \ifwindows \providecommand\DeleteFile[1]{\immediate\write18{del #1}} \else \providecommand\DeleteFile[1]{\immediate\write18{rm #1}} \fi \newboolean{AppExists} \providecommand\TestAppExists[1]{ \ifwindows \DeleteFile{\jobname.aex} \immediate\write18{for \string^\@percentchar i in (#1.exe #1.bat #1.cmd) do set >\jobname.aex >\jobname.aex} %$ \newread\@appexistsfile \immediate\openin\@appexistsfile\jobname.aex \expandafter\def\expandafter\@tmp@cr\expandafter{\the\endlinechar} \endlinechar=-1\relax \readline\@appexistsfile to \@apppathifexists \endlinechar=\@tmp@cr \ifthenelse{\equal{\@apppathifexists}{}} {\AppExistsfalse} {\AppExiststrue} \immediate\closein\@appexistsfile \DeleteFile{\jobname.aex} \immediate\typeout{file deleted} \else \immediate\write18{which #1 && touch \jobname.aex} \IfFileExists{\jobname.aex} {\AppExiststrue \DeleteFile{\jobname.aex}} {\AppExistsfalse} \fi} \newcommand\minted@resetoptions{} \newcommand\minted@defopt[1]{ \expandafter\def\expandafter\minted@resetoptions\expandafter{% \minted@resetoptions \@namedef{minted@opt@#1}{}}} \newcommand\minted@opt[1]{ \expandafter\detokenize% \expandafter\expandafter\expandafter{\csname minted@opt@#1\endcsname}} \newcommand\minted@define@opt[3][]{ \minted@defopt{#2} \ifthenelse{\equal{#1}{}}{ \define@key{minted@opt}{#2}{\@namedef{minted@opt@#2}{#3}}} {\define@key{minted@opt}{#2}[#1]{\@namedef{minted@opt@#2}{#3}}}} \newcommand\minted@define@switch[2]{ \minted@defopt{#1} \define@booleankey{minted@opt}{#1}{ \@namedef{minted@opt@#1}{#2}} {\@namedef{minted@opt@#1}{}}} \minted@defopt{extra} \newcommand\minted@define@extra[1]{ \define@key{minted@opt}{#1}{ \expandafter\def\expandafter\minted@opt@extra\expandafter{% \minted@opt@extra,#1=##1}}} \newcommand\minted@define@extra@switch[1]{ \define@booleankey{minted@opt}{#1} {\expandafter\def\expandafter\minted@opt@extra\expandafter{% \minted@opt@extra,#1}} {\expandafter\def\expandafter\minted@opt@extra\expandafter{% \minted@opt@extra,#1=false}}} \minted@define@switch{texcl}{-P texcomments} \minted@define@switch{mathescape}{-P mathescape} \minted@define@switch{linenos}{-P linenos} \minted@define@opt{gobble}{-F gobble:n=#1} \minted@define@opt{bgcolor}{#1} \minted@define@extra{frame} \minted@define@extra{framesep} \minted@define@extra{framerule} \minted@define@extra{rulecolor} \minted@define@extra{numbersep} \minted@define@extra{firstnumber} \minted@define@extra{stepnumber} \minted@define@extra{firstline} \minted@define@extra{lastline} \minted@define@extra{baselinestretch} \minted@define@extra{xleftmargin} \minted@define@extra{xrightmargin} \minted@define@extra{fillcolor} \minted@define@extra{tabsize} \minted@define@extra{fontfamily} \minted@define@extra{fontsize} \minted@define@extra{fontshape} \minted@define@extra{fontseries} \minted@define@extra{formatcom} \minted@define@extra@switch{numberblanklines} \minted@define@extra@switch{showspaces} \minted@define@extra@switch{resetmargins} \minted@define@extra@switch{samepage} \minted@define@extra@switch{showtabs} \minted@define@extra@switch{obeytabs} \newsavebox{\minted@bgbox} \newenvironment{minted@colorbg}[1]{ \def\minted@bgcol{#1} \noindent \begin{lrbox}{\minted@bgbox} \begin{minipage}{\linewidth-2\fboxsep}} {\end{minipage} \end{lrbox}% \colorbox{\minted@bgcol}{\usebox{\minted@bgbox}}} \newwrite\minted@code \newcommand\minted@savecode[1]{ \immediate\openout\minted@code\jobname.pyg \immediate\write\minted@code{#1} \immediate\closeout\minted@code} \newcommand\minted@pygmentize[2][\jobname.pyg]{ \def\minted@cmd{pygmentize -l #2 -f latex -F tokenmerge \minted@opt{gobble} \minted@opt{texcl} \minted@opt{mathescape} \minted@opt{linenos} -P "verboptions=\minted@opt{extra}" -o \jobname.out.pyg #1} \immediate\write18{\minted@cmd} \ifthenelse{\equal{\minted@opt@bgcolor}{}} {} {\begin{minted@colorbg}{\minted@opt@bgcolor}} \input{\jobname.out.pyg} \ifthenelse{\equal{\minted@opt@bgcolor}{}} {} {\end{minted@colorbg}} \DeleteFile{\jobname.out.pyg}} \newcommand\minted@usedefaultstyle{\usemintedstyle{default}} \newcommand\usemintedstyle[1]{ \renewcommand\minted@usedefaultstyle{} \immediate\write18{pygmentize -S #1 -f latex > \jobname.pyg} \input{\jobname.pyg}} \newcommand\mint[3][]{ \DefineShortVerb{#3} \minted@resetoptions \setkeys{minted@opt}{#1} \SaveVerb[aftersave={ \UndefineShortVerb{#3} \minted@savecode{\FV@SV@minted@verb} \minted@pygmentize{#2} \DeleteFile{\jobname.pyg}}]{minted@verb}#3} \newcommand\minted@proglang[1]{} \newenvironment{minted}[2][] {\VerbatimEnvironment \renewcommand{\minted@proglang}[1]{#2} \minted@resetoptions \setkeys{minted@opt}{#1} \begin{VerbatimOut}{\jobname.pyg}}% {\end{VerbatimOut} \minted@pygmentize{\minted@proglang{}} \DeleteFile{\jobname.pyg}} \newcommand\inputminted[3][]{ \minted@resetoptions \setkeys{minted@opt}{#1} \minted@pygmentize[#3]{#2}} \newcommand\newminted[3][]{ \ifthenelse{\equal{#1}{}} {\def\minted@envname{#2code}} {\def\minted@envname{#1}} \newenvironment{\minted@envname} {\VerbatimEnvironment\begin{minted}[#3]{#2}} {\end{minted}} \newenvironment{\minted@envname *}[1] {\VerbatimEnvironment\begin{minted}[#3,##1]{#2}} {\end{minted}}} \newcommand\newmint[3][]{ \ifthenelse{\equal{#1}{}} {\def\minted@shortname{#2}} {\def\minted@shortname{#1}} \expandafter\newcommand\csname\minted@shortname\endcsname[2][]{ \mint[#3,##1]{#2}##2}} \newcommand\newmintedfile[3][]{ \ifthenelse{\equal{#1}{}} {\def\minted@shortname{#2file}} {\def\minted@shortname{#1}} \expandafter\newcommand\csname\minted@shortname\endcsname[2][]{ \inputminted[#3,##1]{#2}{##2}}} \newfloat{listing}{h}{lol} \newcommand\listingscaption{Listing} \floatname{listing}{\listingscaption} \newcommand\listoflistingscaption{List of listings} \providecommand\listoflistings{\listof{listing}{\listoflistingscaption}} \AtBeginDocument{ \minted@usedefaultstyle} \AtEndOfPackage{ \ifeof18 \PackageError{minted} {You must invoke LaTeX with the -shell-escape flag} {Pass the -shell-escape flag to LaTeX. Refer to the minted.sty documentation for more information.}\fi} \TestAppExists{pygmentize} \ifAppExists\else \PackageError{minted} {You must have `pygmentize' installed to use this package} {Refer to the installation instructions in the minted documentation for more information.} \fi \endinput %% %% End of file `minted.sty'. ptex2tex-0.4/latex/warning.fig0000644000000000000000000000042111632132265015105 0ustar rootroot#FIG 3.2 Landscape Center Inches Letter 100.00 Single -2 1200 2 0 32 #e0f4ff 0 33 #ffd2d2 0 34 #fcf6dc 1 3 0 1 20 20 50 -1 20 0.000 1 0.0000 3600 2400 720 720 3600 2400 4320 2400 2 2 0 1 7 7 50 -1 20 0.000 0 0 -1 0 0 5 3096 2268 4104 2268 4104 2532 3096 2532 3096 2268 ptex2tex-0.4/latex/tip.eps0000644000000000000000000000674711156446067014310 0ustar rootroot%!PS-Adobe-2.0 EPSF-2.0 %%Title: tip.fig %%Creator: fig2dev Version 3.2 Patchlevel 4 %%CreationDate: Tue Aug 23 23:51:46 2005 %%For: oliphant@den.local.net (Travis Oliphant) %%BoundingBox: 0 0 88 88 %%Magnification: 1.0000 %%EndComments /$F2psDict 200 dict def $F2psDict begin $F2psDict /mtrx matrix put /col-1 {0 setgray} bind def /col0 {0.000 0.000 0.000 srgb} bind def /col1 {0.000 0.000 1.000 srgb} bind def /col2 {0.000 1.000 0.000 srgb} bind def /col3 {0.000 1.000 1.000 srgb} bind def /col4 {1.000 0.000 0.000 srgb} bind def /col5 {1.000 0.000 1.000 srgb} bind def /col6 {1.000 1.000 0.000 srgb} bind def /col7 {1.000 1.000 1.000 srgb} bind def /col8 {0.000 0.000 0.560 srgb} bind def /col9 {0.000 0.000 0.690 srgb} bind def /col10 {0.000 0.000 0.820 srgb} bind def /col11 {0.530 0.810 1.000 srgb} bind def /col12 {0.000 0.560 0.000 srgb} bind def /col13 {0.000 0.690 0.000 srgb} bind def /col14 {0.000 0.820 0.000 srgb} bind def /col15 {0.000 0.560 0.560 srgb} bind def /col16 {0.000 0.690 0.690 srgb} bind def /col17 {0.000 0.820 0.820 srgb} bind def /col18 {0.560 0.000 0.000 srgb} bind def /col19 {0.690 0.000 0.000 srgb} bind def /col20 {0.820 0.000 0.000 srgb} bind def /col21 {0.560 0.000 0.560 srgb} bind def /col22 {0.690 0.000 0.690 srgb} bind def /col23 {0.820 0.000 0.820 srgb} bind def /col24 {0.500 0.190 0.000 srgb} bind def /col25 {0.630 0.250 0.000 srgb} bind def /col26 {0.750 0.380 0.000 srgb} bind def /col27 {1.000 0.500 0.500 srgb} bind def /col28 {1.000 0.630 0.630 srgb} bind def /col29 {1.000 0.750 0.750 srgb} bind def /col30 {1.000 0.880 0.880 srgb} bind def /col31 {1.000 0.840 0.000 srgb} bind def /col32 {0.875 0.953 0.996 srgb} bind def /col33 {0.000 0.000 0.000 srgb} bind def end save newpath 0 88 moveto 0 0 lineto 88 0 lineto 88 88 lineto closepath clip newpath % Fill background color 0 0 moveto 88 0 lineto 88 88 lineto 0 88 lineto closepath 0.88 0.95 1.00 setrgbcolor fill -172.3 187.6 translate 1 -1 scale /cp {closepath} bind def /ef {eofill} bind def /gr {grestore} bind def /gs {gsave} bind def /sa {save} bind def /rs {restore} bind def /l {lineto} bind def /m {moveto} bind def /rm {rmoveto} bind def /n {newpath} bind def /s {stroke} bind def /sh {show} bind def /slc {setlinecap} bind def /slj {setlinejoin} bind def /slw {setlinewidth} bind def /srgb {setrgbcolor} bind def /rot {rotate} bind def /sc {scale} bind def /sd {setdash} bind def /ff {findfont} bind def /sf {setfont} bind def /scf {scalefont} bind def /sw {stringwidth} bind def /tr {translate} bind def /tnt {dup dup currentrgbcolor 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} bind def /shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul 4 -2 roll mul srgb} bind def /DrawEllipse { /endangle exch def /startangle exch def /yrad exch def /xrad exch def /y exch def /x exch def /savematrix mtrx currentmatrix def x y tr xrad yrad sc 0 0 1 startangle endangle arc closepath savematrix setmatrix } def /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def $F2psBegin 10 setmiterlimit 0 slj 0 slc 0.06000 0.06000 sc % % Fig objects follow % % % here starts figure with depth 51 % Ellipse 7.500 slw n 3600 2400 720 720 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col7 s gr % Ellipse n 3600 2400 660 660 0 360 DrawEllipse gs col1 1.00 shd ef gr gs col1 s gr /Times-Bold ff 1650.00 scf sf 3384 2940 m gs 1 -1 sc (i) col7 sh gr % here ends figure; $F2psEnd rs showpage ptex2tex-0.4/latex/note.eps0000644000000000000000000000645311156446067014453 0ustar rootroot%!PS-Adobe-2.0 EPSF-2.0 %%Title: note.fig %%Creator: fig2dev Version 3.2 Patchlevel 4 %%CreationDate: Wed Aug 24 03:03:42 2005 %%For: oliphant@den.local.net (Travis Oliphant) %%BoundingBox: 0 0 88 88 %%Magnification: 1.0000 %%EndComments /$F2psDict 200 dict def $F2psDict begin $F2psDict /mtrx matrix put /col-1 {0 setgray} bind def /col0 {0.000 0.000 0.000 srgb} bind def /col1 {0.000 0.000 1.000 srgb} bind def /col2 {0.000 1.000 0.000 srgb} bind def /col3 {0.000 1.000 1.000 srgb} bind def /col4 {1.000 0.000 0.000 srgb} bind def /col5 {1.000 0.000 1.000 srgb} bind def /col6 {1.000 1.000 0.000 srgb} bind def /col7 {1.000 1.000 1.000 srgb} bind def /col8 {0.000 0.000 0.560 srgb} bind def /col9 {0.000 0.000 0.690 srgb} bind def /col10 {0.000 0.000 0.820 srgb} bind def /col11 {0.530 0.810 1.000 srgb} bind def /col12 {0.000 0.560 0.000 srgb} bind def /col13 {0.000 0.690 0.000 srgb} bind def /col14 {0.000 0.820 0.000 srgb} bind def /col15 {0.000 0.560 0.560 srgb} bind def /col16 {0.000 0.690 0.690 srgb} bind def /col17 {0.000 0.820 0.820 srgb} bind def /col18 {0.560 0.000 0.000 srgb} bind def /col19 {0.690 0.000 0.000 srgb} bind def /col20 {0.820 0.000 0.000 srgb} bind def /col21 {0.560 0.000 0.560 srgb} bind def /col22 {0.690 0.000 0.690 srgb} bind def /col23 {0.820 0.000 0.820 srgb} bind def /col24 {0.500 0.190 0.000 srgb} bind def /col25 {0.630 0.250 0.000 srgb} bind def /col26 {0.750 0.380 0.000 srgb} bind def /col27 {1.000 0.500 0.500 srgb} bind def /col28 {1.000 0.630 0.630 srgb} bind def /col29 {1.000 0.750 0.750 srgb} bind def /col30 {1.000 0.880 0.880 srgb} bind def /col31 {1.000 0.840 0.000 srgb} bind def /col32 {0.875 0.953 0.996 srgb} bind def /col33 {0.996 0.820 0.820 srgb} bind def /col34 {0.984 0.961 0.859 srgb} bind def end save newpath 0 88 moveto 0 0 lineto 88 0 lineto 88 88 lineto closepath clip newpath % Fill background color 0 0 moveto 88 0 lineto 88 88 lineto 0 88 lineto closepath 0.98 0.96 0.86 setrgbcolor fill -172.1 187.9 translate 1 -1 scale /cp {closepath} bind def /ef {eofill} bind def /gr {grestore} bind def /gs {gsave} bind def /sa {save} bind def /rs {restore} bind def /l {lineto} bind def /m {moveto} bind def /rm {rmoveto} bind def /n {newpath} bind def /s {stroke} bind def /sh {show} bind def /slc {setlinecap} bind def /slj {setlinejoin} bind def /slw {setlinewidth} bind def /srgb {setrgbcolor} bind def /rot {rotate} bind def /sc {scale} bind def /sd {setdash} bind def /ff {findfont} bind def /sf {setfont} bind def /scf {scalefont} bind def /sw {stringwidth} bind def /tr {translate} bind def /tnt {dup dup currentrgbcolor 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} bind def /shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul 4 -2 roll mul srgb} bind def /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def $F2psBegin 10 setmiterlimit 0 slj 0 slc 0.06000 0.06000 sc % % Fig objects follow % % % here starts figure with depth 52 % Polyline 7.500 slw n 3600 1680 m 2880 2400 l 3600 3120 l 4320 2400 l cp gs col31 1.00 shd ef gr gs col31 s gr % here ends figure; % % here starts figure with depth 50 % Polyline 60.000 slw n 3600 1860 m 3060 2400 l 3600 2940 l 4140 2400 l cp gs col0 s gr % here ends figure; $F2psEnd rs showpage ptex2tex-0.4/latex/tip.fig0000644000000000000000000000044411632132265014241 0ustar rootroot#FIG 3.2 Landscape Center Inches Letter 100.00 Single -2 1200 2 0 32 #e0f4ff 0 33 #000000 1 3 0 1 1 1 50 -1 20 0.000 1 0.0000 3600 2400 660 660 3600 2400 4260 2400 1 3 0 1 7 7 51 -1 20 0.000 1 0.0000 3600 2400 720 720 3600 2400 4320 2400 4 0 7 50 -1 2 110 0.0000 4 1140 465 3384 2940 i\001 ptex2tex-0.4/latex/note.fig0000644000000000000000000000044311632132265014411 0ustar rootroot#FIG 3.2 Landscape Center Inches Letter 100.00 Single -2 1200 2 0 32 #e0f4ff 0 33 #ffd2d2 0 34 #fcf6dc 2 3 0 1 31 31 52 -1 20 0.000 0 0 -1 0 0 5 3600 1680 2880 2400 3600 3120 4320 2400 3600 1680 2 3 0 5 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 3600 1860 3060 2400 3600 2940 4140 2400 3600 1860 ptex2tex-0.4/latex/ptex2tex.sty0000644000000000000000000000314411447644576015323 0ustar rootroot\usepackage{relsize,fancyvrb,moreverb,epsfig,framed} \usepackage{color,listings,pythonhighlight} %\usepackage{minted} % requires latex -shell-escape and pygments % minted is used for the Minted_Python, Minted_Cpp, etc. environments % include minted explicitly in the ptex2tex file: \usepackage{minted} % Tiago Quintino's adjustment of the listings package: \definecolor{darkgreen}{rgb}{0,0.45,0.08} \definecolor{darkblue}{rgb}{0,0.08,0.45} \definecolor{darkred}{rgb}{0.45,0,0.08} \definecolor{sgray}{rgb}{0.97,0.97,0.97} \definecolor{dgray}{rgb}{0.8,0.8,0.8} \renewcommand{\lstlistlistingname}{List of Code Listings} \renewcommand{\lstlistingname}{Code Listing} \lstset{language={[ISO]C++}} \lstset% general command to set parameter(s) { frame=single, framerule=0pt, aboveskip=\medskipamount, belowskip=0pt, tabsize=2, numbers=left, numberstyle=\tiny, stepnumber=2, numbersep=6pt, escapeinside={(*@}{@*)}, mathescape=true, basicstyle=\scriptsize\ttfamily, % print whole listing small keywordstyle=\color{darkblue}\bfseries,% bold black keywords identifierstyle=\ttfamily, % nothing happens commentstyle=\color{darkgreen}, % white comments stringstyle=\color{darkred}, % typewriter type for strings showstringspaces=false, % no special string spaces float=!htbp, backgroundcolor=\color{sgray}, captionpos=b, breaklines=true, breakatwhitespace=true } % prints the shadow box \lstset{framexleftmargin=0mm, framexrightmargin=0mm, frame=shadowbox, rulesepcolor=\color{dgray}} ptex2tex-0.4/doc/0000755000000000000000000000000011633377046012415 5ustar rootrootptex2tex-0.4/doc/brief.do.txt0000644000000000000000000000415611632137704014646 0ustar rootroot===== What is Ptex2tex? ===== Ptex2tex is a tool that allows you to replace LaTeX environment declarations with simple keywords. In a way, Ptex2tex allows you to create LaTeX packages without any sophisticated knowledge on how to write LaTeX packages. The idea behind Ptex2tex is code generation: instead of hiding complicated LaTeX constructions in complex LaTeX packages, one simply generates the necessary LaTeX commands on the fly, from a compact begin-end environment indication in the LaTeX source. This implies that you have to preprocess your LaTeX source to make an ordinary LaTeX file that can be compiled in the usual way. The main application of Ptex2tex is for inserting verbatim-style computer code in LaTeX documents. Code can be copied directly from the source files of the software (complete files or just snippets), and output from programs can be created and copied into the documentation as a part of running Ptex2tex. This guarantees that your LaTeX document contains the most recent version of the program code and its output! With the default Ptex2tex configuration style, you can switch between 30+ styles for computer code within seconds and just recompile your LaTeX files. Even in a several-hundred pages book it takes seconds to consistently change various styles for computer code, terminal sessions, output from programs, etc. This means that you never have to worry about choosing a proper style for computer/verbatim code in your LaTeX document. Just use Ptex2tex and leave the decision to the future. It takes seconds to change your mind anyway. Read the https://ptex2tex.googlecode.com/svn/trunk/doc/ptex2tex_doc.pdf for further information and demos. ===== Required Software ===== Ptex2tex requires the following additional software: * http://code.google.com/p/preprocess * LaTeX packages: http://www.ctan.org/pkg/fancyvrb, http://www.ctan.org/pkg/moreverb, pythonhighlights, minted (see https://ptex2tex.googlecode.com/svn/trunk/latex/styles in the ptex2tex tree, which include a corrected version of `minted.sty` * http://pygments.org ptex2tex-0.4/doc/ptex2tex_doc.pdf0000644000000000000000000054073111565043724015527 0ustar rootroot%PDF-1.4 %쏢 5 0 obj <> stream x\[~GMA / !H![WAkגfNK#9m(bjZV_nwb;A>|~~wu{&vĿWg?4aWvOJZ|r_;]9)&+g_8>8y.&7ӸFIRgT_HSLsJH{U`ygTͻZ)X$&5v=s"Ͽ"jr6_(>)^?Q0|sz#cYtV:[B\x0yy&Lv&$ڹJX7)LJ5 #wJNQ鰻|BNRi_B$n$1BR(zewn @Mjȅh)84irxzU&i⮚/' !S.^~\nΕ9ͳ'ip,UaSzKhY<4E(Z\N "jK0h,D ]9( 6 H6=GeEHl  74CCT|q@{2lUdR{zWlVU9We@(;E},z] :ӻ\hhї`H2D#7:$N&Hjš4+*.|- iv,IX@tUj(5X~E9MKs1 MC*X<^K e-䤟'_=c;zJKm˒|{|KwmNyFlpR'+t+*b(" )L"{~?O1/ ,υ96jTbN; vpxKOv4i&lƉh (*VUW# ⴜQqwx|X |CC*` >?Wew>:̀G&f!B\)- % 䤽#` P)XwyqFQDI UHWN%Th3D!1oBR /1Y#Kp!ȡ(02O4bFAHJq0 CrGB/|1 &agg'W M+෡[#QyZbt V28!!a6 ͊{ [J0?0χlL_rJ<̧ Eև/}@|ꞿ!%(w.1;e6!h^DTyP) 33"U>H y6q0&*f'(}5HW"jױRĬ^.wC|Lqp2ikgW9F M!i1OB)څU9DE$5:5'%#f%KqθH ]%8gޝKHZ¬:k"IT:ir!$@DlJSdM"3S~I FS7dk^ v4g%^i_˫E6,1)M}W"ԕ0[i,]uG8Ɲ'yD7Mn(MR숆9r#$"So/q$%4Jq'4IxʈU !Est-|rSbFY; [\41ٓ`#qV.ב m^*2بJ1ͅ+;Nr#'z%JW6F?䶃yyFb&KONbFG7<f0Ιsy~ۙHk304qO._GM:xo lBpS䜦b%a0 u^qĩxEYf_3ߕSair&QkQ$+-* W&$x[}Luvp_sitr ~ Qy%.ڰ{ё_w^fnE!J1= vCCzTpJ4]&UבZu W J9MnM:q90 i/Tтn/7 JZPRRgkv:xʧ!$Pm^?Hu$h~yO+SkI\qw. Ӗ"0߫YolHD^;H\|ĉH9 #`!AWUPFc!7h>QQSjr5M( jVnZB`+,$.Q!|O54knW)d,Lk3L􂚋sla})i%kS5j j AsY~Uky _W Zŏ\gM߮CEvn4dr?t@Hȫq/1F!GwA3bQUgTVȃ;Cyq}zJ*J?"ouĹu7IȺpŹ}L ^Ԕ]ȾPsV F|O"xfkߓT"|Ϫ>:7!(u-Tj/95#n ^7x֔3'v5OH kߴ8VN.#Hw,9x_<܎. 2/XrItxg' u,scW36j|3&%t< z3I_nNjSn-#j{r3jC7 p)vcZoT},SS:&_NJ[Zg|=S't2gPl#%TqZXØk5!^Yjkdjri 7~v^1~ᮾca㦫M@l}cױq9Sl*;j\muLyW _LSʥS+ϔrP2mޒQhicW޵G?S%ot>hWN87@B|BSvX`Y2us8 ҔE\!\]HUCE夻< #»b8Qi,?A{ <5¸ 'Hb6ɪkem,kgJ*X#W1 Qn 5,U]Hv 6nw?/ʶ/E"H'2WڡJ9q * ;j8ނ? [MmF>emAl8gD([i3MZiIGsQ8ַ}?M̐^!l225Pbj?V 0 |۵NÒqh"5ˢ(~P ,Iu h9o v#x-i.m~UCSթ ZWzVε Eetp4=Il*x'쵲tO mGN4f=o=$[w"Sq &km^ؒn)6X|vXw!SxgnPMw4#H[؄ԚL؄!P|DZ(*=]@(}*>Gb(btR.u<ٷ߶2! oT4KV]H/]>~ +^ [5c3`1dkDcdb洆nW JM"^ʫܾiv:H&g֩S]4P|GፄArZxw HNhyZ=[m.EZ qTC/$U#@[J5)+WgΨ˕.l8m;=)~fݏ Iz'( zF]Н% Z@]|Ji(EQZrFK+Y7씀UzI[2 A a;X7*ϸW' r\q(C#S<~k}벽ͣhӧԇ((TŐ NM#$5nT&o{ӼviOUՇCh[Ў۹T:,ɲ<({"a,rK'TxHgjIqR-4E!UGaݲ8] ٬~LQFaTj!rxs9)q 4UYg)-&"k?A yݜQ!Ir]ǮYSwm"ݠ/w]jq*0]@endstream endobj 6 0 obj 4684 endobj 25 0 obj <> stream x]oqo^lyhb AdYNOw]w'rSi73fٵbŗ?͢[~-,D\8^/9EL iX [gJm/U9šu[yR LsӮ5J7+¶+mCumTF4%FL*/d]eFhuHCsR.XJ 4ͫo<H/݋׭N;AxӲsuA@Ƴ^ {_ta׍ڥ &W%||~sD1/r*F fC^wH_f=?@!o?%6sT{Ò2"ꐝݙ0J4~z !hB [7jFyH_&]I1 a;<|]CB}ok"9 %5;$ aygQcϥ7,Kv6s%=#: E/y(ǾA/b+~nj ^|?1oHgym]yб:Ubn rnCEaKBT)O%򖥁l zC^*>.Llb';P 8Jf DQDjDTw+8[?e5+S>鉈g{ɶ@"-SxFrEJ@RQejgr nX2gδ'9 "O |_ ޲E޲+ȥ1\BU=:MokFM@,7,[ |NYljQ5w:U=}߲fWsE1#\>]e/X٨nZ9NNSVQ".:w_g 1GHI[?.=|XぷFݨ|8_D݇H3&2.8*z 66'8?Zq?kT{Fq׏WGn~~ZO†EqĞXo; O6P5DžsGYDħlFp i*Awve{A>jWvrgWvŃa=uyYp< u(1jsEνrU'uxM=#EӅk2?.:]#%oLu3kϖ2Ҟn`FZj0_f,O>jo>Yek4NP*>fՑ}..~ v;[&")(V1(T/xHo!=_Heendstream endobj 26 0 obj 3718 endobj 36 0 obj <> stream xnN#^rc7}m8FHd: l(q)jOU,=)19$5յW _D'W>;_=ٓFt&.hr%Wݓ҇NZu¯w`Ǖ[|՞L۬:_.:d/(i줍֧Wׯ7V.yy?WקZz*-X GSwxO?Y2]Q"Y 8Wv~b#:Lv}PNvBϵ66n@"nڬ9x+8ǨᲶ&ӫQLzy܂ ~A: tSs0q=6Q s*Pt}g.£k+/aBU\ {*oPtx^~  pYC矁1>^Otz<g,s0=`2=Ro5ҎX /Á^ʓ_YzUdDFMnw%wyZNX^܁guMl=vύy]O}>>1L]5ӣ jN5N•xe֒śwFVrS "^,nՖWIXη}^(eB64i"1rM_/,w{ Ǽ7Gm<oYzH@\d7-qq|w3Ajgt3-kχ3I!vgZ߰g.I?btޜUAQGq .ng3;GahG-_f,Xs~`?7̮'%_O#OQU7MdX s2D),o*'q$aNݭm:gNֈ!HEǒ:v g,&޻e~C^{mvAx{C k^ W3,8=F3EBglylcy"{q_LD?3RRa.[%y?:1h]>le&P9]šF_q)A'cI,2_F8Q ˴'#Eә%H K~e1C`d 0\v W") >N?e>ۆjNotV)o\dcBΣ v+:vcݑo$ȚR9N%v5IζKDe\wh{fF›%n+6M?XF`dB0uʸ-kV[uB:ں޹CZZ@ǒI_mѺoU$ ?G a$HCD-A^(JeFƦ!!?7\?ܪ6r*{ KwVn9s$&# GGW1 b? lId£hX.'@ruE49 PmUqzY=%$*OɫM=uFQGNvS@:):@ I:ޤX8Bo "G9%pIĞFcʸA h$KIy0x+Hv4#m^GJ B;DGR" Dz{$@ǐbc lGgyP^%I(K(GDXyxt-,: Ѓ^}*dmn',d<2uTf_C9i}zn퉦 !\qDm:iASz=tͤ"+KYlY2TB#-_6= 65nu˛d Ϲo! 8 ~Tì3&RbdE|q“~tmE~5 qX\ef1H"UĉMKPӭA1AȌmP<h4H2&<ceސAZ's ’bh:75Jj`FR CM_{LaR4D`]ТRP0D?vPt(^@L9<0-kg_ <-pV)~ք*7%awv8Nq[AhLVJԂa' Y$e9ätz ] :Ѿ C|^&Jfl9nzG|B6 GbD[Jճ!@ElǤUHP baYc(`)Z>!&!"6(A/vÉ^-T=1`[]¦VlIZ R㼻3N)eX$iv`@}lM$sNXChi ivÞUV hyGs pXɪ;A8՜!Kvb˪MOg~Wzi0PQŚ}Oϊ\kNcBXF+ڑsԑ#B0;Vi{$*ѻŨLk(IQ6&XX@$Yg et'1@s)rX׃+QĬ|݉u6]E Q"n㼮\Ƒ;TΘ"^"e;lJeX`tjo$#&ӫm;(y_ -߀C-LoԱRK{6&EG14֖ƯW[׹>f|(* sW1o9X~ɼCwR<M#i-jC,3 L,u6"S9z.pA\N2Tr.l( o 9-djnl(BKDZ$X2ѣ?HQFJwI%qH]O5u*^Y7h MҀlOTw햸"\m!k[̃>HJZF|jHSrCa>w4-@s"7 /-F,q~غ)}3~QfQip#dpdNFߦHw%4B:eS!4#*SUs/ qZTkE=*TfrI,@l*b@u?8b1/~!bk18GI6|5eԴo{+ۮfoQZֆ0 PI;?5;\u ќ }D@ n4 5ڇhk\{AKf:hhwq̳RL@Z  1 P8'@;rJY@{J:iү@p٭TJl6ZgGmijsHۃHqWEp(C˺ s2sH riYAR3DV;;4t/tQ>Ӓk~/ fH8!#~L$) ,ZV 񒀿a6CUa 0+! {L: %WS~ R斃vRse6w[> BNj3]2}soVTendstream endobj 37 0 obj 4521 endobj 41 0 obj <> stream x\Y~ A30`DI, l'v6+3ή"E63ZIA`iqd`q~Y/n_,x X{uq-g/7_rn;'h eGWV \~ <׫FXYW5Bjz$jgdU1iVaREzͤV|32-~;k294tīȘ:clG8I$FזH(t iO4z4Tqؙ7kaaLV"\ox`[[8vslg0dwva⾻[B3mw'?`iP FB{=~@qV 묮x9t+"*k(A3!c&o઀JZso:a ʀ_E D`9L€1Vpm 8@D R0\HDy20oG9p`Q;>Ž诞)iW8$4Vs梯uyr@gC%f>⬪y7Ɨ C_{;J }OG`Br8Ԛ 4W Z^/rU3h$FQ^45`Ђ`Ҡ0ȍ0IpU|*& jF5/WOS+(u4W 1.EY>~>wG :u{zpK8:b鯯No׷S3 vm:.t"\&zNDowu# G}#"GFs[]k{L2/=ޯoET `SvsVT ꆽ(8 2?}īaM<&d .K0¿ (a 3|ɡѠ rQ$6FfyD#dG9D -"ߗ{%oJP[pJ*< XRtTje,.ڄ-HexCP"$I[.q~>`'|ן R}EzfT亰TŸ!o[|BDjޘ?9Wa]hU)#&mRld3*9!6~*pcXv3yZ=G&t¤kVYĶgWxȮ=tNWa'$}ymtY|v M&jHܮ~ T_3̊µcRtKsX*`O ;D& 3`Շg9&d+RFM1[bœ=z:)@'c?65hgz5 @0.%Hi^B21`%pvbt)<)l̅F45$".Zo=W[.͕K8q}9Jp<Ս<- Aj&UD?#ߥU",5,;e 1Ȝ՟ VSտg ]=QsP>k&,a&sٰ|UV-B|ju6HK'Ҙܭ̗Ë(sP;l+!/<:f]6eHJ[ BVېZf\(9H%2m_Ub 0DRkG"srQB9p {t9z>F~&~UݜY "jT v m?b<`f(ت;c<UX8 ˋxhF콩@1Gu`r5m$̛a }u"/b8yC^<>j^V.]'q|/?Ѽ$´R!Ps@Zϒ~.,Hc 4*,KNfﰣ+f ۗk0sh#3 j{z`䙪T)&Zb$@ȩ1F ȩ4_T"dx"Zz<~Ngȴ4ubQI@FH 8rpTp;xƂ^XHQCxiBQ_H'`A džD)IQ)XA?ftk٦ 5-dvkli%` bҁpt@j[eY3LD{x7- ;kg\gFpqI}ʕh cdRҰ`A7qI >70Rћp]re{=X ?UP2F.@Ğ|$_JwP кlH)IB<i7uAMXzҺJ/Rmb(ULAhm-¬IHbRH<a'KK_^e/gABA.[FX6u~C?Ӫ󭈏Ĉ97*ኒSoB^ozC#*_ ]ȥ_x2!Ҁ[oC> s8&endstream endobj 42 0 obj 4837 endobj 48 0 obj <> stream xioEѧ6>-6&HBe7Hcwr%=;Mϒ3|?n7 K?>;`˃xؤ^ot @l8|s|q0e''h5 e6nBcŭv+8zrۯ}v+űF}U@Nq(.CK/DP0jHZ39i/ "8'/u^D{6#H0*W 4݇xcUs$rO@\p}=MPk\OLԤyBV[͵d 0 1 uV3%#0B{Y0$(i}"68dVE\^pqfp" FЈX })SjM/tIgЉ^ 4nLl 0q.AR*<& A"Ѡ [ c'<H%j`XN|/a]Jr^K_pD&< ڇ5Mr CdzR7&O dzdxrWQK _J@Fz|{7AzpyxC%7eVaԏp\UP!%AXYkATOV? ^`RLΏvpc)*xG5؜QYZD2 a5v#&,ďpMVwcxV$ *`r.|($. i<L?ϔ(lIT*IB{k& fh*$ZD}i6B2F]ǜ߾90DƠ tVeXFr4ېӽY} L5gjRa^ٍUߢw!9$3$l#4U2?|[* pB)=LJZmJ X#Il%Tvw ,_`) 1)?g1 kE66(Ef!0d H)ϝŕ8Wt;sek"QA͢ISe/%ZCRyz|nZc`B;r{z1SBDL .VdyC2{_efzlԗV=jXpGx妶cʵo'B];-] m%Qrj5V> 7mUčV1^#<.qTBǝ+`J

@{5%,8rm+pFnْqӷquw^TN9} ex H.l]/84{K%)jDڳD}#гwAR7ʱA#q+Z"^cdB„eNpIP#kgE^RNTQH$8?+.8y fMQLМReФSHx2R2;2OYl<0>2~ R: %@=E0 6P=57*Es' WFHj AuAsI7)a+\.ҴSkj4Ǵ`fUb* 7فa`bVNU[s>hb}#~ /u)V~#A T^^G,6.!_e2|ۍl2|1{bZ3#<*4? #7I;ئ4 }7.Z,m g\Hfp1-6,*1!WO: "`OxnfbVԭX+4>3AyY W!YY,pڥMٚz0LG͜ eWxB}bx (DcۣҀMv px9p`w.(_0(h. e0δePi+R!;%©]ByLZB0LL$.7;I;bu xnF&d\*$ꞀX{ZMa+ŸN8_2xe(^-|YQ˷ҝAT홎d, aUY񐤣:1XJr' KId1L'x0%@MIOma{@~yO'FHҼSWR<# XqDDޯ( fb[ i#V:_Y-}1[!6xy%]<,8˭ke@Wh܋k9Q rଵ_f(n֗(}BMBGjVN*hэԪ+)ѓX<,M*C6ew i#$i"1&]Q`s3\nڀMv ͢A;'fJi\C'4mh1KzIl8Z^ Km(Y&ӱ>jD^֗2z~t/$f洧&KU 9ƄžYw)Y()5bwK;ߛ,?ܓZ(R43 Fժx9. o.!Nx?k qFQz=fDL-t=: /mO0i^}t#@XTEr Gan?NIDl&1Mi Exo6H aTU)bdޓq~TeJqf߉*fGlՎ?/*Ih.eg~/ʰ<-^7eQ}[o7e?2}+"q/::?t. rLw8{;~NxȻbq-KVɩM7@IZTb|Yf!EJp#l.0:eendstream endobj 49 0 obj 4868 endobj 53 0 obj <> stream xَ}! 0pdxyrPı@A !֮|}Hvwj0ԢbW1ȍʟGOWGb#6͟NH*Xrsrqߖ Y3(6'GX D_U7qN9^]|Ow;^:1oEyMy_kWW͏_5ϏQRߧ|J;+C1y*\LΫDK&6fq"B6K_I^7yy:?5}^~ )Ӫ|5#~P]Ahǻ|D\eowbPDie5l e HNhCVwgmpz%VLjLؙjRee+<7lz+1Og*7 .vR8k,pP H컼a0~6m%=2oN@ZB\' x:K0̏dn~$:ӴCK XA Dn(}te HgG}Q"rA, hT\.j$Q:dgu$N06;kLqD7(/_== j.C"ŘBû>'@AM?aB$NׇѨ{aq>9"VW֠D-ehxVI0x]AXGW+K|ty1n**ݾ$uR)(EP^q'Şy; SR"Q*"ɺ=i pd@vZ;بGt~^-sMB#)#Qs*t<)4\#رsܽʖC|u'Ź\-iskAD aDE퓮u»i[TIgP5J@ ULi S,(]2 XDo_RB1zu6'=1#MA. 67JqױNVRc+&@ѦI<@E,o6hޫm@^&R xgi~=c FMJIøLNƚ/`0W^-9J؈jB2@ = QM$}`<_{|kS.1:wD(!^n)I%7NI*ӖV/7Ez ̈́ {x1XelҲX(4V܊ikK" jr|HVGz-d-~84I=ơN IP5Wo: y\E0H&/]69/Wr! p  H˼~6?&M,X'iъ\AX rtzNY` ƄXvK/"c;& NwYYpOhrO!)BGbfޤ@-+Lw$!CJfDZ?}7bM)H% !)EHnÃuPڝ^}FT$IeSoǭ:Lx{/.[ g|+"TJp<@šccZ .RBWKr<-μ"A9 %] ۊEg|!=WsH[(]z\mK/]GU!)[c(,1>ԘP p$5aW#J=ϷM@xfvq)r:qU"_r4"77| ," S%XA i>ceh7zFq糕'2vFBCn!Uh81$-iBU΄|FxH3| )7m%`7)q6Ov\/-g'uOrѾ茙c9J6j+ۍ֦sɜͫa> XĠ$LGkz^qSmߴI}HOcw8l6qizW;V2j0_a=ы%|^ǍT@VnJ UM ~k|e%@AbqVLނK$_!`_tO%-j Js0'fEejk$\nQuYg_y8Ov#G8daY-<5k$CC`hԿ7lj/Fn i~h:ͻ,(Pʿ<84δMiJXVH-]ZtNZA "+Ҷ %`p@1ߖ}Əd5n> zPHųg=nNO2i~j^j(J2<5/tiiH?>Z)hFUcK@z!Oz=Ƈg/PxMMH~F>qq=oklqjj5{굢H̚y,,ſ FbtUي7$&邏?kgi {3_ӂ:ƴV2i;i.Aߵ[-U%"lg>1fjMB L"ZD}jЦ18;t6YXO_"8y%ÿZFLqp`H!=: 0(ˡ9Sc^`W}В`zTKd ~S`U(#Mn%Jou〳C?R[UHq=ȫȪhqt^GسHJj6%uʛ?jY&xp#F_M*06˔߄!:C sx?<}zr8|zӻ[x8o7Hzkmf)2Qዣ@=endstream endobj 54 0 obj 4582 endobj 60 0 obj <> stream x\Yo~g#6@\Nc@X~xHLKKOU3=ål90 F=u|uwb_7vzV_w'0;x3x(~W 2Z Bѷ1\X:>pn֯6 /[ 0 Ly!5_{!z}9qyEZ:`H-2*޾k&G,*?c`__{͹Ŵ޴,BYs}怴ެO g(< 60f&gg5S`{da҉AK_ (n vdKU1>~ia + ۼ|w#;9qJ{ټVL&piiq^A+eIWqy&Ór0Uz2NOOy-HYы# ˳ѓS7¯<% &AHOΥ7N3=Jp)U2p&m *jHF qJau &lh%#i' Y!"e\ 9zt'ͤV%5gv:^̗gJQyAZ%z`qqp@T,I/L]wl9̸Eل!Z앋{De kZ]5WV#*:. 1p`X%ENzEav;3Ԧa:j'G^JA-M:-:iDflK)- m G~2;Bƫ46)J$1q*H`!V:-#+NNRRb4aH}4Ҿ7$"k1+=Pt( !9> )E2  Ή Ae{6E1i/0_nY0kۃo]2i@ZmPVwUl d OoEl||hLr2rzA*dzPJP)<$ Ã#l13St>LAiNU?6U2hu2< V S?Hɕ?Eb80ɛs+6n|) ue( ѷ_C.- t g>'E/%_xAi pYY_9Z8Dj:9e6uTR.6 #Sckd (p`CܙUE!Qts~ΠOJyʠ(iDĸF,nОd`?m+[q}*>$&axHVxCf>:°bpd mĒ U@$ p{b`raHMKiR& NnnV1Xâ3:$옳9WZ21Wc7=+Qho爰Vgg_.کml)`6 U16\Ift4ÅLPɢD6\J9.91 ~Y?Kc*AŘB(J-TSŠ=4lYvkq2.ZFj\ѠD;Mu[K1zTs>r yٚ(Z zejj`),:VUtV&^B EizpѤeZ^.a>t/ 2@@aߎP];Oq/HUOƬzuBA22A9Dvg,7j$odg1|P[$T+|-HpRkM]obpp+Yr= Ȼ{:?HsLsj$GG<@yhB?PgV?!Q՚i *eŃ.҆o,QB >$8Jl?V"X]h"uIqmV4!DwSCګ&8Eb ?lc-&}ZD<8ӊZ}TTp-͇80%W?5^qPY:ug,뾂t#sKn i}EQ7 {^Vn3$VldYXjQ Tßgr]:rApV^7v| K#: rrY2HmzElG2j r0ӹgtk$<+D*̫õ?No],@T!Ɩ+cR[6 9U Jy.Ut`t]%zay܃sN;k@egujo*s+iuHmTIfDuy!N"1\wc)GUi #:Hͷbw=n~Y8.u &i3 M Z?pŘdWo۔-*d{ $2= q]AAL?ܞm*0DiɅR?b(b_7:\Z]oE,WۣqAV,:lkV 3fQ&!opoAto 78_߽xu{q{̃}sOX%>Fy}zyЁ<ǯM~yv$)>sjf6=gNdc>nӿ`|vwuK>ݟ^v;m`nSP^_ݝ_@a"d_\fJ?y~rYܕßc܌46*~Zי.޻qsx9jߟ.`Jz{>m-lIL#|]&]fxyn""Noo/v/< /WH߀ PF6j6%x0nd^8ޜ&X71ۻ4IbSZ'qv$- z!p/Hg(Okۋw۸t2{c@pzݷ^nK͜ޮx,?[NHendstream endobj 61 0 obj 4656 endobj 65 0 obj <> stream xZo8Z4P n(qE:jrw3\r%O'[MPwf8?kټwf~q 5^ܯNδ"ѩ^5]c qv2\mr}Noms\_mw($ zvw|W_1) ˻Y>_ʊXe! /@q[PrUDP׷Whv"1jf3Á"{|  ʯ|paq6@էu^F1z鶏vpz8``=CCt#>N)Dfqxߺ`:X)rEP:c<6 K;M6n@zWBk!hs rr Q 3Skjz_}v uO=У TPR@Gvu @Η 6ev#,YG։g8#+A$(rس.kL)h$r1Nn{$LDl@H)1((ŔWH|H"=]0$3jaI'^(Hƌ<AGp<=r=;=V|ջꄒ{5Ԫ)F(n*Ռv䫒 ):F)h&n5 *Pn'`XG/ b@bZܧIyn!}!`7&U?]0F 8宧 Ɂ \ 8<5leT?˝%>)h`dUz\ĉ,xP PkɎčU_/ ,ao\xlNg$!}{5Q8@MU0؜@ YRpyk&t!44h[x\> #^}KN.诞tRh KO:쌞WU8 N]@,?l^v/aF<i<$& 8k;hm.}axTeO@D^P9UF}g\M ,4g>8j\}gycnѴP7񛖭<&ǔ2M. 6LzAXE8@'kUhg\S 6|.`sRPރ _z]Z̿P;2'=Rf 2Og[%M&K(X=zi:bǬ=d͕7TowNF*lS)="=AƂ/p R wh/t? ]}⎭s%4W;<>իi>#1TzMdPRc'OgKmE=ש\)E֔ Xt5YӟBB%YFN`ciUHm8a:16EŤf5ً䶧!s(rje pߦC&ТVxA>w~il>Ė[3v[sҁ:z-BLkkλd]nӪ;{j ɛ^_Y-Yjn̕9\4as*Ʀ< i]e\-5>tJ|\lNv86`ȼ`]uo]|YWB} St8[~cFGjT1] LXsOѸÅ/7c)(%k]~W| I6+OxsP?ls.q ~n& `4 LOUz4 uTr# d#B^endstream endobj 66 0 obj 3127 endobj 70 0 obj <> stream xnqֆKh&['7ȊS}gxYjc' `i;>ÞM|WO7;a>3XLy?{_=vrVPfvӉp7\^*f&m|~&^;RXp&m5p`XC|=938BD9i&V /N>Nr![ %2s]¬~$p4=rJ!h;>d0" +MuGD*oɋ8ܟJd p-# `yo7ۧiE#vO`EZh@,4]0E(# ̨!q ^ᢋJ]̛sLqd"3YQ-gNL^!X4#hY 99xoL !slOxdD0=f"`rhe8 ,D "VRNTVz'/a`y5p2p}{?y# }ENcᜧs1Z]\n0jL.e6s͚K:* $j} )XH[[nvnf]]6oٺu VHA˴CgHJ=q[L*{B" fo,P{+PiV@HAV3dU0,t4!b&LDta[dEUx3@@:9+y:|%&4 Gob_SˬeZF>G䙇:rQXw1 2r.CkbJFo;mѢF޻Gdv 8$[Ҿ<9cuRB(ӚCV ZOm+REde˴u,be77(jjms*f pw#G^@ 0sOm@A|#:+=Ǣ lW2$];M(и@JO317ƒ>\ kXRz^.Yf 6(Wcf3Al4DRmhiy9 Z~qD![Bd&D_* ]p5(OY o$ 7S~nA-.e@8>0|SmP:^*qI4X~d~+4 6Nvw4-u xX ,&m{> stream xZ]o\5}_W!wo!!(CCg!&QC=cn!cgl33gyv7''"v gހQlzNh@n8tJ$~֗ә ~U{[aig@HI]Imum#,Xv#l}2T?Vc=b*EŀUpTo? <",.(8x7? ʃql㠼@ZhLg nE K߅`2BZoOpvlZmf`gB2O9DyQ#b{`hMG`kA}] a'&M0:"\Lt-rdpp)p1ta:45i/H]j ߒemvdۤK A;'6mBP {:A Aedu8XhH֧sҕ5qV$lUt-!=tVbV?M___\}3 *n L40ɺ^N1yi<$ϝ Y<1YwVs gQ]N1)NkMzh6ӀjtB@Q"ɖAi<F<8@K%®>!D"ă`upa- UvM|P8' o%`ŕpVQmq@Oҷ8S+'i-#^^j&p%Fg˓LL>{0-1LSΖ[≷ ӷ|RݗOVG 5 {#ַA?'[DY߅t1:鴶ęYNT7=@/J3emvGO+NH+c֞rǢƽWkl֋Q;jD6ܞ6ɖkYȸ$)&;@jMmRQBPap&5EH|xhޔ X`A\KHP$_d!V#xz-W#HLr\>u<֡N6N&M||+2e?mbc;V\4_|H+Nn|KI(aR_w]vBgьֹQ{z=1!| K0V'wCTs^- "\)fmjGs34JY%^ QB:%v\ytFoYkdlҚVLu`3j^ZAq.{&ŦkB^G~TVdU|;Gn$eeύ]{`%P,ʏAwٜ8S> stream x\[\~#ͳ)AKBIHHV8ػkvltrNKGάR<07l?zzvř޼>c?qdp陒JN#gh.&`R0M\9l3vܤ=zLy,7kI xz_w0jWXܾ=si7@Bj 9K-aRg]}u& HB}adc84$GX`kDR:"CBr@=yfJRX6.'b-9Wc"T 5C_LZ#@G_.Q9 zg&R~IP͆ٓ4?3HwZKԣLS[*Z `~RRpẀK' r(D`a:5@9~b8']\3D0+asٍNo!v񑟆pq{EЧQ*/ڜ(C`)eeG%YrN2/80r WQxN)_OtA Utq3pKT!rRMD| 7 StB \e@MQp2_3sp@raXT/ekWn\b[?p2KZ{, gvQ?9Bc"RRD9cXzҮA)8)85b|wOJ4tɂEzH1i1gRt\O~N|MeJH':5ID<Řd!7+g:G@gq^4E%͢nMp:qi=$w`ރF:wG!л\Is* ʼn˸#0`*n9e΋lDXWY۾ 6x0 sÊ:V ﹫ m;R6"ѳ]Fk@B 2 a^ӶFӱ+"Hli(܃[įE]"0xɫ;8d!B|pNC+TRI\IetwthAID< ewݩg,8Qէ"*DA”qEVi lz@B>.i7DaNe|ӬP$JJA,S.}GS$e)vf/,O?D+4E3(hlхi9 >$inY🖌7D}J{{5μt:nfyyo ͸=A_(d=no"xNljH9&-KßSDŽ:w:]&d'0MN 5nyJDmN;&Kr@ z2о^SffQ&Iΰ*1!d}wP!dNi*G2:x"ҹ-k</H"T7T[PR}X[ǐգfReRFh2s*H݌?rɄ/uJ zBX%ܦ8V-&>1ȟLtqzF-v .FVi2*ƣ`'Y*%I8"_\PKyi+/NQ_w/RWIQBJWa,:UJmJFuP$K[qq)#22Bsڸ N—=X_f2qAl]h$]D@Ž *D߸% ʮJf+΀*n _M6ީ7:2eh[UĻzux1{iw,ĒTAK2'@_NpoX]fESc8\!ˢ´z؛]w)ܽg4z fO%3wrڇdWm]1,?';r]&CL%:Vl;eZIb.]ݱ1^?yq׍KtKİ˝-ܱRA ⴶ&&E^j*7 9OgPai'%r oC9C 2z.6H^P*N\>l դu1]  *="0L1 fKi븆`_ XÕJ|@;gެtkJ9c+܆TEtv@N>VU~v]o*ؕ)uL FJ$f8ୈÂK%Qn`YMm2ͻh;[ G|% !DBñuײcQD4-=󧸈g0폛3r\pQg=K m5N"hYXL֭teZ:TRɴo#+[F8l@6V]eړf. @qpUY&y1mݾPGVOcqqNA>_zf_@p7璲FDL޵8vJAuS~Ċs-DoC;H7 TOt%m6܍7^㸧~JR'N[hb{6Gh4a @|qӁT!+cUp-:Myb OiIF7V aVJQ& Hv]XlrC D|RS(DM_4v %X1EJ~_%ȑɎp[01 69?HuDGҊ^ ߶jZ|<͞- A! faӊNj29CGN)򰡙A@ ߝѪKdPYv6zԮX\89q⥨,峦fWv!磕lXH 3k6honDU>Y_Z8~QnU>x֏^9Wy,fVʅ|qV}SY?`r!&>7"lRj y~~Fx^8I|qOɒ Gu#sUO>G]K_>e{;W$2eo< ?f[>x,WU?~}%xKGỸrPh?ם6S["%LO#/5Js=BH3F`?C~竳endstream endobj 81 0 obj 4785 endobj 85 0 obj <> stream xLҀMͻ^ g"۳H釠Y3(6ξޞ a{S~0Qi+ߜփ~{ɺ .wif?߉y~ jrh3`0TV+:}脦 &5yf/O{аd?y8Nj?#|dqʻTp~;(GL R2~" 0X Z؁N<l`gz+Oا![F n+TADʵq^Cg3aǴ bg<ߵ x0Z/40O:Jƍu@Vo=>Xks{4b0f >D(1xH3x8٩gA^yI+78ؼG@}2L鎦=5H lL4y1dE Ɔq9qņ|wr{WI>H B#mFN˘) {H"V9:N1 9LKI+x^! p[dh~N&H#rbK3Ԉs6}Ț$I g#9g "@:khpނ-U Fw;r47\@X xĖ6#L{HgD#xQK64,K4u x6|$!q``2WI >D}U)EH_G$mR%4$wLsOj#SiB NLrj(WvHNygR?V5CfUZre j`M~h. 4m0~`y5#c鞓-XpH0suNHPh%߽EXu,0mԗ,@ ݧ飘p}HgZAy0gKui`,F OHc|NL%dA `ii'cpݢ V_o }Hb/Ĉ}\ u*CLҋ^Q8׀ Fk⧅4{ f?;kS=9˟1lq8hG}erNT@JlǘOA펖 TPYzŴLQUO A㷓5ѫN ~(iD/8WumOXFMɯ}O,o,k}Wfc43I*ࢋ( 8T)Piazs^w&E\Y$] $7īV13W>r}?愐VH.ڑS"e?OC-_NJ97JrfR 22|a34[|;7W;+yj V窽n!;j%SS?**`oZJO6v5)e\Qf4?*BO3֑I^Ѩ؆jN'2վ"5nmk<&PY |I 5H]Y:&"laNA6smpu>ւ&Hb.$;l*֬@x9s nY*$)LYnLvTa5stSWRp emu#wi ֭V!Ò~Q M!kYՋ*.X2|HU k jUj"ph)\x37s3xUP}j~a5 c̊dC2wǪ^Fk…c6I54"E|c?Dž0'u_(_Z&(naGU 6g1S]~'Frua$<^5jH$5":ϮI_7j&5Dz˹#kڽA~ ofX.)nwlݢF 8Qd(K%J@T̒b H hW#Y$%Nu wcBbQ+StS||.&;| eJWc\JQm+{V VC@J5Ǐ+X % `O88)v"9]oЭ^LTU.,2k;X$9T8>Mq{inŹZ4cN. f!2=@ cO`JEࢼczTt\ xBe bŷ:y_ɋ6|n#%&kb](I{rG=9_ m\N.n'Ʉ4/ iêʩ6E`2wcP񘾋R*>UCdUEэDŦgj']Y0%>AN"ZUbZ"ERgr!fVWR~{zj1myЭâxS,.R{XTճ]"8 [ld,FMkU1Y^ωeQBFxJ`΋L@z/.AiՍb[4xQ^""Ɨ.w3FOpkl-&i*Ӳ_SĔ5jZk*[Y( OLWmǕbuwK9fٳI*s9ع7za;TE0_o:̓& j]\?V91p+'2,Sz.'t-zTv/y{A"F,pJ襼8F*r%<e+)KHBU˓d>Uvp")5?{ٯN_8'˧b|FnN| |Ps2b=7mӧzN>u^e}CvM̿U9 ]Z+ċ[yPR@)t[8}1Wi.b/ȡd1"xX T5M/?_n E)ըfդzHn>V1/K6a:4 gXJfNpz%ZOWyת%lzSN$13E~- EwذVrt&rl #D mF{R!5~E!Zx23^Şqx> stream x\Ks3{2eo U9.'q*UVr| K _&)KJ*= L.eJT@яV}'V=>>nupЯ.~:4`:^}} 7]X_үѝvu|}rA>+Ku[gL`@8Z9ׯ$} kzoz [n^7leϊl{~gtlZdžJC/;;⣖NoM˱qx>=^\s_tZ έ#C!s6!KJoN53-Z̈tc$P3ȩ# s֮!nuUorÝj$ q h'aղwK j\-oq뷓peـ 4˜K NDpI e4GnLX319 6C:}IGBPA߃p]M?i|ӐŋC+ :ĖL_XR]0p7c:;7-7qT ;co~( S:*.t *N\s=gTUo80Q.w`}lxh-WL S9Á|$!CBy*d/.Z"A䞁QTa#N9-ʁ Y+PS+~~q fisߡȹ_$ 4tM 5'64e!/wgkiX! 0ڊd ̡Y–fhKωT"-zk:٤$}~[8`ב¥H\%}}AivJ U ;|<H+塛NsḛY V,&o rdcs/=NрCXS'&óV tm8YZx ޟ1P'H+a  N3^t& %8™p ~>Ĩ=3wl\zhr7MP )s+Y6~[`mha,S`cj1#FPZ 6ab6H}"PF`8kS9@fŒX- řvd3|ҚOaU̜,pnv q6kc P$W j&ǁv1w}eH+ں8$XB `wք2AhFYiG4#ehmp1]Ju#5ة#f[Td r-y7@GW#FFbEmt7X8篜_՘V m2&m.*R9,xQRrH%&YtN{ˎ"ot[y4hc*`Gl;֧ۻ? g|l/o~x]@#%L.5]higAhtחYZ^)LC}weeg{{#JԎ,zֈj#hO}5-Ywrs5ESZu,zOp:LS9T@Qwɮʪ!*ɱc#lp!Z{ˢhy>8Sw^+S7+-ҵVom!~٫ȇa1?%"ymju~cs?c|nt l΀C\zu'S|ڸWBmdm(LCvb?hE| $< S‹.*+i!ݯ2[F;>靑f/ju-v9c-+YBu0n9,Y9 @ aJшLo'/ 4dQwܞ^aRT~ Z49E EV d&}Ev&٥ ?bN9FlZd@XtT|l-<1'YnXA= NUҴ֕Vmu/d,!}P'l AK 1~_d^fZZ<)`)ъZyVe25Cdd_7#KWzUpX& ,0]0r']Q֜ q61M.dOF4RJO]eFr7VNVZνN R \X"[BPVEj8`j"?XD'vI4uensPqJƊ?;@%cH=+qCNaT|}7=|* .W܄&KťԨq7Ň^:í\%Mfh~q4 >!T~@> 0 \WcVi|W_vwZM$rC$ci@J@/l/]JG^@68o8[PC`5c'#yE W$ ~) s^:dăJo9:cӋ+|,111t:.ǓL aLff|ⳡ=A'bGUXClqxA%DQި71aZ(7-n=n9)>@ ?r|YIE~8nendstream endobj 91 0 obj 4811 endobj 97 0 obj <> stream x\Y9r~oϏ7U\~6z C_e5cFA&U-uk! &E1`0/6bϯ~yHl=H҄M& 96'or#gۜ͠\m_ݜ^_vs򧣓~=Ye_۟>\~>iy @EHN!7;%ߎwbV(}svXA:8h+Zo{| _d16-D؞ARϴ㝄%ܾVhk&dX-f{^C^G=w&\ \ NÆKPqeoqnl qW4Yak_)^L\Ƃt0w==k\.V'' 5W=-ktr~Tܽã~~=FYoH`0apNvo6bhJ"? zFq1+gЏX7ȕ3tV:s]KFǫyx^-Qiƒ2Т_Ɂ-2 ( ~7>-+ \44Nv]=@*ƛy$7)mybZ$YGO}$ %x4!^56+5ahܘΚbgBA~ WW} f4t5+E b}'μMd(lf{R4FஸR#>}. KHh<}CkjN0A;`Ĝܓ)Ϗx"??ܟzʹk_]_`˷nû뿑版aW.pysQ $e\>] K:i)]/Er!Js&,.W]$C*[f ^p+Hd̓ڃH v4rɛ$rz݅`i/97 3[hL2;Xzǫtfyw[$9YENAUN!=zGk#ij 3Bov;'MThB+Wb/HrKz~VgXrB.@=qosHr8"LҏksH/HL}CT),CY2A&yBe c]4Bz eՈ4·FU]^V.UOϳ?:!ךHu5nApeW\%cJ3H)`$Hc @x ^hAtŹ&-DM)z`60󀓺QxA/ͶEn+i/t2U?HD]gS $]?E3]3pZ8[{ƣ^ +QՁh/`ߕeU\d cQ\#9ˣ1A.t;xA8Foa7u Iġ# +&tۨU%,Mt![r$,ґ-t֋LԕERM V ʏuQ_W#.͂#HQљ0AIb_|#pe=H;*:^E+9Na1*K~~n->i Y'Co&OWf!#JwJaTNB]%3C_mz=~l<$_qHyδ>ABءp-㚙5xԓx"c(1>wYIZC'5U h+wWhh0t5ޜ}?Ѩʕ_TX^x7Y)u7Pk<ͯݦ|'#{|=ʠm7V:CbcOZ@$T+\Ȳ1=9{jP4?q R2!OL>qܼrS ײu%vL36Sߪ[^YDy:Prʍ$ϚRm^N;i*8;GJ^<*Օ;֥E= ~>]brW]}0^z.}p{x]dn(޶,j.0c"%Y`faZr4~ -CSK[RMS=zD81ou< F ͌yOkR#/M79w^izd z=K8vѨu)K:W)#Uo L`|K0A-4RW/sN ЇS8:usɜ4Fv;rsNh]"|yrʹ;zP(C hՊO_H `1@6>ΣGp[z0=6A+ O@Zץ!q.(tЄ8ABT[+k-J/ph"U5a{^J p!iM\hTX(_9 aQ48FpQ~JtPXZe[dA]E,'`~lW27>@دcS NMO*]J^OݚǪ Hg S=PS'`~WbY}|+N& *K蟿q</Bs-!\v1ev`[hŇ.^ۿeU6Fw`.1ff`ɲ,e!ΚL{< ]No`ý4APEGŬ4~uLbZv JbaoZZn[KRQKrz5Q#5~^LBd\,e<;- }P:&ܦO4q~\pFM4zo&|R[ޔ유zOK30zp@Rx3¨E&R`x+=9%[5HEEu2"JFe OUڟ!Xs?wW.-NnjsHXVurjqgLDQ*J]-]ӓV[1'.H. }0Y֫ф&u6 WJM|¤J0ݮxiLT%Mg7b WV:nYpˤYdF5Ɯ MY+&Ư=% qwth13ŸE!endstream endobj 98 0 obj 4757 endobj 102 0 obj <> stream x=io7߅n-M`f`>6ly*>>խ(A`~?ۼ;7:z{$g0Ho޴Œ\XU"U{r{z8ظӂ1~]?B D679 D% #mޔ —~'0[Qw1紨覟~ac-|BB%|q]Mcƽh`+-B@G'F%҅”3|Z @H%ATKp\ۣg|{]PXQΈpz6һKCfg/r/]sI'dU()\| ͋K)~(\d,E:}s)/n\)nX͋ 2!( | BS4B줅/gG$VGn}7!ϐ0I%%b&7s*7wK9RYzo'QV(9I6z\&X[+/J-"Eav5坾L4<'V0)6'8^yBb v1>9Z(COIDt1 N?Ddz]3jDًlEAr 9FpLH*ثaZ#;R5]Wם1hD( q7V_?v0 C e?DS(x!`XVÌ@2PNQ gD]cZ%1nrcXvK`T d^DS:9'O/p0@9-M< ((x5ƒ}f2- ڎ6>IR38e'~tm09͢5 |K}K<η`MY|G 5 fx0#Y*y㇥qJR{Xt B;kX2'>qFX9F{P5pΎat%F\saQo$(~ PI%$(;dAjըAoK8=d 6bE ף* tuJ-D*qV ) :N"`{n2vKe)y1 Kke)2dp(Ff4MpU{]mx=zAB!96&nOL:q h":ʂ-*=蝗cPY^Q0]2rШp< עg)\NX{$ڊ{d)\)X=,],`w.h=y I7hr; ݠ؍17ZmzpqIMr5k9Ƹ(4Ỹb%ܤ.=Ļ;N*s\ɒsTۿEp|GUjP^ZxRUJoJ)FtF:n7~03\4/s8'i f Q*&e1,H|X]J8ٙ(SÅpۨga0(C%{ϲ2K%%hFq0=[΃eq2_Ќ5I }TXH ul@eؾ7gfɿ͛i1%! jMlx(We8?+!|euB2CZOFeI9_J'_W PVE7 QOw@~EVԋQalTT4/^EQeҍ}FT%C'.T V^>k]* Z#!vU8DE+:i=AJ>tfqŻ4TbGxA-ѫ5T-{K.~6K\>6f_L[?N%ޕ9 (&ełiqSEAi%z擗ط2Ŋm謸6fҔW jŰ+/rz'K4=MCaD\ieƈ郃#ъq uZ  ˘iP Du~Zbv%JTIIzvm 2 uCVn |zӵR{6$FgjǶxCE0!]\up -WGζ>plqMx~v#Gέ7,6Wc`ˣ)%_Sq`΀X) aB SF%JYM4"f@u,-ۃ:u;ѿNT0|(d2*-(WyߊX?Œ12\]Y{=nu2PVI_SJNTJ{~569L vb72wBuLF6q=g* .AKD]"z3"$vj:1[1:F+JVAtxfx%)F%hyaxz"A*sBeT%C&k <)[RR:A[pf-މ 56OiMY;4 7 o)5N KϪăRy*w)(PP s*덷dKD"=S+ȋN@̢shCVf0fB!uuXt0le-aksƙ"ɋc&8U}U~eJ(RuF4^J-Cp\d FJD`lk,!E{P-wC9&!٫:GXMԂ^Gw0pP<-B8V :]efq| }q>b4kXA ;gKoQq\q5_LUPxW|ebeW5n*Bk9<ӑX$y]O볯K/6g҂Ω.DR=$h  g H}yWn~G FNu ڶBCRxք @b>Chm{{(* ۂHn˝2!fR.r^SLu36ǹcnzѼ6ųߍ֮}^X8܋W@&:?8LC%z1C/; `Fd.Jްx&N[RݒeTΦHNu;:NbqIkk۪^AtY_X,TꉒA̼Ͽ}s{| V5/n/w^S }zb{/vowwv篿>=>"5\9~rЋ'r3F]jRoݬV>y]*:y8XyIzZ ^kU٦9lÊ@Xpg -iCA1 ,#2CJB\ݬfQ0wX2]1 (/unS&'Y({_lbuNdM_*\1x=Zqx%\acm㭏ʢ]d>HNB-|ǂG+;{ɐ3ڞ`[/Yա<̄DJHIHe$)nsߴy,i;.vb e6 bоOuz3eF /`AmBߧmMӓt\?+Y kYTDQ1/B&oD X{ݧm0Uh]C%"EӚ`s']Q&0V><@v*~]-&/bj"Lx(5Cv_[ZcEtk1rnyŇ'T3O_T@BDѬz)]QAjt?[+4Dx _e5jyx վ|๨ P#zXHyHj@´zh=f=.%;Y#ޤ%WE!(,% SWr:k##9ѥ:7xUcy/2^}xp.QC5-KbT.?@@U:d m)Bѹ> stream x\Yo$~#дyye8@FWWڵ=U$&9l AGl '{}a|=:_';N3|K5XcVPfz'N Vj=`S^`Z19(Vgk6 <~By L\9 t=X 70N3&ꚬxs d鹕^.|`BXesc18cV S c[= ݆u.\s0e|SZoVQ#$2QZnu57)9-aӎ5g7qT78S " ?'E6;:C4hY\Ɏ;cc3%qRA0rJ8 .<xz0 ❲LdĈLY`}$=vC`GK_l4* &{Q8\!P 7I&jspZLۇʙf*ɯH]xa>NՎ"HOt$-OgT샖 .Q0AgyD *DgA`A0m~lR`U4盩d7y J ^SdmhJwͪR؉q@#%DQeCt X W=& 9_`>r#J˧GC*Ra:ƷKRxn .{[ rѐIJ-p)at- of*LYYb:( f`=pdUZ DRAp>z_Erj9^wI(4p#HVw.\p-f2#Ì%#sw:!g}µDwO` gR?bO9s\-PR{gYnMpM*ԃBR P'`fJ0z&+<|JWsn EEPp%QRFi`__u]>R%hlQs&5OV~BT{klj+-<_iƈRt[]"Χ\׺y?.jl6 mG=ҕyi-/Z8Sa6`쳙 @;XA 1fH_k:{h?jG*$QѱL*.\jFOo7,(zw2d4g̡>ը|G: 6@j&Į$҂0e2=B=p>02$1b9?hFl(RjPohc [hp`ֶX!5RXֈ BjRi.>9\j{nlu2 .T:waFz(yk%d#UQE^W*7pGNZ_@55fAn`qZI<cгV`Dyn <мss37g[y!k E"7ҠJBq 4Os=yL61n[!V! OtѲoŽIFTݕv - =*8B2.yKՊ\nN龏dtR7L`t-,{> cqIPډYMVhmf12@Y ģ%8bET-b \#:El25q]~_bU ҵcԼXC:W%oJpAWz _ljKg:c ~i8qS M6fdq 07ijV -yEJAx\l-_7OϣW[/a|FP!w1㶚]gdV39:r<ۖ.NNoTS[8ilh-խt YlJ%g ) ρu/؂m'/+"JA=VՄ46UH;rnA : p!43A$Px45z=֘0Ԩ+4v7ƁӴl'ψ#͊TLS1$aB HbQ3z N}PLw VZ{4cY&PW1I <7˂PW1pA[z$9GVSɑuB颏S'T(gV=lnD,o8 l]XK(y6re7i|]Orhnu^syx=۾s6&mD*)zi)4lNENꠖfw({1 +X!ciҠp5Pą5K$VϳNU*cL`͂ v!2 ;YG[M]LeF#]}Ljg8$Q(O:)vdM2EF$o=w7L`qN JcFƍJ\Y;#x][Yz|LѶU+Kջ ˁ/8)q, iJU$1\Sd|}./tEq #σ%ոSCPl܁+==MdhpֿPߚZUZGWDtztgB:0=i+q>px5^EzQ{ q^o3:%!rK .,jиY} 7-y9٢p><ݻ`xpK!sܢrs$ hx4 jzWuI- ^+%k{TJJН-p/TE IQ K[sT\4`64v;'ϗ@\C'K,Kh!=Mb_dZ9G1GS vI"D 1@Oq4Mփ4e6zsR'BNMv$kw'O.cu86=>*- FU)ߡV- wڱ4 &x[,mCj%[)Xpd7yu 9U1Ge 1^W㕑'> 6TVHSf`(@Vo`PN@Wsz?Ĝ(~o;W ?] d/K% 26-PJJj5It56S h`lBgnդ34N2T!:/"ᅋ4[BOqvzz/O1̎blqcLNbW8Be{>H)%(ne,.k!Ā2hT*koPH}W>Rv vRVR~7!;Z`[qzX~8x4ܭ,oqZj'I+&y@$q&x%+n.!˸μt< VGt L5ֺD[gYy|C̥v|3Y ~00HPp ׌49o [_G;*qVË8BK-]`Zk cW3Ë~e8`BY _x1Fn7/Bw`W]2%lv/Z($p?_ZD|M"詙:HRnwpEy#&~B _~I!-M t+QHV5? ={jLtN^5y㣽>z'endstream endobj 108 0 obj 4912 endobj 114 0 obj <> stream xio#!$YdTDSi" mEd[5]{$nc4M漜N߮O=_+LnדϮ5S[bߦJum()j&z}Cu;e憊a:#5cRYͧ&2.i}%,ڿ}Q:ZjA~xL0YSfj(Â^#?TwDIlob"ZMg&VU{\Q.mGv?ȀpPi \R)CIf')Mm\/@77[e'r^-߰tX~8, HU |"U+: .`@h ֡~PNl9en&5smt wr}Hػ2k@'w{XmV*=Zeq#o&Bkf-FES9sHZR] qɄ؀N)Z95ML螜Zs\儮Lt7waRxRu89ISbnƉL)fS&7SO0 m]0.r[SLSM@Tu~d<` kvW r@FQTAx`{Ee\>ѻ8#Y~ H<x`D K @3`!L.}2B#iE[Gj:("JTZò)THIxyKO E@EyTht<*E/ !aER 6S+-duѹE _C,ִ"B0 `4b"[d$[8`i BL& <.GIO쾗N `;7$_`.a(갑(_j9E4׃kE%{NXC-LPD~73%l[CJ}4~ҊdGn2-n :>A>ktc,=%Ѵ,S N{RD.4o83gB^1,'ͲL<242l노z)6N8[u=n2ϟ]BXtòtBx-db QSBBI*t.5X0Ɂ%%H$@'2n>7'="lfY6*-M/Az"AӠ#Gˇd$a8'#W,)gCl1`'.H{} &ߥGf$fa!e`ҤABdL^&L{bxy!ыp*BK| ΅2.C[a#4^DyW5J*"(,+c9Z*auLiKd h)XA[n O,AK@I?g_eܧ -}Iz^s$ór)QQ G}j}^ڽ} FQ0\#ܺnr;gmvl"33&:xk_lP1-< :(tf|NNgVxX e ftk^i-m9 ݇dEQcg% $ﮞ'KpdU`w@b~ݭsbcGP'1 l,ݟO!Lzz,n,Mr^5Nu$ҧ}i4Yl8I"&3q<^.~ZUw$!1j BZmBw^"Y4۞f#k9i5|=V=Nf,&4M1%B<ܝTdMZ`dM#0doZFrb~X{\A4 S9*LNƃYzga(v0WG @,oNÆLBKu, AZendstream endobj 115 0 obj 3234 endobj 119 0 obj <> stream xZY ~G N݇?ĈC,!ཬY$!X왝VQR񑬞_ /8_/2mX_.>M2JEó|Z.]Paq˃qy0Qi+WkmC^W肷¨i WnCtoL -.[o 31 ",OeI^~םfyEA c(vC^ֲ * SvPkPj@]ozYR6vIU0 <|7T(\>A2_Ky[ɽ Ly-B'F DR.} AZW\zhԫިT'_dGGo׃ԝ5&f g>#~\&KoDim:d%!'+t#)mU4@~pӥIRDw/=0vaSܻKcby ȑ..>u;`DܡW_f1p]ֶ~=P`XJQdRJkf0 ! ҁkz!yo{OR ^8D!(V x:7٬^#f Epr0&oH*UqP3X ;-^WG*#A(5p\B^/ FW1_Dl8׶kG6~R@ Z4J*5F܂FC&ARZ׿+&iI) {%pt^Z#+4b_In x1s8Q,<&L5 |,Yԟ1HŃ|ںΔ3p_&~7_M՞zͅW%n9˱9EFunJd MN uDc(TCC].C?2!Ebzz{PȐjwla[[L >\̧2thw4P t,a^z+)xSkh6gBA}[TIy[8ܐrXHW Jsge U%u׼U(nY_Io ;)NI#ySg*Qq9vZHrNS,:6Ys&0ܲϭ=FG`m& *#riQq3l>.Te.y1Ct͕ 5shk彧A\A[`UnMtK):{lf FAm |^4f3}sц+[NI%6Pw 8SF;%d]ۚq˖Te/q\ȳBo-5_/-kmqXklO6u'&-y:Dg^%&cwZczXM5c0؟G6Z)3PpvƷn#,jXYddl<bb'w?X')=Մ[-3qNխ'먙lLvu*6 I@k/ +{h4Qn;9/k I"s^4NތV_Mqh_#y5y(3pFw%4mg+<14cOI uHv}u>7| l? ?'4&ð:gꌔAa|Ni7 2+<Qx]O'xœqFWQHl(-&zYi tnľ|E75}_Z \ُ*™?YzUVR@J70{|dZ2|U{RpI|EWa/ԩW ypj۸|2:S+;p"|>ͱ0ZSd9+Bpw Ǭfm\s;CkK rlU'E{6v+k;~?7㡅GvuI}PiG]_H%n eƋx% v۱3r^`BF}(\RhLjSX3`W_=2Cޕ.:"V.N  ׸lwiu` oY3|UB:. @\aL$aΊkkg0#1XhW$r5{/RI HQ O݈I6v KRw$Y?cqI<Z7Tf9ne"nwY|ۓ ˗>g9\7#U#^Y_m>9f049vd,`p3WU8=li8z7)t}-wkZcVl9+mGO"Hf {cPa x^f|fUfOZi\1H\ACeӤFi n>MIܯeo]I]ߩܳ݇-)lK_]񚓽 ǎ|:؏cݶw&,*?{#~]4f ZXg+OC>:W}Kg#Iic ׂO!~0OK?) MtWc}͉{-Uꁐ1*6(Lڥ;)Lʇ~3Fendstream endobj 120 0 obj 3044 endobj 124 0 obj <> stream xYKoFWA`m]4(@M*;ᐴ#샻+vuzѼ盙u!+ o/l g|`+M҅rqF4GTLpt38χ*^n-#,HVHο6I解 P'<3-3Q ̋Qྜྷ6`)g4 I6]@j8M?Q[F7YoogEDg1&,"#yb@%Pg RBsg:-# VN: VHB2-)Ǥ@Br%(h%ySJ& FaZ $`~`ocCAu4tV`: %ǜpEQP"aHa}`|;iRDCo'H~EjL#("FZ iL?jKO9Œ`JmG=M$o"dk)H44@:8X*DTA1 ̰t׃?]8q졦dnٿ25bJDzUC%lJ \ "\IX)f@M JN")ł;шQӶcXP_.BzP:hA?t?@XTu?I&yoL0ys[n?wʮ Y>Eu{PW.fjۋ=>`ԙ`d 9^xv{ab_nբK囲w뛶lWmu<4g0flX>p9W몶6;.w>&X˺C֗qp`_S9r܎d4!M﫺]uLz׬l4>9IDHnId/MDr3@WϺjo)'~(] xRq<-Z u+F]m3 7*~lh$H2^ ;\`)t}#7;gM$W6r˾wA"]锿RqmE_"pڢOw};rW.$Ɖ)PC_h;Dє$scY98kbsjT߃[^[g*%(XL9t3?n wljkV9GV{Lg3} ' CQ? kx7lN!YH-)-y>JG hucL"gCI&pǒtx{Gendstream endobj 125 0 obj 1709 endobj 129 0 obj <> stream xYo6~_!tHJ úPmj˩;Hɒe EPHwwN#'?n.&3[O>NP-wsX"E 3A(#9QSw;4q7zCqr,XB|ĹN=-,g> kYrr9Na)YcFBGHϦX&qZZآ2Lqͻ/ǜV0#ADH+9B7faf \mo}HiL30_\(Qj8HZ%9'&|0%|7Y<FnZ1v#sgGrJ(/9Wq|$`d>sEWɃFM7"VC/-k~z3U`)˫W~CFڼūC-f.rwq1/ǧ2.}VpX?Zf'X \'( \&$pYjࢮ\żv~ ^`V<pgY9aYLXq_r^0\/LV!+67/vOu͟ \PO:]{`$۸С Lg?>&5zI"?XYZ.nltf/Bn-< uH>zŻe0ү`^F@Dm|~n{gd n};Rf}'X7V~sHP$<=e ϖLo%>?&Uoʫ!aBGGQc+k#C0,_moNΏc]2LCI2Y d8v c!Zy rނ-\i[Ԩn`X@/MUo*3' V'Z 4jZԗ>b[B/!Hvd.et:lHg\ԇN˅]r36n2ehv^ր`:2>*YaqV=/V}T5%3JOa[ j\xU Hc49o*Se%UU*u;U*l2zW_w\4e\J}8UǞ*>α-N:))swEoP}5:TUu@Q żD?uS? 8GR压$ `Q̊9,b"J&\}[3ׄB'3f(m)a}qlQʛ(TXܞ#^qczfbog+ܜ>aixnvpc1byIF67> stream x\[o~ׯ>dX^ d}1et#d&YŞH3U.wɺȞMD''"/9Onrq'&.'f#xHIU oˉԮNO;`}oYz~phT9_\!%>0G1|`1GdkJj?ό!''%N,{ޏ/{JtAɡz$;dBF8:Qo~yH?opYYiOG 򪙲J8E7H=I~{N>jAT>peWAՍupԨڨRo{G>E(#UވN F,̞P+YQIL.1)- *5J11wj:G9,5nI$npwHϻ8CeatF")k\VQ&!X/|^F:gA܅dVA(C_IwTY\x.،tXR]PA)bo^Őy_3ĜVT0ei~?+y&:Q!{J|L|Ž@gceSUœ d x:k7? :h?6a>Z2Cf4b Ks$P]^^9KV^o&F#IЇb $]"V1H y P% JZ~u=G+2Xx#-{/x_4sv_ÂtCU-;SUZNq 3myc#& ̑k@5+=œ )WR/GRdB{bz|n|۳D]8+IGvW J=Ya&Qu4~%WBXuiU}"mx'R JJXvd>j~,'B~y8l(=0B{]UqHYC};+\)o"w6eNLg, jJE $,4p)dI(ffX7W ucy5vcYbl6 .V94:m"jNsp$>HZ$|2-GP׉>ZJ%`'"Yg`FOyu'm,N>TkI4SX387Vk6?fE&CʱH<[N )lZpWe(~\h@tڇd)6}m/y5 Ŏ0t%9+%uSa<-SYfYP(Y0g/>qD)\"DԸRءHq/),w:D9ę.mUM̿AMoҌE4xG,+zmܹ gy<}h =~QWy}yVT_2kpc[b_>l|zr-Yn"啓 d,vw~ .Sr3Ч { 75KIv?}]:NctF$g22uZR?oJXTkBL[rL`U];͔?I)8ЂyyH 9*- yLᦻ&v fvHc/ uӡLP g>R]~ 4EGEkD^Sfxy?職52|%e*K>L$nu!;$ ֨>^۾Ylh 8WHesL-G l8tIfɖ=k9X)ت5N4a.!nw!C8Cx¾va cK1߅ WQdxM{c8PX+dž82ZtxxKp#8kC{YXL:շ \e2l/*P%ւ8}:Kg>6' PAZ 3Ps.63JR5^Hv71lIs) gxco?(X+nE?eofv틼߳!#x^&EPX9Vcn逫o)*f8C8Ex3¯lv#ΚЮ+uZÙai TvͽJa]{PؘQ7QoQPݫh=ҷ_7wagDbx+o~z>}L>zP8SDcn!!PW߸ڗ1AY+"ǺnK 2 m !۵j] OfC,nm3eIUyQo=?޼E \^E ccDVFz/>b3\%-9}{o=ȇ1"z ŤCΚD\ߗendstream endobj 135 0 obj 4609 endobj 141 0 obj <> stream x]oBH>b/9rI ʲ[=IX~U$X鞱vo-S$dW>BK_w wGJ 8RGx'>N&|ZJBˣ9RG W&(a <Z-7[ˆ?Ϗ ^%Lc'R.|{4L+mD h[?~yuj/DVn**˿ˣE$ oQ$M;h2E¸:辢BX]ـ?͛@nn"ZaƁdtY eIBbk+:Yd W__,v|v-N/O0xNׇQQ?Yد` V$z3%) m C) 5S ~O'o D 7놱,II-W67}eajk*%.iTNf;J|:b:w4F`cZHPPo` /exA {k' >c%/x0pasB /WexB}5?SV g^<'Ȟ' ko>t;$xC;26Wz  Z 汯w\sKW+F3=zTh{yQLS߷Y{׫dK>⢢+(g@yPzel}qEX ;1`1uֻv;Tͬ&- Zs-ȢkAnjA%>ՋnN*ͥ^vC@Af`h2$xC{`_.OB 3%%.$Xivz'RA 䖞TSd/ 4@[b9r DFwzBkϺ<}c d?^XXzQlB4b\ iK"FT$}Hgc:U Yw@<ѭ~*63%b[Ǘ<\Cjhw*Tc,d t@ۑŜrRq$ *5įP?Uςwuh=&8kozX>j-Z3<^<'ّB QR6AcC S Va4fzK !!ՖqAFrE^Q 6ߝȏ|XF400gZ1L,$reۦ5DeṖT"i]ԭ mI,pdwz=woJᴒ 6n JNqZKj..'/Dvv`$1lژ| w'kD3Mp_Z:%ړ?5AL}|b&tRY GoHĔ W c q0M] {[ YIζpnʶ,DlmUZzXistqKiǨ{6*({[(-j,7e1M!fDy]*8+z覢׬ԻIXoPk9\e A5ÆuvRyW}Ԩ]^|O{'֋.kC9V0%'na}\U!-ߝ--=U('&lI t zSnsOp@Ms$ đ+|SJVLJD^,etڅg/;KfH c_[jEЭ| xAmyQ#QR쑯KqnIq%݊8 U辵Syɧ1{vXiH|r ᾙXRCWoJ5Ql[0_B'ɦ7URu%2‚YԗCn(%k. prh];RnjmjmjE;Gg݋硑oY+@υ1KQ_eRsy-=y':o t H;zu0{a3c袢Gmx@ep΍!yGf^66  3}1emO7}_J Uq2;!*-$|mkSex o  'xF += &=tY] \u;;ܗ|X8W(pf  <ĝ헜7J{‰ݷ16?}&iE']vwoeM|ba<b ʒ Љ UA)g d癜9da @7MjO빱*7v$"E= ġġ8U% 6=-^sPâfxa$;ٳ1ѐ-1_7}׵bHRa9zr%{gi$h.>4Āб  @f;6~\;V_rڠhГJ 5":K՚vL@Uo.eM[~\gJ-?.-=UR +Ǩ>~/ƶ]|P.]UV)3Ô#aGнiZiFNjۥ)umNڴU7U9sS\Z:+FάrNNxX}#S);*t!&xJpC|d"G&I[H-mʈe-Y}eiZ!=Ӽyp](5o)!x;v c*8o*އ ,%0 V+Hۖf!KSoyKKO*V0\"ӨFarV^}Etm;K+*?Iٱ ;M j+-=Ihڽ]wG_C&0Jy\/ s6pm!?Cyχ-)sr"l3oi[*6+zxge[WZz_iOL ޠbG)Z{Q&_<_ysTˆ"4-\kx@ Z# &'D2,~GQzOQN{vˮu.5 *޷XiU[YZzk^ %b 2ң r߳1Y69ҝ +mm'QEOYJ~j i滍RoS[LO߈a]qS[ZzFҞXBtN *-(CO^I2UZz'Xj' /xB)}4e]e gaGq*|^1l&G%TRmmpi N;cٻTc ?uSzӮ'|,8aP@KF a<\자f]~'d{BFؼV_G~(inii=Qۙ)8b:A/1Gΐf?;C ;CT3O^Ch[rZAmuiiDU[G]˺# *3k&ڔ"u}uζ%'DgZt0yg[ ¯7l!Ƹm!N h􄳐n (Rkf-dx4۟Qe[Ph.r\J~|t|KFrACx&Jn((I%J=fΙ΁:ǘcEHxbR qįLA ~&8̗HFeYWB\OVgDZ=~۔'|Q>|[K_>vw]+Qiru-DZ[!fIR:5s-W:I.[SDP I<x J5H/Hi:zbhēD.\t'1>pk ^-Ж9t N >#!hjh6[dQO t0FA$<PEn1Os2IK,DK D^D F[0˷Rhi5AT 1h<,qd|!B#pEk[*F*.0b[ >tuuޠ}FD<&-n 3Ģ|ͳvFTc<@-kD5X!KT|73 ]t0Z~Cdl]sE`]]%Yҵ|QpA[h6(q6Tߌ1>M#N5?]QQ@17@css5q]ӺU6˒.K7Eyz+-P.ۂ{ܤSi#\M1!ްͣ,c҅C SU_KB#b: ϐ9-CZ_+tWK󵽒k9iskB{~10B%qW\u0q@ w.(W\4,hWG+ga-ad 7 N?#UvM3]Ջo5]~Lh^C ŏd_8jR]H`+CU^Bt}(o趃~K)rk c!cœ?\BQMaYMboXQԦK1O c8wdQ Kq$#/I pEj\1I9 m_.Cx9aQM,  d!IR^LQ~zpS<JҭvP8)_ơzGnl'Ey%(!_^3#8%؆/Z&Ld Sz-n@eviQkAӂ -+̧8p|,5 |VStu v?YHD1{ml0zɸrSmN S8p3sOow]r)j?]H~j9'gv㦔qJpMhJ2R3|$$8'͙1RwG *պ~̒_\?B⥡=zHnپ$8ְB]+7 aF2uZ`\ ו,uӠ XWMeκˬl}a\YrXJFh]VRK=<\S) z܎N,2(o8έu:7PCUrRV&xlSLz*j~睞1섴K@Jɛ hw2JQ]dIEyC{v!#,zk{x5VE0>)6٪v!Ki_TK s#(oyщ\ugכ(~(ןbketbW!78Yuq:qj,p}\VZ(K$ARj+5> !I9*<8?Wf}=u!AkV(H|ќ;69bbiLCS= ztOz?8r[$yO`;_?߽a@uR0v ~Ko,qQ^zV~ _3[]mZY&Ъ ;6ZѼQEZ5S{Yt)PIqި"AfT9K+cV K&퇵$Vڥʺ ; ?i<&KtR7 G v8aBjnW9jG#P$v@QtRTmaW3*Mಇ(\X5$B 0ڻ/hru!J`}+kY%}Q>v3N`NzkfFy .$~}t<5#XeR@ ٧O?a0Me^M٧KΛ}z".*d*A^%X=[]_ӪOW+sky]:M()t`ϵiZ?U`>0I/[W88fu&L R4Ak/D*=X.tVW~ ą? "ќWxnRxnA15jD!~:~]8}ad8Iu|Jq^QW"pW緘,1oѼVCjx}Z;RnL^FӜЏ~R'q[zǘޛ,鱜77ւAMrߊϫ8S$d4RA%c`%tS λϮ ξpd-?#?4mt{>W(oZb|ąpI[EyEyzqж̿7bKYmBQ>nԙr1vfqI_h=;ͳmY8+ۖHe)3E``,Ct%2)DAQ x # U֕JúRi dwxX Q *m/9^rZ.}~ /GV;m柡U*Cn4 A r #/a i@<U-\3C.q^:C-Za 3~Z{xnUJgݲm<έ鞪a^tDd0[EJ"3T{lCt(BbdXFFz&Dz`EpFph[˦m .j57]]W`XTac [*q]?s- |6t1O?'"Gy=g8W̨mf2emY .˂xmM3L&6x=)'w7B5HTsx@K"_Q~^w|Yd M7~^H0[0.a{Cг.)xx69@^ nG 1 IKD݅+t|OpCȫH;jyI&UE!,\(ܢ{8]gdM$钻(8N 抳I^EZp{.z]0iʊH}"!#$]"ecf=C)/ƴP %'eZq_' m z,k\$X().a@SY4L+g6$I Eyˏv"KQ&(fnBtPujGwJȽhq2n Zԫt1ZS-LES^$K6%K2%a_`۵(#s#͒qNURkMq0^SW讠Ֆ Zr-< .D)2z0,Ƌ}Wh~XTzW0&'IאYwcCxAE'Ħ-@F !8'xW!#DpNg_zv5f]0' mJio_s d scjk.'IEg̅ ?\F@W꽇‚`x#/H(]cz,hUPP]t~3y%mcu佅xY)Kzf*v;5``ި t(F(Kٸ} 05趟@E=hAU=feI@ݟ{|ϝomw[6Wߝ[p Yו٤z\ 3rYAӂ݊sT1UUSz-:*GY4|k |\}{ik0z> stream x][o~ׯ$K1a(ձ.HBvj嬈%qҫHKe5|Lg|n,p,Hx0b=?X]ކ՛J*Aq7oTh}O87 &V:?jw]au4v^o=(΃4r6Xp<6 3i"{,qnB_7Y17 &'h`ykT%f( <Zx` Đto>чP獂QFS.q+8܆) `fu#ٽi\Iq=ÊÇ`yVI; I !HQ̛Ց'$DBbd'$C^!Ě@0:vK5>LJւ\ImZi6zywzGvޥqˇlWjHݹ-=mh0pC'NE ]1]r|ꌙ7|i^;pp߫.UE-#q(+w 0m/01p ;h\X+>iun<o!A'TSW\jS/b8M<&ܾǑהi$ɼ"ψY%tѮ{. b3|яs&D~4*ӕib|d|hMq 28qd 'u6JH#LyF$vC{""݆Q"<& _i|r1i3٧屟yB",z '3"ٷ"yD'oo _yMqg4^.1M={l(d=s@/_6 "8ywgZNC-]Z2DŽ9-!`ڪaT!>Ǐ\خ%"Y;~ϐ4rR^1[B85M $?%nC'HE~J9Mc0=M:u<&JG8"ynBm O> M+>{A@S(!A>θWTBӴA^YE-3 M; $*?[AU,k 1n\v y|ewQG`_Z/ץAT%r뭛((_&d[jk2i"|lܠ>7umW9w4PW2=Vm=ew^~+=>Q D:M. ;̬ST"~aedgBH"wT ) 4¨2q> `k&o*n.OFz@ʖ}Ŗ-үDnkZ$7V*'cNj@)ŬƋ7J1"yǦ2 *LC.aNly@k94"1{4yRs- [0 a}ϒeioVۂ>'K6憺 5R^ E\gN EK#ܳX2Ӛ{щo?VMĭ]X u[B}0Z(.9LJj:ڛ.PǞO= Uo b_y/ܫ$k_XJB«+Ů_/~kc[>9}MS)QU[XQ7Gn3= {)#pjq1םn av8FbW S,IOB̸NjNlF;uk6 Ñ9Vd#C~]žk{gъd>WJ nwܛד~?b7.ޢ+ ;>M+ڞAP߳ɜg(Gba KxvBAgϫ͂ zCfY3Lޏ*ogZEf+4*P_ɜI6};IL.L2~=ϲ#k@J~p괇Ac:̾hKغlS.Ko] 59u~>E"9۸:$݇ 9-@5Bm\m1g ë(2PWwxuy_XȘPz?WՋqdIJ_+/DRF/0N]^QJLYdsθ2=p.Nuc5 Dd22yDs"o<%=)5|֔e{;v#IۋSz-->Kz_3,3l|s 6xO{X#OӚ-Eh,Cׇ 2pJ "#G{ݾR\![Ht_)!㝀ehhQ_Bʜ̊qaR(7m7 "Vs0t "1kʹ| LeN E0M ȗ/ҦJ1k$eNkEH eiZsO2}\B]4nvLˏ8YwHUw` q{-e{!eǜTo,-i9"{=vbhnK 9[{Ixq5U-#J3P!;4ëxJ'r)_mM , l+,U"'FK]EH) DRk>VeUbϜx sK{=Oc]g s<`>qCHk;`0NYYؑuK^^ա!I/0~5qС+m袎 nendstream endobj 152 0 obj 4807 endobj 156 0 obj <> stream xko;~7~P(6-8AJ ӆh1Lt|ʠS#8<BP^lm` atf jJ09D]QBS!㰪~5x2G엃JIv2V+m>0]@*ĪHDmi܄-CSe@k]Dpq[#8}`t?rFӧw:MYjI'IPVZA}`'`K81@N$La8p#63HiWHgY҂^i@;QI>A %Y;.8&-%Zi#}@Qdz3Zɲf(s\ED(=5}qMj\ӇG#G -Eʞf /U8ͼ:X1R13RpXz_BLL_4M2%@>Q&UUl8#qo0@jb.4+υBCpK\D]ip!EsZ$ Q))jYgr՚>Tl&, F(LmnJ,F+4 1 $ lH|:Yy { xiU^"v_gS r/}˩i@ZV]_x^)$ $gJG l|qKQA^goVӺ_*,vf>8܎WeKW%&~ գ OEk;Z.Z4%]B +PhFHRoR:VT i"2Rz3._ܟD)y,r"*d [@)%PzD b<W͔νԞrgjE:3W%H &90A}j3Ym]s Bc;m7$ԻB!f̢jWgHpܿW@T~"q)Xm:~[o3 71Lo:_sdo︢\w}*s )\J)&ŊFbmRƇWeJjY!>zGШ -m綠QnI|T\˩hoR9L9+RS:0Z>KBuFR, %-KH,:Fo3p4ߑ X >Os|j!!sc9$8W\p ]4JRJŠ0ΞyX鵏8A.RY#‚NS13Q8%^UH* ~sX`g 3*TSL2a-;E ? 5a$^UQg!t78Z]LŸ7]ZH$E2:`]0 e>-4+jב%om* ߁<;"1!A$G '{/A"O! b %$f@jqE" 8@rb^BW0 7B?4,!1;2jVfKƜ+/6G8+( &4/zaendstream endobj 157 0 obj 3191 endobj 4 0 obj <> /Contents 5 0 R >> endobj 24 0 obj <> /Contents 25 0 R >> endobj 35 0 obj <> /Contents 36 0 R >> endobj 40 0 obj <> /Contents 41 0 R >> endobj 47 0 obj <> /Contents 48 0 R >> endobj 52 0 obj <> /Contents 53 0 R >> endobj 59 0 obj <> /Contents 60 0 R >> endobj 64 0 obj <> /Contents 65 0 R >> endobj 69 0 obj <> /Contents 70 0 R >> endobj 74 0 obj <> /Contents 75 0 R >> endobj 79 0 obj <> /Contents 80 0 R >> endobj 84 0 obj <> /Contents 85 0 R >> endobj 89 0 obj <> /Contents 90 0 R >> endobj 96 0 obj <> /Contents 97 0 R >> endobj 101 0 obj <> /Contents 102 0 R >> endobj 106 0 obj <> /Contents 107 0 R >> endobj 113 0 obj <> /Contents 114 0 R >> endobj 118 0 obj <> /Contents 119 0 R >> endobj 123 0 obj <> /Contents 124 0 R >> endobj 128 0 obj <> /Contents 129 0 R >> endobj 133 0 obj <> /Contents 134 0 R >> endobj 140 0 obj <> /Contents 141 0 R >> endobj 145 0 obj <> /Contents 146 0 R >> endobj 150 0 obj <> /Contents 151 0 R >> endobj 155 0 obj <> /Contents 156 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R 24 0 R 35 0 R 40 0 R 47 0 R 52 0 R 59 0 R 64 0 R 69 0 R 74 0 R 79 0 R 84 0 R 89 0 R 96 0 R 101 0 R 106 0 R 113 0 R 118 0 R 123 0 R 128 0 R 133 0 R 140 0 R 145 0 R 150 0 R 155 0 R ] /Count 25 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 22 0 obj <> endobj 23 0 obj <> endobj 33 0 obj <> endobj 34 0 obj <> endobj 38 0 obj <> endobj 39 0 obj <> endobj 45 0 obj <> endobj 46 0 obj <> endobj 50 0 obj <> endobj 51 0 obj <> endobj 57 0 obj <> endobj 58 0 obj <> endobj 62 0 obj <> endobj 63 0 obj <> endobj 67 0 obj <> endobj 68 0 obj <> endobj 72 0 obj <> endobj 73 0 obj <> endobj 77 0 obj <> endobj 78 0 obj <> endobj 82 0 obj <> endobj 83 0 obj <> endobj 87 0 obj <> endobj 88 0 obj <> endobj 94 0 obj <> endobj 95 0 obj <> endobj 99 0 obj <> endobj 100 0 obj <> endobj 104 0 obj <> endobj 105 0 obj <> endobj 111 0 obj <> endobj 112 0 obj <> endobj 116 0 obj <> endobj 117 0 obj <> endobj 121 0 obj <> endobj 122 0 obj <> endobj 126 0 obj <> endobj 127 0 obj <> endobj 131 0 obj <> endobj 132 0 obj <> endobj 138 0 obj <> endobj 139 0 obj <> endobj 143 0 obj <> endobj 144 0 obj <> endobj 148 0 obj <> endobj 149 0 obj <> endobj 153 0 obj <> endobj 154 0 obj <> endobj 160 0 obj <> endobj 161 0 obj <> endobj 29 0 obj <> endobj 178 0 obj <> endobj 27 0 obj <> endobj 179 0 obj <> endobj 20 0 obj <> endobj 18 0 obj <> endobj 180 0 obj <> endobj 16 0 obj <> endobj 181 0 obj <> endobj 158 0 obj <> endobj 14 0 obj <> endobj 136 0 obj <> endobj 12 0 obj <> endobj 182 0 obj <> endobj 109 0 obj <> endobj 10 0 obj <> endobj 92 0 obj <> endobj 183 0 obj <> endobj 8 0 obj <> endobj 55 0 obj <> endobj 43 0 obj <> endobj 31 0 obj <> endobj 184 0 obj <> endobj 30 0 obj <> endobj 162 0 obj <>stream xY@SW۾1psJz kuWZqk "{0R GԶVkXmk{cI߇Q<{>>G 'giS )ЏCe}/- !d0j,gwCa0J(&- I=vwe7m&M:u{{]J~vwz{Hev{IA}7<<|Ȕ@·&ۅ{KzxH#ʨQW-! ~irEz%]/"R3+}6}  9(op=d~aÞ_=z{)wח^b=wFNJۗ#2GFZ5naƶ7gŽm䢸<+vK. ! M ;Zt;l~(wilHq(As 54#O7KMW G~UN֠=)Y|rF(F ^eUU6tЮuZ=сZ%ӿ6b:JB&AE1fj (AQ,ǞlQG%Wkh#9"W{m\+دwQKZVņwQ4? JT/xKu%jlIW *+iC-. BoiB~,2 @\V ZA3'XN[a?않gP;sc],p-7]rZ"DJ,/um:w,Cp ]7Z3' 'kKuB'-Ŕx88A+Yӭ_zǩSs:P͖jYJ|R HEO6Fv;;@~|poKּ:woҹm4#ڰh]-|lb;0Jً^ya̷9.[$[r?Є<0tonqy'":( /YWtC,9 &a[NzO"l#`pP,4;nU;rT"=5k,Mb &;_zS|zdvlMϖsXJw4հ؝yX<;Ua[xpCEFKW= t44/!uC!Bnu(9*^%DlG%ߟ@ ʫ\^*Mi1/0siLA+h6![ $8ÒBEv|x^ j"߰/V ]Ι1=YIىIh*- 2`/EM #I5UUSKVVeRf_(c'1ч&˴5.WqkX2 EzWrN?FjT\0\! /I/@8z"AΜfٯ鴸gGXvz8w6t_us.ZOW;s6q_gcFg!fYb1fAaUWe m(볫E}#4O@51A1|XjQ +ƯoO qȳ͉h"Ѝ"Tw[tD IXO頖X8VSX>k VUa $Ğ=s}Qp|»jN(v.JVZҸqæ>p׫tO !ېꇘ֐QY]YRw}m3 LynoL9k|[4p?pƁO=Ooݰͅf(K[Ά:^SXGTʈqmygK}#x1BG "I^+ZY/Vkڋo[d6r19ND1(1=%آ"|EG55AG-S8k?4Կ~2(nmVD9ujQ0Pu5[6~<_B/YKb.e<ŧn ـ+P(rGȿܷԿ.jb.W}D6+D@tePK5>yjO=vXz6%nǃt҄Ѵ^aQZXZWWQQՙPraVe뒿 G3knάɹצV)Ke=*t좦<6 W<w YPƈ+s/hF'lO2B սXjD'r;.\4 !F(ͤ,kt`^yih,v]*R+0C6ea(,DOx%0.h.f35nVmC}»Kn 0Mg-9^Co f́\\68'?44 `( M7׉(gwu5%S6MϺjP3_AviN-MhiOJ=JP=E(? ͉@?U4#b|MvgXOl?0Z2 yB$n( R2P~nՂff.lF^(w`IDY-!(c`|B^^ͨMQx(JEJFVį/LJ`寯x_'{IX `+ m_!ܴ-9GsQ{8k'賺pee_nb-Sǡ,+ڈ6n]Ǭ(G\wTDEL]Hixg96dT]ߡ Wˈ,M=%/biiXKx@>ҝ$~1+?@($S0ߏXt !'KҹLd6>1%>XJV*/]Vռ Q pӸEIB<6E`F|_RI upގmpx|Z&[H_M}B "ש 7 F],(Ƴxh$fWvByKZh }ˈelZzwJ}q;l0_EQx0ۂ{Q|d|=⼉N&g;_[/ݾwcG?7uvyjK05zdZڨt<\Eœ=9D;9vx B#񼔪wٔPĄGG33y犬 d..-MO!x D 6ikTlj|,wvOvR_zUzr^٣M̴?fmu!:mB\rtӹXHƽDw"&N2dˡlN n MI&IQJmeőꊜ=}E7Vk[Lqsl )Gp.PD捎<Xн -2|zu|)Kܲқή"-Â2mB4DўQћR$'W)%3x#3N" 5KT <>A C {!u)dWzQH%1%.B S%e)凲M*L|}I3^'[c]sn9x5Csgﮋ+TI኏h<_nlί!:t̥~KͪL/Dr <@͇;}H*T/)MIXzGb^N:案OO>iQ!*/]#/K?Q'v^ٶOΣO?"r49 ۦxAM g] xn4刴tA 0 endstream endobj 28 0 obj <> endobj 163 0 obj <>stream xXTT־`U^%XcBD`^ 0P6a KzS@QDBbѨ/%Y?3i~Y&Gtܼyq'Gb>X@!"LqI0E & 3b 1XJ #ˉHE&v8<%o"OϠVW5jx^Y5|vѿZ3f /dq pO=(e݆,i-@+m.pfPD .j1E654Kzغ>q9rwZn]yMiG|B%4 Wa?Bi(vnV`` G"S4 4&^ B3i[ۏ]x%ٳlm&P:4]>ݣKA}85! Uw}>!HJ al2aF"f-NSCQfׂ<@ A(\ BÇ(6B؍l>}PLTj__ blQ`7X7Oie/syYȤ? yYal jA ,Ǘ1\IڊANc)uHI ]r)Y҈A Š++zßn\꤇v],Fizq4v"}@gGlۡ̅`r~7fc8İX=jO ٣b=jG̓6D\GvH0 )ŀV5T$t-ظ.ŕmL fA=-7x~1 [XG1j ij+{` +8p6rnaϭjGT18X+3CtD%"^:lBR0){ C13R l)-mcN<9QzՆg(Y[ک~ +ehq%R萚׮e8\'[t0R!A&/]e~^9溴UJ BV)Uf3|""ߑ4;\VƆ$@ԣr^itqsh8@hηdZH :|I opWc%r&K5[u5di=6bY4 W!oOGVpaWYo$0XS]u^K_463J,rհ{MLVp%(ݷzbx $ %Oa4G讫ԼNh4s0"C Ցz"T?ĨIa^T P ڨD>熍7dyIr':b*'ǞMnٻ n{)91=itP}pj@{SdVTP 231G\WrRR?QhqKaWzd<*f_s !c{ֳhqpSe_zߙXi$ȍbW\DzIbvr8B !N40;7Բk>^Դf$3㊄h"2CLrLoGBد!uQaL{W^^VA=v wDOz?\4{IQ.-4'38s}?x~D kZ5S2yʒ\PEaʊaIĕe3p"t^b@MJt ZQgR }7g`T,?ۈs~~Pdd%9HC^!р z5sFƺAO b .[1#[tR\U7ih$]emml95W1ˮEW9_{H}vɭ.cr7踃@ (ls dWkgQ58,06 'bN'%2Y+X"!hIG>h (?`@R\+_:%]N nHdrDBԉG䉲y@Tx,4KVQWƢ=МPR'Jؒ!crsU烍c &&SUB ]v4Cz&uFOWovj.NҸBO<{X$' - 4Brbën\=5.EN][.ڶr. $gb6OԲD1(Y(;^,kϚ?bتRe"'L\jEyMyhwj/ZP+lGؤ0`e8=RwɁ=}6:e)Ksf8u޲%\} ûR_%@} O}Bfg >yFNEW72Չp{nEt>Vm[Я ga!V&g4S8.x'ZxcL0,0)U* '?'?P8 rloT~ew )c1o3 M+**&044&F2eh:` P'ĮFe ofJ2#ہe>F&3edI$J.U ȬRo+W4tJmX ayLS[WI7G?_y}bV-P(E P,NR4#} /@xNT5;^"}=+Yw˶l4M(b V@Q8<888NS}&oޡjU;8iʮv_#sd>UWweVlO`)=ɣ-YW,i:8s훝YtdѺW.|dzN׮۴H[ TCHoϿ}&R'sd2 #KC1r(Oەdi27M߃m%2}1U-YumYLvkf}V&  u$'p<\gx0p4|5ǧۃ}A–}iU!-u}|Z,MI(JZ]Q^GZ\pZ]W+ޞ??>gzTuTitX$q/Z de1lIݶֶ5trTѣyyݻD,r4x6gMNYtMgޙ_KSܻku]؆Ƥ^q80m80NFcxw 3*茕Fq)nqң;QBB^ vIiI .|O2;k`_R,Y< U:v>ޜb R+nb,WwکVos9ljܳv7 ϊi؂T?F E:wy-d,'g3ߕ=715?xG{pNJEc9\_xN2}# á \SS0tFbCkѯڹ?̷uF7^|{7vxjz0P|xuZSy' pf XJQ Io%fU[󉸜.wBd ZZ">F~RY2./5/=ǗExϡ*$4]կaq`=mY@%ɓ`ixfz9st>|=N+G*:J*JJVVDʀeyEiu{G޲+ _cupUtm.?0-_9ΆDҽ3$h+Xȭ̃ I#Pј1CLC5C  : endstream endobj 21 0 obj <> endobj 164 0 obj <>stream xcd`ab`dddu 1T~H3a!gk7s7 ~(Ș[_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*\"s JKR|SR ``ab5#phی)Uݕm{-~ .)KJ+Y`euedm{ؽuo1}<Ȩy% :{5gsyxtU endstream endobj 19 0 obj <> endobj 165 0 obj <>stream xz xS)9G GZГ2$(@ҹtB6&YI:CΤ-2CA\EQשzyMrzk'6L>tSX-_#,$T)0@zip{q`{b$66) BBc·E:4u֬^2eӼ N##@5!۽#c }s䨨IAB}7)j{j^N C#Vy;Y7 $(T<;3,`&2wI=f2,b2%4f):>3YƼ,gV03(faL3<81&3v f0cȘަMƙVl<#fg}lC[&v kroυ=wwT80eG5yAѲֽ^!CJG8~2eaK^~З^oA#ܓ;n O~a#F\jd٨^ʕїD]g qY\bi'Gt.Ӌ49qjUz!fg:-V[ F#Z._!d.C Ǡ5*-˰AmrJ 9&|m [ډ`m&{s / >' 5렖{W+?_9u|Inpp wؒPo\e[rNv Ws6˭Y1Twy|w59Y/&zYIHe@f􄨠L׮oV8 -jb 98}50d,i6\nhfήs#EQ~ `&I}w7%qɦ%П<%Ć &ϯs8Q&0oЃ@_wPj*J_XpSoYxo=Af#мj<4a:kFG)U*9E*<zr< Y_Z(/p:wkُ!WY>[_bBWzɾo:֮Gah?D h"{x 'A =ʑˇD%B*4l܅7:6FAbJP)d r*lӲ({Ht2l 8$:?;"KFYp~%G&m]}-1Mk6fŵ 8ȣl\hE)8)1m8vpWM#d{3yz*AFZ̞wDcIs\>ET/Hq6 8Wj2 rߜx+@},.)oetD9*tbuOkna)呛s,[m4فSi!cEvEh,GZF%ARo*)ll l&Ȯ hEhx;̵58F"~9:,*JmpU P,Gހg$*L잀Hq<Ԭ)% N& Syxzzޔe,6yΙ{hA]L.bā,BA_^™=OL*7zRXSڽwO@KɣAVGkۥk )QPg$d= V{Ґ:\v1^IE1Č36?_¡Q<4,\4.S|EXä+W.ײԏ,eB8h]fk;IN'E_p]6K( z;gա"?9Gs*nՉ`߶¡;HɟEFiRS=ShqTGؚRsP!d30[͟qCz>d<;A} 7|z{TX7|.Z"M=ղz"S+g a5NW9ZY)5T uUhQHM6"`>[-Z ) +$ׁFUޱ ʩ^ih"!3=WyTvUJq K@ڞ6VM[eI1X[޴U'k>R@^}Xپ練=|qo> ?/Л\{*qi8NXuGѓpV6mP%q1=~(|a5luّqɩi"p+\"G]RIA^eV {vdE6N{0߹{ZsޒCXiaݰ&RZ>aΏ)k%%yF%8."_wHoYRbakf]-4@[e"(SCӹO>㐫,KIxםSz6b \(GЧS+3=^J(]kX.';YҾڰ^2"6jXJy`tmNVh 08_[J=ʩR.4B7e;,åW}[ŝ.(Vh2K}S%O'˥n*-*(ݖh֞?+gl.zEw}X:$k5IցHДɤ]X BwbFi~8!=1_X}HKt93\mtid"1ȵOW vJ`MZk,>jÃ8y絾͂Z\XyT}ls&' d~K:'2J#OZL\?mN6TuSLj8y$l(vGhGz(8T'[t,'+1ձ "VVh}WսIHi1$Ԉ/lkCZ+|^TULfTъ}JIc%h 1!oIЙzohPhuK䗰8yD'lp˶ukGx"~,Z}i䰲/qg)X4ؠ-mF۫>MWlÁJ(ͮt1^gK05>P7z;AZFmJB4U'(cuL8C^N\1T#lzBݬجp we1TMtVLn]_q]='ü$eR*Xv7y,xj"?UQjQS!6֠pZh6tBs{"6w"U:<5s wDjI!HPUfl ٫K[Zë-Z-7ʌt%$qEI9UeI^Qn*wݠn…okvcu2Xmr ܂֢؍c`m a&%~cno }aw7woBYҦJg]gD{܄f{:2m>v7ħ<P&C}}3+ #$cG7 ;"M/{_d#VJTݾa)x{Re_gCARҴrջ~1R%qe"3] T=nNoiZmR:ckH$3 y|PyAƱ˱a]δzʰ|PܻudE :Z9 |Qxﱏ\v/r UүkV<t>Lz8)O0$X u\m1$$&*léӟ~x>I}"#"#=YUZmZj0H:'uPMTqzI  PB$G1Fҽ }OWyvo>I?] H[|}mo ݗO'm:U"<b6SMҝgֺ5ZmzsNC%s yd0?Btt09E8Kr7t~2*̄CnaQVzL-|UMit//Vgi5NGlZ 5ǥ2ՠK899@jqސ) P57G8oQ^>a[izW@TVS][uW.CEEyԾ (L,OCd;وbBB[ٔ#:8=$d-X\DWҲ2 n}\s5s∪[ط^~3Dօxf j9Vݮn=5:T3207bD݇(p؟|/Cn4> ,7 > 伕GmN|@"Ote\O>/fh~yԲ?Coݙ ʸs_zaÂ^[SuWWv8RȥKH đ[WŮ 6#JqA)^Ox|EGo;Jh"ǯMptw82qWzWȠ8 cZ(pfIM\ 2Vn~|/o>?ukӥ5_?"#'xmaE@#cNQbC`9q}z"#-Qޒ)mpȹJ{93N=Rh yjs׊vrD=6:'J:|Iѐ N QQP"%O]wRlєg}E7;e &fyEJHVFƜO(/tILWΜK9Wk.ſs@ 1pFIO_[F}87qpQE2 䩋lI"Fs ,y|3 9--l?ѭny@GWk댕-ΝNf۫,!A0?SNiy/Y +8WJ"+(L?޸0֎n(qZu *#CME4 @w b]1UfFv7)D ܶJ>g 󖿔֐ŗ_Q"Xihu7{7j$bO쿝 ѻɯH#N'4D.rJ.kq@3ri'Ћj ]礈t[J^ĩH|g8!iSƒ<@FeUQ-p|pj5-hڭ}x`4ڈ{$D Ž-BIZ QQ &&6W6X19pZ,_}o9rR;0Q8Î[Z~h+Ξw$G*8Ċҝm7Hl"ioYd+iC?n:B^~.-z[N~ 7JEWa?GYĘaTZ>e4?[_Vv3"%CPAnY3RFf<ർ:HR2! brTT,`:gH*ʡzuNC$N> \AJ2!#9Y-D 2/83?`+Sɦޒ*_wmwJyL X>ނw2ͫQrn%Wy/XY,<\=Q?ͫ&S16 ̅et^X|?~ WɠUh5 zM:_A),:jL >S#_~4wɮOΞǎ(#&(ʚ j@>:zޜ֦kZ⯴lMF8~Yi=η %ǧ.Wݽ~?~H`J _/\rکWGuon0M G] ^0XޓIUan-Tm& RiZHd]Je _.G^Z흲fZB nS.A'\vcdewqYt>tfg[5 ;,#lgcq }v\ rk;QV-EEwe0>ޕk-ײfCpoךnBp뚬P&naA?G[їec5QYX KSq $qe{F+=h!; ?/Tؒ(7mg|nDe9 ,顙w>nN4)¸tNaapAIJ< YsK~}g> endobj 166 0 obj <>stream xXXT׶>0sXB3{荒V(4iRŀC E"ch5=O&!h:}~,{F b$ mǼ JqR DN v6'Ǎ=ppF*Fi t=iYN;;8- V8#}Ց M1N^ܹssB^>): ioo54$5uS[?*7-7>wƀM充KfϙC9uƅqg60)&f3lef0fYfv0+9JƕYcV3kZff=Ƽ,b0cƉ faHf3%X*{\xmp>MC2zrƁ>TK(bT#Ʒjn_18Y~8f.hFjBg#GZeܾGV"A)Jp7JQ}'|CW[e"s sBU"x\,%Hf w*Կ HIP@2}d_Z~0 tN]ĜiPU/ &+&;j)[$Q_~d˩M3IaIZ ٹԐY8+?B`‡'y|pN]ξGCfŒs{ХMڳx\C]LG<%6W_MRTc :q6Xk`GzT=2O[q>VJB eo;rŧTN7hv +ZS-S}{_* }0UDm.d`2ȘpxTC6͒--^qPEj!#8 "e8%#C8^x.]:`ڒ.|8] (5 7*2s83dV)5uTH~&E?a2dnR t/&Z^ܜ+LCem?8 |Ģ3H xj!v8طFuG9pvdd( YZ%6G :V` nil"K߷%[/$PjVt8~}2}@/aO6l8Qkvƈ ϝI ;TI!Ѥ5u5pNka+"m DUR)V-Eƛr( Чogx.ՠq|z448ʢ[䴄C!i ݁+! d̨/fa<~*huf5SE\Rg0$)K)ӗ3p,;LU`:]AbkͅgoִȒqũ8l^yzVx"nRx'SiЬ'(!,=Fm.RɊ 2d@%'\`ÉRp,S|!X^k|zl&tu[IdHpx{HnD lT:Wz'NdrI6]%4%5x*2d8walV6\lV8cC5/ 7+$T05*m 7d28=vƙ8twiAH3Sakh{QYgcl8in*o<^iK2sm_gb~'_r,JliJS֕Tgui8sGc*/MFUAʠ<eܪ済THȹ_[oP^^9ifʔ91 3gwu.p]H￁2W@g-O+Egtto&X4Vܣn7E엂<+ȏ7p*,.[J~(_T7(ӶiBahKy:کN % &"\ٰk/B8ID#z|_߆֓VYAƻ 3EbO-w'-U>"rN2֬Ԁ|z;+ZAΐP7o?9%du΢CʎmGSD>*Wj BSi^&6( etﷃyšKnŋI @ ~&9UMdm\I}{ToSz>fp&KrAE)jǑ?~ Jm>jKlȁZN%Sd# gʱ.))Tl]E֯q 23 ] oQfا3ܡ Lٹ*0NwgU: 48= *$ȜP?Jc)!p^kCyijCAAiI]q;7{,uFp $(+y9Sw{_^ɰ PvT6 s q dgJJw0$h{IryQR\ۙ=_~%&]uoz\(j#XJOsdYRIgN3!oJ[:?s7!aKSKfmŔl݅E#PNkL?` 8|ډ皾5rjZ&.yVCNMQavS Z>1|"ymϵ}&Z*ޛWo6!+Yګ@]cmREh=񦑒י7'*́Ƥ|YN-ށލ--->uYч6#a3N&=b+kozEPR|q{k#YV5_}i Ydbʯħ1Ɵ=P:W<` ˊD@6N⁏g_%dѦϴ%:2)>a:=*#Rrq4rDbی?Y?ūn\DGtRv4ZI)p\ys?-G÷:}DEZ6cݬփU M3mA,E˙,3W/޺K$$:)R`cITqt[3n)thaa4k2y* PϵyCBsma [W;9wc$6./n?wxc;m 588}AC!]-s&O'sNJ7_y|uT^c }]qH%<p3iBy*~q}=PzƠ;6@,M-G(OoI>[R3?wN(Ӣcc+JckP ➊9ٕZmQ2Dakn\;;T ͰgCb~ endstream endobj 159 0 obj <> endobj 167 0 obj <>stream xW{TSw>!xT+=:vv:uV+JQoBț섐H H@jE+2NEΝֶNooךܟs=gθ毻Gs9gqáޕ#\??8$p!!>KK p2VP!**('y"驍}27&X'**Oڝ%.+J rĊMdߟx2IV$.LڗW'&d%M/VAP"% BQxdT[PXVRZGR5b/J'҈Ab qH'[6b;xxI"^&6='! #gs;w__/@>N6[7z 0ߵp0hEk/8ڹ8کwGyN).UPFJϻn_0ϥ) Y^aP+zc3w *VHқ8h)E7X"?VTB!THե6Y_o+</P.KVm6kXABܨ9^02DEaLc5o^D_!ί':ǜ8~s>XA}y/ kʡX7֒mAPdoCyƻ2r"#i, TAI 9i{}BeLlǸLwݏxWZ33g1t]~6꯸h3 4 "]7IDTeGug{5~}[xbkN3Z+0ݝvie,T(CQ9W"hg݂LPG}3+ g*R:(n֜_Onpow@/49z>04C+CzmqP .( 0z VhHP*uBM=Rf܉x駏nš+u --8u ("HA,GO̒J!{.3L. Q&D%;*^ `cZH{]EN")WzY6~2ōꢋ6T-st]=}?"m9rg\75I|iޫ]!V^6高ǪQ깋t[< #l&NTb=m)_2y\sX^bBfǧf0Y|,ns*}e ņnHc)EZ h{AJN(Ut7ҁjUi:9Zq2g>!z`y8_OFEWAVLj7{O8vki ٽO}U[j.1,vP2cm]R+˵ruV~(9s3C]t~S. YV#ݤ) Sj|^ t:z~ 4 TZl*l)z(oF ]%SWkLtbK&k0B{omnfՁK0NwGuw9Vii\_;;ߢb vDבk|K&&zNNO% ĕԛ)}/_(WUt/ TO^L>vL<6 [q=)|K9N(?zv7 4.gf=ہ5FBp5@Τ1TG Zwdr4iU;~Am׷ [&d^E?E}9GPW.?|N Ww|șG0/O\> VO (V7iXX"ۈ͟n{*A1?xfl?Al>ұ"pT xi5SWǶ%lᕩ`=vt iqKc?՛@ *Po@-pƾD]Ďf=18ms{FWz#Eፏ׼tDCYk<#Ek٭ FU6WK+3G~pfsy9F͌W#bǯHA=r%ܾ!&}D`"$ZU'8ҶdVwg7W(U #]2d$LkH2&yaU] UVKW ŒW>Q|囋n'#L:vqnsܳ? b #;09&N//@Fϣ=j.}ArpgпfVkni>pz?cplo-x  ^*VIlqΝ|CI2h[MwSڛSRƮJzpOs%uugK]<~}x~qE_z}@4FtT7 fw7A/[l]vfu-q;I1˅Tinz͋vKZ6#s6ge~lf~F$s G>e=L Pm0{7vF|;;4[ AIju5vR@l2hT^CmWǤG3v55nK{2dҝՠ}‹mBdP^*~}80[2ۣI$qf0k]4!}2*`SHś*F#_LMf񏙪z1[+`i 4j\UV`t@31y ƩPVF~EQ9mϦAɪTny$`jc0mhZE8:ɷ:ޙsz:gkcH4DjPb[q:2W[2Db11ъ(Z|mFSгIvM,5FNd%58}do ە^YN1үDުxdAp14K#ՅZ^R#O5%ִw9]6J}wo/_4%hZA%!nuwaz3R Sᓃ̥3?-ѭvrȂx a~ę@1 endstream endobj 15 0 obj <> endobj 168 0 obj <>stream xU{PSW!U{7k]E94>uK0$!$\ hx@@$AuK5JcUwڙ~s2;{%Jp3䞜{~};BGH$E*2r3a0UZBr9")#MC!m,D#ޜ7XIrV[ʹ/X2UmLJ)Uq&:5$.R IjE9kd2,3㸠 1q[\IP5zI>.Uf ѧ&QPuAR11ũ6h"SRW"ib#1DAl&"-*"&ˆu|BE'~I& dDq_2SR'Η^͒Won(E(4oěB vS.=!JAExHքt:'cuN֖RVaيeWMHBXFW탼O2T~-ވ_ntKK?]MGu L;MDlqo3ɺV1@CMxOE x+/$ )4 >{chQ|7V"@./4?|T tXo)/bVKq~|WL}0 '̓gمY% @ϩc+5vDuᰑy/5B,6ÈkI΅`'oٶg/ۉ_UslzO]jn`h;e!Xym74W=Vn$`̃wA b,-X):'&x g0 }C0i 5(5d(d-08C҂L!暢@E6h-j𭄟57/@̙L8+yQ^7R` ܭBLEjD574kZ9= 6&_>wiz^*,f vCzIp NlEILVx;dILǵ|%ld>bALvD j )Ѿشr;XluK+$L2CPsR΀CsI-v&сk1AM#/2ah7 &j yy)YԚaq۴(Z¹|]*%G ?݂%JP܌&D}C_StJ}2'P#㔗)/q!S=7#nqo5CWu*cPeYYS#dC4v6l*RqQY(Z :Tv}صgKN ROʫvѢfgjbDm}1N 9ZP_/CoyIXijaDi)R*l8=Zonܿ`e}Du֗B@4jȳ< 38 ep>d0krBcFfG^og[t]E6 ȭbۊC -m DqCn>8Ut g79hs--v{ W)>{1kSh͂`Clu$7L{4L|ݔۭzoalD6HK*Naޒ](ʩjp~sSvr:%jϏŀ\ ]tK6S[ӎv:m̘\Rm$T+QHE?w& endstream endobj 137 0 obj <> endobj 169 0 obj <>stream xWyTSg1v*TSZ[ť ŪZn]H@,7 ;!@-nvzjgELi=j;]lO9K&Nw߽@dƘMfr& )82{":9CB =WD+ON+^6;::jz؜YIqҰq q$NI (ONT䆽4OP͝93;;;2N)'-6=,;Y!ې(JL{[&U$=aLH%$ʥALYq{rK'oJIύ$:b=DKL#6[bb XFM,'f+*u"XM!89 ..hԶQۅ X/Q[RFFFP9с3{3(*HV0zjSk8X.t%"\EC  mp# 0Y}PM8|ˮ,^jb ڡ!⋢<Ԋ^:jn;p)P'kre"屨]3"LF p0YL}4EA(JK֗Cp g` _NS(QYbsV$<<|Q8J IQm`ܯ8?9sǷ,9o^Z/(Ev"ms{V簷N&~C|(g;),dQ>>oB\%VpoЉP5NwɲŰ[8"v[UdH6Qyfecp3aw85_< Z JK뮅Q&tCtwkeIU&hfh['1 T[F4"X'C %%bHMqmX¿34@=Msp8#ԹDz v֨Я7(1b(|[m`0uu y$Cv[՛ =`(o>\?7HQ/,@f4{#Q5@R@keZ\[ eꝳ}gvc[**3 dm~RvzўR1P[v aYBaAjz`{I}F'UTn጑y|}rsD.%h-/\A \*Y=Fu{?K'F&U Q%{bՕ%ҼdUy$Yʯ\ЖKpuvA+M޵1x,)jg.vzז{z؆>@ PÛJ^[I')i Ya7U4Wu.z|"ț+^bSRuTo=y_VWH1. 6g@⑎FI4. 斿Q,V^3>WHBk{'>fv?CڇbcHsA$.H2ሽhbm'W%laj0Tfm]ql=6^33ɖj԰9}SCUzr1dRˆAE~BwHO]s}ph_kװR=ڞ#֞l W{ż>\<+MޅZVe2dOݳ? K,U!۳ H~?E4#ԻsL[oap|СEHmfYh(R46T0~&|BI!IM& oGZDZxDih''K%#]]g =%@{D!}eU=^e#qnhט fL@,8 h endstream endobj 13 0 obj <> endobj 170 0 obj <>stream xcd`ab`dddw 441UH3a!G&nn? }O=B19(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMU8NB9)槤10003000ā0aH[#s>s+ڽy&wOݠn%;;;9+#/qbԮӧE5twvsbNޝ)læniM*Z]cJwozi;d.[75Ewv:3!#{7GJLg793\qwoNBߌ-wq4LŞ=r߁Խzu+6." {:AtWMhjnNT}M;ju˛-Kc9_[zfr\,bi> endobj 171 0 obj <>stream xcd`ab`dddsuT~H3a!g k7s7˦wG ~"ȘW_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*&s JKR|SRYjt]~?&4mXZ]]]P{柷-5]]%lVt>}c/~)fJ}3ۉzluo}X&?D^v揀iN;n2~|r\,y8NηČ& endstream endobj 11 0 obj <> endobj 172 0 obj <>stream xWyTTWeA"1~k`&%REŦ `m_Z+R +1QcFcNz4$>L&9sfUݪ}o"c%$A~,,&~+,}/1xy88tyzw,%ɹ ʌXS|-Z0wY|eIqRoT+KUM濾8*%*r̙iii3 I1oM %˒ReQ* RwC reJ%KRP\Ǥd՚cb6[x, zLmj .5ZASoPJjPk9:j.HmR/Q/Scqxj1"U#gox,0xz{=,#G4=z21/o˼?Qy'E6V[/ʂ,4{lK `2AhP?}̕d~lЃn|3$q iMi>2 V"3%B;6.be!4(ڶT-Kc IOqI~(XG~C~ =*[ <@ŋU7p8I`hd,Cm5^vfIx~iHF=F8V84|G.4u6=V mp$մ b!0q[2`g/&x:P)"IƳW?'Jy+Uy<ށjR$rqNrT|C$д8$(sCa\/PGtNϥ)aX~b&bzB.Og(3ft5*"+f H,/ Lg\p([xQm[D;QFd-`V祧svĬ ΁X@¡gs*u,)D$mvk7)FQ_09D:4ef^˙T]Ӻj힝rK&e yъ*ifě8c^1Sf )s,Kn&2%dMrI( Ebx#f,v7X|C})Br\L_H;{:gsK@rX&FqRӿ@óILwɂ6]{ 0, [~)%2۟q /`r5=?lE7Or/fx* Ӹ.# Ar52O7:=0#079`kHcr5}֖q)EFJnON w?]C;.:‹ fQ@:5YW[[IK;0?4ޮ[b{҅?urۚbc?_).e%jn)vʊ;ZN"VEn ŵ K/aL:?RaK]Xp}T0h8x[47`SyM]1)`k>->2~ @ln^;B-•!)P~/;!TktK9DO06GJa 9nX+'V`ܴB@EyЇ*ǹzV;lb_Qtfqn:Q #GMe<20'|yJY0ࡹ.2cwZ!;}ԥz2jrq{Q=1 aaGr:}'3^ٯ OӈJKAke!`6,F[fF9y'S:[ EQM!3~ᄋi?GRbgEHc)yF7SB77| MhxFl;3CQNsRf1Qz66q<aUZEeUjv|@G|UcOWթ0b8~wT'C0f )̃uYMsIfT;9:;<#byb=lCuý1tq%A*%x,:0|`/5SxFrlnC񾣺M9剮j {j 8^Xjl0w ݶ{:$ӎTgBbJR^^dwp'}TxIR|9CO 4O%9(a24||r_BQęA[Q=AtZ؛ܰڊpŋgnkmH99ZFs٬}'TM!YʅaGCw  %yDRd4Us%%->#qK4₪Sy +*c@lF`?~O yihxy~?Bnu+7+$7[T$\y.[sm;m$C8$ / @ <_C &4vCdrgJWQ82: MϜzrF_J,ggz 2:sfJ\`F@9Ӭ+BsE zM\'긋wt9nL~9+[0ȴ&&ٝxZ=Ơ Hqcv^3Ahsi Ds_:zQ ?pOs'w=G(+ ԁ)Zeeҫ]$ԝroiz o`%r>^wFW4%ץ* "Ea ,ِG dQG?:%+D$9[ X].^!q |e*o&Yp =yHB8't{sHbpQ}kf">f6{}tkB :qZ9s~Dpg S5J(+Kv<5Vuk Eݔ)y endstream endobj 93 0 obj <> endobj 173 0 obj <>stream x{Tw'PũVZUuZQЀ! %"$7A++!hT*P@DTZvkwujVQk[w؟ghu9sdr&P^D" [?$HPȤ <+[8Fcb?AI%M!DWcg͟?w|̙5J]|"Q)5 kc qz}RK/PhRfhuESqnr|6Q/_({1| jRJGIW^j^;÷ؗ:0s}ԱQL~~~(|َ1=;q V?ԹHiZN 2N&Ё>fKYfeZx&M&|G[xRo4@/7I9L{`/?K^paV//gM\Ha3kZiZ*aznwhoZe`7Y)^b8&.5f6H<+śB0;L9ɔWPnPƋڵ$":1[{z<`lܿבJf$Ȟ\θ\ L6X:*K-ڃܾҊ.Cq|g3?*[\\ C U6Og,P j}Nyui/ ALZ<7.h]%4Lw~FzZZ_䰅kkpd`mA ٛW+84yq%0TBAל֖NAOcn狓+|F#׏8t\z  ^t jEǹO 6Tpa-'-֚]Xlr5ul/1Φ+&j !qo@ 3fyN\sh=SbN}U}vK rƶBâ/P p5ܖ *yBԍX^k2,jⳢwY4;^dsi#d=ֲn[_+*J`}EܧNwJKRYG{O07.~I֓S? Ph[,ڶ6ePqI ;2-dˆmo2i m*gFDVL,lc^~=ŀ.k MltX0[IMys 58vYkY|YsEQӧ,>cцIqP(p=!0 ?ϙv!5*5, %|Dy-*yU,-)vZKLlԹ[n$DW?*.枇͇9k\`9'ܹQz!JWn{Le$vS{1GH&3wId& % ))FҤh#{78t{J}xy8zC".ae?`2 [sHckAYT\Fclt׺7t.x69P c|.͉IãhaK*)V c'0~2=FRIq$Vܺ15eyYE""c/6!0DWn8?uQRl&{ ] endstream endobj 9 0 obj <> endobj 174 0 obj <>stream xW{TS>1stbuPj"UA^By@ w$"(jiSwpZx{;;kJ緿GxMa$,<2*$t۫) )ر(o𕂯WK~'_`3,#HҳJ̔dbr"dɒ _XJLQƥ+"ɉ8-آV$juKڌܠ8UV:3iٜ)dETbVbfNb"BUlS%*&4y W2HuBbf:03ҷ3V]keB{RTa f#d6302[YL40+L8Ȭbf"LY,b" ̋/Bx1%k%SfLJ'^oy}A&RL2U9i ||\e|}]k%*Ø0,_򡒻d XF{k+u;&*2.9 sr UF__ڝ<~ck5ǂD|F1ЩQs! BhiRB*jAGz~l\ެ1vw1D"`&L~ H@X'>Kqdw1p"/GeYiQ[_pn p;`\'& #l2R NdKS@ښ|az^iт.hZЉ7%?=\8gdlvvToz -ć`:2OCw%]GadA_i(-46 J7CT)}tys {MU-_'C"C=y˞n pmÍ tQ }a<c: #DoO?s> O^ȕ?{#v14C!~AtyiwjFUIyq)Jqwq>qK\#t:a*jՕSºR{fo)hMU&iԼ`-QIALW[b_;J΅?ANy4[|̆ex0Wi9p꠽@: J/arsuE~/1|m7( (:"f mO?b8.o׵htlg^G{'SfK֟PwR`XsTe,qn ^.2T>~Gh2;51NJ(-7>&U/Y935MT+iڡYe5i,BSMzeb'ozOVpv [Ls_ջݪMM-7(ӛ-y[F%_J1L w:rrs33[Z]> endobj 175 0 obj <>stream x%kPSWFo\JQo7E >xU U jABHHs6)$XS*PPju*Vё;2FmuNϞϯo6#8CHxÝaر Ido p'- ~.(E|L4=?D&R$KT%@/_JŊDa \JK*ے*%&UYuI*|RL!YK?Y$+ŊLHIlJł)4"3Tb \&+? pb1p%.Lb1t= h<ΐe׾-S,eBΏi9h鞓h=K h~PstT]A$':g 삨긆 u󼃐X]^q9a갌/MGK৊wg&tZy\iQ-#1>Vh! y-1itl\y,6>']]6vU 4CE( Cݱq2V#/4zc2Y:d!ZBn:?d?poט7 v&MrrR 환2d/(k ,*+=BJGnR}Po3ω S-Ŏ"^T!Ğ=uhGACwhdii?7zc%=cV05E-5E H#rQEuaz@cAp3ZSmN;$r_ӵEnkI!Z> OXsdyI I)D1_ ezSUuYMRk>@ވHԘ|gcS>xnAxJtğM5Rxi:30jn7X̍6coHݾv%D'I ݠGkCin0!Zʱ.op '&nյA'\hP4Cx _Zk_}7δQ R&4$@xz mo1"n_ŨTaN<73O@5/H mr596.phl)FST{SM=Ls@bWo ,-(()TWv3}]W͈3C$8=>Bcn֊JY҃BOdf!gF"oF~xQw b'"*0ޜշ6hW0]ae?+g5PP_Zh`D.V6Za1B;[yP2"43ϟIq;kK|ᘙz?lͰ`H=qg66fur4U9958}DH endstream endobj 44 0 obj <> endobj 176 0 obj <>stream xSkLWnj&̌ jڴV[.%ڸ;۝i j@k%Ե,TmMLD])iJն4Ѥ?i?:,(g=s}K((1[^==KiK ZߧuC&BK=  \^.RĂ$quZK+5VN-V*:(HvRL\[(WRS^o)HVbHlrM̖\cuHo)YrGH6DžZ^WD-֣l,(QRyJ>0D//jւXU0imo:-sGLJ Lڍ..#C0])7!3p_a <0RЩIPA%Mb'$򤐤rf_\ ,§jT\oZv㠣^~]%KMH6s?HW[v@H#LB]5fS_ awf MަS=´7C*a0ߣ6q@ݾh kϺOT{-u25;xB1N}>&P,V,cxOPa3$xQji񑆆ƣ VW'YyuӃBmBgi~v}K־c~XUUln/A JCT?y'3;{uCĕd1@[pEcnyڌ7rԉTmy0sAmZK\#ςi#׃_x?BW5WJpcF8K*?}u@ԅi]Bre3 B@'q=J"Cd>3aVHLĀ&TWb ilc*|vn7~4SP4>>D<ovsfNOe;L-Z÷q Q5=RKQ_*%L=I K䙷9:K0.|٢lI)_%Ѿ|2ZRqب./DUJ6=пQ endstream endobj 32 0 obj <> endobj 177 0 obj <>stream xV{TS1.X+f.7BVNk2t!Ҋ e@IB! !ɗGBHHyIxEჇm;uV׭;휽~qם ֞3۳?q|?0ߵ}ٟ'ϔPMZL~"FɏaLCT$<)7*+~Ӧϯ[/dx4_ȓqe 2nyR+--]+,^+[*q%2~6wH(ň %R/KE EbID cXKvaInlŶb۰`qX<+Ėc! #qz &?b I =WA}DpJ 1P4fr6^~j[m×>T&OWdJ dxzgC(dՀV 5F,N\ft:vK8B`x/e; r%tg@.J,N0j+쵵> BB/QSjeHD-//1f`y1M=EZn'1FO Ly9)z0c;3JV$]{RJso&Z賍xU%ȵ&]#]p0lw*jnloh!ЪrI ZPR2rBr2YWB+"lˡN>l}' $+%{OTߴYȈ&]1G`":ʮF_ :SW6]q% B5{n{X򝽎Ό\=MhY?dzX IxxʒD qǠw+2DJMV^K(ͬ~:0q&D-EMpV MB^gPG55 $dӉc({'Z;i{i~̵&mgiV1oPú20T)9r0𴪡3krdͣis4@Im6}QZ\Mm= SW`w\͓4sPƒjmOA vAǘAu0[J%RQkmEETZ6rg;6K KdUX P}ma]D& ޯu_;9SԊUT 8ÍD/ b&'#^CrYVp5PNrdMxPWQ xK{z3dFKZp;KRL'yƽxuf(*gWfUH$yiE9}.F|s_0GixfY lcerL$df~P>>stream 2011-05-19T00:25:42+02:00 2011-05-19T00:25:42+02:00 dvips(k) 5.99 Copyright 2010 Radical Eye Software doc.dvi endstream endobj 2 0 obj <>endobj xref 0 186 0000000000 65535 f 0000110145 00000 n 0000176619 00000 n 0000109906 00000 n 0000105813 00000 n 0000000015 00000 n 0000004769 00000 n 0000110211 00000 n 0000118150 00000 n 0000165759 00000 n 0000117281 00000 n 0000159039 00000 n 0000116683 00000 n 0000157453 00000 n 0000115949 00000 n 0000151974 00000 n 0000115006 00000 n 0000143139 00000 n 0000114324 00000 n 0000134571 00000 n 0000114135 00000 n 0000133689 00000 n 0000110252 00000 n 0000110282 00000 n 0000105973 00000 n 0000004789 00000 n 0000008579 00000 n 0000113567 00000 n 0000127018 00000 n 0000112988 00000 n 0000119438 00000 n 0000118957 00000 n 0000172443 00000 n 0000110378 00000 n 0000110408 00000 n 0000106135 00000 n 0000008600 00000 n 0000013193 00000 n 0000110484 00000 n 0000110514 00000 n 0000106297 00000 n 0000013214 00000 n 0000018123 00000 n 0000118688 00000 n 0000170934 00000 n 0000110590 00000 n 0000110620 00000 n 0000106459 00000 n 0000018144 00000 n 0000023084 00000 n 0000110718 00000 n 0000110748 00000 n 0000106621 00000 n 0000023105 00000 n 0000027759 00000 n 0000118499 00000 n 0000169151 00000 n 0000110846 00000 n 0000110876 00000 n 0000106783 00000 n 0000027780 00000 n 0000032508 00000 n 0000110996 00000 n 0000111026 00000 n 0000106945 00000 n 0000032529 00000 n 0000035728 00000 n 0000111091 00000 n 0000111121 00000 n 0000107107 00000 n 0000035749 00000 n 0000039943 00000 n 0000111208 00000 n 0000111238 00000 n 0000107269 00000 n 0000039964 00000 n 0000041933 00000 n 0000111303 00000 n 0000111333 00000 n 0000107431 00000 n 0000041954 00000 n 0000046811 00000 n 0000111398 00000 n 0000111428 00000 n 0000107593 00000 n 0000046832 00000 n 0000051887 00000 n 0000111493 00000 n 0000111523 00000 n 0000107755 00000 n 0000051908 00000 n 0000056791 00000 n 0000117653 00000 n 0000162836 00000 n 0000111599 00000 n 0000111629 00000 n 0000107917 00000 n 0000056812 00000 n 0000061641 00000 n 0000111716 00000 n 0000111746 00000 n 0000108080 00000 n 0000061662 00000 n 0000067532 00000 n 0000111823 00000 n 0000111854 00000 n 0000108246 00000 n 0000067554 00000 n 0000072540 00000 n 0000117125 00000 n 0000158370 00000 n 0000111920 00000 n 0000111951 00000 n 0000108412 00000 n 0000072562 00000 n 0000075870 00000 n 0000112041 00000 n 0000112072 00000 n 0000108578 00000 n 0000075892 00000 n 0000079010 00000 n 0000112149 00000 n 0000112180 00000 n 0000108744 00000 n 0000079032 00000 n 0000080815 00000 n 0000112246 00000 n 0000112277 00000 n 0000108910 00000 n 0000080837 00000 n 0000082692 00000 n 0000112343 00000 n 0000112374 00000 n 0000109076 00000 n 0000082714 00000 n 0000087397 00000 n 0000116297 00000 n 0000154388 00000 n 0000112440 00000 n 0000112471 00000 n 0000109242 00000 n 0000087419 00000 n 0000092248 00000 n 0000112550 00000 n 0000112581 00000 n 0000109408 00000 n 0000092270 00000 n 0000097601 00000 n 0000112647 00000 n 0000112678 00000 n 0000109574 00000 n 0000097623 00000 n 0000102504 00000 n 0000112757 00000 n 0000112788 00000 n 0000109740 00000 n 0000102526 00000 n 0000105791 00000 n 0000115558 00000 n 0000148294 00000 n 0000112867 00000 n 0000112898 00000 n 0000120032 00000 n 0000127587 00000 n 0000133906 00000 n 0000135077 00000 n 0000143486 00000 n 0000148636 00000 n 0000152281 00000 n 0000154721 00000 n 0000157723 00000 n 0000158581 00000 n 0000159345 00000 n 0000163127 00000 n 0000166046 00000 n 0000169411 00000 n 0000171210 00000 n 0000172708 00000 n 0000113474 00000 n 0000114042 00000 n 0000114848 00000 n 0000115470 00000 n 0000117011 00000 n 0000118065 00000 n 0000119353 00000 n 0000175192 00000 n trailer << /Size 186 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 176820 %%EOF ptex2tex-0.4/doc/.ptex2tex.cfg0000644000000000000000000004606611565043724014750 0ustar rootroot # plain Verbatim environment: [Verb] breplace = \begin{Verbatim} ereplace = \end{Verbatim} # white background, rules above and below, with a title box "Code" [CodeRule] breplace = \vspace{4pt} \begin{Verbatim}[numbers=none,frame=lines,label=\fbox{{\tiny %(boxtext)s}},fontsize=\%(fontsize)s, labelposition=topline,framesep=2.5mm,framerule=1pt] ereplace = \end{Verbatim} boxtext = Code fontsize = fontsize{9pt}{9pt} # white background, rules above and below, with a title box "Terminal" [CodeTerminal] breplace = \vspace{4pt} \begin{Verbatim}[numbers=none,frame=lines,label=\fbox{{\tiny %(boxtext)s}},fontsize=\%(fontsize)s, labelposition=topline,framesep=2.5mm,framerule=0.7pt] ereplace = \end{Verbatim} fontsize = fontsize{9pt}{9pt} boxtext = Terminal # more plain Verbatim environment [Code] breplace = \begin{Verbatim}[fontsize=\%(fontsize)s,tabsize=8,baselinestretch=%(bstretch)s] ereplace = \end{Verbatim} \noindent bstretch = 0.85 fontsize = fontsize{9pt}{9pt} # as Code, but with line numbers [CodeLineNo] breplace = \begin{Verbatim}[numbers=left,fontsize=\%(fontsize)s,tabsize=8,baselinestretch=%(bstretch)s] ereplace = \end{Verbatim} \noindent bstretch = 0.85 fontsize = fontsize{9pt}{9pt} # as Code, but indented: [CodeIndented] breplace = \begin{Verbatim}[fontsize=\%(fontsize)s,tabsize=8,baselinestretch=%(bstretch)s, fontfamily=tt,xleftmargin=7mm] ereplace = \end{Verbatim} \noindent bstretch = 0.85 fontsize = fontsize{9pt}{9pt} # as CodeIndented, but larger font (10pt9: [CodeIndented10] breplace = \begin{Verbatim}[fontsize=\%(fontsize)s,tabsize=8,baselinestretch=%(bstretch)s, fontfamily=tt,xleftmargin=7mm] ereplace = \end{Verbatim} \noindent bstretch = 0.85 fontsize = fontsize{10pt}{10pt} # Python code, highligheted through the package codehighlight.sty: [PyHighlight] breplace = \begin{python} ereplace = \end{python} [CppHighlight] breplace = \begin{c++} ereplace = \end{c++} [PyMatlab] breplace = \begin{matlab} ereplace = \end{matlab} [PyBash] breplace = \begin{bash} ereplace = \end{bash} [PySWIG] breplace = \begin{swigcode} ereplace = \end{swigcode} # Several minted styles (requires minted LaTeX package and Pygments) [Minted_Python] breplace = \begin{minted}[fontsize=\%(fontsize)s,linenos=false,mathescape,baselinestretch=%(bstretch)s,fontfamily=tt,xleftmargin=7mm]{python} ereplace = \end{minted} \noindent bstretch = 1.0 fontsize = fontsize{9pt}{9pt} [Minted_Cython] breplace = \begin{minted}[fontsize=\%(fontsize)s,linenos=false,mathescape,baselinestretch=%(bstretch)s,fontfamily=tt,xleftmargin=7mm]{cython} ereplace = \end{minted} \noindent bstretch = 1.0 fontsize = fontsize{9pt}{9pt} [Minted_Cpp] breplace = \begin{minted}[fontsize=\%(fontsize)s,linenos=false,mathescape,baselinestretch=%(bstretch)s,fontfamily=tt,xleftmargin=7mm]{c++} ereplace = \end{minted} \noindent bstretch = 1.0 fontsize = fontsize{9pt}{9pt} [Minted_C] breplace = \begin{minted}[fontsize=\%(fontsize)s,linenos=false,mathescape,baselinestretch=%(bstretch)s,fontfamily=tt,xleftmargin=7mm]{c} ereplace = \end{minted} \noindent bstretch = 1.0 fontsize = fontsize{9pt}{9pt} [Minted_Fortran] breplace = \begin{minted}[fontsize=\%(fontsize)s,linenos=false,mathescape,baselinestretch=%(bstretch)s,fontfamily=tt,xleftmargin=7mm]{fortran} ereplace = \end{minted} \noindent bstretch = 1.0 fontsize = fontsize{9pt}{9pt} # warning box, pink background, warning sign [Warnings] breplace = \definecolor{warnback}{rgb}{1.0, 0.8235294, 0.8235294} \setlength{\fboxrule}{2pt} \begin{center} \fcolorbox{black}{warnback}{ \begin{minipage}{0.8\textwidth} \includegraphics[height=0.3in]{warning.eps} \vskip-0.3in\hskip1.5in{\large\bf WARNING} \\[0.2cm] ereplace = \end{minipage}} \end{center} \setlength{\fboxrule}{0.4pt} %% Back to default # tip box, light blue background, "i" (info) sign [Tip] breplace = \definecolor{tipback}{rgb}{0.87843, 0.95686, 1.0} \setlength{\fboxrule}{2pt} \begin{center} \fcolorbox{black}{tipback}{ \begin{minipage}{0.8\textwidth} \includegraphics[height=0.3in]{tip.eps} \vskip-0.3in\hskip1.5in{\large\bf TIP} \\[0.2cm] ereplace = \end{minipage}} \end{center} \setlength{\fboxrule}{0.4pt} %% Back to default # note box, "i" (info) sign [Note] breplace = \definecolor{noteback}{rgb}{0.988235, 0.964706, 0.862745} \setlength{\fboxrule}{2pt} \begin{center} \fcolorbox{black}{noteback}{ \begin{minipage}{0.8\textwidth} \includegraphics[height=0.3in]{tip.eps} \vskip-0.3in\hskip1.5in{\large\bf NOTE} \\[0.2cm] ereplace = \end{minipage}} \end{center} \setlength{\fboxrule}{0.4pt} %% Back to default # colored box, can handle multiple pages [Blue] shadecolor = 0.87843, 0.95686, 1.0 envname = Blue define = True newenv = \providecommand{\shadedskip}{} \definecolor{shadecolor}{rgb}{%(shadecolor)s} \renewenvironment{shadedskip}{ \def\FrameCommand{\colorbox{shadecolor}}\FrameRule0.6pt \MakeFramed {\FrameRestore}\vskip3mm}{\vskip0mm\endMakeFramed} \providecommand{\shadedquote%(envname)s}{} \renewenvironment{shadedquote%(envname)s}[1][]{ \bgroup\rmfamily \fboxsep=0mm\relax \begin{shadedskip} \list{}{\parsep=-2mm\parskip=0mm\topsep=0pt\leftmargin=2mm \rightmargin=2\leftmargin\leftmargin=4pt\relax} \item\relax} {\endlist\end{shadedskip}\egroup} breplace = \begin{shadedquote%(envname)s} # \centering{\large\bf Program} \\[0.2cm] \fontsize{9pt}{9pt} \begin{Verbatim} ereplace = \end{Verbatim} \end{shadedquote%(envname)s} \noindent # colored box, can handle multiple pages # \fcolorbox{black}{yellow} [BlueFrame] shadecolor = 0.87843, 0.95686, 1.0 envname = BlueFrame define = True newenv = \providecommand{\shadedskip}{} \definecolor{shadecolor}{rgb}{%(shadecolor)s} \renewenvironment{shadedskip}{ \def\FrameCommand{\fcolorbox{black}{shadecolor}}\FrameRule0.6pt \MakeFramed {\FrameRestore}\vskip3mm}{\vskip0mm\endMakeFramed} \providecommand{\shadedquote%(envname)s}{} \renewenvironment{shadedquote%(envname)s}[1][]{ \bgroup\rmfamily \fboxsep=0mm\relax \begin{shadedskip} \list{}{\parsep=-2mm\parskip=0mm\topsep=0pt\leftmargin=2mm \rightmargin=2\leftmargin\leftmargin=4pt\relax} \item\relax} {\endlist\end{shadedskip}\egroup} breplace = \begin{shadedquote%(envname)s} # \centering{\large\bf Program} \\[0.2cm] \fontsize{9pt}{9pt} \begin{Verbatim} ereplace = \end{Verbatim} \end{shadedquote%(envname)s} \noindent # colored box with left vertical bar, can handle multiple pages [BlueBar] shadecolor = 0.87843, 0.95686, 1.0 barcolor = 0.7, 0.95686, 1 envname = BlueBar define = True newenv = \providecommand{\shadedwbar}{} \definecolor{shadecolor}{rgb}{%(shadecolor)s} \renewenvironment{shadedwbar}{ \def\FrameCommand{\color[rgb]{%(barcolor)s}\vrule width 1mm\normalcolor\colorbox{shadecolor}}\FrameRule0.6pt \MakeFramed {\advance\hsize-2mm\FrameRestore}\vskip3mm}{\vskip0mm\endMakeFramed} \providecommand{\shadedquote%(envname)s}{} \renewenvironment{shadedquote%(envname)s}[1][]{ \bgroup\rmfamily \fboxsep=0mm\relax \begin{shadedwbar} \list{}{\parsep=-2mm\parskip=0mm\topsep=0pt\leftmargin=2mm \rightmargin=2\leftmargin\leftmargin=4pt\relax} \item\relax} {\endlist\end{shadedwbar}\egroup} breplace = \begin{shadedquote%(envname)s} # \centering{\large\bf Program} \\[0.2cm] \fontsize{9pt}{9pt} \begin{Verbatim} ereplace = \end{Verbatim} \end{shadedquote%(envname)s} \noindent # colored box, can handle multiple pages [Red] shadecolor = 1, 0.97, 0.85 envname = Red define = True newenv = \providecommand{\shadedskip}{} \definecolor{shadecolor}{rgb}{%(shadecolor)s} \renewenvironment{shadedskip}{ \def\FrameCommand{\colorbox{shadecolor}}\FrameRule0.6pt \MakeFramed {\FrameRestore}\vskip3mm}{\vskip0mm\endMakeFramed} \providecommand{\shadedquote%(envname)s}{} \renewenvironment{shadedquote%(envname)s}[1][]{ \bgroup\rmfamily \fboxsep=0mm\relax \begin{shadedskip} \list{}{\parsep=-2mm\parskip=0mm\topsep=0pt\leftmargin=2mm \rightmargin=2\leftmargin\leftmargin=4pt\relax} \item\relax} {\endlist\end{shadedskip}\egroup} breplace = \begin{shadedquote%(envname)s} # \centering{\large\bf Program} \\[0.2cm] \fontsize{9pt}{9pt} \begin{Verbatim} ereplace = \end{Verbatim} \end{shadedquote%(envname)s} \noindent # colored box, can handle multiple pages [RedFrame] shadecolor = 1, 0.97, 0.85 envname = RedFrame define = True newenv = \providecommand{\shadedskip}{} \definecolor{shadecolor}{rgb}{%(shadecolor)s} \renewenvironment{shadedskip}{ \def\FrameCommand{\fcolorbox{black}{shadecolor}}\FrameRule0.6pt \MakeFramed {\FrameRestore}\vskip3mm}{\vskip0mm\endMakeFramed} \providecommand{\shadedquote%(envname)s}{} \renewenvironment{shadedquote%(envname)s}[1][]{ \bgroup\rmfamily \fboxsep=0mm\relax \begin{shadedskip} \list{}{\parsep=-2mm\parskip=0mm\topsep=0pt\leftmargin=2mm \rightmargin=2\leftmargin\leftmargin=4pt\relax} \item\relax} {\endlist\end{shadedskip}\egroup} breplace = \begin{shadedquote%(envname)s} # \centering{\large\bf Program} \\[0.2cm] \fontsize{9pt}{9pt} \begin{Verbatim} ereplace = \end{Verbatim} \end{shadedquote%(envname)s} \noindent # colored box with left vertical bar, can handle multiple pages [RedBar] shadecolor = 1, 0.97, 0.85 barcolor = 1, 0.85, 0.85 envname = RedBar define = True newenv = \providecommand{\shadedwbar}{} \definecolor{shadecolor}{rgb}{%(shadecolor)s} \renewenvironment{shadedwbar}{ \def\FrameCommand{\color[rgb]{%(barcolor)s}\vrule width 1mm\normalcolor\colorbox{shadecolor}}\FrameRule0.6pt \MakeFramed {\advance\hsize-2mm\FrameRestore}\vskip3mm}{\vskip0mm\endMakeFramed} \providecommand{\shadedquote%(envname)s}{} \renewenvironment{shadedquote%(envname)s}[1][]{ \bgroup\rmfamily \fboxsep=0mm\relax \begin{shadedwbar} \list{}{\parsep=-2mm\parskip=0mm\topsep=0pt\leftmargin=2mm \rightmargin=2\leftmargin\leftmargin=4pt\relax} \item\relax} {\endlist\end{shadedwbar}\egroup} breplace = \begin{shadedquote%(envname)s} # \centering{\large\bf Program} \\[0.2cm] \fontsize{9pt}{9pt} \begin{Verbatim} ereplace = \end{Verbatim} \end{shadedquote%(envname)s} \noindent # colored box, can handle multiple pages [Yellow] shadecolor = 1.0, 1.0, 0.7 envname = Yellow define = True newenv = \providecommand{\shadedskip}{} \definecolor{shadecolor}{rgb}{%(shadecolor)s} \renewenvironment{shadedskip}{ \def\FrameCommand{\colorbox{shadecolor}}\FrameRule0.6pt \MakeFramed {\FrameRestore}\vskip3mm}{\vskip0mm\endMakeFramed} \providecommand{\shadedquote%(envname)s}{} \renewenvironment{shadedquote%(envname)s}[1][]{ \bgroup\rmfamily \fboxsep=0mm\relax \begin{shadedskip} \list{}{\parsep=-2mm\parskip=0mm\topsep=0pt\leftmargin=2mm \rightmargin=2\leftmargin\leftmargin=4pt\relax} \item\relax} {\endlist\end{shadedskip}\egroup} breplace = \begin{shadedquote%(envname)s} # \centering{\large\bf Program} \\[0.2cm] \fontsize{9pt}{9pt} \begin{Verbatim} ereplace = \end{Verbatim} \end{shadedquote%(envname)s} \noindent # colored box, can handle multiple pages [Gray] envname = Gray define = True newenv = \providecommand{\shadedskip}{} \definecolor{shadecolor}{gray}{0.93} \renewenvironment{shadedskip}{ \def\FrameCommand{\colorbox{shadecolor}}\FrameRule0.6pt \MakeFramed {\FrameRestore}\vskip3mm}{\vskip0mm\endMakeFramed} \providecommand{\shadedquote%(envname)s}{} \renewenvironment{shadedquote%(envname)s}[1][]{ \bgroup\rmfamily \fboxsep=0mm\relax \begin{shadedskip} \list{}{\parsep=-2mm\parskip=0mm\topsep=0pt\leftmargin=2mm \rightmargin=2\leftmargin\leftmargin=4pt\relax} \item\relax} {\endlist\end{shadedskip}\egroup} breplace = \begin{shadedquote%(envname)s} # \centering{\large\bf Program} \\[0.2cm] \fontsize{9pt}{9pt} \begin{Verbatim} ereplace = \end{Verbatim} \end{shadedquote%(envname)s} \noindent # light blue shaded box, can handle multiple pages, "snippet" to the right [Blue_snippet] define = True newenv = \providecommand{\shadedquoteBluesnippet}{} \renewenvironment{shadedquoteBluesnippet}[1][]{ \definecolor{shadecolor}{rgb}{0.87843, 0.95686, 1.0} \definecolor{shadetitle}{rgb}{0.5, 0.95686, 1} \bgroup\rmfamily \fboxsep=0mm\relax \begin{shaded} {{\hfill\tiny\textsf{\textcolor{shadetitle}{Snippet\ \ }}}} \list{}{\parsep=-2mm\parskip=0mm\topsep=0pt\leftmargin=2mm \rightmargin=2\leftmargin\leftmargin=4pt\relax} \item\relax} {\endlist{\textcolor{shadecolor}{\ }}\end{shaded}\egroup} breplace = \begin{shadedquoteBluesnippet} # \centering{\large\bf Program} \\[0.2cm] \fontsize{9pt}{9pt} \begin{Verbatim} ereplace = \end{Verbatim} \end{shadedquoteBluesnippet} \noindent # light blue, shaded box, can not handle multiple pages (sp = single page) [Blue_singlepage] breplace = \begin{SaveVerbatim}{Snippet} ereplace = \end{SaveVerbatim} \setlength{\fboxrule}{0pt} \begin{center} \definecolor{shadecolor}{rgb}{0.87843, 0.95686, 1.0} \fcolorbox{black}{shadecolor}{ \begin{minipage}{0.97\textwidth} # \centering{\large\bf Program snippet} \\[0.2cm] \raggedright \fontsize{9pt}{9pt}\selectfont{\BUseVerbatim{Snippet}} \end{minipage}} \end{center} \setlength{\fboxrule}{0.4pt} %% Back to default \noindent # light gray, shaded box, can not handle multiple pages (sp = single page) [Gray_singlepage] breplace = \begin{SaveVerbatim}{Programsingle} ereplace = \end{SaveVerbatim} \setlength{\fboxrule}{0pt} \begin{center} \definecolor{shadecolor}{gray}{0.93} \fcolorbox{black}{shadecolor}{ \begin{minipage}{0.97\textwidth} # \centering{\large\bf Program line} \\[0.2cm] \raggedright \fontsize{9pt}{9pt}\selectfont{\BUseVerbatim{Programsingle}} \end{minipage}} \end{center} \setlength{\fboxrule}{0.4pt} %% Back to default \noindent # Tiago Quintino's code environment (requires ptex2tex.sty) [TiagoPy] breplace = \lstset{language=Python} \begin{lstlisting} \fontsize{9pt}{9pt} ereplace = \end{lstlisting}\vspace{3mm} # Tiago Quintino's code environment (requires ptex2tex.sty) [TiagoCpp] breplace = \lstset{language=[ISO]{C++}} \begin{lstlisting} \fontsize{9pt}{9pt} ereplace = \end{lstlisting}\vspace{3mm} # FEniCS style code environment [FEniCS] define = True newenv = \providecommand{\fenicscode}{} \renewenvironment{fenicscode}[1]{ \center\tabular{c}\hline\\ \footnotesize \minipage{#1\textwidth}\verbatim} {\endverbatim\endminipage\\ \\ \hline\endtabular\endcenter} breplace = \begin{fenicscode}{0.9} ereplace = \end{fenicscode} # FEniCS style code environment [FEniCSsmall] define = True newenv = \providecommand{\fenicscodesmall}{} \renewenvironment{fenicscodesmall}[1]{ \center\footnotesize\minipage{#1\textwidth}\verbatim} {\endverbatim\endminipage\endcenter} breplace = \begin{fenicscodesmall}{0.9} ereplace = \end{fenicscodesmall} # NOTE: The CodeGrayWhite1/2 redefine \FancyVerbFormatLine and this # will affect all forthcoming styles that use fancyvrb (quite many!). # Be careful with this environment # Code with gray background and white split between lines: [CodeGrayWhite1] breplace = \definecolor{Light}{gray}{.80} \renewcommand{\FancyVerbFormatLine}[1]{\colorbox{Light}{\makebox[\linewidth][l]{#1}}} \begin{Verbatim}[fontsize=\%(fontsize)s,numbers=left,tabsize=8,baselinestretch=%(bstretch)s,fontfamily=tt,xleftmargin=7mm] ereplace = \end{Verbatim} \noindent bstretch = 0.85 fontsize = fontsize{9pt}{9pt} # as CodeGrayWhite1, but no line numbers: [CodeGrayWhite2] breplace = \definecolor{Light}{gray}{.80} \renewcommand{\FancyVerbFormatLine}[1]{\colorbox{Light}{\makebox[\linewidth][l]{#1}}} \begin{Verbatim}[fontsize=\%(fontsize)s,tabsize=8,baselinestretch=%(bstretch)s,fontfamily=tt,xleftmargin=7mm] ereplace = \end{Verbatim} \noindent bstretch = 0.85 fontsize = fontsize{9pt}{9pt} [inline_code] font = 10 [preprocess] #defines = T2 #undefines = T2 #includes = /home/some/body/myfile [names] # the names below are just examples - new names can be # defined instead or in addition to those listed here # computer code in quote environment (gives a left margin): ccq = CodeIndented # computer code with no left margin: cc = Code # computer code with line numbering: ccl = CodeLineNo # program box: pro = BlueBar pypro = Minted_Python cpppro = Minted_Cpp cpro = Minted_C fpro = Minted_Fortran # computer code box (snippet, not complete program): cod = Blue pycod = Minted_Python cycod = Minted_Cython cppcod = Minted_Cpp ccod = Minted_C fcod = Minted_Fortran # computer code box (snippet, not complete program): #sni = Blue_snippet sni = Blue # data file: dat = CodeIndented # data file snippet: dsni = CodeIndented # system commands (in terminal window): sys = CodeTerminal # one-line system command (in terminal window): slin = Code # IPython interactive session: ipy = Code # standard interactive python session: py = Code # execution of a Python program ("run python"): rpy = CodeTerminal # one-line program code: plin = Code # verbatim environment: ver = Verb # warning box: warn = Warnings # tip box: rule = Tip # note box: summ = Note n1 = Verb n2 = CodeRule n3 = CodeTerminal n4 = Code n5 = CodeLineNo n6 = CodeIndented n7 = CodeIndented10 n8 = PyHighlight n9 = CppHighlight n10 = PyMatlab n11 = PyBash n12 = PySWIG n13 = Minted_Python n14 = Minted_Cython n15 = Minted_Cpp n16 = Minted_C n17 = Minted_Fortran n18 = Warnings n19 = Tip n20 = Note n21 = Blue n22 = BlueFrame n23 = BlueBar n24 = Red n25 = RedFrame n26 = RedBar n27 = Yellow n28 = Gray n29 = Blue_snippet n30 = Blue_singlepage n31 = Gray_singlepage n32 = TiagoPy n33 = TiagoCpp n34 = FEniCS n35 = FEniCSsmall n36 = CodeGrayWhite1 n37 = CodeGrayWhite2 ptex2tex-0.4/doc/envir_demo.tex0000644000000000000000000003277211565043724015276 0ustar rootroot \noindent Here is a demo of the environment \code{Verb}: \bn1 # Here is some Python code def height_and_velocity(t, v0): """Invoke some advanced math computations.""" g = 9.81 # acceleration of gravity y = v0*t - 0.5*g*t**2 # vertical position v = v0 - g*t # vertical velocity return y, v class Wrapper: def __init__(self, func, alternative_kwarg_names={}): self.func = func self.help = alternative_kwarg_names def __call__(self, *args, **kwargs): # Translate possible alternative keyword argument # names in kwargs to those accepted by self.func: func_kwargs = {} for name in kwargs: if name in self.help: func_kwargs[self.help[name]] = kwargs[name] else: func_kwargs[name] = kwargs[name] return self.func(*args, **func_kwargs) height_and_velocity = Wrapper(height_and_velocity, {'time': 't', 'velocity': 'v0', 'initial_velocity': 'v0'}) print height_and_velocity(initial_velocity=0.5, time=1) \en1 \noindent Here is a demo of the environment \code{CodeRule}: \bn2 # Here is some short Python code def height_and_velocity(t, v0): """Invoke some advanced math computations.""" g = 9.81 # acceleration of gravity y = v0*t - 0.5*g*t**2 # vertical position v = v0 - g*t # vertical velocity return y, v print height_and_velocity(initial_velocity=0.5, time=1) \en2 \noindent Here is a demo of the environment \code{CodeTerminal}: \bn3 # Here is some short Python code def height_and_velocity(t, v0): """Invoke some advanced math computations.""" g = 9.81 # acceleration of gravity y = v0*t - 0.5*g*t**2 # vertical position v = v0 - g*t # vertical velocity return y, v print height_and_velocity(initial_velocity=0.5, time=1) \en3 \noindent Here is a demo of the environment \code{Code}: \bn4 # Here is some Python code def height_and_velocity(t, v0): """Invoke some advanced math computations.""" g = 9.81 # acceleration of gravity y = v0*t - 0.5*g*t**2 # vertical position v = v0 - g*t # vertical velocity return y, v class Wrapper: def __init__(self, func, alternative_kwarg_names={}): self.func = func self.help = alternative_kwarg_names def __call__(self, *args, **kwargs): # Translate possible alternative keyword argument # names in kwargs to those accepted by self.func: func_kwargs = {} for name in kwargs: if name in self.help: func_kwargs[self.help[name]] = kwargs[name] else: func_kwargs[name] = kwargs[name] return self.func(*args, **func_kwargs) height_and_velocity = Wrapper(height_and_velocity, {'time': 't', 'velocity': 'v0', 'initial_velocity': 'v0'}) print height_and_velocity(initial_velocity=0.5, time=1) \en4 \noindent Here is a demo of the environment \code{CodeLineNo}: \bn5 # Here is some Python code def height_and_velocity(t, v0): """Invoke some advanced math computations.""" g = 9.81 # acceleration of gravity y = v0*t - 0.5*g*t**2 # vertical position v = v0 - g*t # vertical velocity return y, v class Wrapper: def __init__(self, func, alternative_kwarg_names={}): self.func = func self.help = alternative_kwarg_names def __call__(self, *args, **kwargs): # Translate possible alternative keyword argument # names in kwargs to those accepted by self.func: func_kwargs = {} for name in kwargs: if name in self.help: func_kwargs[self.help[name]] = kwargs[name] else: func_kwargs[name] = kwargs[name] return self.func(*args, **func_kwargs) height_and_velocity = Wrapper(height_and_velocity, {'time': 't', 'velocity': 'v0', 'initial_velocity': 'v0'}) print height_and_velocity(initial_velocity=0.5, time=1) \en5 \noindent Here is a demo of the environment \code{CodeIndented}: \bn6 # Here is some Python code def height_and_velocity(t, v0): """Invoke some advanced math computations.""" g = 9.81 # acceleration of gravity y = v0*t - 0.5*g*t**2 # vertical position v = v0 - g*t # vertical velocity return y, v class Wrapper: def __init__(self, func, alternative_kwarg_names={}): self.func = func self.help = alternative_kwarg_names def __call__(self, *args, **kwargs): # Translate possible alternative keyword argument # names in kwargs to those accepted by self.func: func_kwargs = {} for name in kwargs: if name in self.help: func_kwargs[self.help[name]] = kwargs[name] else: func_kwargs[name] = kwargs[name] return self.func(*args, **func_kwargs) height_and_velocity = Wrapper(height_and_velocity, {'time': 't', 'velocity': 'v0', 'initial_velocity': 'v0'}) print height_and_velocity(initial_velocity=0.5, time=1) \en6 \noindent Here is a demo of the environment \code{CodeIndented10}: \bn7 # Here is some Python code def height_and_velocity(t, v0): """Invoke some advanced math computations.""" g = 9.81 # acceleration of gravity y = v0*t - 0.5*g*t**2 # vertical position v = v0 - g*t # vertical velocity return y, v class Wrapper: def __init__(self, func, alternative_kwarg_names={}): self.func = func self.help = alternative_kwarg_names def __call__(self, *args, **kwargs): # Translate possible alternative keyword argument # names in kwargs to those accepted by self.func: func_kwargs = {} for name in kwargs: if name in self.help: func_kwargs[self.help[name]] = kwargs[name] else: func_kwargs[name] = kwargs[name] return self.func(*args, **func_kwargs) height_and_velocity = Wrapper(height_and_velocity, {'time': 't', 'velocity': 'v0', 'initial_velocity': 'v0'}) print height_and_velocity(initial_velocity=0.5, time=1) \en7 \noindent Here is a demo of the environment \code{PyHighlight}: \bn8 # Here is some Python code def height_and_velocity(t, v0): """Invoke some advanced math computations.""" g = 9.81 # acceleration of gravity y = v0*t - 0.5*g*t**2 # vertical position v = v0 - g*t # vertical velocity return y, v class Wrapper: def __init__(self, func, alternative_kwarg_names={}): self.func = func self.help = alternative_kwarg_names def __call__(self, *args, **kwargs): # Translate possible alternative keyword argument # names in kwargs to those accepted by self.func: func_kwargs = {} for name in kwargs: if name in self.help: func_kwargs[self.help[name]] = kwargs[name] else: func_kwargs[name] = kwargs[name] return self.func(*args, **func_kwargs) height_and_velocity = Wrapper(height_and_velocity, {'time': 't', 'velocity': 'v0', 'initial_velocity': 'v0'}) print height_and_velocity(initial_velocity=0.5, time=1) \en8 \noindent Here is a demo of the environment \code{CppHighlight}: \bn9 # Here is some Python code def height_and_velocity(t, v0): """Invoke some advanced math computations.""" g = 9.81 # acceleration of gravity y = v0*t - 0.5*g*t**2 # vertical position v = v0 - g*t # vertical velocity return y, v class Wrapper: def __init__(self, func, alternative_kwarg_names={}): self.func = func self.help = alternative_kwarg_names def __call__(self, *args, **kwargs): # Translate possible alternative keyword argument # names in kwargs to those accepted by self.func: func_kwargs = {} for name in kwargs: if name in self.help: func_kwargs[self.help[name]] = kwargs[name] else: func_kwargs[name] = kwargs[name] return self.func(*args, **func_kwargs) height_and_velocity = Wrapper(height_and_velocity, {'time': 't', 'velocity': 'v0', 'initial_velocity': 'v0'}) print height_and_velocity(initial_velocity=0.5, time=1) \en9 \noindent Here is a demo of the environment \code{PyMatlab}: \bn10 # Here is some Python code def height_and_velocity(t, v0): """Invoke some advanced math computations.""" g = 9.81 # acceleration of gravity y = v0*t - 0.5*g*t**2 # vertical position v = v0 - g*t # vertical velocity return y, v class Wrapper: def __init__(self, func, alternative_kwarg_names={}): self.func = func self.help = alternative_kwarg_names def __call__(self, *args, **kwargs): # Translate possible alternative keyword argument # names in kwargs to those accepted by self.func: func_kwargs = {} for name in kwargs: if name in self.help: func_kwargs[self.help[name]] = kwargs[name] else: func_kwargs[name] = kwargs[name] return self.func(*args, **func_kwargs) height_and_velocity = Wrapper(height_and_velocity, {'time': 't', 'velocity': 'v0', 'initial_velocity': 'v0'}) print height_and_velocity(initial_velocity=0.5, time=1) \en10 \noindent Here is a demo of the environment \code{PyBash}: \bn11 # Here is some Python code def height_and_velocity(t, v0): """Invoke some advanced math computations.""" g = 9.81 # acceleration of gravity y = v0*t - 0.5*g*t**2 # vertical position v = v0 - g*t # vertical velocity return y, v class Wrapper: def __init__(self, func, alternative_kwarg_names={}): self.func = func self.help = alternative_kwarg_names def __call__(self, *args, **kwargs): # Translate possible alternative keyword argument # names in kwargs to those accepted by self.func: func_kwargs = {} for name in kwargs: if name in self.help: func_kwargs[self.help[name]] = kwargs[name] else: func_kwargs[name] = kwargs[name] return self.func(*args, **func_kwargs) height_and_velocity = Wrapper(height_and_velocity, {'time': 't', 'velocity': 'v0', 'initial_velocity': 'v0'}) print height_and_velocity(initial_velocity=0.5, time=1) \en11 \noindent Here is a demo of the environment \code{PySWIG}: \bn12 # Here is some Python code def height_and_velocity(t, v0): """Invoke some advanced math computations.""" g = 9.81 # acceleration of gravity y = v0*t - 0.5*g*t**2 # vertical position v = v0 - g*t # vertical velocity return y, v class Wrapper: def __init__(self, func, alternative_kwarg_names={}): self.func = func self.help = alternative_kwarg_names def __call__(self, *args, **kwargs): # Translate possible alternative keyword argument # names in kwargs to those accepted by self.func: func_kwargs = {} for name in kwargs: if name in self.help: func_kwargs[self.help[name]] = kwargs[name] else: func_kwargs[name] = kwargs[name] return self.func(*args, **func_kwargs) height_and_velocity = Wrapper(height_and_velocity, {'time': 't', 'velocity': 'v0', 'initial_velocity': 'v0'}) print height_and_velocity(initial_velocity=0.5, time=1) \en12 \noindent Here is a demo of the environment \code{Minted_Python}: \bn13 # Here is some Python code def height_and_velocity(t, v0): """Invoke some advanced math computations.""" g = 9.81 # acceleration of gravity y = v0*t - 0.5*g*t**2 # vertical position v = v0 - g*t # vertical velocity return y, v class Wrapper: def __init__(self, func, alternative_kwarg_names={}): self.func = func self.help = alternative_kwarg_names def __call__(self, *args, **kwargs): # Translate possible alternative keyword argument # names in kwargs to those accepted by self.func: func_kwargs = {} for name in kwargs: if name in self.help: func_kwargs[self.help[name]] = kwargs[name] else: func_kwargs[name] = kwargs[name] return self.func(*args, **func_kwargs) height_and_velocity = Wrapper(height_and_velocity, {'time': 't', 'velocity': 'v0', 'initial_velocity': 'v0'}) print height_and_velocity(initial_velocity=0.5, time=1) \en13 ptex2tex-0.4/doc/make.sh0000644000000000000000000000073411530166554013666 0ustar rootroot#!/bin/sh -x # produce ptex2tex documentation file=doc # first make all environments for demo: cp ../lib/ptex2tex/ptex2tex.cfg .ptex2tex.cfg # latest config file python ../bin/testconfig.py mv -f tmp_latex envir_demo.tex cat tmp_names >> .ptex2tex.cfg rm tmp_names ptex2tex $file latex -shell-escape $file latex -shell-escape $file dvipdf $file mv -f doc.pdf ptex2tex_doc.pdf echo echo "Documentation in $file.pdf" # googlecode wiki: doconce format gwiki brief.do.txt ptex2tex-0.4/doc/clean.sh0000644000000000000000000000023111437647451014031 0ustar rootroot#!/bin/sh files="*.aux *.dvi *.log *.out *.tmp* tmp* doc.tex *.ps doc.pdf" echo "removing the following files:" /bin/ls $files 2> /dev/null rm -rf $filesptex2tex-0.4/doc/myprog.py0000644000000000000000000000077011156446224014303 0ustar rootroot#!/usr/bin/env python import math, sys """ This is a small script containing a simple function. """ def myfunc(x): result = None if isinstance(x, (list, tuple)): result = [] for i in x: result.append(math.fabs(i)) elif isinstance(x, (int, float)): result = math.fabs(x) return result print myfunc(-1.0) print myfunc((2, -3.)) try: result = myfunc([eval(x) for x in (sys.argv[1:])]) if result: print result except: pass ptex2tex-0.4/doc/division.py0000644000000000000000000000034611156446224014611 0ustar rootroot#!/usr/bin/env python import sys def division(a, b): try: return a/float(b) except ZeroDivisionError: print 'cannot divide by zero' return None if __name__ == '__main__': print division(2, 0) ptex2tex-0.4/doc/man/0000755000000000000000000000000011633377046013170 5ustar rootrootptex2tex-0.4/doc/man/man1/0000755000000000000000000000000011633377046014024 5ustar rootrootptex2tex-0.4/doc/man/man1/ptex2tex.1.gz0000644000000000000000000000102011633340710016265 0ustar rootrootDmNptex2tex.1O0OABK+UGL#l=lK K<gKlx3L_Na-qFK>,6 OX<5KὕJ*ЫPWvcNS`\r@20k2Q"1v̩TpN yϥ0 0G&O/xy;S+19HL[QUOiPZI2]wûa}:?wlަ ީn'sr35WMEl?-k\ Lx|V*ojF+*Ɛvh+F,2Fptex2tex-0.4/doc/myfolder/0000755000000000000000000000000011633377046014236 5ustar rootrootptex2tex-0.4/doc/myfolder/myprog.py0000777000000000000000000000000011633377046020224 2../myprog.pyustar rootrootptex2tex-0.4/doc/doc.p.tex0000644000000000000000000011513711565043724014147 0ustar rootroot%\documentclass[envcountsect]{lncse} \documentclass[a4paper,11pt]{article} \usepackage{ptex2tex,minted} \begin{document} \title{Ptex2tex: Flexible Handling of Computer Code in \LaTeX{} Documents} \author{Ilmar Wilbers \and Hans Petter Langtangen} \date{Simula Research Laboratory\\ Email: \texttt{\{ilmarw,hpl\}@simula.no}\\ \ \ \\ \today} \maketitle \section{Introduction} \subsection{What is Ptex2tex?} Ptex2tex is a tool that allows you to replace \LaTeX~environment declarations with simple keywords. In a way, Ptex2tex allows you to create \LaTeX{} packages without any sophisticated knowledge on how to write \LaTeX{} packages. The idea behind Ptex2tex is code generation: instead of hiding complicated \LaTeX{} constructions in complex \LaTeX{} packages, one simply generates the necessary \LaTeX{} commands on the fly, from a compact begin-end environment indication in the \LaTeX{} source. This implies that you have to preprocess your \LaTeX{} source to make an ordinary {\LaTeX} file that can be compiled in the usual way. The main application of Ptex2tex is for inserting verbatim-style computer code in \LaTeX{} documents. The main application of Ptex2tex is for inserting verbatim-style computer code in \LaTeX{} documents. Code can be copied directly from the source files of the software (complete files or just snippets), and output from programs can be created and copied into the documentation as a part of running Ptex2tex. This guarantees that your {\LaTeX} document contains the most recent version of the program code and its output! With the default Ptex2tex configuration style, you can switch between 30+ styles for computer code within seconds and just recompile your \LaTeX{} files. Even in a several-hundred pages book it takes seconds to consistently change various styles for computer code, terminal sessions, output from programs, etc. This means that you never have to worry about choosing a proper style for computer/verbatim code in your \LaTeX{} document. Just use Ptex2tex and leave the decision to the future. It takes seconds to change your mind anyway. Let us look at an example. Say that you are writing a book or an article, and there is a certain style of box you tend to use frequently. The annoying thing is that this box has a lot of \LaTeX~syntax connected with it to make it look like you want. Here is an example involving a blue box: \bsni import sys; print 'script name is', sys.argv[0] \esni The \LaTeX~source code for this box needs quite some statements: \begin{verbatim} \providecommand{\shadedquoteBluesnippet}{} \renewenvironment{shadedquoteBluesnippet}[1][]{ \definecolor{shadecolor}{rgb}{0.87843, 0.95686, 1.0} \definecolor{shadetitle}{rgb}{0.5, 0.95686, 1} \bgroup\rmfamily \fboxsep=0mm\relax \begin{shaded} {{\hfill\tiny\textsf{\textcolor{shadetitle}{Snippet\ \ }}}} \list{}{\parsep=-2mm\parskip=0mm\topsep=0pt\leftmargin=2mm \rightmargin=2\leftmargin\leftmargin=4pt\relax} \item\relax} {\endlist{\textcolor{shadecolor}{\ }}\end{shaded}\egroup} \begin{shadedquoteBluesnippet} \fontsize{9pt}{9pt} \begin{Verbatim} import sys; print 'script name is', sys.argv[0] \end{Verbatim} \end{shadedquoteBluesnippet} \noindent \end{verbatim} \noindent With Ptex2tex, the box is crated by just enclosing the text (inside the box) in a certain \emph{environment}, say \code{mybox}: \bdat \bmybox import sys; print 'script name is', sys.argv[0] \emybox \edat The \LaTeX{} code corresponding to the \code{mybox} environment, i.e., how the box should look like, can be defined in a configuration file. It is then easy to work with boxes, typically contining computer code, in a large document and with Ptex2tex just use some environment names rather than the full, complicated \LaTeX{} surroundings. That is, the Ptex2tex approach allows much less code, and makes it easier to concentrate on the contents of the document we are writing and not the \LaTeX~code necessary to create such a box. Suppose you want the box to have a completely different look: \bcod import sys; print 'script name is', sys.argv[0] \ecod which in pure \LaTeX~looks like: \begin{verbatim} \providecommand{\shadedskip}{} \definecolor{shadecolor}{rgb}{0.87843, 0.95686, 1.0} \renewenvironment{shadedskip}{ \def\FrameCommand{\colorbox{shadecolor}}\FrameRule0.6pt \MakeFramed {\FrameRestore}\vskip3mm}{\vskip0mm\endMakeFramed} \providecommand{\shadedquoteBlue}{} \renewenvironment{shadedquoteBlue}[1][]{ \bgroup\rmfamily \fboxsep=0mm\relax \begin{shadedskip} \list{}{\parsep=-2mm\parskip=0mm\topsep=0pt\leftmargin=2mm \rightmargin=2\leftmargin\leftmargin=4pt\relax} \item\relax} {\endlist\end{shadedskip}\egroup}\begin{shadedquoteBlue} \fontsize{9pt}{9pt} \begin{Verbatim} import sys; print 'script name is', sys.argv[0] \end{Verbatim} \end{shadedquoteBlue} \end{verbatim} \noindent Using plain \LaTeX, you would have to replace the \LaTeX~code, which in this case is located both before and after the code you want to display. In addition, you may have several hundred boxes throughout your document. Changing all the \LaTeX~code for these boxes would require a lot of work, even if you use search and replace in your editor. Using Ptex2tex you could simply swap \code{mybox} with \code{yourbox}, or change the configuration file accordingly if the change is to be made for all boxes using this style. In this way, you do not need to make any changes to the document itself at all! At this point you may think that definition of new \LaTeX{} environments, stylefiles and packages solves the problem outlined above. This is not always true, as we elaborate on in the ``Motivation'' section below. Ptex2tex, which is built on \LaTeX{} code generation, apperas to be a simpler and more powerful technology. Another major advantage of Ptex2tex is that it provides means to include text from files, \emph{or from parts of files}, as well as output from programs ran at the command line at compile time. Say that you are writing a book about programming or a manual for a programming tool. You frequently include computer program code in your document, and also the output of running programs. While writing the document, you might make changes to programs and the output of them. Instead of cutting and pasting both the actual program and the output every time it is changed, using Ptex2tex, the only thing you need to do is to run \code{ptex2tex} on the document. Let's look at an example. We include the following in the \code{.p.tex} document: \bdat @@@CODE division.py def@if The output from running this function with a=2 and b=0 is: @@@CMD python division.py #0 \edat Now, the file \code{division.py} itself as well as the output from running it will be included in our document, and the result looks as follows:\\ \line(1,0){374}\\ @@@CODE division.py def@if The output from running this function with a=2 and b=0 is: @@@CMD python division.py #0 \line(1,0){374}\\ \\ This makes Ptex2tex a very convenient tool, particularly when writing large \LaTeX~documents about computer programming where one needs to include a lot of programs and code snippets. \subsection{Motivation} Why do we not simply define \LaTeX~environments and use these directly in our files? We consider Python more powerful and convenient than \LaTeX~for generating environments. Also, including text from file using search expressions as well as including results from programs ran at the command line are very challenging, if not impossible, tasks in \LaTeX. Imagine that you want to include a certain paragraph or code block from a file. Using plain \LaTeX~this means copying the necessary text from the source file, and pasting it into the \LaTeX~file. If you make changes to the file you copied from, you have to remember to copy the text you need a second time. Even though there exist ways of including whole files in \LaTeX~(\code{verbatiminput}), it is very difficult to include a part of the file. Also, you might want the text to be included to be typeset in a certain way, something that cannot be achieved by a simple \code{verbatiminput}. The point is that even though these things \emph{could} be done in \LaTeX~using classes, for instance, writing them in Python is much easier. As Ptex2tex uses Python configuration files to define commands, one does not even have to know Python in order to extend and tailor Ptex2tex. \subsection{Structure of this tutorial} This tutorial is divided in four sections. Following the introduction is section about running the \emp{ptex2tex} program and generating native \LaTeX{} code, followed by a section on including files and output from program execution. Finally, we will explain how the Ptex2tex environments work and how we can configure them. \section{The prepocessing step} When using Ptex2tex, your \LaTeX{} source file must have the extension \code{.p.tex}. All edits to your text must be done in this file. Running the program \emp{ptex2tex} on the \emp{.p.tex} file produces an ordinary \LaTeX{} file, which can be compiled to a \emp{.dvi} and \emp{.pdf} file in the usual way. However, if you apply any of the \emp{minted} code environments in your \emp{.p.tex} file (\code{Minted_Python} for instance), you must run \emp{latex} with the option \code{-shell-escape} option. Most editors will recognize a \emp{.p.tex} file as a \LaTeX{} or \TeX{} file and invoke relevant styles. Let us start by looking at what happens when we run the command \bsys ptex2tex test.p.tex \esys on the command line. If the extension of the file is not \code{.p.tex}, the program will exit with an error message. If no extension is given, that is, we run \code{ptex2tex test}, it is assumed that we are looking for the file \code{test.p.tex}. % #define INCLUDE_PREPROCESS 1 % #ifdef INCLUDE_PREPROCESS The first step of Ptex2tex consists of running Trent Mick's \code{preprocessor}. This is a Python package that allows us to use preprocessor statements in files, just like the preprocessor statements known from the \code{C} and \code{C++} languages. These statements take the form of normal comments in the source file, but when running \code{preprocessor}, these are treated in a special way. For instance, we can include whole files, or include certain blocks of test or code in our file only when a special requirement is met, otherwise this text or code is ignored. The statements need to be on a separate line. The statements that are implemented in the current version (which is 1.1.0 as of January 2009), are: \begin{itemize} \item \code{% #define VAR [VALUE]} \item \code{% #undef VAR} \item \code{% #ifdef VAR} \item \code{% #ifndef VAR} \item \code{% #if EXPRESSION} \item \code{% #elif EXPRESSION} \item \code{% #else} \item \code{% #endif} \item \code{% #error ERROR_STRING} \item \code{% #include "FILE"} \end{itemize} The source code for the present document, \code{doc.p.tex}, includes a few of these statements as an example. (For now, it is not possible to include arguments to \code{preprocess} within Ptex2tex, meaning that only the input file and output file are specified, with an additional argument to force the preprocessing by using the \code{-f} flag for \code{preprocess}). For further documentation, please visit the website for this package\footnote{\texttt{http://trentm.com/projects/preprocess}}. The input file type to \code{preprocess} is \code{.p.tex} and the output is \code{.tmp1}. If \code{preprocess} is not available on the system, this step is skipped. Preprocessor statements in the file will then be treated as comments, and the file is copied directly to \code{.tmp1}. % #else Information about the preprocess stage is left out. % #endif \section{Including files and output from program execution} The second step is to examine and execute the Ptex2tex keywords for including files and for including the output from executed programs. For both these two stages, the input file type will be \code{.tmp1} and the output file type is \code{.tmp2}. \subsection{\texttt{@@@CODE}} A line \emph{starting} with this statement indicates that a file containing a program (that is, computer code) is to be included in the document. If there is only one argument after the statement (the file name), the whole file is included. If a second argument is included, it is split with respect to the character \code{'@'}. If only an expression in front of this character is given, only the part of the file starting with that argument and ending with the end of the file is included. If an expression after the character is given as well, the part of the file starting with the first expression and ending at the beginning of the second expression is included. This means that the included part ends \emph{before} the text in the second expression, hence that text is \emph{not} included. When searching the file, the first occurrence of the start expression is used. Ptex2tex then starts scanning for the stop expression from the beginning of the location of the start expression, which will denote the end of the region to be copied into the text. White-spaces in front of and at the end of the expressions before and after \code{'@'} are ignored. The searching in the file for start and stop expressions is done using the Python function \code{find} on strings. Hence, start/stop expressions are compared directly to the text in the file. % #define INCLUDE_CTEX 0 % #ifdef INCLUDE_CTEX In the \code{ctex2tex} script, which Ptex2tex is based on, regular expressions were used. % #endif The environment keys 'pro' and 'sni' are short for 'program' and 'snippet', respectively, indicating that the former is meant to be used for typesetting a complete program, whereas the latter is meant for a program snippet, for instance a function. Both these Ptex2tex environments are for typesetting code. Environment keys here means keywords that Ptex2tex substitutes with actual \LaTeX~code later. More information about Ptex2tex environments is given in section \ref{sec:config}. If the whole file is included, the Ptex2tex environment key 'pro' is used. Otherwise, the environment key 'sni' is used. An exception here is in the case that a second \code{'@'} is used after the stop expression. This indicates that the 'pro' environment key is to be used, instead of 'sni'. The reason one might wish to typeset only a part of a file as a full program, is that one can use the search expressions for removing details in the full program, such as headers and test functions, that are irrelevant or confusing in the document, but still are considered important for the actual program. It is important to differ between the \code{@@@CODE} statement and the include statement provided with the \code{preprocessor} package. The latter allows us to include a file by \code{% #include FILE}, but does not embed the copied text in special \LaTeX~environments, that is, the whole file is included as is. We will exemplify this for the file \code{myprog.py}. Let's look at the output of some different options:\\ \code{'@@@CODE myprog.py'} includes the whole file: @@@CODE myprog.py \code{'@@@CODE myprog.py def myfunc'} and \code{'@@@CODE myprog.py def myfunc @'} includes everything from the first instance of the string 'def myfunc' to the end of the file: @@@CODE myprog.py def myfunc @ \code{'@@@CODE myprog.py if isinstance@elif'} includes everything from the first instance of the string 'if isinstance' \emph{up to} , but not including, the first instance of 'elif' \emph{after} 'if isinstance'. @@@CODE myprog.py if isinstance@elif \subsection{\texttt{@@@DATA}} \code{@@@DATA} is essentially the same as \code{@@@CODE}, but different environment keys are used: 'pro' becomes 'dat' and 'sni' becomes 'dsni'. These are short for 'Data' and 'Data snippet', respectively. Whereas \code{@@@CODE} is meant to be used with program code, \code{@@@DATA} is meant to be used with data files that are not code, for instance input files to, and output files from, computer programs. \subsection{\texttt{@@@CMD}} A line \emph{starting} with the statement \code{@@@CMD} indicates that we want to include the output from a shell command with command-line arguments. All text after the statement \code{@@@CMD} will be executed, except the text after (and including) \code{'#'}. The character after \code{'#'} defines how much of the commands we want to execute should be part of the final text to be included in our document. Any whitespaces after the character are ignored. There are five possible values: \begin{enumerate} \item \code{'0'} omits the whole command that is to be executed \item \code{'1'} the command is included and the full path stripped \item \code{'2'} the command is included and the full path is not stripped \item \code{'3'} the command is included except for the name of the program being called (the first word) and the full path is stripped \item \code{'4'} the command is included except for the name of the program being called (the first word) and the full path is not stripped. \end{enumerate} For options \code{'1'} and \code{'3'} a simple regular expression search is used to allow statements like \code{'python code/myprog.py'} to be printed as \code{'python myprog.py'} and \code{'myprog.py'}, respectively, that is, we remove the path to the directory where the program is located, allowing us to run programs in a different directory than where we are running Ptex2tex, without the output reflecting this. For options \code{'3'} and \code{'4'} the first word is simply stripped, allowing statements like \code{'python code/myprog.py'} to be printed as \code{'myprog.py'} and \code{'code/myprog.py'}, respectively. The default option is \code{'3'}, and the terminal session is typeset using the environment key 'sys' (for ``system''). Again, let us exemplify this. Running \code{'python myprog.py -1 2 -5'} in a shell gives us the following output: @@@CMD python myprog.py -1 2 -5 #0 Instead of copying and pasting this into the documents we are creating, meaning we would have to update this every time the code in \code{myprog.py} is changed, we simply add the following line: \code{'@@@CMD python myprog.py -1 2 -5'}. The result looks like this: @@@CMD python myprog.py -1 2 -5 Before looking at the additional options, let us assume that the file \code{myprog.py} is located in a subfolder \code{myfolder}, meaning that we would have to run the command \code{'python myfolder/myprog.py -1 2 -5'}. Adding additional options to this commands gives the following results:\\ \code{'@@@CMD python myfolder/myprog.py -1 2 -5 # 0'} omits the whole command that is called: @@@CMD python myfolder/myprog.py -1 2 -5 # 0 \code{'@@@CMD python myfolder/myprog.py -1 2 -5 # 1'} removes the additional folders: @@@CMD python myfolder/myprog.py -1 2 -5 # 1 \code{'@@@CMD python myfolder/myprog.py -1 2 -5 # 2'} doesn't remove anything: @@@CMD python myfolder/myprog.py -1 2 -5 # 2 \code{'@@@CMD python myfolder/myprog.py -1 2 -5 # 3'} removes the additional folders and the first word after \code{'@@@CMD'} (which is \code{'python'}): @@@CMD python myfolder/myprog.py -1 2 -5 # 3 \code{'@@@CMD python myfolder/myprog.py -1 2 -5 # 4'} removes only the first word after \code{'@@@CMD'}: @@@CMD python myfolder/myprog.py -1 2 -5 # 4 We give a table with an overview of the different Ptex2tex environments that the \code{@@@} keywords are mapped to in Table \ref{table:env}. \begin{table} \begin{center} \begin{tabular}[h]{|l|r|} \hline Keyword & Ptex2tex key\\ \hline @@@CODE without search expressions & pro\\ @@@CODE with \code{start} or \code{start@} & sni\\ @@@CODE with \code{start@stop} & sni\\ @@@CODE with \code{start@@} & pro\\ @@@CODE with \code{start@stop@} & pro\\ @@@DATA without search expressions & dat\\ @@@DATA with \code{start} or \code{start@} & dsni\\ @@@DATA with \code{start@stop} & dsni\\ @@@DATA with \code{start@@} & dat\\ @@@DATA with \code{start@stop@} & dat\\ @@@CMD with any parameters & sys\\ \hline \end{tabular}\caption{Mapping of keywords to environments}\label{table:env} \end{center} \end{table} \section{Ptex2tex environments}\label{sec:config} This section explains the use of the Ptex2tex environments. Ptex2tex environments consist of text that we want to typeset in a special way (typical computer code), surrounded by keywords for defining the beginning and the end of the text to be typeset. Ptex2tex replaces these keywords with the \LaTeX~commands that we have configured the Ptex2tex environment in question to be associated with. We will now explain this in more detail. \subsection{How to use the environments} Ptex2tex environments are described by several keywords. In the previous section we looked at the ones starting with \code{'@@@'}, and explained that these keywords were replaced with different Ptex2tex environment keys. These environment keys can have different names, we already encountered 'pro', 'sni', 'dat', and 'sys'. These are environment keys that are built into Ptex2tex and need to be there, as they are used for the \code{'@@@'} keywords, but we can define what the \LaTeX~environment they are translated to should look like, as we will see shortly. In addition, we can add any new environment keys as we please, and some are already defined by default. Let us have a closer look at the environment key 'pro'. For every environment key, two keywords can be used in the document we are working with. For 'pro' these would be \code{\}\code{bpro} to indicate where we want to start the typesetting for that environment, and the other is \code{\}\code{epro}, indicating the end. In general, for an environment key 'xxx' there will be keywords \code{\}\code{bxxx} and \code{\}\code{exxx} where 'b' and 'e' stand for 'begin' and 'end', respectively. When Ptex2tex is scanning the documents, these two keywords are replaced with the actual \LaTeX~code that makes up the environment. Let us once again look at an example. The lines \bdat \bpro //This text is typeset as computer code. \epro \edat will result in the following box: \bpro //This text is typeset as computer code. \epro The advantage is that we now can change the way this box should look like without making any changes in the document itself, as described in the next section. Also, if we want to change the environment to be used, say for instance from 'pro' to 'sys', instead of changing up to several lines of \LaTeX~code, we simply change the keywords from \code{\}\code{bpro} and \code{\}\code{epro} to \code{\}\code{bsys} and \code{\}\code{esys}. This step results in a \code{.tex} file that can be compiled with \LaTeX. Normally, this is done in the usual way: !bsys Unix/DOS> latex myfile.tex !esys However, if the \emp{minted} \LaTeX{} package is included (needed for the \code{Minted_*} environments in the default \emp{.ptex2tex.cfg} configuration file), one needs to apply the \code{-shell-escape} option to \code{latex}: !bsys Unix/DOS> latex -shell-espace myfile.tex !esys The Pygments program when \code{minted.sty} is included, and this program cannot be invoked without the \code{-shell-escape} option. In the next section we show more of the details behind the environment keys. Note that the \emp{minted} package must be explicitly included in a \emp{usepackage} statement by the writer of the Ptex2tex file. \subsection{The configuration file}\label{sec:conffile} As mentioned earlier, the idea of Ptex2tex is to allow the user to write short keywords for parts of the document that are to be typeset in a special way. When running Ptex2tex, these keywords are then replaced with the full \LaTeX~commands, resulting in plain \code{.tex} files. For instance may the keyword \code{\}\code{bpy} be replaced with \bdat \plin \edat and \code{\}\code{epy} with \bdat \elin \edat Some keywords will also output additional \LaTeX~code for defining \LaTeX~environments once for every file, more on this later. We will differentiate between Ptex2tex environments, which we are about to explain in detail, and \LaTeX~environments, which refer to the \LaTeX~commands that we would have to use instead of the Ptex2tex keywords. All Ptex2tex environments available are defined in a configuration file. When running Ptex2tex for the first time, or if the file is removed since the last time Ptex2tex was run, this configuration file will be placed in the user's home directory. The file is named \code{.ptex2tex.cfg}, indicating that it is hidden. The file is written in the Python ConfigParser language\footnote{http://docs.python.org/lib/module-ConfigParser.html} and will be referred to as the global environment file. This file is read every time one runs Ptex2tex. In addition to this file, the \code{.ptex2tex.cfg} file in the directory where the \code{.p.tex} file currently being processed is located, is also evaluated, if it exists. This file is referred to as the local environment file. The global environment file is evaluated first, and then the local one. This means that if a specific environment is defined both in the global and local environment files, the environment from the local file will overwrite the one from the global file. In this way, one can make changes to an environment that will only affect the local \code{.p.tex} files. At the same time, one can make changes to the global file, but these changes will only matter if the environment it concerns is not overwritten in the local environment files. One can thus add environments to the global file and they will be available when running Ptex2tex from any location. The configuration file is made up of different sections, one for each environment and one for the mapping of environment keys to the corresponding environment. Each environment can contain the following options: \bdat breplace ereplace newenv define fontsize bstretch \edat We refer to the \emp{ptex2tex.cfg} file in the \emp{lib/ptex2tex} directory to see a large number of examples of how these environments can be used. Each section has a heading enclosed by brackets. This heading will also be the name of the environment. The options for this environment should follow on the lines below. For instance, to define the Ptex2tex environment 'Extra' and the option \code{breplace}, we would write: \bplin [Extra] breplace = \begin{Verbatim} \eplin In addition to the sections defining the environments, there is a section \code{[names]}. In this section we map environment keys to Ptex2tex environments. For instance, if we want the key 'pro' to be associated with the environment 'Bluebox', we write: \bdat [names] pro = Bluebox \edat Hence we can use \code{\}\code{bpro} to indicate the beginning of the 'pro' environment, and \code{\}\code{epro} to indicate the end. We can set multiple keys to point to the same environment: \bdat [names] pro = Bluebox tmp = Bluebox \edat If we try to assign multiple environment to the same key, only the last one is used: \bdat [names] pro = Bluebox pro = Graybox \edat \subsection{Defining new environments} A Ptex2tex environment in the configuration file is defined by a section heading and several options. A minimum requirement of an environment is that the options \code{breplace} and \code{ereplace} are defined. Hence, for the environment 'Extra', the following lines should exist and be defined: \bplin [Extra] breplace = \begin{verbatim} erplace = \end{verbatim} \eplin In this case they define a simple \code{Verbatim} environment. \code{breplace} and \code{ereplace} control what \LaTeX~commands that should be returned at the beginning and at the end of the Ptex2tex environment, respectively. Note that only defining the environment is not enough, the keywords to be used with this environment also need to be defined in the 'names' section: \bdat [names] ext = Extra \edat Now, the keywords \code{\}\code{bext} and \code{\}\code{eext} will be replaced with the text defined in \code{breplace} and \code{ereplace}. We differ between two categories of environments in Ptex2tex: those that make use of the \code{\}\code{newenvironment} keywords in \LaTeX, and those who don't, but instead use other \LaTeX~ commands like \code{\}\code{minipage} and different packages like \code{fancyverb} or \code{framed} as well as different box environments. The problem with Ptex2tex environments that use \code{\}\code{newenvironment} is that \LaTeX~needs this environment to be defined, but not more than once, or it will issue an error. Therefore, when replacing the first occurrence of each environment keyword (for instance 'bpro'), a definition is added as well. This is the keyword \code{newenv} in the section for an environment. Default, this is an empty string. When running Ptex2tex on multiple files, and then combining these files in a single document, this environment will be defined multiple times, once for every \code{.p.tex} document. Since we run Ptex2tex on one file at the time, Ptex2tex cannot know if a specific environment is defined earlier. In order to get around this limitation, we use \code{\}\code{renewenvironment} instead of \code{\}\code{newenvironment}. But since it is not possible to renew an environment unless it already is defined, this by itself does not solve the problem. But if we first add the line \bdat \providecommand{\shadedquote}{} \edat we have created a way around this. What it does is to create a command \code{shadedquote} given that \code{shadedquote} is not already defined. There is no equivalent\\ (\code{\}\code{provideenvironment}) for environments, but since \code{\}\code{renewenvironment} simply checks if the name of the environment (\code{shadedquote}) is defined, not if it is defined as an environment, this works. When defining new environments as described above, the name of the environment must be unique in the configuration file. For example, ``shadedquote'' must not be defined in another environment. Ptex2tex is normally able to detect such problems. It is also possible to use an environment that is defined elsewhere, say in third-party \LaTeX~package. One can then use the option \code{define}. If it is set to \code{False}, it is assumed that the \LaTeX~environment is defined externally, and Ptex2tex will not define this environment. There are two types of boxes supported by the standard configuration file \emp{ptex2tex.cfg}. One kind (e.g., 'Blue') allows the text in the box to be split over pages, while the other kind (e.g., 'Blue\_sp') does not allow splitting, which often forces \LaTeX\ to move the box to the next space, leaving a lot of white space on the preceding page. % outdated: %Currently the %Ptex2tex environments 'Program' and 'Data' use %\code{\}\code{renewenvironment}. The names of the \LaTeX~environments are %\code{shadedquote} and \code{shadedquotedat}, respectively. %These two environments are also the only ones that support code spanning multiple %pages. This means that if the text between the beginning and ending keywords %is too long to fit on a single page, it is divided over several pages. With the %other Ptex2tex environments, the box enclosing the text might be %moved to the next page, leaving a lot of white space. In the case that the %text within the box exceeds one page, it will even disappear below the %bottom of the page. This is a known problem for those who have experience in %using \LaTeX. Please note that the names of the environments should not contain numbers, only letters. Naming an environment \code{\}\code{shadedquote2} makes the interpreter think that we are using \code{\}\code{shadedquote} followed by the number $2$. It is possible to use so-called variable interpolation in the configuration file. This means that one can use the name of one option in another option in the section, and the value for that option will then be included in the first option, for example: \bdat [SomeBox] breplace = \begin{Verb}[baselinestretch=%(bstretch)s] bstretch=0.85 \edat What happens here is that the \code{%(bstretch)s} part is substituted with the value of the option 'bstretch'. The \code{'\%'} indicates that the variable within the following parenthesis is to be interpolated. The 's' after the last parenthesis means that the option to be inserted is a string. See the \emp{ptex2tex.cfg} file in \emp{lib/ptex2tex} for numerous examples. Often, the option text for 'breplace' or 'ereplace' spans several lines (of \LaTeX~code). It is then important that the text for the lines following the first use the same indentation. It is possible to comment out some of the lines in the configuration file by using a \code{'#'} at the beginning of the line. Any other position won't work, as it will be parsed as part of the option instead. If you need to use comments in the \LaTeX~code, you need to use two \code{'\%'}, as only one will be considered as variable interpolation, and will likely cause an error. In the previous code example we show some of the mentioned points. For further documentation of Python Config Files, see the Python Library Reference. All options within a section of the configuration file are parsed within Ptex2tex. You can define your own options beyond the six mentioned, but this will result in a warning. %If you try to run \code{ptex2tex -h}, you will see that for every environment %that is found, there are two command-line arguments that are available. The %names of these are the keyword for the class followed by a \code{f} and a %\code{m}. For \code{pro}, these are thus \code{--prof} and %\code{--prom}. These stand for 'fontsize' and 'margin', respectively. Although %they are not currently used with any of the default environments that are %included with Ptex2tex, they are available as the class attributes %\code{fontsize} and \code{margin}. If they are not set at runtime, their %default value is \code{None}. \subsection{Remarks about \LaTeX~packages} Note that some of the environments present in the environment configuration file require certain \LaTeX~packages to be available. Specifically, you should use the following lines in the header and make sure the corresponding packages are installed on your system: \bdat \usepackage{relsize,fancyvrb,moreverb,epsfig,framed} \usepackage{color,listings2,codehighlight} %\usepackge{minted} \edat Many of the stylefiles are found in the \code{latex/styles} directory of the Ptex2tex source. For example, \code{codehighlight.sty} and \code{listings2.sty} are only found here and must be copied to the right directory for \LaTeX~packages. The \emp{minted} package requires the Python tool \emp{pygments} to be installed and \emp{latex} to be run with the extra option \emp{-shell-escape}. Therefore the \emp{minted} package is optional. It is only demanded for the \code{Minted_*} environments in the default \emp{.ptex2tex.cfg} configuration file. The Ptex2tex package comes with a \LaTeX~style file \code{ptex2tex.sty} containing the above \emp{usepackage} commands, plus some tweaks of packages. If the \code{ptex2tex.sty} file is installed correctly so that \LaTeX~can find it, one can simply use \bdat \usepackage{ptex2tex} \edat or \bdat \usepackage{ptex2tex,minted} \edat if the \code{Minted_*} environments are desired for typesetting code. One can also just copy the \code{ptex2tex.sty} file to the current working directory. This file, as well as the \code{.eps} files used for the Ptex2tex environments 'Warnings', 'Rules', and 'Summation', are located in the folder \code{latex} in the source code for Ptex2tex. The installation script for the package will try to install these to the computers' \LaTeX~folders, see the README file. \subsection{Additional keywords} In addition to the keywords starting with \code{@@@} and the keywords associated with beginning and ending Ptex2tex environments, there is another keyword available, namely \code{\}\code{code}. This keyword can be used anywhere in the text, as long as it is contained within a single line. This allows the use of any character, we can for instance write \code{\}\code{code}\code{{}\code{@#_%}\verb!}! without \LaTeX~giving us any errors. The result is similar to the \code{\}\code{texttt} \LaTeX~command, but it has nicer typesetting of (for instance) underscores. The \emp{code} command is really just a slightly modified normal inline verbatim construction where the font size can be controlled. Moreover, the escape character in \LaTeX, which is \code{\}, is removed in front of the characters \code{'\#'}, \code{'\%'}, \code{'\@'}, \code{'\$'} and \code{'\_'}. Writing \code{\}\code{code{}\code{\%}\smaller\verb!}!\larger~results in the text for the rest of the line after the character \code{\%} being marked as a comment in most editors, which is confusing. Writing \code{\}\code{code{}\code{\$}\smaller\verb!}!\larger~results in the text for the rest of the document being marked as a math environment. Using \code{\}\code{code{}\code{\}\code{\%}\smaller\verb!}!\larger~and \code{\}\code{code{}\code{\}\code{\$}\smaller\verb!}!\larger~instead gives us the same result in the final document without this problem appearing in our editor. \subsection{Mapping of keywords to environments} The default mapping between Ptex2tex keywords and environments is included for reference: \bdat # computer code in quote environment (gives a left margin): ccq = CodeIndented # computer code with no left margin: cc = Code # computer code with line numbering: ccl = CodeLineNo # program box: pro = BlueBar pypro = Minted_Python cpppro = Minted_Cpp cpro = Minted_C fpro = Minted_Fortran # computer code box (snippet, not complete program): cod = Blue pycod = Minted_Python cppcod = Minted_Cpp ccod = Minted_C fcod = Minted_Fortran # computer code box (snippet, not complete program): sni = Blue # data file: dat = CodeIndented # data file snippet: dsni = CodeIndented # system commands (in terminal window): sys = CodeTerminal # one-line system command (in terminal window): slin = Code # IPython interactive session: ipy = Code # standard interactive python session: py = Code # execution of a Python program ("run python"): rpy = CodeTerminal # one-line program code: plin = Code # verbatim environment: ver = Verb # warning box: warn = Warnings # tip box: rule = Tip # note box: summ = Note \edat You are free to define completely new keywords (and environments) in the configuration file. \subsection{Demo of the different environments} There is a test script \code{testconfig.py} that can read a configuration file and make a \LaTeX{} demo of all environments in that file. Just run the script in a directory with a \code{.ptex2tex.cfg} file. The result is a file \code{tmp_names} with definition of new environment keys pointing to all environments found in the configuration file. This \code{tmp_names} can be appended to your \code{.ptex2tex.cfg}. The script \code{testconfig.py} also makes a file \code{tmp_latex} which can be copied into any \LaTeX{} in Ptex2tex format (i.e., a \code{.p.tex} file) to see a demo of the environments. Below is such a \LaTeX{} demo. % demo created by inserting the tmp_latex file generated by ../bin/testconfig.py % first copy the latest .ptex2tex.cfg file: % cp ../lib/ptex2tex/ptex2tex.cfg .ptex2tex.cfg % run % python../bin/testconfig.py % insert tmp_names at the end of .ptex2tex.cfg % insert tmp_latex in this file (done via preprocess now) % % the make.sh script automates the steps % #include "envir_demo.tex" \section{Support} Please contact \code{ilmarw@simula.no} for bug reports, feature requests and general help. \end{document} ptex2tex-0.4/MANIFEST.in0000644000000000000000000000016711156450070013377 0ustar rootrootinclude README include *.cfg recursive-include lib/ *.cfg recursive-include latex/ * recursive-include doc/ *.pdf *.py ptex2tex-0.4/ptex2tex.cfg0000777000000000000000000000000011633377046020706 2lib/ptex2tex/ptex2tex.cfgustar rootrootptex2tex-0.4/misc/0000755000000000000000000000000011633377046012603 5ustar rootrootptex2tex-0.4/misc/makedist0000755000000000000000000000316411627360025014326 0ustar rootroot#!/bin/bash # This script creates a new release of ptex2tex # Make sure we have the current version echo '--- Synchronizing repository' sleep 1 svn update svn commit # Update version numbers echo '--- Update version number in CHANGELOG' sleep 1 emacs -nw CHANGELOG echo '--- Update version number in lib/ptex2tex/__init__.py' sleep 1 emacs -nw lib/ptex2tex/__init__.py echo '--- Update version number in setup.py' sleep 1 emacs -nw setup.py # Commit changes echo '--- Committing changes to repository' sleep 1 svn commit # Get the version number VERSION=`python -c "import sys;sys.path.insert(0, 'lib');import ptex2tex;print ptex2tex.__version__"` echo "--- Version number is $VERSION" # Tag repository svn cp https://ptex2tex.googlecode.com/svn/trunk/ \ https://ptex2tex.googlecode.com/svn/tags/$VERSION/ # Create archive echo "--- Creating release $VERSION of ptex2tex" mkdir -p dist cd dist rm -f ptex2tex-$VERSION.tar.gz rm -rf ptex2tex-$VERSION svn export https://ptex2tex.googlecode.com/svn/trunk ptex2tex-$VERSION GZIP=--best tar -cz --owner root --group root --mode a+rX -f \ ptex2tex-$VERSION.tar.gz ptex2tex-$VERSION cd .. # Create Windows installer rm -f dist/ptex2tex-$VERSION.win32.exe python setup.py bdist_wininst --plat-name win32 # Upload files to googlecode echo '--- Uploading files to googlecode' googlecode_upload.py \ -s "ptex2tex $VERSION - Source version" \ -p ptex2tex dist/ptex2tex-$VERSION.tar.gz googlecode_upload.py \ -s "ptex2tex $VERSION - Windows Installer" \ -p ptex2tex dist/ptex2tex-$VERSION.win32.exe # Edit web pages echo '--- Edit web pages' firefox http://ptex2tex.googlecode.com ptex2tex-0.4/LICENSE0000644000000000000000000000527411633366152012661 0ustar rootrootCopyright (c) 2007-2011, Hans Petter Langtangen and Simula Resarch Laboratory. Copyright (c) 2007-2009, Ilmar Wilbers and Simula Resarch Laboratory. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Simula Research Laboratory nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------- Other files with different licenses: latex/styles/minted.sty: Copyright 2010 Konrad Rudolph This work may be distributed and/or modified under the conditions of the LaTeX Project Public License, either version 1.3 of this license or (at your option) any later version. The latest version of this license is in http://www.latex-project.org/lppl.txt and version 1.3 or later is part of all distributions of LaTeX version 2005/12/01 or later. Additionally, the project may be distributed under the terms of the new BSD license. latex/*.eps and latex/*.fig: These figures are from the book "Guide to NumPy" by Travis E. Oliphant, which is released into the public domain. Both the book and the book source are available for download from http://www.tramy.us/. latex/styles/pythonhighlight.sty: Permission has been granted by the author Olivier Verdier to release this file together with Doconce under the new BSD license. ptex2tex-0.4/setup.py0000644000000000000000000000322411633376756013372 0ustar rootroot#!/usr/bin/env python """Distutils setup script for 'ptex2tex'.""" import sys, os, shutil, glob from distutils.core import setup name = "ptex2tex" latex = os.path.join('latex', '*.*') latex_files = glob.glob(latex) # The next line should probably have a Windows alternative: latex_dir = os.path.join('share', 'texmf', 'tex', 'latex', name) data_files = [(latex_dir, latex_files)] # Add man page data_files.append((os.path.join("share", "man", "man1"), [os.path.join("doc", "man", "man1", "ptex2tex.1.gz")])) out = setup(name=name, version="0.4", description="A filter for converting from .p.tex to .tex format", author="Ilmar M. Wilbers", author_email="ilmarw@simula.no", url="http://ptex2tex.googlecode.com", license="BSD", platforms=["Linux", "Mac OS X", "Unix"], keywords=["ptex2tex", "latex"], data_files=data_files, scripts=[os.path.join("bin", "ptex2tex")], package_dir = {'': 'lib'}, packages=['ptex2tex', os.path.join('ptex2tex', 'envs'), ], package_data = {'': ['ptex2tex.cfg']}, ) try: install_data = out.get_command_obj('install').install_data if install_data: print '\n*** LaTeX style files are located in:' print ' %s' %(os.path.join(install_data, latex_dir)) print ' Please make sure the latex command can' print ' locate them, see the README file.' except: print '\n*** Please make sure the latex command can locate' print ' the LaTeX style files, see the README file.' ptex2tex-0.4/lib/0000755000000000000000000000000011633377046012416 5ustar rootrootptex2tex-0.4/lib/ptex2tex/0000755000000000000000000000000011633377046014201 5ustar rootrootptex2tex-0.4/lib/ptex2tex/__init__.py0000755000000000000000000005105611633376756016333 0ustar rootroot#!/usr/bin/env python # -*- coding: utf-8 -*- __all__ = ['__doc__'] import sys, os, re, shutil, string, glob, commands from optparse import OptionParser import ptex2tex.envs as envs __version__ = "0.4" code_statement = "@@@CODE" data_statement = "@@@DATA" cmd_statement = "@@@CMD" def doc(): return """ Main class for converting from the ptex to the tex format. A little bit about the statements above starting with '@@@': code_statement: A line _starting_ with this statement indicates that a file is to be included in the .tex file. If there is only one arguments after the statement, the whole file is included. If a second argument is included, it is splitted with respect to character '@'. If only an expression in front of this character is given (the character can be skipped, so that only the expression is given), only the part of the file starting with that argument and ending with the end of the file is included. If an expression after the character is given as well, the part of the file starting with the first expression and ending at the beginning of the second expression is included. This means that the include part ends before the text in the second expression, hence that text is NOT included. When searching the file, the first occurence of the start expression is used, and the first occurence of the stop expression AFTER the start expression. This allows for usage of a text that exists in the file before the start expression as well as after, without using the first one. Whitespaces in front of and at the end of the expressions before and after '@' are stripped. If the whole file is included, the environment 'Program' is used. Otherwise, the environment 'Snippet' is used. An exception here is in the case that a second '@' is used after stop expression. This indicates that the 'Program' environment is to be used, instead of 'Snippet'. It is important to differ between this include statement and the include statement provided with the preprocessor package. The latter allows us to include a file by '% #include FILE', but does not set any environment variables for us, ie. the whole is included as is. Examples: @@@CODE IntegrateSine.py -> includes the whole file @@@CODE IntegrateSine.py # Test -> includes everything from the first instance of the string '# Test' @@@CODE IntegrateSine.py # Test @ -> includes everything from the first instance of the string '# Test' @@@CODE IntegrateSine.py for i in@sys.exit(1) -> includes everything from the first instance of the string 'for i in' _up to_ the first instance of 'sys.exit(1)' _after_ 'for i in'. data_statement: Exactly the same as code_statement, but a different environment is used. code_statement is meant to be used with program code, while data_statement is meant to be used with data files that are not code. cmd_statement: A line _starting_ with this statement indicates that we want to include the output from a shell command with commandline arguments. All text after the statement is included in the execution, except any statements after '#'. The character after '#' should be a number indicating whether the command to be called itself is to be included. '0' omits the commands, all other values will include it. If not present, the default choice is that the command _is_ included. A simple regex is used to allow statements like: python code/SineEval.py to be printed as python SineEval.py In order to avoid this, the argument after '#' must be set to 2. Examples: @@@CMD python code/SineEval.py 'sqrt(2)' 5 # 1 @@@CMD python code/SineEval.py 'sqrt(2)' 5 #1 @@@CMD python code/SineEval.py 'sqrt(2)' 5 -> the command itself is included with the output without 'code/' @@@CMD python code/SineEval.py 'sqrt(2)' 5 # 2 @@@CMD python code/SineEval.py 'sqrt(2)' 5 #2 -> the command itself is included with the output as is @@@CMD python SineEval.py 'sqrt(2)' 5 #0 @@@CMD python code/SineEval.py 'sqrt(2)' 5 # 0 -> the command itself is omitted, only the ouput is included. For now, the environment 'Verb' is used. """ class _Ptex2tex: __doc__ = doc() def __init__(self, argv=sys.argv): """ Command-line arguments: -v: turn on verbose mode -DVAR: define variable/macro VAR (can be many of these) -UVAR: undefine variable/macro VAR (can be many of these) All other options are controlled by the config file. """ # Define temporary files: self.file = argv[-1] filetype = os.path.splitext(self.file) if (filetype[1] == ".tex") and (filetype[0].split('.')[-1] == 'p'): self.file = os.path.splitext(filetype[0])[0] elif len(os.path.splitext(self.file)[1]) > 0: print "extension %s is illegal," %os.path.splitext(self.file)[1], print "this script should only be called for .p.tex files" sys.exit(1) self.ptexfile = self.file+".p.tex" self.preoutfile = self.file+".tmp1" self.transfile = self.file+".tmp2" self.texfile = self.file+".tex" self.verbose = True if '-v' in argv else False # other command-line args are defined below # Returns a dict where the keys are the names of the classes, # and the values are a tuple consisting of an instance of the class, # as well as the begin and end codes: self.supported = envs.envs(os.path.dirname(self.ptexfile)) # [preprocess] section contains defines/undefines # (a list of macro names) # and includes, a list of paths. The defines/undefines # are translated to a dict with names as keys and True/False values: #print 'self.supported:\n' #import pprint; pprint.pprint(self.supported) self.preprocess = self.supported.pop('preprocess') self.preprocess_defines = {} self.preprocess_substitute = False if 'defines' in self.preprocess: s = self.preprocess['defines'] for define in s.split(','): define = define.strip() if define: # non-empty string self.preprocess_defines[define] = True # add defines from the command line: for i in range(len(argv)): if argv[i].startswith('-D'): define = argv[i][2:] self.preprocess_defines[define] = True if argv[i] in ('-s', '--substitute'): self.preprocess_substitute = True if 'undefines' in self.preprocess: s = self.preprocess['undefines'] for define in s.split(','): define = define.strip() if define: # non-empty string # this is not right: #self.preprocess_defines[define] = False # this is the right way to do it (values in # the defines dict are always treated as True :-( if define in self.preprocess_defines: del self.preprocess_defines[define] # add undefines from the command line: for i in range(len(argv)): if argv[i].startswith('-U'): define = argv[i][2:] del self.preprocess_defines[define] if 'includes' in self.preprocess: s = self.preprocess['includes'] # comma-separated list acts as a tuple for eval: self.preprocess_includes = eval(s) else: self.preprocess_includes = [] # -I dir options to preprocess for i in range(len(argv)-1): if argv[i] == '-I': self.preprocess_includes.append(argv[i+1]) # [inline_code] section has the font item for \code and \emp commands: self.inline_code = self.supported.pop('inline_code') if not 'font' in self.inline_code: print "missing option 'font' in inline code" sys.exit(5) def strip(self, text): """Remove empty lines, but not single white-spaces. But only at the beginning and at the end.""" lines = text.split('\n') startline = 0; stopline = len(lines) for i in range(len(lines)): if lines[i].strip() > 0: startline = i break lines.reverse() for i in range(len(lines)): if lines[i].strip() > 0: stopline = i break lines.reverse() stopline = len(lines) - stopline return '\n'.join(lines[startline:stopline]).strip('\n') def preprocessor(self): """Run the preprocessor command on the file (if available).""" if not os.path.isfile(self.ptexfile): print "file %s not found" % self.ptexfile sys.exit(2) try: import preprocess except: print 'could not find the preprocess program, skipping preprocessing...' open(self.preoutfile, 'w').write(open(self.ptexfile).read()) return print "running preprocessor on %s... " % self.ptexfile, if self.preprocess_defines: h = [name for name in self.preprocess_defines] print 'defines: %s ' % (str(h)[1:-1]), if self.preprocess_includes: print 'includes: %s ' % (str(self.preprocess_includes)[1:-1]), preprocess.preprocess(self.ptexfile, self.preoutfile, defines=self.preprocess_defines, includePath=self.preprocess_includes, substitute=self.preprocess_substitute, force=1) print "done" def inline_tt(self): """Replace the \emp and \code environments with raw latex code.""" lines = open(self.preoutfile).read() # \emp{} commands: replace with \texttt{} and font adjustment pattern = re.compile(r'\\emp\{(.*?)\}') #, re.DOTALL) if self.inline_code['font'] == 'smaller': lines = re.sub(pattern, r'{\smaller\\texttt{\1}\larger{}}', lines) else: fontsize = int(self.inline_code['font']) lines = re.sub(pattern, r'{\\fontsize{%spt}{%spt}\\texttt{\1}}' % (fontsize, fontsize), lines) # several \code{} commands: replace with \verb!..! and font adjustment # first, remove backslashes (if present - these are never necessary, # and they should be removed from old documents) pattern = re.compile(r'\\code\{([^}]*?)\\_\\_([^}]*?)\\_\\_(.*?)\}') #, re.DOTALL) # re.DOTALL is problematic because verb!...! cannot have newline lines = re.sub(pattern, r'\code{\1__\2__\3}', lines) no_of_backslashes = 5 for i in range(no_of_backslashes): # Handle up to no_of_backslashes in backslash constructions pattern = re.compile(r'\\code\{([^}]*?)\\([_#%$@])(.*?)\}', re.DOTALL) lines = re.sub(pattern, r'\code{\1\2\3}', lines) # remove one newline (two implies far too long inline verbatim pattern = re.compile(r'\\code\{([^\n}]*?)\n(.*?)\}', re.DOTALL) lines = re.sub(pattern, r'\code{\1\2}', lines) pattern = re.compile(r'\\code\{([^\n}]*?)\n(.*?)\}', re.DOTALL) m = pattern.search(lines) if m: print r'\code{%s\n%s}' % (m.group(1), m.group(2)), \ 'contains newline - make a single line!' sys.exit(1) # now all \code{} are without backslashes and newline pattern = re.compile(r'\\code\{(.*?)\}', re.DOTALL) if self.inline_code['font'] == 'smaller': lines = re.sub(pattern, r'{\smaller\\verb!\1!\larger{}}', lines) else: fontsize = int(self.inline_code['font']) lines = re.sub(pattern, r'{\\fontsize{%spt}{%spt}\\verb!\1!}' % (fontsize, fontsize), lines) open(self.preoutfile, 'w').write(lines) def include_file(self): """Read from preoutfile file and write to transfile. If no include statements (statement variable) are found, copy directly to transfile.""" self.code_statement = code_statement self.data_statement = data_statement infile = open(self.preoutfile) lines = infile.read() if lines.find(self.code_statement) < 0 and lines.find(self.data_statement) < 0: shutil.copy(self.preoutfile, self.transfile) return outfile = open(self.transfile, 'w') if self.verbose: print self.transfile lines = lines.splitlines() if self.verbose: print lines for line in lines: code_found = line.startswith(self.code_statement) data_found = line.startswith(self.data_statement) if code_found or data_found: codefilename = line.split()[1] if self.verbose: print codefilename try: codefile = open(codefilename) except: print "include file %s could not be found" %codefilename sys.exit(2) code = codefile.read() codeline = string.join(line.split()[2:]) if self.verbose: print codeline if codeline.find('@') < 0: codeline += '@' regex = codeline.split('@') for i in range(len(regex)): regex[i] = regex[i].strip() if self.verbose: print regex startexp = None whole = False if len(regex[0]) > 0: if len(regex) > 2: whole = True startexp = regex[0].strip(); startexp = startexp.replace('~', ' ') if len(regex[1].strip()) > 1: stopexp = regex[1] stopexp = stopexp.replace('~', ' ') else: stopexp = "" if self.verbose: print startexp, stopexp start = code.find(startexp) while code[start-1] == ' ': start -= 1 if start < 0: print "start expression not found for %s" %codefilename print 'will start from the beginning of the file' start = 0 if startexp and stopexp: stop = start + code[start:].find(stopexp) else: stop = len(code) if stop < 0: print "stop expression not found for %s" %codefilename sys.exit(3) if self.verbose: print start, stop code = code[start:stop].rstrip() if self.verbose: print "inserting the following text:" print code if startexp and stopexp: if start == 0: regex[0] = 'BOF' insstr = 'from "%s" to "%s"' %(regex[0], regex[1]) elif startexp: insstr = "from %s to EOF" %regex[0] else: insstr = "(everything)" print "copying in file %s %s..." %(codefilename, insstr), if startexp and not whole: if code_found: outfile.write(self.supported['sni'][1]+"\n") elif data_found: outfile.write(self.supported['dsni'][1]+"\n") else: if code_found: outfile.write(self.supported['pro'][1]+"\n") elif data_found: outfile.write(self.supported['dat'][1]+"\n") outfile.write(self.strip(code)) if code: if code[-1] is not "\n": outfile.write("\n") if startexp and not whole: if code_found: outfile.write(self.supported['sni'][2]+"\n") elif data_found: outfile.write(self.supported['dsni'][2]+"\n") else: if code_found: outfile.write(self.supported['pro'][2]+"\n") elif data_found: outfile.write(self.supported['dat'][2]+"\n") print "done" else: outfile.write(line+"\n") code_found = False; data_found = False; whole = False outfile.close() def include_command(self): """Function for including output from shell commands.""" self.statement = cmd_statement infile = open(self.transfile) lines = infile.read() if lines.find(self.statement) < 0: return outfile = open(self.transfile, 'w') lines = lines.splitlines() for line in lines: if line.startswith(self.statement): command = string.join(line.split()[1:]) if self.verbose: print command if len(command.split('#')) > 1: command, include_cmd = command.split('#') include_cmd = include_cmd.strip() # Options: # 0: Command not included # 1: Command included, path stripped # 2: Command included, path not stripped # 3: Command included except for programname, path # stripped # 4: Command included except for programname, path not # stripped # Default: 3 try: include_cmd = int(include_cmd) except: print "argument after '#' in @@@CMD must be integer" if self.verbose: print include_cmd else: include_cmd = 3 failure, output = commands.getstatusoutput(command) if failure: print 'failed to run command', command print output sys.exit(4) print "copying in output from %s..." %command.strip(), outfile.write(self.supported['sys'][1] + "\n") if bool(int(include_cmd)): if include_cmd == 1 or include_cmd == 3: pattern = re.compile(r'\s+.*/') command = re.sub(pattern, ' ', command) if include_cmd == 3 or include_cmd == 4: index = command.strip().find(' ') command = command[index:].strip() outfile.write(command + '\n') outfile.write(output + '\n') outfile.write(self.supported['sys'][2] + "\n") print "done" else: outfile.write(line + '\n') outfile.close() def convert(self): """Function for converting from ptex to tex.""" infile = open(self.transfile) outfile = open(self.texfile, 'w') block = infile.read() lines = block.splitlines() # Use the instances of the environments: sorted_keys = self.supported.keys() sorted_keys.sort() sorted_keys.reverse() for key in sorted_keys: value = self.supported[key] obj = value[0] for i in range(len(lines)): if lines[i].startswith(value[1]): if obj.define: lines[i] = lines[i].replace(value[1], obj.newenv + value[1]) obj.define = False lines[i] = lines[i].replace(value[1], obj.breplace) elif lines[i].startswith(value[2]): lines[i] = lines[i].replace(value[2], obj.ereplace) elif lines[i].strip().startswith(value[1]) or lines[i].strip().startswith(value[2]): self._cleanup = False print '***warning: extra white-space detected, check line %d in %s' %(i, self.transfile) block = '\n'.join(lines) outfile.write(block) print 'done %s -> %s' % (self.ptexfile, self.texfile) def cleanup(self): """Function for deleting temporary files.""" os.remove(self.preoutfile) os.remove(self.transfile) def run(self): """Runs through the different functions necessary to complete the conversion.""" self._cleanup = True self.preprocessor() self.inline_tt() self.include_file() self.include_command() self.convert() if self._cleanup: self.cleanup() def init(argv=sys.argv): instance = _Ptex2tex(argv) instance.run() __doc__ = doc() ptex2tex-0.4/lib/ptex2tex/envs/0000755000000000000000000000000011633377046015154 5ustar rootrootptex2tex-0.4/lib/ptex2tex/envs/__init__.py0000644000000000000000000001737011433254002017255 0ustar rootrootimport glob, os, sys, re, shutil import ConfigParser def doc(): return """ Short description of use for envs/__init__.py, part of the ptex2tex package ================================================================== New environments are added by creating an instance of class Env and replacing the attributes. The following variables are inharited: self.fontsize self.bstretch self.margin fontsize and margin are defined by commandline arguments at runtime. bstretch is set depending on fontsize. Commandline arguments for new classes are automaticaly available, run 'ptex2tex -h' to view them. The commandline arguments result in the following strings: # fontsize : # tiny = fontsize{7pt}{7pt}\selectfont # small = fontsize{9pt}{9pt}\selectfont # normal = footnotesize # bstretch : # tiny = 0.6 # small = 0.85 # normal = 0.85 # margin is not used for the time being The functions breplace(self) and ereplace(self) return the LaTeX code we want to replace the keywords with. If the file '.ptex2tex' exists in the directory where the .p.tex file resides, additional environments can be defined in that file. Also, existing environments can be overwritten by defining them again. If the file does not exist, it is copied. """ __doc__ = doc() class Env(object): """Class for the different environments. All environments are instances of this class with the attributes replaced.""" # fontsize : # tiny = fontsize{7pt}{7pt}\selectfont # small = fontsize{9pt}{9pt}\selectfont # normal = footnotesize # bstretch : # tiny = 0.6 # small = 0.85 # normal = 0.85 # define : # True = Define environment once every file # False = Assumes environment defined externally def __init__(self): """Sets default values for attributes.""" self.fontsize = "footnotesize" self.bstretch = "0.85" self.name = "" self.env = r'{Verbatim}' self.newenv = "" self.breplace = "" self.ereplace = "" self.define = True self.envir_type = "" def __str__(self): s = '' #for attr in self.__dict__: # s += '\n%s:\n%s\n' % (attr, self.__dict__[attr]) s += '\nname: %s\n' % self.name s += '\n newenv: %s\n' % self.newenv return s def __repr__(self): return self.__str__() def envs(dirname): """Function for finding all valid environments, defined in the users home directory (.ptex2tex.cfg). If this file doesn't exist, it is copied there when ptex2tex is invoked. If a local .ptex2tex.cfg exists (in the directory where the .p.tex file resides), any options here will be added. Existing options will be overridden. Returns a dict where the keys are the codes for the classes, and the values are a tuple consisting of an instance of the class, as well as the begin and end codes. All files follow the ConfigParser (.cfg) style.""" cfgfile = os.path.join(os.path.join(dirname, '.ptex2tex.cfg')) if os.path.isfile(cfgfile): print 'using local config file .ptex2tex.cfg' homecfgfile = os.path.join(os.path.expanduser('~'), '.ptex2tex.cfg') if not os.path.isfile(homecfgfile): print 'copying .ptex2tex.cfg to %s' %(os.path.expanduser('~')) shutil.copy(os.path.join(os.path.dirname(__file__), os.pardir, 'ptex2tex.cfg'), homecfgfile) cfgfiles = [homecfgfile, cfgfile] config = ConfigParser.SafeConfigParser() config.read(cfgfiles) supported0 = {} sections = config.sections() if not 'inline_code' in sections: print "section 'inline_code' not found in config file" sys.exit(8) supported0['inline_code'] = {} for option in config.options('inline_code'): supported0['inline_code'][option] = config.get('inline_code', option) supported0['preprocess'] = {} for option in config.options('preprocess'): supported0['preprocess'][option] = config.get('preprocess', option) # Find all entries in names section: if not 'names' in sections: print "section 'names' not found in config file" sys.exit(6) names = sections.pop(sections.index('names')) # Run through all environment names in the [names] section, # find the corresponding environment type and fill in the # supported0[envir_name] dict with an Env object with the # attributes containing the information in the environment type. for envir_name in config.options(names): key = envir_name envir_type = config.get(names, envir_name) supported0[envir_name] = Env() supported0[envir_name].name = envir_name supported0[envir_name].envir_type = envir_type if not envir_type in sections: print "the environment type '%s' is not defined in the configuration file" % (envir_type) sys.exit(7) for option in config.options(envir_type): curdict = supported0[envir_name].__dict__ # Disable warninga, we should encourage the use of user defined # variables in config file: #if not hasattr(supported0[envir_name], option): # print "***warning: unknown option '%s' in environment '%s' " % \ # (option, envir_type) if option == 'define': curdict.update({option: config.getboolean(envir_type, option)}) else: curdict.update({option: config.get(envir_type, option)}) supported = {} for key in supported0: Env_instance = supported0[key] if key == 'inline_code' or key == 'preprocess': supported[key] = supported0[key] continue envir_name = Env_instance.name try: supported[key] = (Env_instance, '\\' + 'b' + envir_name, '\\' + 'e' + envir_name) except: print "error in environment " + key sys.exit(4) # check that newenvironment names are different: newenvir_names = [] newenvir_types = [] exceptions = ('shadedwbar', 'shadedskip', ) import re c = re.compile(r'renewenvironment\{(.+?)\}', re.DOTALL) for key in supported: if key == 'inline_code' or key == 'preprocess': continue #print 'envir "%s" points to [%s]' % (key, supported[key][0].envir_type) newenv = supported[key][0].newenv if newenv: all = c.findall(newenv) if all: for e in exceptions: if e in all: all.remove(e) for name in all: #print 'Found', name # is this environment name defined before? if name in newenvir_names: envir_type = supported[key][0].envir_type #print 'Found %s in [%s]' % (name, envir_type) other_envir_type = newenvir_types[newenvir_names.index(name)] #xoprint 'Found %s in [%s] too' % (name, other_envir_type) if other_envir_type != envir_type: print """ Error: new latex environment "%s" defined in [%s] in configuration file, but this environment is alread defined in [%s]. Construct another name for "%s" in [%s].""" % \ (name, envir_type, other_envir_type, name, envir_type) sys.exit(8) else: newenvir_names.append(name) newenvir_types.append(supported[key][0].envir_type) return supported ptex2tex-0.4/lib/ptex2tex/ptex2tex.cfg0000644000000000000000000004440411551656130016444 0ustar rootroot # plain Verbatim environment: [Verb] breplace = \begin{Verbatim} ereplace = \end{Verbatim} # white background, rules above and below, with a title box "Code" [CodeRule] breplace = \vspace{4pt} \begin{Verbatim}[numbers=none,frame=lines,label=\fbox{{\tiny %(boxtext)s}},fontsize=\%(fontsize)s, labelposition=topline,framesep=2.5mm,framerule=1pt] ereplace = \end{Verbatim} boxtext = Code fontsize = fontsize{9pt}{9pt} # white background, rules above and below, with a title box "Terminal" [CodeTerminal] breplace = \vspace{4pt} \begin{Verbatim}[numbers=none,frame=lines,label=\fbox{{\tiny %(boxtext)s}},fontsize=\%(fontsize)s, labelposition=topline,framesep=2.5mm,framerule=0.7pt] ereplace = \end{Verbatim} fontsize = fontsize{9pt}{9pt} boxtext = Terminal # more plain Verbatim environment [Code] breplace = \begin{Verbatim}[fontsize=\%(fontsize)s,tabsize=8,baselinestretch=%(bstretch)s] ereplace = \end{Verbatim} \noindent bstretch = 0.85 fontsize = fontsize{9pt}{9pt} # as Code, but with line numbers [CodeLineNo] breplace = \begin{Verbatim}[numbers=left,fontsize=\%(fontsize)s,tabsize=8,baselinestretch=%(bstretch)s] ereplace = \end{Verbatim} \noindent bstretch = 0.85 fontsize = fontsize{9pt}{9pt} # as Code, but indented: [CodeIndented] breplace = \begin{Verbatim}[fontsize=\%(fontsize)s,tabsize=8,baselinestretch=%(bstretch)s, fontfamily=tt,xleftmargin=7mm] ereplace = \end{Verbatim} \noindent bstretch = 0.85 fontsize = fontsize{9pt}{9pt} # as CodeIndented, but larger font (10pt9: [CodeIndented10] breplace = \begin{Verbatim}[fontsize=\%(fontsize)s,tabsize=8,baselinestretch=%(bstretch)s, fontfamily=tt,xleftmargin=7mm] ereplace = \end{Verbatim} \noindent bstretch = 0.85 fontsize = fontsize{10pt}{10pt} # Python code, highligheted through the package pythonhighlight.sty: [PyHighlight] breplace = \begin{python} ereplace = \end{python} # Several minted styles (requires minted LaTeX package and Pygments) [Minted_Python] breplace = \begin{minted}[fontsize=\%(fontsize)s,linenos=false,mathescape,baselinestretch=%(bstretch)s,fontfamily=tt,xleftmargin=7mm]{python} ereplace = \end{minted} \noindent bstretch = 1.0 fontsize = fontsize{9pt}{9pt} [Minted_Cython] breplace = \begin{minted}[fontsize=\%(fontsize)s,linenos=false,mathescape,baselinestretch=%(bstretch)s,fontfamily=tt,xleftmargin=7mm]{cython} ereplace = \end{minted} \noindent bstretch = 1.0 fontsize = fontsize{9pt}{9pt} [Minted_Cpp] breplace = \begin{minted}[fontsize=\%(fontsize)s,linenos=false,mathescape,baselinestretch=%(bstretch)s,fontfamily=tt,xleftmargin=7mm]{c++} ereplace = \end{minted} \noindent bstretch = 1.0 fontsize = fontsize{9pt}{9pt} [Minted_C] breplace = \begin{minted}[fontsize=\%(fontsize)s,linenos=false,mathescape,baselinestretch=%(bstretch)s,fontfamily=tt,xleftmargin=7mm]{c} ereplace = \end{minted} \noindent bstretch = 1.0 fontsize = fontsize{9pt}{9pt} [Minted_Fortran] breplace = \begin{minted}[fontsize=\%(fontsize)s,linenos=false,mathescape,baselinestretch=%(bstretch)s,fontfamily=tt,xleftmargin=7mm]{fortran} ereplace = \end{minted} \noindent bstretch = 1.0 fontsize = fontsize{9pt}{9pt} # warning box, pink background, warning sign [Warnings] breplace = \definecolor{warnback}{rgb}{1.0, 0.8235294, 0.8235294} \setlength{\fboxrule}{2pt} \begin{center} \fcolorbox{black}{warnback}{ \begin{minipage}{0.8\textwidth} \includegraphics[height=0.3in]{warning.eps} \vskip-0.3in\hskip1.5in{\large\bf WARNING} \\[0.2cm] ereplace = \end{minipage}} \end{center} \setlength{\fboxrule}{0.4pt} %% Back to default # tip box, light blue background, "i" (info) sign [Tip] breplace = \definecolor{tipback}{rgb}{0.87843, 0.95686, 1.0} \setlength{\fboxrule}{2pt} \begin{center} \fcolorbox{black}{tipback}{ \begin{minipage}{0.8\textwidth} \includegraphics[height=0.3in]{tip.eps} \vskip-0.3in\hskip1.5in{\large\bf TIP} \\[0.2cm] ereplace = \end{minipage}} \end{center} \setlength{\fboxrule}{0.4pt} %% Back to default # note box, "i" (info) sign [Note] breplace = \definecolor{noteback}{rgb}{0.988235, 0.964706, 0.862745} \setlength{\fboxrule}{2pt} \begin{center} \fcolorbox{black}{noteback}{ \begin{minipage}{0.8\textwidth} \includegraphics[height=0.3in]{tip.eps} \vskip-0.3in\hskip1.5in{\large\bf NOTE} \\[0.2cm] ereplace = \end{minipage}} \end{center} \setlength{\fboxrule}{0.4pt} %% Back to default # colored box, can handle multiple pages [Blue] shadecolor = 0.87843, 0.95686, 1.0 envname = Blue define = True newenv = \providecommand{\shadedskip}{} \definecolor{shadecolor}{rgb}{%(shadecolor)s} \renewenvironment{shadedskip}{ \def\FrameCommand{\colorbox{shadecolor}}\FrameRule0.6pt \MakeFramed {\FrameRestore}\vskip3mm}{\vskip0mm\endMakeFramed} \providecommand{\shadedquote%(envname)s}{} \renewenvironment{shadedquote%(envname)s}[1][]{ \bgroup\rmfamily \fboxsep=0mm\relax \begin{shadedskip} \list{}{\parsep=-2mm\parskip=0mm\topsep=0pt\leftmargin=2mm \rightmargin=2\leftmargin\leftmargin=4pt\relax} \item\relax} {\endlist\end{shadedskip}\egroup} breplace = \begin{shadedquote%(envname)s} # \centering{\large\bf Program} \\[0.2cm] \fontsize{9pt}{9pt} \begin{Verbatim} ereplace = \end{Verbatim} \end{shadedquote%(envname)s} \noindent # colored box, can handle multiple pages # \fcolorbox{black}{yellow} [BlueFrame] shadecolor = 0.87843, 0.95686, 1.0 envname = BlueFrame define = True newenv = \providecommand{\shadedskip}{} \definecolor{shadecolor}{rgb}{%(shadecolor)s} \renewenvironment{shadedskip}{ \def\FrameCommand{\fcolorbox{black}{shadecolor}}\FrameRule0.6pt \MakeFramed {\FrameRestore}\vskip3mm}{\vskip0mm\endMakeFramed} \providecommand{\shadedquote%(envname)s}{} \renewenvironment{shadedquote%(envname)s}[1][]{ \bgroup\rmfamily \fboxsep=0mm\relax \begin{shadedskip} \list{}{\parsep=-2mm\parskip=0mm\topsep=0pt\leftmargin=2mm \rightmargin=2\leftmargin\leftmargin=4pt\relax} \item\relax} {\endlist\end{shadedskip}\egroup} breplace = \begin{shadedquote%(envname)s} # \centering{\large\bf Program} \\[0.2cm] \fontsize{9pt}{9pt} \begin{Verbatim} ereplace = \end{Verbatim} \end{shadedquote%(envname)s} \noindent # colored box with left vertical bar, can handle multiple pages [BlueBar] shadecolor = 0.87843, 0.95686, 1.0 barcolor = 0.7, 0.95686, 1 envname = BlueBar define = True newenv = \providecommand{\shadedwbar}{} \definecolor{shadecolor}{rgb}{%(shadecolor)s} \renewenvironment{shadedwbar}{ \def\FrameCommand{\color[rgb]{%(barcolor)s}\vrule width 1mm\normalcolor\colorbox{shadecolor}}\FrameRule0.6pt \MakeFramed {\advance\hsize-2mm\FrameRestore}\vskip3mm}{\vskip0mm\endMakeFramed} \providecommand{\shadedquote%(envname)s}{} \renewenvironment{shadedquote%(envname)s}[1][]{ \bgroup\rmfamily \fboxsep=0mm\relax \begin{shadedwbar} \list{}{\parsep=-2mm\parskip=0mm\topsep=0pt\leftmargin=2mm \rightmargin=2\leftmargin\leftmargin=4pt\relax} \item\relax} {\endlist\end{shadedwbar}\egroup} breplace = \begin{shadedquote%(envname)s} # \centering{\large\bf Program} \\[0.2cm] \fontsize{9pt}{9pt} \begin{Verbatim} ereplace = \end{Verbatim} \end{shadedquote%(envname)s} \noindent # colored box, can handle multiple pages [Red] shadecolor = 1, 0.97, 0.85 envname = Red define = True newenv = \providecommand{\shadedskip}{} \definecolor{shadecolor}{rgb}{%(shadecolor)s} \renewenvironment{shadedskip}{ \def\FrameCommand{\colorbox{shadecolor}}\FrameRule0.6pt \MakeFramed {\FrameRestore}\vskip3mm}{\vskip0mm\endMakeFramed} \providecommand{\shadedquote%(envname)s}{} \renewenvironment{shadedquote%(envname)s}[1][]{ \bgroup\rmfamily \fboxsep=0mm\relax \begin{shadedskip} \list{}{\parsep=-2mm\parskip=0mm\topsep=0pt\leftmargin=2mm \rightmargin=2\leftmargin\leftmargin=4pt\relax} \item\relax} {\endlist\end{shadedskip}\egroup} breplace = \begin{shadedquote%(envname)s} # \centering{\large\bf Program} \\[0.2cm] \fontsize{9pt}{9pt} \begin{Verbatim} ereplace = \end{Verbatim} \end{shadedquote%(envname)s} \noindent # colored box, can handle multiple pages [RedFrame] shadecolor = 1, 0.97, 0.85 envname = RedFrame define = True newenv = \providecommand{\shadedskip}{} \definecolor{shadecolor}{rgb}{%(shadecolor)s} \renewenvironment{shadedskip}{ \def\FrameCommand{\fcolorbox{black}{shadecolor}}\FrameRule0.6pt \MakeFramed {\FrameRestore}\vskip3mm}{\vskip0mm\endMakeFramed} \providecommand{\shadedquote%(envname)s}{} \renewenvironment{shadedquote%(envname)s}[1][]{ \bgroup\rmfamily \fboxsep=0mm\relax \begin{shadedskip} \list{}{\parsep=-2mm\parskip=0mm\topsep=0pt\leftmargin=2mm \rightmargin=2\leftmargin\leftmargin=4pt\relax} \item\relax} {\endlist\end{shadedskip}\egroup} breplace = \begin{shadedquote%(envname)s} # \centering{\large\bf Program} \\[0.2cm] \fontsize{9pt}{9pt} \begin{Verbatim} ereplace = \end{Verbatim} \end{shadedquote%(envname)s} \noindent # colored box with left vertical bar, can handle multiple pages [RedBar] shadecolor = 1, 0.97, 0.85 barcolor = 1, 0.85, 0.85 envname = RedBar define = True newenv = \providecommand{\shadedwbar}{} \definecolor{shadecolor}{rgb}{%(shadecolor)s} \renewenvironment{shadedwbar}{ \def\FrameCommand{\color[rgb]{%(barcolor)s}\vrule width 1mm\normalcolor\colorbox{shadecolor}}\FrameRule0.6pt \MakeFramed {\advance\hsize-2mm\FrameRestore}\vskip3mm}{\vskip0mm\endMakeFramed} \providecommand{\shadedquote%(envname)s}{} \renewenvironment{shadedquote%(envname)s}[1][]{ \bgroup\rmfamily \fboxsep=0mm\relax \begin{shadedwbar} \list{}{\parsep=-2mm\parskip=0mm\topsep=0pt\leftmargin=2mm \rightmargin=2\leftmargin\leftmargin=4pt\relax} \item\relax} {\endlist\end{shadedwbar}\egroup} breplace = \begin{shadedquote%(envname)s} # \centering{\large\bf Program} \\[0.2cm] \fontsize{9pt}{9pt} \begin{Verbatim} ereplace = \end{Verbatim} \end{shadedquote%(envname)s} \noindent # colored box, can handle multiple pages [Yellow] shadecolor = 1.0, 1.0, 0.7 envname = Yellow define = True newenv = \providecommand{\shadedskip}{} \definecolor{shadecolor}{rgb}{%(shadecolor)s} \renewenvironment{shadedskip}{ \def\FrameCommand{\colorbox{shadecolor}}\FrameRule0.6pt \MakeFramed {\FrameRestore}\vskip3mm}{\vskip0mm\endMakeFramed} \providecommand{\shadedquote%(envname)s}{} \renewenvironment{shadedquote%(envname)s}[1][]{ \bgroup\rmfamily \fboxsep=0mm\relax \begin{shadedskip} \list{}{\parsep=-2mm\parskip=0mm\topsep=0pt\leftmargin=2mm \rightmargin=2\leftmargin\leftmargin=4pt\relax} \item\relax} {\endlist\end{shadedskip}\egroup} breplace = \begin{shadedquote%(envname)s} # \centering{\large\bf Program} \\[0.2cm] \fontsize{9pt}{9pt} \begin{Verbatim} ereplace = \end{Verbatim} \end{shadedquote%(envname)s} \noindent # colored box, can handle multiple pages [Gray] envname = Gray define = True newenv = \providecommand{\shadedskip}{} \definecolor{shadecolor}{gray}{0.93} \renewenvironment{shadedskip}{ \def\FrameCommand{\colorbox{shadecolor}}\FrameRule0.6pt \MakeFramed {\FrameRestore}\vskip3mm}{\vskip0mm\endMakeFramed} \providecommand{\shadedquote%(envname)s}{} \renewenvironment{shadedquote%(envname)s}[1][]{ \bgroup\rmfamily \fboxsep=0mm\relax \begin{shadedskip} \list{}{\parsep=-2mm\parskip=0mm\topsep=0pt\leftmargin=2mm \rightmargin=2\leftmargin\leftmargin=4pt\relax} \item\relax} {\endlist\end{shadedskip}\egroup} breplace = \begin{shadedquote%(envname)s} # \centering{\large\bf Program} \\[0.2cm] \fontsize{9pt}{9pt} \begin{Verbatim} ereplace = \end{Verbatim} \end{shadedquote%(envname)s} \noindent # light blue shaded box, can handle multiple pages, "snippet" to the right [Blue_snippet] define = True newenv = \providecommand{\shadedquoteBluesnippet}{} \renewenvironment{shadedquoteBluesnippet}[1][]{ \definecolor{shadecolor}{rgb}{0.87843, 0.95686, 1.0} \definecolor{shadetitle}{rgb}{0.5, 0.95686, 1} \bgroup\rmfamily \fboxsep=0mm\relax \begin{shaded} {{\hfill\tiny\textsf{\textcolor{shadetitle}{Snippet\ \ }}}} \list{}{\parsep=-2mm\parskip=0mm\topsep=0pt\leftmargin=2mm \rightmargin=2\leftmargin\leftmargin=4pt\relax} \item\relax} {\endlist{\textcolor{shadecolor}{\ }}\end{shaded}\egroup} breplace = \begin{shadedquoteBluesnippet} # \centering{\large\bf Program} \\[0.2cm] \fontsize{9pt}{9pt} \begin{Verbatim} ereplace = \end{Verbatim} \end{shadedquoteBluesnippet} \noindent # light blue, shaded box, can not handle multiple pages (sp = single page) [Blue_singlepage] breplace = \begin{SaveVerbatim}{Snippet} ereplace = \end{SaveVerbatim} \setlength{\fboxrule}{0pt} \begin{center} \definecolor{shadecolor}{rgb}{0.87843, 0.95686, 1.0} \fcolorbox{black}{shadecolor}{ \begin{minipage}{0.97\textwidth} # \centering{\large\bf Program snippet} \\[0.2cm] \raggedright \fontsize{9pt}{9pt}\selectfont{\BUseVerbatim{Snippet}} \end{minipage}} \end{center} \setlength{\fboxrule}{0.4pt} %% Back to default \noindent # light gray, shaded box, can not handle multiple pages (sp = single page) [Gray_singlepage] breplace = \begin{SaveVerbatim}{Programsingle} ereplace = \end{SaveVerbatim} \setlength{\fboxrule}{0pt} \begin{center} \definecolor{shadecolor}{gray}{0.93} \fcolorbox{black}{shadecolor}{ \begin{minipage}{0.97\textwidth} # \centering{\large\bf Program line} \\[0.2cm] \raggedright \fontsize{9pt}{9pt}\selectfont{\BUseVerbatim{Programsingle}} \end{minipage}} \end{center} \setlength{\fboxrule}{0.4pt} %% Back to default \noindent # Tiago Quintino's code environment (requires ptex2tex.sty) [TiagoPy] breplace = \lstset{language=Python} \begin{lstlisting} \fontsize{9pt}{9pt} ereplace = \end{lstlisting}\vspace{3mm} # Tiago Quintino's code environment (requires ptex2tex.sty) [TiagoCpp] breplace = \lstset{language=[ISO]{C++}} \begin{lstlisting} \fontsize{9pt}{9pt} ereplace = \end{lstlisting}\vspace{3mm} # FEniCS style code environment [FEniCS] define = True newenv = \providecommand{\fenicscode}{} \renewenvironment{fenicscode}[1]{ \center\tabular{c}\hline\\ \footnotesize \minipage{#1\textwidth}\verbatim} {\endverbatim\endminipage\\ \\ \hline\endtabular\endcenter} breplace = \begin{fenicscode}{0.9} ereplace = \end{fenicscode} # FEniCS style code environment [FEniCSsmall] define = True newenv = \providecommand{\fenicscodesmall}{} \renewenvironment{fenicscodesmall}[1]{ \center\footnotesize\minipage{#1\textwidth}\verbatim} {\endverbatim\endminipage\endcenter} breplace = \begin{fenicscodesmall}{0.9} ereplace = \end{fenicscodesmall} # NOTE: The CodeGrayWhite1/2 redefine \FancyVerbFormatLine and this # will affect all forthcoming styles that use fancyvrb (quite many!). # Be careful with this environment # Code with gray background and white split between lines: [CodeGrayWhite1] breplace = \definecolor{Light}{gray}{.80} \renewcommand{\FancyVerbFormatLine}[1]{\colorbox{Light}{\makebox[\linewidth][l]{#1}}} \begin{Verbatim}[fontsize=\%(fontsize)s,numbers=left,tabsize=8,baselinestretch=%(bstretch)s,fontfamily=tt,xleftmargin=7mm] ereplace = \end{Verbatim} \noindent bstretch = 0.85 fontsize = fontsize{9pt}{9pt} # as CodeGrayWhite1, but no line numbers: [CodeGrayWhite2] breplace = \definecolor{Light}{gray}{.80} \renewcommand{\FancyVerbFormatLine}[1]{\colorbox{Light}{\makebox[\linewidth][l]{#1}}} \begin{Verbatim}[fontsize=\%(fontsize)s,tabsize=8,baselinestretch=%(bstretch)s,fontfamily=tt,xleftmargin=7mm] ereplace = \end{Verbatim} \noindent bstretch = 0.85 fontsize = fontsize{9pt}{9pt} [inline_code] font = 10 [preprocess] #defines = T2 #undefines = T2 #includes = /home/some/body/myfile [names] # the names below are just examples - new names can be # defined instead or in addition to those listed here # computer code in quote environment (gives a left margin): ccq = CodeIndented # computer code with no left margin: cc = Code # computer code with line numbering: ccl = CodeLineNo # program box: pro = BlueBar pypro = Minted_Python cpppro = Minted_Cpp cpro = Minted_C fpro = Minted_Fortran # computer code box (snippet, not complete program): cod = Blue pycod = Minted_Python cycod = Minted_Cython cppcod = Minted_Cpp ccod = Minted_C fcod = Minted_Fortran # computer code box (snippet, not complete program): #sni = Blue_snippet sni = Blue # data file: dat = CodeIndented # data file snippet: dsni = CodeIndented # system commands (in terminal window): sys = CodeTerminal # one-line system command (in terminal window): slin = Code # IPython interactive session: ipy = Code # standard interactive python session: py = Code # execution of a Python program ("run python"): rpy = CodeTerminal # one-line program code: plin = Code # verbatim environment: ver = Verb # warning box: warn = Warnings # tip box: rule = Tip # note box: summ = Note ptex2tex-0.4/TODO0000644000000000000000000000351211164132407012326 0ustar rootroot- Add changes made for 0.31 to documentation: - '~' for space in CODE/DATA - New section 'inline_code' in ConfigFile. - Support for preprocess commandline arguments in ConfigFile (own section). - Check for names in renewenvironments. - Testconfig.py. - Warning for space in front of environment keys, do not delete temp files. - Testconfig.py should not be executable, instead called when running ptex2tex --test or similar. - Change the name of the classes for the environment from their original names to names describing their looks, the way it is now is confusing. This goes also for the temporary names within the LaTeX code. - Implement the possibility of having @@@CODE and the like inside environments without the file actually being included. ctex2tex has a variable insidebc that is set and checked. - Add arguments to the beginning statements of ptex2tex environments, such that the header for Warnings, Rules, Summation and MatlabA can be set. - Add possibility for defining what environments are used with @@@CODE, @@@DATA and @@@CMD in configuration file. - Add possibility for setting the default vale for the integer following the character '#' in @@@CMD in the configuration file. - Add support for preprocessor's commandline arguments. - CODE does not except regex, one has to write 'def func(' instead of 'def func\(': less backwards compability (ctex2tex). Add option --regex so that ptex2tex using regex instead of line.search - Add functionality in @@@CMD to strip lines with reverse sign \r >>> d.split('\r') ['time=4', 'time=5'] >>> d.split('\r')[-1] 'time=5' - Add functionality to strip code text in @@@CODE (try/except and __debug__-blocks. - Windows: Add ptex2tex.bat Can be automated, see setup.py file for Instant. - doc: Add documentation for \code and \emp.