diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/statrep/statrep.dtx |
Initial commit
Diffstat (limited to 'macros/latex/contrib/statrep/statrep.dtx')
-rw-r--r-- | macros/latex/contrib/statrep/statrep.dtx | 2960 |
1 files changed, 2960 insertions, 0 deletions
diff --git a/macros/latex/contrib/statrep/statrep.dtx b/macros/latex/contrib/statrep/statrep.dtx new file mode 100644 index 0000000000..38f90f325b --- /dev/null +++ b/macros/latex/contrib/statrep/statrep.dtx @@ -0,0 +1,2960 @@ +% \iffalse meta-comment +%<*internal> +\iffalse +%</internal> +%<*readme> +ABOUT + +The StatRep package is a LaTeX package that provides two environments and +two tags that work together to display your SAS code and results and to +generate the SAS program that produces those results. The two environments +(Datastep and Sascode) display SAS code. The two tags (Listing and Graphic) +display SAS output. + +The generated SAS program includes calls to macros that use the SAS +Output Delivery System (ODS) document to capture the output as external files. +These SAS macros are included in this package (statrep_macros.sas). + +The package is available in two locations: + + * http://support.sas.com/StatRepPackage + * http://mirror.ctan.org/macros/latex/contrib/statrep/ + +The distribution(statrep.zip) consists of the following files: + README.txt (this file) + statrep_macros.sas SAS macro file + statrep_tagset.sas SAS tagset and style for LaTeX tabular output + statrepmanual.pdf StatRep Package User's Guide (pdf) + statrepmanual.tex StatRep Package User's Guide (source) + quickstart.tex Example and tutorial LaTeX file + statrep.dtx Package source file + statrep.ins Install file (for MikTeX Users) + +INSTALL + +Unzip the file statrep.zip to a temporary directory and +perform the following steps: + +Step 1: Install the StatRep SAS Macros + + Copy the file statrep_macros.sas to a local directory. If you have a + folder where you keep your personal set of macros, copy the file + there. Otherwise, create a directory such as C:\mymacros and copy + the file into that directory. + +Step 2: Install the StatRep LaTeX Package + + If you are working with the MikTeX distribution on Windows and it is + configured to download and install packages automatically, you can + skip this step. Otherwise, see these instructions for installing + packages for MikTeX: + http://docs.miktex.org/manual/localadditions.html + + The following instructions show how to install the StatRep package in the + TeXLive LaTeX distribution for your personal use. If you maintain a + system-wide LaTeX distribution and you want to make StatRep + available to all users, see more detailed information about how + to install LaTeX packages at + http://www.tex.ac.uk/cgi-bin/texfaq2html?label=what-TDS + + a) + Determine the location that LaTeX uses to load packages. From a + command-line prompt, give the following command: + kpsewhich -var-value=TEXMFHOME + + The command will return the root directory name in which LaTeX can + find your personally installed packages. + + b) + Create the directory if it does not exist and create the additional + subdirectories tex/latex/statrep + Your directory tree will have the following structure: + --------------- + root directory/ (given by kpsewhich command in 2a) + tex/ + latex/ + statrep/ + + d) + Copy the files statrep.dtx, statrepmanual.pdf, and statrepmanual.tex to + the statrep subdirectory. Your directory tree will have the following structure: + --------------- + root directory/ (given by kpsewhich command in 2a) + tex/ + latex/ + statrep/ + statrep.dtx + statrepmanual.pdf + statrepmanual.tex + --------------- + + e) + Change to the statrep directory and give the following command: + pdflatex statrep.dtx + + The command creates several files, one of which is the configuration + file, statrep.cfg. + +Step 3: Let the StatRep Package Know the Location of the StatRep SAS Macros + + Edit the statrep.cfg file generated in Step 2d so that the macro SRmacropath contains + the correct location of the macro file from step 1. For example, if + you copied the statrep_macros.sas file to a directory named 'C:\mymacros', + then you define macro \SRmacropath as follows: + \def\SRmacropath{c:/mymacros/statrep_macros.sas} + + Note the use of the forward slash in the definition. Use the forward slash + as the directory name delimiter instead of the backslash, which is a special + character in LaTeX. + +EXPLORE + + You can now test and experiment with the package. Create a working + directory and copy the file quickstart.tex into it. + + To generate the quickstart document: + 1) Compile the document with pdfLaTeX. You can use a LaTeX-aware + editor such as TeXworks or use the command-line command 'pdflatex'. + This step generates the SAS program that is needed to produce the results. + + 2) Execute the SAS program quickstart_SR.sas, which was automatically + created in the preceding step. This step generates the SAS + results that are requested in the quickstart document. + + 3) Recompile the document with pdfLaTeX. This step compiles the + quickstart document to PDF, this time including the SAS results + that are generated in the preceding step. + + You might need to repeat this step so that LaTeX can re- + measure the listing outputs to ensure that they are framed properly. + + Notes: You can make changes to the file with a LaTeX-aware editor + or with any plain-text editor such as NotePad or emacs. + + You can read the StatRep User's Guide for complete usage details. + It is included in the file statrepmanual.pdf that you copied + in the installation step 2d. + +UNINSTALL + + To uninstall the package, delete the statrep directory that you created + in the installation step 2d and remove the SAS macro file statrep_macros.sas + that you copied in Installation step 1. + +NOTE + + StatRep now includes limited support for SAS ODS LaTeX output. + See the StatRep User's Guide for details. + +LICENSE + +statrep.dtx +statrep_macros.sas +statrep_tagset.sas +statrepmanual.tex + +Copyright (c) 2015 SAS Institute Inc. + +Permission is granted to copy, distribute, and/or modify this software +under the terms of the LaTeX Project Public License (LPPL), version 1.3. + +This software is provided by SAS Institute Inc. as a service to its users. +It is provided 'as is', without warranty of any kind, either expressed or +implied, including, but not limited to, the implied warranties of +merchantibility and fitness for a particular purpose. +See http://www.latex-project.org/lppl.txt for the details of that license. + +This work has the LPPL maintenance status 'maintained'. +The Current Maintainer of this work is Tim Arnold (tim dot arnold at sas dot com). + +REQUIREMENTS + + pdfLaTeX typesetting engine 1.30 or later + + LaTeX packages + verbatim, graphicx, xkeyval, calc, ifthen + SAS 9.2 or later + +See the StatRep User's Guide, included with this package, for complete details. + +This work consists of the files: + README (this file) + statrep_macros.sas + statrep_tagset.sas + statrepmanual.tex + statrepmanual.pdf + quickstart.tex + statrep.dtx + statrep.ins + statrep.pdf + statrep.sty + statrep.cfg +%</readme> +%<*internal> +\fi +\def\nameofplainTeX{plain} +\ifx\fmtname\nameofplainTeX\else + \expandafter\begingroup +\fi +%</internal> +%<*install> +\input docstrip.tex +\keepsilent +\askforoverwritefalse +\preamble +---------------------------------------------------------------- +StatRep --- A LaTeX package to generate documentation and a SAS program that + generates the SAS results used in the source document. + The package helps to support reproducible research. + +E-mail: tim.arnold@sas.com +---------------------------------------------------------------- +\endpreamble +\postamble +Copyright (C) 2015 by SAS Institute Inc. <tim.arnold@sas.com> + +This work consists of the files + statrep.dtx, + statrep_macros.sas, + statrep_tagset.sas + statrepmanual.tex, + quickstart.tex + +and the derived files + statrep.ins, statrep.cfg, statrep.sty, longfigure.sty, + statrep.pdf, + statrep_macros.sas, + statrepmanual.pdf +\endpostamble +\generate{\file{statrep.sty}{\from{statrep.dtx}{statrep,cfg}}} +\generate{\file{statrep.cfg}{\from{statrep.dtx}{cfg}}} +\generate{\file{longfigure.sty}{\from{statrep.dtx}{longfigure}}} +%</install> +%<install>\endbatchfile +%<*internal> +\generate{\file{statrep.ins}{\from{statrep.dtx}{install}} +} +\nopreamble\nopostamble +\generate{\file{README.}{\from{statrep.dtx}{readme}}} +\ifx\fmtname\nameofplainTeX + \expandafter\endbatchfile +\else + \expandafter\endgroup +\fi +%</internal> +%<*statrep> +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{statrep}[2015/09/15 v1.07 The statrep package] +%</statrep> +%<*driver> +\documentclass[11pt]{ltxdoc} +\usepackage[T1]{fontenc} +\usepackage{float} +\restylefloat{figure} +\usepackage{tocloft} +\usepackage[lined,boxed,linesnumbered]{algorithm2e} +\usepackage{parskip} +\usepackage{xspace} +\usepackage{framed} +\usepackage{xcolor} +\definecolor{shadecolor}{rgb}{0.8,0.9,1} +\definecolor{lightblue}{rgb}{0.93,0.95,1.0} +\definecolor{darkblue}{rgb}{0,0,0.6} +\usepackage{mathptmx} +\usepackage{upquote} +\usepackage[numbered]{hypdoc} +\usepackage{statrep} + \newcommand*{\Statrep}{\textsf{StatRep}\xspace} +\newcommand*{\Sasoption}{\marginpar{\hfill\emph{SAS option}}} +\DeclareTextFontCommand{\Code}{\ttfamily\bfseries} +\uchyph=0 +\EnableCrossrefs +\CodelineIndex +\RecordChanges +\begin{document} + \DocInput{statrep.dtx} +\end{document} +%</driver> +%\fi +%\def\filename{statrep.dtx} +%\def\fileversion{1.07} +%\def\filedate{\today} +%\CheckSum{2172} +%\StopEventually{\PrintChanges\PrintIndex} +% +% \CharacterTable +% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +% Digits \0\1\2\3\4\5\6\7\8\9 +% Exclamation \! Double quote \" Hash (number) \# +% Dollar \$ Percent \% Ampersand \& +% Acute accent \' Left paren \( Right paren \) +% Asterisk \* Plus \+ Comma \, +% Minus \- Point \. Solidus \/ +% Colon \: Semicolon \; Less than \< +% Equals \= Greater than \> Question mark \? +% Commercial at \@ Left bracket \[ Backslash \\ +% Right bracket \] Circumflex \^ Underscore \_ +% Grave accent \` Left brace \{ Vertical bar \| +% Right brace \} Tilde \~} +% +% +%\changes{v1.0}{2011/11/15}{Initial version} +%\changes{v1.01}{2012/05/23}{Updated README for MikTeX users} +%\changes{v1.02}{2014/06/16}{Added options for graphtype and odsgraphopts} +%\changes{v1.03}{2014/06/19}{Added support for PDF graphics} +%\changes{v1.04}{2014/09/08}{Fixed ligatures appearing in Listings} +%\changes{v1.05}{2014/10/27}{Added support SAS-generated LaTeX table output} +%\changes{v1.06}{2015/01/15}{Added support for root directory specification} +%\changes{v1.07}{2015/09/15}{Fixed bug with losing margins after an output} +%\GetFileInfo{statrep.sty} +% +% +%\DoNotIndex{\.,\@auxout,\@height,\^,\addcontentsline,\addvspace,\arabic,\bfseries} +%\DoNotIndex{\boolean,\DeclareOptionX,\do,\dospecials,\hskip,\hoffset,\insert,\label} +%\DoNotIndex{\LaTeX,\leftskip,\loop,\ProcessOptionsX,\real,\repeat,\stepcounter} +%\DoNotIndex{\@@Function,\@@endpbox,\@@startpbox,\@Function,\@M,\@Mi,\@acol} +%\DoNotIndex{\%,\@@endpbox,\@@startpbox,\@M,\@Mi,\@acol,\@arraycr} +%\DoNotIndex{\@arrayparboxrestore,\@arstrut,\@arstrutbox,\@cclv,\@classiv} +%\DoNotIndex{\@classz,\@colht,\@colroom,\@depth,\@ehc,\@endpbox,\@finalstrut} +%\DoNotIndex{\@firstofone,\@footnotetext,\@getpen,\@gobble,\@gtempa,\@ifnextchar} +%\DoNotIndex{\@ifstar,\@ifundefined,\@let@token,\@lowpenalty,\@makecol,\@makeother,\@medpenalty} +%\DoNotIndex{\@mkpream,\@mparbottom,\@ne,\@outputpage,\@preamble,\@sharp,\@spaces} +%\DoNotIndex{\@startpbox,\@tabacol,\@tabarray,\@tabclassiv,\@tabclassz,\@tabularcr} +%\DoNotIndex{\@testopt,@twocolumntrue,\@undefined,\@width,\@xargarraycr,\@xdblarg} +%\DoNotIndex{\@yargarraycr,\\,\^,\2,\9,\advance,\aftergroup,\arabic\arrayrulewidth} +%\DoNotIndex{\arraystretch,\begin,\begingroup,\bgroup,\bigskipamount,\bgroup} +%\DoNotIndex{\bigskipamount,\box,\break,\c@footnote,\c@LF@chunks,\c@LFchunksize,\c@page} +%\DoNotIndex{\cloeout,\col@number,\col@sep,\copy,\count@,\cr,\crcr,\csname,\def} +%\DoNotIndex{\define@boolkeys,\define@cmdkeys,\dimen@,\dimen@ii,\doublerulesep} +%\DoNotIndex{\dp,\edef,\egroup,\else,\end,\endcsname,\endgraf,\endgroup,\endinput} +%\DoNotIndex{\endLFfirsthead,\endLFfoot,\endLFhead,\endLFlastfoot,,\equal,\everycr} +%\DoNotIndex{\expandafter,\extrarowheight,\fi,\fill,\footins,\footnotetext,\futurelet} +%\DoNotIndex{\gdef,\global,\halign,\hbadness,\hbox,\hfil,\hfill,\hline,\hrule} +%\DoNotIndex{\hsize,\ht,\if,\if@filesw,\if@twocolumn,\ifcase,\ifdim,\ifhbox,\ifhmode,\iffalse,\ifnum} +%\DoNotIndex{\ifthenelse,\ifvoid,\ifx,\immediate,\isert,\itemsep,\itshape,\kern,\kill} +%\DoNotIndex{\lastbox,\leaders,\let,\LF@@hl,\LF@@hline,\LF@@save@row,\LF@@tabarray} +%\DoNotIndex{\LF@array,\LF@argtabularcr,\LF@bchunk,\LF@blank@row,\LF@build@blank,\LF@cols,\LF@crcr} +%\DoNotIndex{\LF@def@row,\LF@echunk,\LF@end@hd@ft,\LF@end@pen,\LF@endpbox,\LF@entry} +%\DoNotIndex{\LF@entry@chop,\LF@entry@write,\LF@err,\LF@final@warn,\LF@get@widths} +%\DoNotIndex{\LF@kill,\LF@lastfoot,\LF@LL@FM@cr,\LF@max@sel,\LF@mcol,\LF@n@fcols} +%\DoNotIndex{\LF@no@pgbk,\LF@nofcols,\LF@ntabularcr,\LF@old@row,\LF@output,\LF@p@ftn} +%\DoNotIndex{\LF@p@ftntext,\LF@rebox,\LF@rows,\LF@save@row,\LF@sep,\LF@setprevdepth} +%\DoNotIndex{\LF@startpbox,\LF@t@bularcr,\LF@tabularcr,\LF@warn,\LF@xtabularcr} +%\DoNotIndex{\LFchunksize,\LFlistoffalse,\LFlistoftrue,\LFoutfile,\LFpost,\LFpre} +%\DoNotIndex{\LFright,\LF@samefalse,\LF@sametrue,\LFupcase,\lineskip,\m@ne,\m@th} +%\DoNotIndex{\MakeUppercase,\mathchardef,\maxdepth,\maxdimen,\MessageBreak,\multicols} +%\DoNotIndex{\multicolumn,\multispan,\newbox,\newcommand,\newcount,\newcounter,\newdimen} +%\DoNotIndex{\newenvironment,\newif,\newlength,\newpage,\newsavebox,\newskip,\newtoks} +%\DoNotIndex{\newwrite,\noalign,\nobreak,\noexpand,\noindent,\nopagebreak,\number} +%\DoNotIndex{\numberline,\omit,\or,\output,\outputpenalty,\pagebreak,\pagegoal,\pagetotal} +%\DoNotIndex{\par,\parbox,\parsep,\parskip,\partopsep,\penalty,\prevdepth,\protect} +%\DoNotIndex{\ProvidesPackage,\relax,\renewcommand,\romannumeral,\saswfk,\sbox,\savebox} +%\DoNotIndex{\selectfont,\setboolean,\setbox,\setcounter,\setlength,\setlongfigures,\settowidth} +%\DoNotIndex{\sffamily,\space,\strutbox,\tabcolsep,\tabskip,\tabularnewline,\the} +%\DoNotIndex{\thetable,\topsep,\ttfamily,\tw@,\unhbox,\unskip,\unvbox,\vbox,\vfil} +%\DoNotIndex{\vrule,\vsize,\vskip,\vspace,\vsplit,\vfuzz,\vss,\vtop,\wd,\write,\x,\xdef} +%\DoNotIndex{\z@} +%\DoNotIndex{\@empty,\@tempa,\@tempboxa,\@tempdima,\@twocolumntrue,\baselineskip} +%\DoNotIndex{\c@LF@tables,\detokenize,\hss,\LF@c@ption,\LF@capti@n,\LF@firsthead} +%\DoNotIndex{\LF@foot,\LF@head,\LF@hline\LF@make@row,\LF@name,\LF@start,\LFcounter} +%\DoNotIndex{\LFProcessOptions,\RequirePackage,\string,\SR@outkey,\SR@outval,\usebox} +% +%\title{The \textsf{statrep} package\thanks{This document corresponds +%to \textsf{statrep}~\fileversion, last revised \filedate.}} +%\author{Tim Arnold and Warren F. Kuhfeld\\SAS Institute Inc.\\\texttt{tim.arnold@sas.com}\\\texttt{warren.kuhfeld@sas.com}} +%\date{\filedate} +%\maketitle +%\iffalse +%<*statrep> +%\fi +% \tableofcontents\listoffigures +% \section{About This Document} +% This document uses the following aids for presenting information. +% \begin{itemize} +% \item The verbatim font (\Code{example text}) is used for names of variables, +% macros, and environments. +% +% \item Hyperlinks are displayed in \textcolor{red}{red}. +% \item Figures are displayed with a light blue background. +%\item Macro names are given in the margin near where the macro is defined or described. +% \item The index contains terms with pointers to the code lines. +% \end{itemize} +% \section{\Statrep Usage} +% \index{statrep package|usage} +% To use the \Statrep package, add the \cs{usepackage} command to your document preamble after you +% declare the \Code{documentclass}. +% +% Figure \ref{fig:usage} shows an example of using the \Statrep package and +% specifying two of its three options. +% \iffalse +%<*example> +% \fi +%\begin{figure}[H] +%\begin{snugshade} +\begin{verbatim} +\documentclass{book} +\usepackage[figname=output,resetby=chapter]{statrep} +\end{verbatim} +%\end{snugshade} +%\caption{Example of Using the \Statrep Package}\label{fig:usage} +%\end{figure} +% \iffalse +%</example> +% \fi +% +% The \Statrep package supports the following options: +% \begin{itemize} +% \item \Code{generate} specifies whether a SAS program +% is generated at compile time. \index{generate option} +% It can have a value of \Code{true} or \Code{false}; the default is \Code{true}. +% +% \item \Code{figname=} specifies the name of a \LaTeX\ counter +% that is used for numbering outputs\index{figname option}. +% The default is \Code{figure}. If you specify a value for the \Code{figname} +% option for which no counter exists, +% a counter is created. +% +% \item \Code{resetby=} specifies that the counter for output numbering be reset with +% each change in the specified counter value. For example, if \Code{resetby=chapter}, +% all output numbering is reset when the chapter value changes. See section +% \ref{longfigure} for details. Also, refer to the \Code{tocloft} package documentation +% for information about how the lists are typeset.\index{list of outputs, creating}% +% \end{itemize} +% +% The options \Code{figname=} and \Code{resetby=} are not used directly by the \Statrep +% package but are passed to the \Code{longfigure} package. +% +% The |longfigure| package is provided with the \Statrep package. It +% supports display and page breaking within a stream of outputs, and it can be +% used independently of the \Statrep package. It supports the options |figname=| +% and |resetby=|. For complete details about the implementation of the |longfigure| package, +% see section \ref{longfigure}. +% +% +% In Figure \ref{fig:usage}, the specified options label the included output as +% appropriately numbered \Code{Output}s and enable a \textit{List of Outputs} to be generated. +% To generate a \textit{List of Outputs}, add the \cs{listofoutput} +% command at the point in your document where you want +% the \textit{List of Outputs} to appear. +% If you specify \Code{figname=display}, add the \cs{listofdisplay} command +% where you want the \textit{List of Displays} to appear. +% +% If you load the \Statrep package with no options, +% the outputs are labeled as figures and you can display the \textit{List of Figures} +% with the command \cs{listoffigures}. +% +% % For more information about how to use the \Statrep package, see the \Statrep User's Guide +% (\texttt{statrepmanual.pdf}) that accompanies the \Statrep distribution. +% +% \section{\Statrep Implementation} +% +% \subsection{Required Packages} +% The \Statrep package requires the following \LaTeX\ packages. Each package is available +% in a relatively recent \TeX{}Live distribution (2005 or later). +% +% \begin{macrocode} +\RequirePackage{verbatim} +\RequirePackage{graphicx} +\RequirePackage{xkeyval} +\RequirePackage{calc} +\RequirePackage{ifthen} +% \end{macrocode} +% \begin{itemize} +% \item The |verbatim| package provides the foundation for the \Statrep package. +% \item The |graphicx| package enables inclusion of images and is used by the \cs{Graphic} tag. +% \item The |xkeyval|, |calc|, and |ifthen| packages provide programming capabilities that are +% used throughout the \Statrep package. +% \end{itemize} +% +% \begin{macrocode} +\newif\ifSR@generate\SR@generatetrue +\DeclareOptionX{generate}[true]{\@nameuse{SR@generate#1}} +\DeclareOptionX{color}[true]{% + \IfFileExists{sas.sty} + {\PassOptionsToPackage{\CurrentOption}{sas}} + {\relax} +} +\DeclareOptionX{figname}{\PassOptionsToPackage{\CurrentOption}{longfigure}} +\DeclareOptionX{resetby}{\PassOptionsToPackage{\CurrentOption}{longfigure}} +\ProcessOptionsX +\IfFileExists{sas.sty} + {\RequirePackage{sas}} + {\relax} +\RequirePackage{longfigure} +% \end{macrocode} +% +% Declare an option for \texttt{color}; Pass the value to the \texttt{sas} +% package if it exists, otherwise do nothing. This option has no effect if +% the ODS Listing destination is used. It applies only to SAS-generated +% LaTeX tabular output. +% +% The file \texttt{sas.sty} is loaded if it exists. The file is created by a SAS ODS +% tagset that is experimental; the tagset generates SAS output as LaTeX tables. More +% information on this experimental support can be found in the User's Guide (appendix). +% +% +% \subsection{Programming Utilities}\label{utilities} +% The programming helpers described in this section are used +% throughout the package: +% +% \begin{macrocode} +\ifSR@generate\def\SR@writepgm{\immediate\write} +\else\let\SR@writepgm\@gobbletwo +\fi +% \end{macrocode} +% \DescribeMacro{\SR@generate} +% \cs{SR@generate} is a Boolean switch that is created and defined to have a +% default value of |true|. The switch is used to provide alternative definitions of +% a utility macro \cs{SR@writepgm}. +% \DescribeMacro{\SR@writepgm} +% If the switch remains true, \cs{SR@writepgm} is defined as +% \cs{immediate}\cs{write}; +% otherwise, it is defined to remove its two arguments (\cs{@gobbletwo}). +% +% The effect of these alternative definitions is as follows. +% When you do not override the default (by default, |generate| is true), +% the macro writes to a file stream that represents the generated program file. +% Otherwise, the macro is defined to remove its two arguments (therefore, it is effectively +% a null operation). +% +% The following two commands set the tolerance for bad boxes, orphans, and widows: +% \begin{macrocode} +\newcommand*{\dosloppy}{\setlength{\hfuzz}{\maxdimen}\hbadness\maxdimen} +\newcommand*{\unsloppy}{\setlength{\hfuzz}{0.3pt}\hbadness 1414} +% \end{macrocode} +% +% \DescribeMacro{\dosloppy} +% \DescribeMacro{\unsloppy} +% The |dosloppy| macro is intended to be used when you knowingly violate +% typesetting rules, such as when you must write extremely +% wide outputs. For such situations, set the tolerance +% high with |dosloppy| and set it back to normal with |unsloppy|. These settings +% do not change \LaTeX's line-breaking algorithms or line penalties; they suppress +% the overfull box (\cs{hfuzz}) and underfull box (\cs{hbadness}) warnings in the log. +% The system uses theses commands when it insert outputs. +% See the +% \cs{SR@set@outmargin} macro in section \ref{insert} for +% details. +% +% The following definitions are used to calculate and set the output +% stream of listings or figures. See section \ref{insert} for details. +% \begin{macrocode} +\newlength{\SR@scratchlength} +\newlength{\SR@verbwidth} +\newsavebox{\SR@filebox} +\newcommand*{\SR@firsthead}{} +\newcommand*{\SR@conthead}{} +\newcommand*{\SR@endfoot}{} +% \end{macrocode} +% The following variables aid in constructing the two verbatim environments +% provided in the \Statrep package: +% \begin{macrocode} +\newcounter{SR@currentline}\setcounter{SR@currentline}{0} +\newcounter{SR@displayline}\setcounter{SR@displayline}{0} +\newcounter{SR@programline}\setcounter{SR@programline}{0} +\newcounter{SR@startinglastline}\setcounter{SR@startinglastline}{0} +\newcounter{SR@totallines}\setcounter{SR@totallines}{0} +\newcounter{SR@multifilecount}\setcounter{SR@multifilecount}{0} +\newboolean{SR@multifile}\setboolean{SR@multifile}{false} +% \end{macrocode} +% \begin{itemize} +% \item |SR@currentline| contains the current line number of the +% |verbatim| environment that is being processed. +% +% \item |SR@displayline| contains the number of lines to display. +% The number can be specified as a line command inside a |Sascode| environment. +% +% \item |SR@programline| contains the number of lines to write to the +% generated program. +% The number can be specified as a line command inside a |Sascode| environment. +% +% \item |SR@startinglastline| contains the line number that begins the bottom block +% of an abbreviated displayed |Datastep| environment. This counter is used +% when the |last=| option is specified in the |Datastep| environment. +% +% \item |SR@totallines| contains the total number of lines in the +% |verbatim| environment. +% +% \item |SR@multifilecount| counter is used to step through and insert +% a set of output files that are generated by SAS. +% +% +% \item |SR@multifile| is a Boolean switch that is used in the algorithm that +% inserts the stream of outputs. See section \ref{insert} for complete details. +% \end{itemize} +% + +% \begin{macrocode} +\begingroup\catcode`\#=12\gdef\SR@hashchar{#}\endgroup +% \end{macrocode} +% \DescribeMacro{\SR@hashchar} +% The \cs{SR@hashchar} macro is used in writing options that are specified in the +% \cs{Listing} and \cs{Graphic} macros. Options that specify SAS ODS +% object names +% can contain a hash character. In the \LaTeX\ source, the normal +% hash character (|#|) must be escaped (|\#|). When the string is written +% to the generated program, the escaping backslash must be removed. +% The definition resets the category code inside a group so that +% the change will not affect other definitions. Then the \cs{SR@hashchar} +% macro is globally defined as an unescaped hash character. +% +% The \cs{SR@hashchar} macro is used in the \cs{SR@write@outoptions} macro. +% See section \ref{output} for details. +% +% \DescribeMacro{SR@ keys} +% The following |SR@| family of keys is used in the |Datastep| and |Sascode| environments +% and the \cs{Listing} and \cs{Graphic} macros. +% \begin{macrocode} +\define@boolkeys{SR}[SR@]{display,program,continued}[true]{} +\define@cmdkeys{SR}[SR@]{caption,first,last}{} +\define@cmdkeys{SR}[SR@]{fontsize,scale,label}{} +% \end{macrocode} +% The keys are used for two purposes: One set of keys is used by the \Statrep +% package to typeset the environments or outputs that are defined in the package. +% Another set of keys is used to communicate with SAS; the keys are passed through +% directly to the generated program. There is some overlap between the two +% set of keys. For example, the |width| key is used by the \Statrep package +% to typeset the output that is specified in a \cs{Graphic} tag and is used by SAS +% to generate the image. +% +% The following keys are used only by the \Statrep package: +% \index{display option|usage}\index{program option|usage}\index{first option|usage} +% \index{caption option|usage}\index{continued option|usage}\index{last option|usage} +% \index{fontsize option|usage}\index{scale option|usage} +% \begin{itemize} +% \item |display| is a Boolean key that specifies that a |Sascode| or |Datastep| block +% should only be displayed. +% \item |program| is a Boolean key that specifies that a |Sascode| or |Datastep| block +% should only be written to the program file. +% +% \item |continued| is a Boolean key that specifies whether the output is a +% continuation of a preceding output block. +% +% \item |caption=| specifies the caption to use for a |Listing| or |Graphic| output. +% +% \item |first=| specifies the number of top lines to display in a |Datastep| environment. +% \item |last=| specifies the number of bottom lines to display in a |Datastep| environment. +% \item |fontsize=| specifies the \LaTeX\ font size to use in displaying output +% or code environment (for example, |small| or |footnotesize|). +% \item |scale=| specifies a factor by which to scale a |Graphic| image. +% For example, specify |scale=0.5| to scale the image to half its original size, +% or specify |scale=2| to scale it to double its original size. +% \item |label=| is used internally by the \Statrep package to generate a label +% for \cs{Graphic} and \cs{Listing} elements. +% \end{itemize} +% +% The following keys are used both by the \Statrep package and by SAS: +% \index{store option|usage}\index{linesize option|usage}\index{width option|usage} +% \begin{itemize} +% \item |store=| specifies the name of the ODS document store to be created in a +% |Sascode| environment. When this key is specified, the \Statrep package +% writes the appropriate SAS program lines to the generated program. When this +% key is not specified, the \Statrep package assumes that the author has written +% the SAS macro calls into the |Sascode| blocks. +% +% \item |linesize=| specifies the line size that is used to generate and +% typeset |Listing| output. Typical values are |80|, |96|, or |120|. +% +% \item |width=| specifies the width to generate or display |Graphic| output. +% +% \item |dest=| specifies the SAS ODS destination to use for tabular output. +% The possible values are |listing| and |latex|. The |listing| option includes verbatim +% text-based tables from the ODS LISTING destination. The |latex| option includes +% LaTeX tabular environments that use the |sas| package (generated during the SAS run). +% \end{itemize} +% \begin{macrocode} +\define@cmdkeys{SR}[SR@]{store,linesize,width,dest}{} +% \end{macrocode} +% The remaining keys are defined and accepted by the \cs{Listing} and \cs{Graphic} +% macros, but are passed on to the generated SAS program. The following keys are +% used only by SAS: +% \begin{macrocode} +\define@cmdkeys{SR}[SR@]{type,style,dpi}{} +\define@cmdkeys{SR}[SR@]{firstobj,lastobj}{} +\define@cmdkeys{SR}[SR@]{objects,pattern,options}{} +\define@cmdkeys{SR}[SR@]{height,pagesize}{} +% \end{macrocode} +% +% \index{type option|usage}\index{height option|usage} +% \index{objects option|usage}\index{pattern option|usage}\index{style option|usage} +% \index{dpi option|usage}\index{pagesize option|usage}\index{firstobj option|usage} +% \index{lastobj option|usage} +% \begin{itemize} +% \item |style=| specifies the ODS style to use in generating output. +% \item |dpi=| specifies how many dots per inch (DPI) to use in generating a graph. +% +% \item |firstobj=| specifies the first object's name to capture in an output stream. +% \item |lastobj=| specifies the last object's name to capture in an output stream. +% \item |objects=| specifies a space-separated list of object names to capture. +% \item |pattern=| specifies a name-matching pattern to select objects to capture. +% +% \item |options=| specifies other options for generating output. +% \item |height=| specifies the height of a generated graph (for example, |height=5.4in|). +% \item |pagesize=| specifies page size for output. +% \item |type=| specifies the type of output stream to initiate (|graphic| or |listing|). +% If the automatic program generation capability is in effect +% (that is, the |store=| option is specified), +% the \cs{Listing} and \cs{Graphic} tags automatically generate the appropriate +% value for this key. +% +% \end{itemize} +% +% \DescribeMacro{\presetkeys} +% When any environment or command uses the keys, it first calls the following +% |presetkeys| macro, which provides default values for each key: +% \begin{macrocode} +\presetkeys{SR}{% + display = false, program = false, continued = false, + caption = \@empty, first = 0, last = 0, + fontsize = \@empty, scale = \@empty, label = \@empty, + store = \@empty, linesize = \@empty, width = \@empty, + type = \@empty, style = \@empty, dpi = \@empty, + dest = \@empty, firstobj = \@empty, lastobj = \@empty, + objects = \@empty, pattern = \@empty, options = \@empty, + height = \@empty, pagesize = \@empty}{} +% \end{macrocode} +% \subsection{Customizable Settings} +%\iffalse +%</statrep> +%<*cfg> +%\fi +% \index{customizing|usage} +% The definitions in this section can be overridden by settings in the external file +% |statrep.cfg|.\index{statrep.cfg|usage} +% +% \DescribeMacro{\SRmacropath} +% \cs{SRmacropath} specifies the path to the location of the +% SAS macros that are bundled with the \Statrep package. You can define +% the path by using forward slashes (/) instead of backslashes (\textbackslash) +% as the directory +% name delimiter. If you do use backslashes, you +% must insert a backslash character into this argument by using the +% \cs{@backslashchar} command. +% The default value is the current +% directory. That is, the definition for the path to the macro file +% is the filename itself, |statrep_macros.sas|. +% \begin{macrocode} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Edit this line to point to the location of the StatRep macros. +\def\SRmacropath{statrep_macros.sas} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \end{macrocode} +%% The following statements define line size, page size, graphic resolution, +%% and also specify the default ODS output style: +% \DescribeMacro{\SRlinesize}\DescribeMacro{\SRpagesize} +% \DescribeMacro{\SRdpi}\DescribeMacro{\SRstyle}\DescribeMacro{\SRodsgraphopts} +% \DescribeMacro{\SRlatexstyle} +%\changes{v1.06}{2015/01/15}{Added rootdir for SAS/Studio support.} +% \begin{macrocode} +\def\SRrootdir{.} +\def\SRlinesize{80} +\def\SRpagesize{500} +\def\SRdpi{300} +\def\SRstyle{statistical} +\def\SRlatexstyle{statrep} +\def\SRodsgraphopts{} +% \end{macrocode} + +% The following statements define system options used in the generated SAS program% +% \begin{itemize} +% \item \cs{SRlinesize} specifies the default linesize to use for listing output. +% \item \cs{SRpagesize} specifies the default pagesize to use for listing output. +% \item \cs{SRdpi} specifies the default DPI setting to use for GRSEG and ODS graphics. +% \item \cs{SRstyle} specifies the default ODS output style to use for ODS graphics. +% \item \cs{SRlatexstyle} specifies the ODS output style to use for LaTeX tabular output. +% The default is |statrep|, which is provided in the supplmental file +% |statrep_tagset.sas|. +% \end{itemize} +% \begin{macrocode} +\def\SRgraphicdir{\SRrootdir/png} +\def\SRgraphtype{png} +\def\SRlistingdir{\SRrootdir/lst} +\def\SRlatexdir{\SRrootdir/tex} +\def\SRdefaultdests{listing} +% \end{macrocode} +% \DescribeMacro{\SRgraphicdir}\DescribeMacro{\SRgraphtype}\DescribeMacro{\SRlistingdir} +% \DescribeMacro{\SRdefaultdests}\DescribeMacro{\SRlatexdir} +% \begin{itemize} +% \item \cs{SRgraphicdir} specifies the name of the directory that contains the +% graphic output files that are generated by SAS. The default is |png|. +% \item \cs{SRgraphtype} specifies the type of graphics file that SAS will generate. +% The choices are |png| and |pdf|. The default is |png|. +% \item \cs{SRlistingdir} specifies the name of the directory that contains the +% listing (tabular) output files that are generated by SAS. The default is |lst|. +% \item \cs{SRlatexdir} specifies the name of the directory that contains the +% LaTeX (tabular) output files that are generated by SAS. The default is |tex|. +% \item \cs{SRdefaultdests} specifies the ODS destination to use for tabular output. +% The possible values are |listing| and |latex|. The default is |listing|. +% \end{itemize} +%\changes{v1.01}{2012/05/23}{Changed SRsasprogramline to call hostdel SAS macro} +%\changes{v1.06}{2015/01/15}{Changed hostdel macro to cleandir for SAS/Studio support.} +% \begin{macrocode} +\def\SRprogramname{\jobname_SR.sas} +\def\SRpreamblename{\jobname_SR_preamble.sas} +\def\SRmacroinclude{\@percentchar include "\SRmacropath" /nosource;} +\def\SRsasprogramline{% +\@percentchar cleandir(\SRrootdir, tex, tex);^^J% +\@percentchar cleandir(\SRrootdir, png, png);^^J% +\@percentchar cleandir(\SRrootdir, lst, lst);^^J% +}% +% \end{macrocode} +% \DescribeMacro{\SRprogramname} +% \DescribeMacro{\SRmacroinclude}\DescribeMacro{\SRprogramline} +% \begin{itemize} +% \item \cs{SRprogramname} specifies the filename for the generated SAS +% program. The default is \cs{jobname\_SR.sas}, where \cs{jobname} is usually +% the stem name of the \LaTeX\ source file. +% \item \cs{SRmacroinclude} specifies the line used in the generated SAS program to +% include the SAS macros that are bundled with the \Statrep package. +% The default is |%include|~\cs{SRmacropath}~/|nosource;|. +% \item \cs{SRprogramline} specifies the first lines to include in +% the generated SAS program +% after the \cs{SRmacroinclude} line. The following default value calls a SAS +% macro that removes the contents of the listing, tex, and graphic directories. +% The directories are created with +% each SAS run that includes the macros themselves (via x commands). +% \end{itemize} +% +% \begin{macrocode} +\def\SRparindent{3em} +\def\SRintertext{... more data lines ...} +\def\SRtempfilename{sr.tmp} +\def\SRcontinuedname{continued} +\def\SRcaptionfont{\sffamily} +\def\SRcaptioncontinuedfont{\sffamily\itshape} +\def\SRverbfont{\ttfamily\bfseries} +% \end{macrocode} +% \DescribeMacro{\SRparindent} +% \DescribeMacro{\SRintertext}\DescribeMacro{\tempfilename} +% \begin{itemize} +% \item \cs{SRparindent} specifies the amount of space to indent +% |Datastep| and |Sascode| environments. +% The argument is a dimension. +% The default is |3em| and is measured according to the font +% currently in use. +% \item \cs{SRintertext} specifies the text to insert in abbreviated +% |Datastep| environments (that is, |Datastep| environments that specify +% the |first=| option). +% \item \cs{SRtempfilename} specifies the name of a temporary file that is +% used as a scratch file in the current working directory. +% The default is |sr.tmp|. +% +% \DescribeMacro{\SRcontinuedname}\DescribeMacro{\SRcaptionfont} +% \DescribeMacro{\SRcaptioncontinuedfont}\DescribeMacro{\SRverbfont} +% \item \cs{SRcontinuedname} specifies the name that indicates that an output +% block is continued. This helper is used when an output stream breaks across a page. +% The default is |continued|. +% \item \cs{SRcaptionfont} specifies the font to use for the output captions. +% The default is \cs{sffamily} (\textsf{sans serif}). +% +% \item \cs{SRcaptioncontinuedfont} specifies the font to use for the |continued| name +% for outputs that break across pages. +% The default is \cs{sffamily}\cs{itshape} (\textsf{\textit{sans serif, italic}}). +% +% \item \cs{SRverbfont} specifies the font to use for code within |Datastep| and +% |Sascode| blocks. The default is \cs{ttfamily}\cs{bfseries} +% ({\bfseries\texttt{typewriter text, bold}}). +% +% \end{itemize} +% +%\iffalse +%</cfg> +%<*statrep> +%\fi +% If the file |statrep.cfg| exists, the following statements load it so that you can override +% the preceding definitions: +% \begin{macrocode} +\InputIfFileExists{statrep.cfg} + {\PackageInfo{statrep}{Reading custom configuration file statrep.cfg}} + {\PackageInfo{statrep}{No custom configuration file found (statrep.cfg).% + Using defaults.}} +% \end{macrocode} +% Two output streams are created: +% \begin{macrocode} +\newwrite\SR@program@stream +\newwrite\SR@tempfile@stream +% \end{macrocode} +% The stream \cs{SR@program@stream} represents the +% generated SAS program. The stream \cs{SR@tempfile@stream} represents a +% temporary stream and is used to write the SAS program preamble and +% to construct each |Datastep| environment. +% +% The following lines define boilerplate text that is included in the +% preamble SAS file and the capture-program SAS file: +% \begin{macrocode} +\def\SR@preambletext{/*^^J + This file is auto-generated by the statrep package.^^J + Do not edit this file or your changes will be lost.^^J + Edit the LaTeX file instead.^^J + ^^J + See the statrep package documentation and the file^^J + statrep.cfg for information on these settings.^^J + */^^J + ^^J +} +% \end{macrocode} +% The following statements open the temporary stream by using the filename +% |\SR@preamblename| and write the default settings into the preamble file. +% The temporary file is then closed. +% \begin{macrocode} +\def\SR@write@preamble{ + \immediate\openout\SR@tempfile@stream\SRpreamblename% + \SR@writepgm\SR@tempfile@stream{\SR@preambletext} + \SR@writepgm\SR@tempfile@stream{/* Set and invoke macro variable defaults. */} + \SR@writepgm\SR@tempfile@stream{\@percentchar let rootdir=\SRrootdir;} + \SR@writepgm\SR@tempfile@stream{\@percentchar let defaultstyle=\SRstyle;} + \SR@writepgm\SR@tempfile@stream{\@percentchar let latexstyle=\SRlatexstyle;} + \SR@writepgm\SR@tempfile@stream{\@percentchar let graphtype=\SRgraphtype;} + \SR@writepgm\SR@tempfile@stream{\@percentchar let graphicdir=\SRgraphicdir;} + \SR@writepgm\SR@tempfile@stream{\@percentchar let listingdir=\SRlistingdir;} + \SR@writepgm\SR@tempfile@stream{\@percentchar let latexdir=\SRlatexdir;} + \SR@writepgm\SR@tempfile@stream{\@percentchar let defaultlinesize=\SRlinesize;} + \SR@writepgm\SR@tempfile@stream{\@percentchar let defaultpagesize=\SRpagesize;} + \SR@writepgm\SR@tempfile@stream{\@percentchar let defaultdpi=\SRdpi;} + \SR@writepgm\SR@tempfile@stream{\@percentchar let odsgraphopts=\SRodsgraphopts;} + \SR@writepgm\SR@tempfile@stream{\@percentchar let defaultdests=\SRdefaultdests;} + \SR@writepgm\SR@tempfile@stream{} + \SR@writepgm\SR@tempfile@stream{options nodate nonumber} + \SR@writepgm\SR@tempfile@stream{ls=&defaultlinesize ps=&defaultpagesize} + \SR@writepgm\SR@tempfile@stream{formchar='|----|+|---+=|-/\@backslashchar<>*';} + \SR@writepgm\SR@tempfile@stream{} + \SR@writepgm\SR@tempfile@stream{ods graphics on;} + \SR@writepgm\SR@tempfile@stream{/* Include SAS macro definitions. */} + \SR@writepgm\SR@tempfile@stream{\SRmacroinclude} + \SR@writepgm\SR@tempfile@stream{} + \immediate\closeout\SR@tempfile@stream +% \end{macrocode} +% The following statements begin writing the generated SAS program |\SRprogramname|. +% They open the |\SR@program@stream|, write lines to include the preamble file, +% and do the preliminary work necessary before each run of the capture program. +% +% The preamble is written to a separate file and not directly into the capture +% program so that users who copy and paste code from the \LaTeX\ source to a SAS +% session can include only the preamble in their SAS session. +% \begin{macrocode} + \immediate\openout\SR@program@stream\SRprogramname + \SR@writepgm\SR@program@stream{\SR@preambletext} + \SR@writepgm\SR@program@stream{\@percentchar include "\SRrootdir/\SRpreamblename" /nosource;} + \SR@writepgm\SR@program@stream{/* Remove all output files. */} + \SR@writepgm\SR@program@stream{\SRsasprogramline} + \SR@writepgm\SR@program@stream{} + \SR@writepgm\SR@program@stream{/* Start program with a null title. */} + \SR@writepgm\SR@program@stream{title;} + \SR@writepgm\SR@program@stream{} +} +% \end{macrocode} +% \DescribeMacro{\SR@write@preamble} +% The \cs{SR@write@preamble} macro opens the |\SR@tempfile@stream| stream and +% writes the preamble for the SAS program to be generated. The preamble is constructed +% from the preceding configurable macros (for example, |\SRlinesize|, |\SRdpi|). +% You can modify the preamble in the |statrep.cfg| file. +% +% \begin{macrocode} +\AtBeginDocument{\SR@write@preamble} +\AtEndDocument{\immediate\closeout\SR@program@stream} +% \end{macrocode} +% At the beginning of the document, the \cs{SR@program@stream} stream is +% opened and the program file preamble (that is, the initial definitions +% described previously) is written to the program file. +% At the end of the document, the \cs{SR@programout} stream is closed. +% +% \subsection{Code Environments} +% +% The \Statrep package depends on the |verbatim| package to handle its code environments. +% The |verbatim| package provides programming hooks for redefining commands that are +% used to process +% |verbatim| environments. By redefining some of the commands that are called by the |verbatim| +% package, the \Statrep package can preprocess and postprocess code blocks as needed. +% +% The |verbatim| package defines the following macros as hooks for processing +% |verbatim| environments: +% \begin{itemize} +% \item \cs{verbatim@addtoline} adds its argument to the character buffer. +% \item \cs{verbatim@processline} typesets the characters that accumulate in the buffer. +% \end{itemize} +% +% By redefining these macros, the \Statrep package can control +% the reading, processing, and writing +% of the |verbatim| environment. +% The |Datastep| environment redefines \cs{verbatim@processline} at the beginning +% and the end of the code block. +% The |Sascode| environment redefines \cs{verbatim@addtoline} by inserting several +% line-processing steps before adding characters to the character buffer. +% +% \subsubsection{Datastep Environment} +% +% Three macros are defined to set up the |Datastep| environment: +% \begin{macrocode} +\def\SR@datastep@writefile#1{% + \setcounter{SR@totallines}{0}% + \@bsphack\immediate\openout\SR@tempfile@stream#1% + \let\do\@makeother\dospecials\catcode`\^^M\active% + % + \def\verbatim@processline{% + \addtocounter{SR@totallines}{1}% + \SR@writepgm\SR@tempfile@stream{\the\verbatim@line}% + }% + \verbatim@start% +} +% \end{macrocode} +% \DescribeMacro{\SR@datastep@writefile} +% The |SR@datastep@writefile| macro is used at the beginning of the +% |Datastep| environment. It resets category codes, opens a temporary file, and +% redefines \cs{verbatim@processline} +% to count the lines in the environment and write the code block to a temporary file. +% +% The logic in the \cs{SR@datastep@writefile} macro is taken from an example in the |verbatim| +% package documentation (Sch\"opf, Raichle, and Rowley 2001). +% \begin{macrocode} +\def\SR@enddatastep@writefile{\immediate\closeout\SR@tempfile@stream\@esphack} +% \end{macrocode} +% \DescribeMacro{\SR@enddatastep@writefile} +% The \cs{SR@enddatastep@writefile} macro closes the temporary file. +% \begin{macrocode} +\newcommand{\SR@datastep@writeprogramline}{% + \SR@writepgm\SR@program@stream{\the\verbatim@line}} +% \end{macrocode} +% \DescribeMacro{\SR@datastep@writeprogramline} +% +% The \cs{SR@datastep@writeprogramline} macro writes a line from the code block to the +% generated program. It is used +% when the code block is not specified as display-only. +% The |Datastep| environment begins by redefining the \cs{verbatim@processline} macro +% to write the code block to a temporary file. It also keeps a count of the total number +% of lines in the block. +% It ends by again redefining the \cs{verbatim@processline} macro, this time +% to process lines from the temporary file according to options that are specified in the +% |Datastep| environment. +% +% Figure \ref{dsscheme} shows how a |Datastep| environment is +% processed. The names in \textcolor{darkblue}{blue} represent macros that are called +% by the |verbatim| package, even though the macro contents might have been redefined. +% \index{Datastep schematic|usage} +% \begin{figure}[H] +% \begin{snugshade} +% \begin{picture}(400,170) +% \put(20,100){\texttt{Datastep}} +% \put(55,120){\textit{\textbf{Begin environment}}} +% \put(55,70){\textit{\textbf{End environment}}} +% % +% \put(55,140){\textit{SR@datastep@writefile}} +% \put(55,138){\vector(1,0){90}} +% \put(165,145){\color{darkblue}\textit{verbatim@processline}} +% \put(165,135){\textit{(count lines)}} +% \put(230,138){\vector(1,0){50}} +% \put(285,140){\textit{Temporary file}} +% % +% \put(55,55){\color{darkblue}\textit{verbatim@processline}} +% \put(55,40){\textit{Process option keys for display}} +% \put(55,30){(see \textit{Algorithm \ref{algo1}})} +% \put(55,52){\vector(1,0){210}} +% \put(285,52){\color{darkblue}\textit{verbatiminput}} +% \put(255,40){\textit{(from temporary file)}} +% \end{picture} +% \end{snugshade} +% \caption{Processing Schematic for the \texttt{Datastep} Environment}\label{dsscheme} +% \end{figure} +% \begin{macrocode} +\def\@Datastep[#1]{% + \setkeys{SR}{#1}% + \SR@datastep@writefile{\SRtempfilename}% +} +\newenvironment{Datastep}{% + \catcode`\^^M=\active + \@ifnextchar[{\catcode`\^^M=5\@Datastep}{\catcode`\^^M=5\@Datastep[]} + } +% \end{macrocode} +% +% \begin{environment}{Datastep} +% The beginning of the |Datastep| environment sets the key-value options that are +% specified for the environment and calls the \Statrep macro \cs{SR@datastep@writefile}. +% +% If you specify a |Datastep| environment with no options, and you place a comment +% character at the beginning of the first line +% of the environment, that line is hidden from +% the display. \LaTeX\ looks for the first ``real'' character of the environment and does +% not see the commented line. To account for this possiblity, the \cs{@Datastep} +% command is used internally to begin the real environment. At the initialization +% of the |Datastep| environment, the category code for the end-of-line character +% is changed to \emph{active}. If the environment has options, processing continues +% as normal (\cs{@Datastep} is called directly). If the environment has no options, +% a blank set of brackets is inserted into the stream and the \cs{@Datastep} is +% then called. Thus, if you specify a |Datastep| environment with no options, +% \LaTeX\ knows not to continue looking for the end of the command because the +% empty brackets represent an empty set of options. +% \begin{macrocode} +{% + \SR@enddatastep@writefile\endgraf% +% \end{macrocode} +% The end of the |Datastep| environment performs the following tasks: +% \begin{enumerate} +% \item calls \cs{SR@enddatastep@writefile} to close the temporary file +% \item redefines \cs{verbatim@processline} to handle line processing +% \item includes the temporary file that uses those redefined macros +% \end{enumerate} + +% If the block should only be written to the program and not displayed, redefine +% \cs{verbatim@processline} to \cs{SR@datastep@writeprogramline} (defined previously) +% to write +% a line to the generated program file. Then process the temporary file. +% \begin{macrocode} + \ifSR@program\def\verbatim@processline{\SR@datastep@writeprogramline}% + \else% +% \end{macrocode} +% Otherwise, the code block is to be displayed. +% \begin{macrocode} + \ifthenelse{\equal{\SR@fontsize}{\@empty}}% + {\relax}% + {\@nameuse{\SR@fontsize}}% + \setcounter{SR@currentline}{0}% + \setcounter{SR@startinglastline}{\theSR@totallines-\SR@last-1}% +% \end{macrocode} +% Set the font size to be used in the display. Set the |SR@currentline| +% counter to 0. Set |SR@startinglastline| to the total number of lines +% in the environment minus the number of bottom lines to display. +% +% \DescribeMacro{\verbatim@processline} +% Redefine the \cs{verbatim@processline} macro to account for options +% that are specified to the +% environment and read in the temporary file. +% \begin{macrocode} + \def\verbatim@processline{% +% \end{macrocode} +% If the code block is not display-only, write each line to the program file +% by using the \cs{SR@datastep@writeprogramline} macro, defined previously. +% \begin{macrocode} + \ifSR@display\else\SR@datastep@writeprogramline\fi% +% \end{macrocode} +% The remainder of the macro logic is described in Algorithm \ref{algo1} on +% page \pageref{algo1}. +% +% Supporting the |last=| option in the |Datastep| environment is the only +% reason for the complexity of writing to a temporary file and +% retrieving the lines from the file. +% To know how to display the last \emph{n} lines, \Statrep must know the total +% number of lines in the code block. +% So it writes the code block to the temporary file and keeps +% a tally of the number of lines as it writes each line. +% +% A horizontal skip of length \cs{SRparindent} is added +% to the beginning of each \cs{the}\cs{verbatimline} line that is displayed. +% +% A \cs{par} is also appended to each \cs{the}\cs{verbatimline}: +% In a |verbatim| environment, +% \index{verbatim environment|usage} the entire block is typeset as a list of one item, +% and within that item, each line is a paragraph. The following statements append a +% \cs{par} to each +% \cs{the}\cs{verbatimline} to end the paragraph: +% \changes{1.05}{2014/10/15}{Added leavevmode; otherwise, interaction with geometry package} +% \changes{1.05}{2014/10/16}{Added braces around par lines; otherwise, interaction with tocloft package} +% \begin{macrocode} + \ifnum\SR@first>0% + \ifnum\theSR@currentline<\SR@first% + {\leavevmode\hskip\SRparindent\the\verbatim@line\par}% + \else% + \ifnum\theSR@currentline=\SR@first% + {\leavevmode\par\hskip\SRparindent\SRintertext\par}% + \else% + \ifnum\SR@last>0% + \ifnum\theSR@currentline=\theSR@startinglastline{\leavevmode\par}\fi% + \ifnum\theSR@currentline>\theSR@startinglastline% + {\leavevmode\hskip\SRparindent\the\verbatim@line\par}% + \fi% + \fi% + \fi% + \fi% + \else% + {\leavevmode\hskip\SRparindent\the\verbatim@line\par}% + \fi% + \addtocounter{SR@currentline}{1}% + }% + \fi% +% \end{macrocode} +% The following algorithm describes how this redefined version of the +% \cs{verbatim@processline} macro processes each line. +% +% \index{Datastep processing|usage} +% \begin{algorithm}[H] +% \For{each line in block}{ +% \uIf{block is not display only} +% {write data line \;} +% \uIf{first=\textsf{n} is specified} +% { +% \uIf{currentline < \textsf{n}}{display line\;} +% \uElseIf{currentline = \textsf{n}}{write the value of \cs{SRintertext}\;} +% \uElseIf{last=\textsf{m} is specified}{ +% \uIf{currentline = (totallines - \textsf{m})}{start new line\;} +% \uElseIf{currentline > (totallines - \textsf{m})}{display line\;} +% } +% } +% \uElse{display line\;} +% } +% \caption{\texttt{Datastep} Environment: \cs{verbatim@processline} Macro}\label{algo1} +% \end{algorithm} +% +% When all settings are configured, and when subsidiary macros and the +% \cs{verbatim@processline} macro are redefined, +% the following statement reads in the temporary file that was created at the +% beginning of the |Datastep| +% environment. The file is read by using the |verbatim| package macro +% \cs{verbatiminput}. That macro then calls \cs{verbatim@processline}, which the +% \Statrep package has just redefined. +% +% \begin{macrocode} + \verbatiminput{\SRtempfilename}% +% \end{macrocode} +% The code block has now been displayed and written to the program file as specified +% by the options in the |Datastep| environment. However, there is still +% cleanup left to do. +% +% The following statements determine whether the block was displayed: +% if it was not displayed, they +% retrieve all vertical space that is associated with the environment: +% \begin{macrocode} + \ifSR@program + \setlength{\SR@scratchlength}{-2\topsep-\partopsep-2\parskip-\baselineskip} + \vspace*{\SR@scratchlength}% + \fi% +% \end{macrocode} +% If the block is written to the program file, the following statements output a blank line after +% this |Datastep| environment in the program file: +% \begin{macrocode} + \ifSR@display\else% + \SR@writepgm\SR@program@stream{}% + \fi% +} +% \end{macrocode} +% \end{environment} +% +% +% \subsubsection{Sascode Environment} +% The following macros are defined to set up the |Sascode| environment: +% +% \begin{itemize} +% \item \cs{SR@sascode@addtoline} resets category codes and calls \cs{SR@sascode@filter}. +% \item \cs{SR@sascode@filter} acts as a filter. It processes lines with line commands +% and passes other lines to \cs{SR@sascode@writeline}. +% \item \cs{SR@sascode@writeline} writes the lines into the character buffer that is used +% by the |verbatim| package. It also writes lines to the generated program file. +% \end{itemize} +% +% The |Sascode| environment uses this sequence of macros by +% replacing the |verbatim| package macro \cs{verbatim@addtoline} with the +% \cs{SR@sascode@addtoline} macro. +% +% The following statements start a group to safely change the category +% code for the \% character to +% \emph{other}. Within this group, the \% character can be used in other definitions +% because its category code is no longer the comment category code (normally category +% code 14). +% \index{category codes|usage} +% \begin{macrocode} +\begingroup + \catcode`\%12 +% \end{macrocode} +% \DescribeMacro{\SR@sascode@addtoline} +% The following statements call the \cs{SR@sascode@addtoline} macro, +% reset category codes, and call +% \cs{SR@sascode@filter} with two arguments: the original category code of the +% \% character and the verbatim line itself. The original category code for the \% +% character is sent so that it can be returned to its original state after +% \cs{SR@sascode@filter} is called. +% \begin{macrocode} + \gdef\SR@sascode@addtoline{\catcode`\%12 + \expandafter\relax + \expandafter\SR@sascode@filter + \expandafter{\number\catcode`\% }} +% \end{macrocode} +% After expansion, the following command is left, where \textit{n} is the original +% category code of the \% character:\\ +% |\relax\SR@sascode@filter|~\textit{n}\\ +% That is, the macro first +% redefines the category code of the \% character and calls the +% \cs{SR@sascode@filter} macro with the original category code of the +% \% character as its first argument. +% +% \DescribeMacro{\SR@sascode@filter} +% The \cs{SR@sascode@filter} macro does the work of filtering the +% code block for line commands. See Algorithm \ref{algo2} for details. +% +% This macro is the reason \Statrep requires the use of +% pdf\LaTeX: the PDF primitive \cs{pdfmatch} is essential to the macro. +% +% \DescribeMacro{\pdfmatch} +% The \cs{pdfmatch}\marg{pattern}\marg{string} +% command implements pattern matching (using the syntax of +% POSIX regular expressions). +% The first argument is a regular expression pattern and the second +% argument is a string. The command expands +% to --1 if the pattern is invalid, to 0 if no match is found, and to 1 if a match +% is found. +% The primitive was introduced in pdfTEX 1.30.0 (Thanh et al. 2009). +% The result of \cs{pdfmatch} is stored in an array. +% +% \DescribeMacro{\pdflastmatch} +% The \cs{pdflastmatch}\marg{integer}\marg{expandable} returns the +% match that corresponds to \marg{integer} provided by the \cs{pdfmatch} +% command. Entry 0 contains the full match, and further +% entries contain submatches (captured group) that correspond to the subpatterns +% of the match. +% +% The regular expression argument must be escaped for use in \LaTeX. +% For example, consider the task to capture the integer in the following +% expression:\\ +% |%* program 4;|\\ +% A typical regular expression to capture the integer 4 is defined as follows:\\ +% |^%\*\s*program\s*([0-9]+);| +% +% To use the expression in \LaTeX, it must be escaped so that +% the pattern becomes\\ +% |^%\string\*\space*program\space*([0-9]+);| +% +% That is, \cs{*} becomes \cs{string}\cs{*} and \cs{s}* becomes \cs{space}*. +% +% The second argument is detokenized so that it represents a string of characters +% for use in the \cs{pdfmatch} macro. +% +% The effect of the \cs{SR@sascode@filter} macro is that every line that +% contains a line command is parsed, the appropriate line counters are +% set, and the line is skipped. +% +% Algorithm \ref{algo2} describes how the \cs{SR@sascode@filter} processes +% each line of the |Sascode| block. +% +% \index{Sascode processing|usage} +% \begin{algorithm}[H] +% \For {each line in block}{ +% \eIf{line begins with \texttt{\%*} (column 1)}{ +% \uIf{line matches \texttt{\%*} program n\; }{set program counter} +% \uElseIf{line matches \texttt{\%*} display n\; }{set display counter} +% \uElseIf{line matches \texttt{\%*} \; }{write line to program\;} +% \Else{display and write to program (valid SAS macro comment)} +% } +% {pass line onward to \cs{SR@sascode@writeline}\;} +% } +% \caption{\texttt{Sascode} Environment: \texttt{SR@sascode@filter} Macro}\label{algo2} +% \end{algorithm} +% \begin{macrocode} + \gdef\SR@sascode@filter#1#2{ + \ifnum\pdfmatch{^%\string\*} + {\detokenize{#2}}=1 + \ifnum\pdfmatch{^%\string\*\space*program\space*([0-9]+);} + {\detokenize{#2}}=1 + \setcounter{SR@programline} + {\expandafter\strip@prefix\pdflastmatch 1} + \catcode`\%#1\@tempswafalse\verbatim@line{} + \else + \ifnum\pdfmatch{^%\string\*\space*display\space*([0-9]+);} + {\detokenize{#2}}=1 + \setcounter{SR@displayline} + {\expandafter\strip@prefix\pdflastmatch 1} + \catcode`\%#1\@tempswafalse\verbatim@line{} + \else + \ifnum\pdfmatch{^%\string\*\space*;(.*)$} + {\detokenize{#2}}=1 + \SR@writepgm\SR@program@stream{\expandafter\strip@prefix\pdflastmatch 1} + \catcode`\%#1\@tempswafalse\verbatim@line{} + \else \catcode`\%#1\SR@sascode@writeline{#2} + \fi + \fi + \fi + \else + \catcode`\%#1\SR@sascode@writeline{#2} + \fi + } +\endgroup +% \end{macrocode} +% The \cs{begingroup} that started the definition block for \cs{SR@sascode@addtoline} +% and \cs{SR@sascode@filter} is closed with \cs{endgroup}. +% +% In the \cs{SR@sascode@filter} macro, the Boolean switch +% \cs{tempswa} must be set to false for skipped lines because of how +% the |verbatim| package uses the switch. +% In the +% \cs{verbatim@processline} macro, the switch determines +% whether to insert a line ending. That is, it decides whether +% a new verbatim environment is +% starting (\verb+\@tempswatrue+). This decision determines whether +% to end +% a paragraph. Lines are equivalent to paragraphs inside a verbatim environment. +% +% Because the |Sascode| environment redefines the \cs{verbatim@addtoline} macro +% and not the \cs{verbatim@processline} macro from the |verbatim| package, the +% |Sascode| environment must set the \cs{tempswa} switch so that it is set appropriately +% when the |verbatim| package invokes \cs{verbatim@processline}. +% In this +% way, the +% \cs{tempswafalse} macro ensures that the displayed verbatim environment does +% not have blank lines in places where a line command was used. +% +% The \cs{SR@sascode@filter} macro passes all lines that are not line commands +% to the \cs{SR@sascode@writeline} macro. Lines that begin with the +% special line command, the null SAS macro comment (\%*;), are written directly to +% the generated program file after stripping the macro comment. +% +% The final \textbf{else} statement is executed +% when neither the program counter nor the display counter is set. +% +% \DescribeMacro{\SR@sascode@writeline} +% The \cs{SR@sascode@writeline} macro tests whether line counters are set +% and writes each line to its appropriate destination (the display or the +% generated program file or both). See Algorithm \ref{algo3} for a description +% of the macro's behavior. +% +% Note the use of \cs{SRparindent} to indent the code lines so that the |Sascode| +% environment display matches the |Datastep| environment display. +% \begin{macrocode} +\newcommand{\SR@sascode@writeline}[1]{% + \ifSR@program% + \SR@writepgm\expandafter\SR@program@stream{\detokenize{#1}}% + \@tempswafalse% + \else% + \ifSR@display% + \verbatim@line\expandafter{\the\verbatim@line\hskip\SRparindent#1}% + \else% + \ifnum\theSR@programline>0% + \SR@writepgm\expandafter\SR@program@stream{\detokenize{#1}}% + \addtocounter{SR@programline}{-1}% + \@tempswafalse% + \else% + \ifnum\theSR@displayline>0% + \verbatim@line\expandafter{\the\verbatim@line\hskip\SRparindent#1}% + \addtocounter{SR@displayline}{-1}% + \else% + \SR@writepgm\expandafter\SR@program@stream{\detokenize{#1}}% + \verbatim@line\expandafter{\the\verbatim@line\hskip\SRparindent#1}% + \fi% + \fi% + \fi% + \fi% +} +% \end{macrocode} +% Algorithm \ref{algo3} describes how the \cs{SR@sascode@writeline} macro +% processes each line that is received from the \cs{SR@sascode@filter} macro. +% +% \index{Sascode processing|usage} +% \begin{algorithm}[H] +% \For {each line received}{ +% \uIf{program only}{write line to program file} +% \uElseIf{display only}{display line} +% \uElseIf{Program counter set} +% {write line to program file\; +% decrement \cs{SR@program} counter\;} +% \uElseIf{Display counter set} +% {display line\; +% decrement \cs{SR@display} counter\;} +% \Else{write line to program file\; +% display line\;} +% } +% \caption{\texttt{Sascode} Environment: \texttt{SR@sascode@writeline} Macro}\label{algo3} +% \end{algorithm} +% +% Figure \ref{fig:sascode} shows how a |Sascode| environment is +% processed. The names in \textcolor{darkblue}{blue} represent macros that are called +% by the |verbatim| package, even though the macro contents might have been +% redefined. +% \index{Sascode schematic|usage} +% \begin{figure}[H] +% \begin{snugshade} +% \begin{picture}(400,200) +% \put(150,175){\texttt{Sascode}} +% \put(167,170){\vector(0,-1){30}} +% \put(60,130){{\color{darkblue}\texttt{verbatim@addtoline}} => \texttt{SR@sascode@addtoline}} +% +% \put(200,120){\textit{\small initialize catcode}} +% \put(200,110){\textit{\small in order to define}} +% \put(200,100){\textit{\small and call\ldots}} +% +% \put(200, 75){\textit{\small filter lines, }} +% \put(200, 65){\textit{\small process line commands,}} +% \put(200, 55){\textit{\small and call\ldots}} +% +% \put(200, 30){\textit{\small send line into standard}} +% \put(200, 20){\texttt{\small \textcolor{darkblue}{verbatim@line}} \textit{\small buffer}} +% \put(188,125){\vector(0,-1){30}} +% \put(175,85){\texttt{SR@sascode@filter}} +% \put(188,80){\vector(0,-1){30}} +% \put(175,40){\texttt{SR@sascode@writeline}} +% +% \put(80,125){\color{darkblue}\vector(0,-1){90}} +% \put(60,25){\color{darkblue}\texttt{verbatim}} +% \put(85,15){\color{darkblue}\small \textit{typeset standard}} +% \put(85,5){\small\color{darkblue}\texttt{verbatim@line} \textit{\small buffer}} +% % +% \end{picture} +% \end{snugshade} +% \caption{Processing Schematic for the \texttt{Sascode} Environment}\label{fig:sascode} +% \end{figure} +% +% \begin{environment}{Sascode} +% The |Sascode| environment first sets the values for the optional keys. +% If the environment is to be written to the generated program, the appropriate +% keys are processed and passed to the program. +% +% If you do not use the |store=| key, \Statrep assumes that you are writing +% your own SAS macros to output the ODS document and write the outputs. If you do +% use the key, the macros are written automatically. +% +% The central point of the code for processing the |Sascode| environment is to +% redirect the |verbatim| package macro, +% \cs{verbatim@addtoline}, to the \Statrep package macro,\cs{SR@sascode@addtoline}. +% This redirection begins the workflow +% shown in Figure \ref{fig:sascode}. The processing steps are as follows: +% \index{Sascode processing|usage} +% \begin{enumerate} +% \item The |verbatim| package macro calls \cs{verbatim@addtoline}. +% \item The \cs{verbatim@addtoline} macro redirects to \cs{SR@sascode@addtoline}. +% \item The \cs{SR@sascode@addtoline} macro sets category codes and calls \cs{SR@sascode@filter}. +% \item The \cs{SR@sascode@filter} macro processes line commands and +% calls \cs{SR@sascode@writeline}. +% \item The \cs{SR@sascode@writeline} macro +% parses and processes the lines. It writes the appropriate lines to +% the generated program file. +% It also writes the appropriate lines into the \cs{verbatim@line} buffer, which +% is processed by the |verbatim| package macro \cs{verbatim}. +% \end{enumerate} +% +% If you specify a |Sascode| environment with no options, and you place +% a comment character at the beginning of the first line, that line is hidden from +% the display. \LaTeX\ looks for the first ``real'' character of the environment and does +% not see the commented line. To account for this possiblity, the \cs{@Sascode} +% command is used internally to begin the real environment. At the initialization +% of the |Sascode| environment, the category code for the end-of-line character +% is changed to \emph{active}. If the environment has options, processing continues +% as normal (\cs{@Sascode} is called directly). If the environment has no options, +% an empty set of brackets is inserted into the stream and \cs{@Sascode} is +% then called. Thus, if you specify a |Sascode| environment with no options, +% \LaTeX\ knows not to continue looking for the end of the command because the +% empty brackets represent an empty set of options. +% \begin{macrocode} +\def\@Sascode[#1]{% + \setkeys{SR}{#1}% + \ifSR@display\else% + \ifthenelse{\equal{\SR@store}{\@empty}}% + {\relax}% + {\SR@writepgm\SR@program@stream{\@percentchar output(\SR@store)}% + \PackageInfo{statrep}{Processing Sascode block \SR@store}}% + \fi% + \ifthenelse{\equal{\SR@fontsize}{\@empty}}% + {\relax}% + {\@nameuse{\SR@fontsize}}% + \setcounter{SR@programline}{0}% + \setcounter{SR@displayline}{0}% + \let\verbatim@addtoline\SR@sascode@addtoline% + \verbatim} +\newenvironment{Sascode}{% + \catcode`\^^M=\active + \@ifnextchar[{\catcode`\^^M=5\@Sascode}{\catcode`\^^M=5\@Sascode[]} +} +% \end{macrocode} +% The end of the |Sascode| environment performs the last steps that are needed +% and does some cleanup. +% The following statements remove vertical space that is caused by the end +% of the |Sascode| environment and write the |%endoutput| macro +% contents to the generated program file: +% \begin{macrocode} +{\endverbatim% + \setlength{\SR@scratchlength}{-2\topsep-\partopsep-2\parskip} + \vspace*{\SR@scratchlength}% + \ifSR@program\vspace*{-\baselineskip}\fi + % + \ifSR@display\else% + \ifthenelse{\equal{\SR@store}{\@empty}}% + {\relax}% + {\SR@writepgm\SR@program@stream{\@percentchar endoutput(\SR@store)}% + \SR@writepgm\SR@program@stream{}}% + \fi% +} +% \end{macrocode} +% \end{environment} +% +% \subsection{Handling the SAS Output}\label{output} +% +% The \cs{Listing} and \cs{Graphic} tags support options that are used +% in the generated program and in output display. +% +% There are three possible cases for an output request: +% \begin{itemize} +% \item The output is of type |graphic|. +% \item The output is of type |listing| and destination |listing|. +% \item The output is of type |listing| and destination |latex|. +% \end{itemize} +% +% When the |store=| option +% is used in the tags, a line is written to the |%write| macro that passes +% a subset of the options in the tag to the generated program. The tags also insert +% the stream of specified outputs in the displayed document. +% +% Graphical output is inserted as specified in the \cs{Graphic} tag, +% captioned, and centered. +% +% Listing output is inserted in the same way, but the output is framed when +% the destination is |listing|; when the destination is |latex|, the output +% (which is in the form of LaTeX tabular environments) is not framed. +% +% The frame for the |listing| destination +% is created with the help of the |longfigure| package and the +% \cs{hline} command. +% If the ODS destination is LaTeX, the resulting output blocks are put into +% a minipage of \cs{textwidth} width and are not framed. +% +% The following helper macros are used only in writing to the generated program: +% \begin{description} +% \item[\cs{SR@write@outoptions}] is called when the |store=| option is specified in +% the output tag. The command parses the options that are specified in the output tag +% for program-related options +% and writes the appropriate SAS macro to the generated program. +% \item[\cs{SR@set@outoptions}] creates a string of |key=value| pairs that are used +% in the generated SAS macro. +% \item[\cs{SR@final@outoptions}] accumulates each |key=value| pair into one string. +% \item[\cs{SR@outkeyval}] tests each key to determine whether to add the key and +% its value to the final option string. +% \end{description} +% +% +% \DescribeMacro{\SR@write@outoptions} +% If the |store=| option is specified in a \cs{Listing} or \cs{Graphic} tag, +% the \cs{SR@write@outoptions} macro is called. +% Otherwise, nothing is written to the generated +% SAS program. +% For each line that is written, use the macro \cs{SR@hashchar} to write out +% an unescaped hash character (|#|) when an escaped hash +% character (|\#|) is read.\index{hashchar|usage}\index{\#|usage} +% See section \ref{utilities} for information about the \cs{SR@hashchar} macro. +% \begin{macrocode} +\def\SR@write@outoptions{ + \SR@set@outoptions + \let\#\SR@hashchar + \SR@writepgm\SR@program@stream{% + \@percentchar write(\SR@label,store=\SR@store \SR@final@outoptions) + } +% \end{macrocode} +% +% After the program line is written, a blank line is output to the program: +% \begin{macrocode} + \SR@writepgm\SR@program@stream{} +} +% \end{macrocode} +% The following statements define the \cs{SR@set@outoptions} macro. +% \DescribeMacro{\SR@set@outoptions} +% This macro +% resets the \cs{SR@final@outoptions} +% definition and calls \cs{SR@outkeyval} for the keys that can be passed +% through to the generated SAS program. This processing is necessary +% so that keys with \cs{@empty} values are not passed to the generated +% program. +% \begin{macrocode} +\newcommand*{\SR@set@outoptions}{% + \global\edef\SR@final@outoptions{} + \SR@outkeyval{height}\SR@outkeyval{objects}\SR@outkeyval{pattern} + \SR@outkeyval{style}\SR@outkeyval{dpi}\SR@outkeyval{options} + \SR@outkeyval{pagesize}\SR@outkeyval{linesize}\SR@outkeyval{width} + \SR@outkeyval{dest}\SR@outkeyval{type}\SR@outkeyval{firstobj}\SR@outkeyval{lastobj} + } +% \end{macrocode} +% Recall that all keys are set to \cs{@empty} with the \cs{presetkeys} macro. +% If the value has not been changed from the default, the following statements +% omit it from +% the \cs{SR@final@outoptions} macro definition. +% +% \DescribeMacro{\SR@outkeyval} +% The \cs{SR@outkeyval} macro expands +% \cs{SR@final@outoptions} to a string of |key=value| pairs. +% With each call to the \cs{SR@outkeyval} macro, the argument is checked +% to determine whether it is empty. If it is not empty, the argument is expanded and +% added to the \cs{SR@final@outoptions} value. +% \begin{macrocode} +\newcommand*{\SR@outkeyval}[1]{% + \def\SR@outkey{#1} + \edef\SR@outval{\csname SR@#1\endcsname} + \ifx\@empty\SR@outval + \else + \edef\SR@final@outoptions{\SR@final@outoptions,\SR@outkey=\SR@outval} + \fi + } +% \end{macrocode} +% +% The following macros are used to display the SAS generated output. +% \begin{description} +% \item[\cs{Listing}] inserts a stream of listing outputs. +% \begin{description} +% \item[\cs{Boxlisting}] boxes a single listing. +% \end{description} +% \item[\cs{Graphic}] inserts a stream of graphical outputs. +% \begin{description} +% \item[\cs{Boxgraphic}] boxes a single graphic. +% \end{description} +% \item[\cs{SR@insert}] begins the output insertion process. +% \begin{description} +% \item[\cs{SR@set@outheadings}] sets the heading for a |longfigure|. +% \item[\cs{SR@set@outmargin}] sets the left margin for centering a |longfigure|. +% \end{description} +% \end{description} +% +% \subsubsection{Note on Widths} +% If the output is a listing and the destination is |listing|, the output +% will be inserted as verbatim type input. The width is calculated by the linesize and +% the output centered by adjusting the \cs{LFleft} margin. The width calculation is +% done once, at the \cs{Listing} command itself. +% +% If the output is a graphic, the output is put into a box at whatever |scale| or +% |width| the user specified. The width of that box is calculated and the +% output centered by adjusting the \cs{LFleft} margin. The width calculation cannot +% be done at the \cs{Graphic} command since the output must be measured first. +% It is in the \cs{Boxgraphic} macro that the calculation takes place, which means it +% happens for each graphic in the output stream. Only the first graphic has an effect; +% it is only the first graphic in the stream that affects the \cs{LFleft} margin. +% This is an inefficiency. +% +% If the output is a listing and the destination is |latex|, the output cannot be +% measured at all. The output is put into a minipage of |textwidth| width and the +% \cs{LFleft} margin is untouched. The user can therefore set \cs{LFleft} before the +% \cs{Listing} tag to shift the output if needed. +% +% \subsubsection{The \cs{Listing} Macro}\label{listing} +%\index{output labels|usage} +% \begin{macro}{\Listing} +% The \cs{Listing} macro sets the options that are specified in the tag and +% automatically creates a label by using +% its \marg{argument}, which serves also as the name of +% the output file (without an extension). +% \begin{macrocode} +\newcommand{\Listing}[2][]{% + \setkeys{SR}{#1,type=listing,label=#2}% + \ifthenelse{\equal{\SR@store}{\@empty}}% + {\relax}% + {\SR@write@outoptions}% +% \end{macrocode} +% The |type=| option is automatically specified as |listing|; this option +% is passed to the generated SAS program. +% If the |store=| option is specified, the \cs{SR@write@outoptions} macro is invoked +% to write the appropriate SAS macro to the generated file. +% \begin{macrocode} +\ifthenelse{\equal{\SR@dest}{\@empty}}% + {\def\SR@dest{\SRdefaultdests}}% + {\relax}% +% \end{macrocode} +% If no value was given for the |dest=| option, set \cs{SR@dest} to the +% default value (specified globally as \cs{SRdest}). Now we are guaranteed +% to have a value for \cs{SR@dest} (used in the \cs{Boxlisting} and +% \cs{SR@insert} macros). +% +% The next block only pertains to the situation where we have a +% verbatim listing output from ODS Listing destination. We need to find +% the width of the output, which is done by calculating the width of a single +% character in the specified font and multiplying that value by the number +% of characters per line (linesize). This line length is saved in the +% value \cs{SR@scratchlength} and used to center the output. +% \begin{macrocode} +\ifthenelse{\equal{\SR@dest}{listing}}% +% The following statements set the font size: +% \begin{macrocode} + {\ifthenelse{\equal{\SR@fontsize}{\@empty}}% + {\def\SR@fontsize{normalsize}}% + {\relax}% +% \end{macrocode} +% The following statements set \cs{SR@scratchlength} to the width of a +% single character (\textasciitilde) by using the +% current font size and the verbatim font: +% \begin{macrocode} + \settowidth{\SR@scratchlength}{\@nameuse\SR@fontsize% + \SRverbfont\selectfont~}% +% \end{macrocode} +% +% The following statements control the line size for ODS Listing output: +% \begin{macrocode} + \ifthenelse{\equal{\SR@linesize}{\@empty}}% + {\def\SR@linesize{\SRlinesize}}{\relax}% +% \end{macrocode} +% The value for the key \cs{SR@linesize} is set to \cs{@empty} with each +% invocation of the \cs{Listing} command. If no value is specified +% for \cs{SR@linesize}, the following statements set it to the specified default +% value for line size \cs{SRlinesize}. This default is set to 80 by the +% \Statrep package; you can set the line size in the |statrep.cfg| file. +% +% The |linesize=| key corresponds to the line size that the SAS program uses to +% generate the tabular output. By default it is set to 80; other typical values +% are 96 and 120. +% +% The following statements set \cs{SR@verbwidth} to the width +% of \cs{SR@linesize} number of columns, +% with each column as wide as \cs{SR@scratchlength}. The result represents the +% width of the contents of a SAS listing output. +% +% \begin{macrocode} + \setlength{\SR@verbwidth}{(\SR@linesize\SR@scratchlength)}% +% \end{macrocode} +% Finally, the following statements +% add 2\cs{tabcolsep} and 2\cs{arrayrulewidth} to that width. +% The result represents the total width of a \cs{Listing} output and +% is used in the \cs{SR@insert} macro to center the output.\footnote{A listing +% output stream gets its width once, at the beginning of the stream. A graphic +% gets the width for each graphic file in its stream. Only the first +% measurement is used to calculate the graphic width +% (that is, only the first graphic file width is used).} +% \begin{macrocode} + \setlength{\SR@scratchlength}{\SR@verbwidth+2\tabcolsep+ + 2\arrayrulewidth}% + }% end if dest is listing + {\relax}% do nothing if dest is latex. +% \end{macrocode} +% With \cs{SR@verbwidth} calculated, \cs{SR@insert} is called to insert the \cs{Listing}. +% When the Listing is being set, the value for the left margin of the longfigure is +% calculated. After the Listing is finished, reset the value back to its default, 0. +% \begin{macrocode} + \SR@insert{#2}% + \setlength{\LFleft}{0in}% +} +% \end{macrocode} +% \end{macro} +% \subsubsection{The \cs{Graphic} Macro} +% The \cs{Graphic} macro sets the options that are specified in the tag and +% automatically creates a label by using +% its \marg{argument}, which also serves as the name of +% the output file (without an extension). +% \begin{macrocode} +\newcommand{\Graphic}[2][]{% + \setkeys{SR}{#1,type=graphic, label=#2}% + \ifthenelse{\equal{\SR@store}{\@empty}}% + {\relax}% + {\SR@write@outoptions}% + \SR@insert{#2}% + \setlength{\LFleft}{0in}% +} +% \end{macrocode} +% \begin{macro}{\Graphic} +% The |type=| option is automatically specified as |graphic|; this option +% is passed to the generated SAS program. +% If the |store=| option is specified, the \cs{SR@write@outoptions} macro is invoked +% to write the appropriate SAS macro to the generated file. +% +% Finally, \cs{SR@insert} is called to insert the \cs{Graphic}. +% When the Graphic is being set, the value for the left margin of the longfigure is +% calculated. After the Graphic is finished, reset the value back to its default, 0. +% \end{macro} +% +% \subsubsection{The \cs{Boxlisting} Macro} +% If the \cs{SRdest} value has been set for this +% listing, the value for \cs{SR@dest} now contains the value (see the Listing code above). +% +% If the current destination is |listing|, the \cs{Boxlisting} macro +% creates a box that contains the verbatim content +% of an external listing file. Put the content of the specified file +% into a box as verbatim input. If the file doesn't exist, place a marker in the document. +% +% If the current destination is |latex|, the \cs{Boxlisting} macro puts +% the contents of the specified file into a minipage and then into the box. +% +% \begin{macrocode} +\newcommand*{\Boxlisting}[1]{% + \ifthenelse{\equal{\SR@dest}{listing}}% + {\global\def\SR@insertname{lst/#1.lst}% + \IfFileExists{\SR@insertname}% + {% + \savebox{\SR@filebox}{% + \def\verbatim@font{% + \@nameuse{\SR@fontsize}% + \SRverbfont% + \hyphenchar\font\m@ne% + \@noligs% + }% + \parbox{\SR@verbwidth}{% + \vspace*{0.25\baselineskip}% + \noindent\verbatiminput{\SR@insertname}% + \vspace*{0.25\baselineskip}}% + }% + }% + {\savebox{\SR@filebox}{\fbox{Missing File \SR@insertname}}% + \global\def\SR@insertname{\@empty}}% + }% + {\global\def\SR@insertname{tex/#1.tex}% + \IfFileExists{\SR@insertname}% + {% + \savebox{\SR@filebox}{% + \begin{minipage}{\textwidth}% + \vspace{0.25\baselineskip}% + \centering\input{\SR@insertname}% + \vspace{0.25\baselineskip}% + \end{minipage}% + }% + }% + {\savebox{\SR@filebox}{\centering\fbox{Missing File \SR@insertname}}% + \global\def\SR@insertname{\@empty}% + }% + }% + \global\setbox\SR@filebox=\box\SR@filebox% + \PackageInfo{statrep}{Processing output \SR@insertname}% +} +% \end{macrocode} +% +% \begin{macro}{\Boxlisting} +% \changes{1.04}{2014/09/08}{Added noligs to verbatim font definition} +% The \cs{Boxlisting} macro takes a single argument, the \marg{filename} +% of the listing output to be boxed (the filename without the extension). +% If the file exists, the macro places the content of the file +% (using \cs{verbatiminput}) into a box of \cs{SR@verbwidth}, +% which is calculated +% as described in section \ref{listing}. +% White space at the top and bottom of the box is +% inserted (0.25\cs{baselineskip}). +% +% The \cs{verbatim@font} is set to the user-defined \cs{SR@fontsize} (from the +% options on the Listing tag) and the \cs{SRverbfont} in the configuration. Furthermore, +% ligatures and the hyphenation character are both turned off. If you omit this +% step, ligatures will appear in the listing output (the case which prompted this +% bug-fix was a dashed line; the emdash ligature was applied to each pair of dashes). +% +% Note that \cs{SR@verbwidth} is the width that is used to create the \cs{parbox} +% that contains the output. \cs{SR@scratchlength} is used to center +% the output in a later step. +% \cs{SR@scratchlength} represents the width of the output plus the surrounding frame. +% +% If the file does not exist, \cs{SR@insertname} is defined to be +% \cs{@empty} and \cs{SR@filebox} is defined to be a box with +% the contents |Missing File|. +% \end{macro} +% \subsubsection{The \cs{Boxgraphic} Macro} +% The \cs{Boxgraphic} macro creates a box that contains the content of an external +% graphic file. +% \begin{macrocode} +\newcommand*{\Boxgraphic}[1]{% + \IfFileExists{png/#1.\SRgraphtype}% + {\global\def\SR@insertname{png/#1.\SRgraphtype}}% + {\global\def\SR@insertname{\@empty}}% + \ifthenelse{\equal{\SR@insertname}{\@empty}}% + {\savebox{\SR@filebox}{\fbox{ Missing File png/#1.\SRgraphtype}}}% + {% + \ifthenelse{\equal{\SR@scale}{\@empty}}% + {\ifthenelse{\equal{\SR@width}{\@empty}}% + {\savebox{\SR@filebox}{\includegraphics{\SR@insertname}}}% + {\savebox{\SR@filebox}{\includegraphics[width=\SR@width]% + {\SR@insertname}}}}% + {\savebox{\SR@filebox}{\includegraphics[scale=\SR@scale]% + {\SR@insertname}}}% + }% + \global\setbox\SR@filebox=\box\SR@filebox% + \PackageInfo{statrep}{Processing graphic \SR@insertname}% + \setlength{\SR@scratchlength}{\wd\SR@filebox+2\tabcolsep}% +}% +% \end{macrocode} +% \begin{macro}{\Boxgraphic} +% The \cs{Boxgraphic} macro takes a single argument, the \marg{filename} +% of the graphic output to be boxed (the filename without the extension). +% \index{png graphics|usage} +% \index{pdf graphics|usage} +% +% The macro first checks whether the file exists. +% If it does, it sets the global variable \cs{SR@insertname} to the full name. +% If the file does not exist, +% \cs{SR@insertname} is defined to be \cs{@empty}. +% +% If the global variable \cs{SR@insertname} is empty, +% then \cs{SR@filebox} is defined to be a framed box with +% the contents |Missing File|. +% +% Otherwise, we use +% the \cs{includegraphics} macro from the |graphicx| package to place +% the image. +% +% If the |width=| or |scale=| option was specified, the option is passed +% to the \cs{includegraphics} macro. +% +% Finally, \cs{SR@scratchlength} is set to the width of the graphic +% (now contained in \cs{SR@filebox}) + 2\cs{tabcolsep}. +% The result represents the total width of a \cs{Graphic} output and +% is used in the \cs{SR@insert} macro to center the output. +% \end{macro} +% +% \subsubsection{The \cs{SR@insert} Macro}\label{insert} +% +% The \cs{SR@insert} macro sets headings and footers for a |longfigure|, +% begins the |longfigure| environment, and calls the appropriate macro to +% display an +% output stream by using \cs{Boxlisting} or \cs{Boxgraphic}. +% The |longfigure| package is described in detail in section \ref{longfigure}. +% \begin{macro}{SR@filebox} +% Two helper macros are necessary to set up for the \cs{SR@insert} +% command: +% \begin{description} +% \item[\cs{SR@set@outheadings}] sets the headings on the output. +% \item[\cs{SR@set@outmargin}] sets the left margin to center the output. +% \end{description} +% \end{macro} +% +% \DescribeMacro{\SR@set@outheadings} +% The \cs{SR@set@outheadings} macro sets the contents of the |longfigure|'s first heading, +% its ``continued'' heading, and the footer. If the content is a \cs{Listing} and the +% destination is |listing|, +% the |longfigure| is framed (the headings and footers include an +% \cs{hline} command). +% +% \begin{macrocode} +\def\SR@set@outheadings{% +% \end{macrocode} +% The following statements define three macros for typing shortcuts: +% \begin{macrocode} + \def\SR@@caption{\caption{\SRcaptionfont\SR@caption}}% + \def\SR@@captioncontinued{\caption{\SRcaptioncontinuedfont\SRcontinuedname}}% + \def\SR@@captionskip{\\*[0.5\baselineskip]}% +% \end{macrocode} +% +% The following statements define a set of \cs{SR@@} macros that are +% used as calculators for the actual macros used +% at the time of typesetting: +% \begin{macrocode} + \ifthenelse{\equal{\SR@dest}{listing}}% + {\def\SR@@firsthead{\hline\endLFfirsthead}% + \def\SR@@conthead{\hline\endLFhead}% + \def\SR@@endfoot{\hline\endLFfoot}}% + % + {\def\SR@@firsthead{\endLFfirsthead}% + \def\SR@@conthead{\endLFhead}% + \def\SR@@endfoot{\endLFfoot}}% + %%% +% \end{macrocode} +% If the \cs{SR@dest} is |listing|, \cs{hline} commands are used for the heading +% and footer of the |longfigure|. +% +% The following statements set initial values for the heading +% and footer based on the preceding definitions: +% \begin{macrocode} + %%% + \renewcommand*{\SR@firsthead}{\SR@@firsthead}% + \renewcommand*{\SR@conthead}{\SR@@conthead}% + \renewcommand*{\SR@endfoot}{\SR@@endfoot}% +% \end{macrocode} +% \begin{macrocode} + \ifthenelse{\equal{\SR@caption}{\@empty}}% + {% CAPTION NOT GIVEN + \addtocounter{\LFcounter}{-1}% + \ifSR@continued% + \renewcommand*{\SR@conthead}{\SR@@captioncontinued% + \SR@@captionskip\SR@@conthead}% + \fi% + }% +% \end{macrocode} +% If a caption has not been specified, the +% first heading is empty. If the |longfigure| is a continuation +% (\cs{SR@continued} is true), the contination heading is set and +% the |longfigure| counter \cs{LFcounter} is decremented. +% Decrementing \cs{LFcounter} anticipates the automatic incrementing of the counter by the +% |longfigure| environment in the |longfigure| package. +% Thus, \textit{continued} |longfigure|s retain the number +% of the preceding |longfigure| environment. +% \begin{macrocode} + {% CAPTION GIVEN + \renewcommand*{\SR@firsthead}{\SR@@caption\label{\SR@label}% + \SR@@captionskip\SR@@firsthead}% + \renewcommand*{\SR@conthead}{\SR@@captioncontinued% + \SR@@captionskip\SR@@conthead}% + } +} +% \end{macrocode} +% If a caption has been specified, both the first heading and the continued +% heading are set appropriately. +% +% \index{output processing|usage} +% \DescribeMacro{\SR@set@outmargin} +% The \cs{SR@set@outmargin} macro sets the |longfigure| parameter |LFleft| based +% on the output dimensions. The output width is set in the +% \cs{Listing} (|listing| destination), +% or \cs{Boxgraphic} macros. The length +% parameter \cs{SR@scratchlength} contains the output width. +% \index{output centering|usage}% +% \begin{macrocode} +\def\SR@set@outmargin{% + \ifdim\SR@scratchlength>\textwidth% + \dosloppy% + \setlength{\LFleft}{(\paperwidth-\SR@scratchlength)/\real{2.0}}% + \addtolength{\LFleft}{-1in}% + \addtolength{\LFleft}{-\hoffset}% + \addtolength{\LFleft}{-\leftskip}% + \ifodd\c@page\addtolength{\LFleft}{-\oddsidemargin}% + \else\addtolength{\LFleft}{-\evensidemargin}% + \fi% + \else% + \setlength{\LFleft}{(\textwidth-\SR@scratchlength)/\real{2.0}}% + \fi% +} +% \end{macrocode} +% If the width of the output is narrower than the text block, it is centered +% with respect to the text block. +% \[ +% \mathsf{LFleft} = \frac{\mathtt{textwidth} - \mathtt{outputwidth}}{2} +% \] +% If the width of the output is wider than the textblock, it is centered with +% respect to the page. The position of the left-hand edge of +% the page from the text block is calculated. +% The text block margin is the sum of the following: +% \begin{itemize} +% \item the standard \TeX\ margin (1 inch) +% \item \cs{hoffset} +% \item \cs{leftskip} +% \item the margin specified in the document design +% \end{itemize} +% To move to the left edge of the page, move left +% by the total amount of margin:\\ +% 1 inch + \cs{hoffset} + \cs{leftskip} + \textit{document margin} +% +% Therefore, to center with respect to the page, add horizontal space equal to half +% the difference between the paper width and the output width. That is: +% \[ +% \mathsf{LFleft} = -(\mathrm{TeX margin}+\mathtt{hoffset} + \mathtt{leftskip} + \mathtt{margin}) +\frac{\mathtt{paperwidth}-\mathtt{outputwidth}}{2} +% \] +% The first term (encompassed in parentheses) moves to the left edge of the page; +% the second and last term adds the +% horizontal space necessary to center the output. For example, using +% |letterpaper|, an output width of 5.75 inches, and a side margin +% of 1.5 inch, and assuming \cs{hoffset} and \cs{leftskip} have their default +% values of zero width, +% the left margin is set as follows: +% \[ +% \mathrm{LFleft} = - (1 + 1.5) + \frac{8.5-5.75}{2} = -1.125 +% \] +% The \cs{LFleft} margin is set to |-1.125|, which is 1.125 inches to the left of the +% normal text block margin. +% +% For documents with unequal margins on even-numbered and odd-numbered pages, +% take the page number into +% account before subtracting the side margin. The \cs{ifodd} macro, provided +% by the |ifthen| package, checks whether the page number is odd or even. +% +% Note: The \cs{dosloppy} command is used only when the output is wider than +% the text block.\index{dosloppy|usage} +% +% \begin{macro}{\SR@insert} +% The \cs{SR@insert} macro inserts an output stream into the document. +% +% The following statements set the heading for the output and box the +% first output in the stream: +% \begin{macrocode} +\newcommand{\SR@insert}[1]{% + \SR@set@outheadings% + \ifthenelse{\equal{\SR@type}{listing}}{\Boxlisting{#1}}{\Boxgraphic{#1}}% + \ifthenelse{\equal{\SR@dest}{latex}}% + {\relax}% + {\SR@set@outmargin}% +% \end{macrocode} +% +% The width of a \cs{Listing} output is calculated in the \cs{Listing} macro. +% The width of a \cs{Graphic} output is calculated in the \cs{Boxgraphic} macro. +% Therefore, after boxing an output, the \cs{SR@scratchlength} contains the +% width of the output regardless of type. With that information, the margins +% that are required for centering are set. This does not apply to outputs with +% |dest=latex|. +% +% The following statements determine whether an output file exists that matches +% the argument specified in the output tag; and if so, they +% set the Boolean switch |SR@multifile| to |true| and display the resulting +% boxed output: +% \begin{macrocode} + \ifthenelse{\equal{\SR@insertname}{\@empty}}% + {\setboolean{SR@multifile}{false}}% + {\setboolean{SR@multifile}{true}}% +% \end{macrocode} +% \changes{v1.07}{2015/09/15}{encapsulates longfigure with bgroup/egroup} +% The following statements center a listing or a graphic and +% put a vertical line on each side of a listing (|listing| destination). +% No horizontal or vertical lines (no box) are drawn for graphics or +% outputs using the |latex| destination. +% \begin{macrocode} + \ifthenelse{\equal{\SR@dest}{listing}}% + {\bgroup\longfigure{|c|}}{\bgroup\longfigure{c}}% + \SR@firsthead\SR@conthead\SR@endfoot% + \usebox{\SR@filebox}% +% \end{macrocode} +% The following statements begin the input loop, inserting output files that +% match the specified stem pattern until +% there are no matching files:\index{output insertion|usage} +% \begin{macrocode} + \setcounter{SR@multifilecount}{1}% + \whiledo{\boolean{SR@multifile}}{% + \ifthenelse{\equal{\SR@type}{listing}}% + {\Boxlisting{#1\arabic{SR@multifilecount}}}% + {\Boxgraphic{#1\arabic{SR@multifilecount}}}% + \ifthenelse{\equal{\SR@insertname}{\@empty}}% + {\setboolean{SR@multifile}{false}}% + {\\[0.5\baselineskip]\usebox{\SR@filebox}% + \stepcounter{SR@multifilecount}% + \setboolean{SR@multifile}{true}}% + }% + \endlongfigure\egroup% + \unsloppy% +} +% \end{macrocode} +% The logic of the preceding statements is depicted in Algorithm \ref{malgo}. +% +% \begin{algorithm}[H] +% \While{multiple files is True} +% {\eIf{type=listing}{Boxlisting}{Boxgraphic} +% \eIf{file exists}{insert contents, increment counter}{multiple files is False} +% } +% \caption{Input Loop for the Output Stream}\label{malgo} +% \end{algorithm} +% +% When SAS generates a set of files from one ODS selection, it follows a +% pattern. The first file that is generated is identical to the filename. The next +% file that is generated has the same name with a ``1'' appended to it, the next file +% has the same name with a ``2'' appended, and so on. +% The preceding statements input the original file; the following statements test for +% the existence of a file that has a name with the next digit in the +% sequence appended. The \cs{SR@multifilecount} counter contains the +% digit. With each inserted file, the counter is incremented. +% +% When no file matches the pattern (the +% \cs{SR@insertname} macro is \cs{@empty}), the Boolean switch +% \cs{SR@multifile} is set to false and the loop is ended. +% +% The \cs{unsloppy} macro is called when the stream insertion is finished +% to undo the effects of a \cs{dosloppy} command, which is called when +% the width of the output is greater than the width of +% the textblock. Invoking the \cs{unsloppy} macro +% multiple times has the same effect as calling it once; that is, even if +% \cs{dosloppy} is never called, calling \cs{unsloppy} causes no problem. +% +% \end{macro} +%\iffalse +%</statrep> +%\fi +%<*longfigure> +% \section{\textsf{\small longfigure} Usage} +% \label{longfigure} +% \index{longfigure package|usage} +% +% The |longfigure| package uses and relabels components of the +% well-known |longtable| package, written by David Carlisle, to +% provide a table-like environment that can display a stream +% of subfigures as a single figure that can break across pages. +% +% The |longtable| package defines a |longtable| environment, +% which produces tables that can be broken by \TeX's standard page-breaking algorithm. +% Similarly, the |longfigure| package defines a |longfigure| environment, which produces +% figures that can be broken by \TeX's standard page-breaking algorithm. +% The internal structure of a long figure is similar to a long table. +% Rows might contain (for example) tables or graphics. Page breaks +% can occur only between rows. +% +% The |longfigure| package differs from the |longtable| package in the following ways: +% \begin{itemize} +% \item The |longfigure| package supports two additional key-value options: +% \begin{itemize} +% \item The |figname=| option specifies the counter for numbering |longfigure| environments. +% You can specify any string; the default is |figure|. +% When you specify a |figname=| value for which no counter already exists, the +% |longfigure| package loads the |tocloft| package and creates the counter. +% \index{figname option|usage} +% +% \item The |resetby=| option specifies a counter (for example, |resetby=chapter|) such +% that output numbering is reset each time the counter value changes. +% If a counter is specified that does not exist, the |tocloft| package is +% loaded to create the new counter. +% \index{tocloft package|usage}% +% For information about how the lists are typeset, +% \index{list of outputs, creating|usage}% +% see the |tocloft| package documentation. +% \end{itemize} +% \item The counters and macros that start with \cs{LT} in the |longtable| package +% are renamed to start with \cs{LF} in the |longfigure| pacakge to avoid +% namespace conflicts when the two packages are used together. +% The generic macros that are defined in the |longtable| package +% (\cs{endfirsthead}, \cs{endhead}, \cs{endfoot}, and \cs{endlastfoot}) are +% also renamed with \cs{LF} as a prefix in the |longfigure| package. +% +% \item The \cs{LF@name} macro is based on the \cs{fnum@table} macro from +% the |longtable| package. The \cs{LF@name} macro returns the capitalized +% counter name and value. For example, if the counter is |figure| and the +% macro is processing the second |longfigure|, the \cs{LF@name} macro +% would contain the value ``Figure 2.'' +% +% \end{itemize} +% You can use the |longfigure| package defaults to produce a \emph{List of Figures} +% by inserting the following tag in your document at the point where you want +% the list to appear: +% \iffalse +%<*example> +% \fi +\begin{verbatim} + \listoffigures +\end{verbatim} +% \iffalse +%</example> +% \fi +% +% The default counter used to display figures is the |figure| counter, +% but you can specify a different counter. For example, if you want your +% figures to be labeled as ``Display,'' specify |figname=display| when you +% load the |longfigure| package; to display a \emph{List of Displays}, insert the following +% command in your document at the point where you want the list to appear: +% \iffalse +%<*example> +% \fi +\begin{verbatim} + \listofdisplay +\end{verbatim} +% \iffalse +%</example> +% \fi +% \textbf{Note:} If you specify a counter that does not exist, +% an auxiliary file with extension |.lft| is created to contain the information +% needed to create the list. +% +% If you want to use more advanced features of the |tocloft| package, +% load it before you load the |longfigure| package so that the |longfigure| +% package sees that the counters specified by the |figname=| and |resetby=| +% options are already defined and does not attempt to create them. +% +% +%\subsection{Example} +% The following lines produce a single figure that contains three images and +% one tabular environment. Each element is a row of the |longfigure| environment. +% Page breaks can occur between rows. +%% \iffalse +%<*example> +% \fi +\begin{verbatim} +\documentclass{book} +\usepackage{graphicx} +\usepackage{longfigure} + +\begin{document} + \begin{longfigure}{c} + \caption{My Long Figure}\label{mlfig}\\ + \includegraphics[width=3in]{myfig1}\\ + \includegraphics[width=3in]{myfig2}\\ + \includegraphics[width=3in]{myfig3}\\ + \begin{tabular}{ll} + one & two \\ + three & four\\ + \end{tabular} + \end{longfigure} +\end{document} +\end{verbatim} +% \iffalse +%</example> +% \fi +% In this example, the |{c}| argument in the |\begin{longfigure}| command +% specifies only a single centered column. You can also specify multiple columns and, +% if needed, use the \cs{multicolumn} command for more flexibility. +% +% The following lines display another example that specifies a 'continued' heading +% when the figure breaks over a page. It also displays a double horizontal line at the +% end of the figure. +% \iffalse +%<*example> +% \fi +\begin{verbatim} +\documentclass{book} +\usepackage{graphicx} +\usepackage{longfigure} + +\begin{document} + \begin{longfigure}{c} + \caption{My Long Figure}\label{mlfig2}\\ + \hline\endLFfirsthead + \caption{continued}\\ + \hline\endLFhead + \hline\endLFfoot + \hline\hline\endLFlastfoot + \includegraphics[width=3in]{myfig1}\\ + \includegraphics[width=3in]{myfig2}\\ + \includegraphics[width=3in]{myfig3}\\ + \begin{tabular}{ll} + one & two \\ + three & four\\ + \end{tabular} + \end{longfigure} +\end{document} +\end{verbatim} +% \iffalse +%</example> +% \fi +% \section{Implementation} +% +% This section describes the implementation of the |longfigure| package. +% The comments describe only the changes from the |longtable| package code. +% For complete details about the logic and usage of the |longtable| environment, +% see Carlisle (2004). +%\iffalse +%<*longfigure> +%\fi +% \begin{macrocode} +\ProvidesPackage{longfigure}[2014/01/06 longfigure] +% \end{macrocode} +% The following statement loads the |xkeyval| package for declaring +% and processing package options: +% \begin{macrocode} +\RequirePackage{xkeyval} +% \end{macrocode} +% The following statement defines a new command, \cs{LFcounter}, to +% contain the string |figure|. +% Later code tests whether a counter with that name exists. +% \begin{macrocode} +\newcommand*{\LFcounter}{figure} +% \end{macrocode} +% +% The following statement defines a new command, \cs{LFreset}, to contain +% the name of the counter within which the |longfigure| number should reset. +% If no value is specified, the long figures are numbered consecutively +% through the document. +% \begin{macrocode} +\newcommand*{\LFreset}{\@empty} +% \end{macrocode} +% \subsection{Options} +% The \cs{LFcounter} and \cs{LFreset} commands support the +% package options |figname=| and |resetby=| as follows: +% \begin{macrocode} +\DeclareOptionX{figname}[figure]{\renewcommand*{\LFcounter}{#1}} +\DeclareOptionX{resetby}{\renewcommand*{\LFreset}{#1}} +% \end{macrocode} +% The following statements further define the options +% that the |longtable| package defines: +% \begin{macrocode} +\DeclareOptionX{set}{} +\DeclareOptionX{final}{} +\DeclareOptionX{errorshow}{\def\LF@warn{\PackageInfo{longfigure}}} +\DeclareOptionX{pausing}{\def\LF@warn#1{\LF@err{#1}{This is not really an error}}} +\ProcessOptionsX +% \end{macrocode} +% The following statements process the options: +% \begin{macrocode} +\def\LFProcessOptions#1{ + \@ifundefined{c@#1}{% + \RequirePackage{tocloft} + \def\LFuc##1##2{\MakeUppercase{##1}{##2}} + \expandafter\def\csname list#1name\endcsname{List of \LFuc#1s} + \ifx\@empty\LFreset% + \newlistof{#1}{lft}{\csname list#1name\endcsname} + \else + \newlistof[\LFreset]{#1}{lft}{\csname list#1name\endcsname} + \fi + }{}% +} +\expandafter\LFProcessOptions\expandafter{\LFcounter} +% \end{macrocode} +% If a counter is specified that does not exist, its name (\cs{c@}\textit{countername}) +% is undefined and the |longfigure| package loads the |tocloft| package in order to +% use its commands to create the new counters and list. +% +% Thus, the |tocloft| package is required only when a new counter +% is specified, +% \index{tocloft package|usage}% +% and this automatic loading takes place only if the counter that is specified +% in the package options is not defined. +% +% You can load the |tocloft| package before loading the |longfigure| package +% and retain all of the flexibility that the |tocloft| package offers. +% However, you must define the new counters yourself by using the +% \cs{newlistof} command in the |tocloft| package, +% and you must define the new list to use an auxiliary |lft| file where +% its auxiliary information is written. +% \index{tocloft package|usage}% +% +% \subsection{Utilities} +% \DescribeMacro{\strcfstr} +% The following macro, \cs{strcfstr}, checks whether two strings, which are +% provided as arguments, are equal (Wilson, 2001). +% A new boolean \cs{ifLF@same} contains the result of the test. +% \begin{macrocode} +\newif\ifLF@same +\newcommand{\strcfstr}[2]{% + \LF@samefalse + \begingroup\def\2{#2} + \ifx\2#1\endgroup\LF@sametrue + \else\endgroup + \fi +} +% \end{macrocode} +% \DescribeMacro{\LFupcase} +% The following macro, \cs{LFupcase}, uppercases the first letter of +% a string (Lazarides, 2010): +% \begin{macrocode} +\def\LFupcase#1{% + \def\x##1##2{% + \MakeUppercase{##1}{##2}}\x#1% +} +% \end{macrocode} +% The following macro, \cs{LF@name}, creates a string to provide a label and number for +% an output. Analogous to the \cs{fnum@table} macro in the |longtable| package, +% it contains the capitalized version of the counter name and the counter +% number (for example, |Figure~3|). +% \begin{macrocode} +\def\LF@name{\expandafter\LFupcase% + \expandafter{\LFcounter}~% + \expandafter\csname the\LFcounter\endcsname}% +% \end{macrocode} +% The remainder of this package follows the |longtable| package +% almost identically, except that macros, skips, counters, and so on +% use an \cs{LF} prefix instead of the \cs{LT} prefix that the |longtable| package uses. +% +% \begin{macrocode} +\def\LF@err{\PackageError{longfigure}} +\def\LF@warn{\PackageWarning{longfigure}} +\def\LF@final@warn{% + \AtEndDocument{% + \LF@warn{\LFcounter \@width s have changed. Rerun \LaTeX\.\@gobbletwo}}% + \global\let\LF@final@warn\relax} +% +\newskip\LFleft \LFleft=\fill +\newskip\LFright \LFright=\fill +\newskip\LFpre \LFpre=\bigskipamount +\newskip\LFpost \LFpost=\bigskipamount +\newcount\LFchunksize \LFchunksize=20 +\let\c@LFchunksize\LFchunksize +\newdimen\LFcapwidth \LFcapwidth=4in +\newbox\LF@head +\newbox\LF@firsthead +\newbox\LF@foot +\newbox\LF@lastfoot +\newcount\LF@cols +\newcount\LF@rows +\newcounter{LF@tables} +\newcounter{LF@chunks}[LF@tables] +% +\newtoks\LF@p@ftn +\mathchardef\LF@end@pen=30000 +\def\longfigure{% + \par + \ifx\multicols\@undefined + \else + \ifnum\col@number>\@ne + \@twocolumntrue + \fi + \fi + \if@twocolumn + \LF@err{longfigure not in 1-column mode}\@ehc + \fi + \begingroup + \@ifnextchar[\LF@array{\LF@array[x]}} +\def\LF@array[#1]#2{% + \refstepcounter{\LFcounter}\stepcounter{LF@tables}% + \if l#1% + \LFleft\z@ \LFright\fill + \else\if r#1% + \LFleft\fill \LFright\z@ + \else\if c#1% + \LFleft\fill \LFright\fill + \fi\fi\fi + \let\LF@mcol\multicolumn + \let\LF@@tabarray\@tabarray + \let\LF@@hl\hline + \def\@tabarray{% + \let\hline\LF@@hl + \LF@@tabarray}% + \let\\\LF@tabularcr\let\tabularnewline\\% + \def\newpage{\noalign{\break}}% + \def\pagebreak{\noalign{\ifnum`}=0\fi\@testopt{\LF@no@pgbk-}4}% + \def\nopagebreak{\noalign{\ifnum`}=0\fi\@testopt\LF@no@pgbk4}% + \let\hline\LF@hline \let\kill\LF@kill\let\caption\LF@caption + \@tempdima\ht\strutbox + \let\@endpbox\LF@endpbox + \ifx\extrarowheight\@undefined + \let\@acol\@tabacol + \let\@classz\@tabclassz \let\@classiv\@tabclassiv + \def\@startpbox{\vtop\LF@startpbox}% + \let\@@startpbox\@startpbox + \let\@@endpbox\@endpbox + \let\LF@LL@FM@cr\@tabularcr + \else + \advance\@tempdima\extrarowheight + \col@sep\tabcolsep + \let\@startpbox\LF@startpbox\let\LF@LL@FM@cr\@arraycr + \fi + \setbox\@arstrutbox\hbox{\vrule + \@height \arraystretch \@tempdima + \@depth \arraystretch \dp \strutbox + \@width \z@}% + \let\@sharp##\let\protect\relax + \begingroup + \@mkpream{#2}% + \xdef\LF@bchunk{% + \global\advance\c@LF@chunks\@ne + \global\LF@rows\z@\setbox\z@\vbox\bgroup + \LF@setprevdepth + \tabskip\LFleft \noexpand\halign to\hsize\bgroup + \tabskip\z@ \@arstrut \@preamble \tabskip\LFright \cr}% + \endgroup + \expandafter\LF@nofcols\LF@bchunk&\LF@nofcols + \LF@make@row + \m@th\let\par\@empty + \everycr{}\lineskip\z@\baselineskip\z@ + \LF@bchunk} +\def\LF@no@pgbk#1[#2]{\penalty #1\@getpen{#2}\ifnum`{=0\fi}} +\def\LF@start{% + \let\LF@start\endgraf + \endgraf\penalty\z@\vskip\LFpre + \dimen@\pagetotal + \advance\dimen@ \ht\ifvoid\LF@firsthead\LF@head\else\LF@firsthead\fi + \advance\dimen@ \dp\ifvoid\LF@firsthead\LF@head\else\LF@firsthead\fi + \advance\dimen@ \ht\LF@foot + \dimen@ii\vfuzz + \vfuzz\maxdimen + \setbox\tw@\copy\z@ + \setbox\tw@\vsplit\tw@ to \ht\@arstrutbox + \setbox\tw@\vbox{\unvbox\tw@}% + \vfuzz\dimen@ii + \advance\dimen@ \ht + \ifdim\ht\@arstrutbox>\ht\tw@\@arstrutbox\else\tw@\fi + \advance\dimen@\dp + \ifdim\dp\@arstrutbox>\dp\tw@\@arstrutbox\else\tw@\fi + \advance\dimen@ -\pagegoal + \ifdim \dimen@>\z@\vfil\break\fi + \global\@colroom\@colht + \ifvoid\LF@foot\else + \advance\vsize-\ht\LF@foot + \global\advance\@colroom-\ht\LF@foot + \dimen@\pagegoal\advance\dimen@-\ht\LF@foot\pagegoal\dimen@ + \maxdepth\z@ + \fi + \ifvoid\LF@firsthead\copy\LF@head\else\box\LF@firsthead\fi\nobreak + \output{\LF@output}} +\def\endlongfigure{% + \crcr + \noalign{% + \let\LF@entry\LF@entry@chop + \xdef\LF@save@row{\LF@save@row}}% + \LF@echunk + \LF@start + \unvbox\z@ + \LF@get@widths + \if@filesw + {\let\LF@entry\LF@entry@write\immediate\write\@auxout{% + \gdef\expandafter\noexpand + \csname LF@\romannumeral\c@LF@tables\endcsname + {\LF@save@row}}}% + \fi + \ifx\LF@save@row\LF@@save@row + \else + \LF@warn{Column \@width s have changed\MessageBreak + in table \thetable}% + \LF@final@warn + \fi + \endgraf\penalty -\LF@end@pen + \endgroup + \global\@mparbottom\z@ + \pagegoal\vsize + \endgraf\penalty\z@\addvspace\LFpost + \ifvoid\footins\else\insert\footins{}\fi} +\def\LF@nofcols#1&{% + \futurelet\@let@token\LF@n@fcols} +\def\LF@n@fcols{% + \advance\LF@cols\@ne + \ifx\@let@token\LF@nofcols + \expandafter\@gobble + \else + \expandafter\LF@nofcols + \fi} +\def\LF@tabularcr{% + \relax\iffalse{\fi\ifnum0=`}\fi + \@ifstar + {\def\crcr{\LF@crcr\noalign{\nobreak}}\let\cr\crcr + \LF@t@bularcr}% + {\LF@t@bularcr}} +\let\LF@crcr\crcr +\let\LF@setprevdepth\relax +\def\LF@t@bularcr{% + \global\advance\LF@rows\@ne + \ifnum\LF@rows=\LFchunksize + \gdef\LF@setprevdepth{% + \prevdepth\z@\global + \global\let\LF@setprevdepth\relax}% + \expandafter\LF@xtabularcr + \else + \ifnum0=`{}\fi + \expandafter\LF@LL@FM@cr + \fi} +\def\LF@xtabularcr{% + \@ifnextchar[\LF@argtabularcr\LF@ntabularcr} +\def\LF@ntabularcr{% + \ifnum0=`{}\fi + \LF@echunk + \LF@start + \unvbox\z@ + \LF@get@widths + \LF@bchunk} +\def\LF@argtabularcr[#1]{% + \ifnum0=`{}\fi + \ifdim #1>\z@ + \unskip\@xargarraycr{#1}% + \else + \@yargarraycr{#1}% + \fi + \LF@echunk + \LF@start + \unvbox\z@ + \LF@get@widths + \LF@bchunk} +\def\LF@echunk{% + \crcr\LF@save@row\cr\egroup + \global\setbox\@ne\lastbox + \unskip + \egroup} +\def\LF@entry#1#2{% + \ifhmode\@firstofone{&}\fi\omit + \ifnum#1=\c@LF@chunks + \else + \kern#2\relax + \fi} +\def\LF@entry@chop#1#2{% + \noexpand\LF@entry + {\ifnum#1>\c@LF@chunks + 1}{0pt% + \else + #1}{#2% + \fi}} +\def\LF@entry@write{% + \noexpand\LF@entry^^J% + \@spaces} +\def\LF@kill{% + \LF@echunk + \LF@get@widths + \expandafter\LF@rebox\LF@bchunk} +\def\LF@rebox#1\bgroup{% + #1\bgroup + \unvbox\z@ + \unskip + \setbox\z@\lastbox} +\def\LF@blank@row{% + \xdef\LF@save@row{\expandafter\LF@build@blank + \romannumeral\number\LF@cols 001 }} +\def\LF@build@blank#1{% + \if#1m% + \noexpand\LF@entry{1}{0pt}% + \expandafter\LF@build@blank + \fi} +\def\LF@make@row{% + \global\expandafter\let\expandafter\LF@save@row + \csname LF@\romannumeral\c@LF@tables\endcsname + \ifx\LF@save@row\relax + \LF@blank@row + \else + {\let\LF@entry\or + \if!% + \ifcase\expandafter\expandafter\expandafter\LF@cols + \expandafter\@gobble\LF@save@row + \or + \else + \relax + \fi + !% + \else + \aftergroup\LF@blank@row + \fi}% + \fi} +\let\setlongfigures\relax +\def\LF@get@widths{% + \setbox\tw@\hbox{% + \unhbox\@ne + \let\LF@old@row\LF@save@row + \global\let\LF@save@row\@empty + \count@\LF@cols + \loop + \unskip + \setbox\tw@\lastbox + \ifhbox\tw@ + \LF@def@row + \advance\count@\m@ne + \repeat}% + \ifx\LF@@save@row\@undefined + \let\LF@@save@row\LF@save@row + \fi} +\def\LF@def@row{% + \let\LF@entry\or + \edef\@tempa{% + \ifcase\expandafter\count@\LF@old@row + \else + {1}{0pt}% + \fi}% + \let\LF@entry\relax + \xdef\LF@save@row{% + \LF@entry + \expandafter\LF@max@sel\@tempa + \LF@save@row}} +\def\LF@max@sel#1#2{% + {\ifdim#2=\wd\tw@ + #1% + \else + \number\c@LF@chunks + \fi}% + {\the\wd\tw@}} +\def\LF@hline{% + \noalign{\ifnum0=`}\fi + \penalty\@M + \futurelet\@let@token\LF@@hline} +\def\LF@@hline{% + \ifx\@let@token\hline + \global\let\@gtempa\@gobble + \gdef\LF@sep{\penalty-\@medpenalty\vskip\doublerulesep}% + \else + \global\let\@gtempa\@empty + \gdef\LF@sep{\penalty-\@lowpenalty\vskip-\arrayrulewidth}% + \fi + \ifnum0=`{\fi}% + \multispan\LF@cols + \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr + \noalign{\LF@sep}% + \multispan\LF@cols + \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr + \noalign{\penalty\@M}% + \@gtempa} +% \end{macrocode} +% \subsection{Captioning} +% You can easily change how a long figure is captioned by +% redefining the \cs{LF@makecaption} macro after loading the |longfigure| package. +% The following statements show the default definition of the +% \cs{LF@makecaption}: +% +% \begin{macrocode} +\def\LF@caption{% + \noalign\bgroup + \@ifnextchar[{\egroup\LF@c@ption\@firstofone}\LF@capti@n} +% \end{macrocode} +% The \cs{LF@caption} command begins the process. +% If it includes an optional argument, it calls \cs{LF@c@ption}; otherwise +% it calls \cs{LF@capti@n}, which then calls \cs{LF@c@ption}. +% \begin{macrocode} +\def\LF@c@ption#1[#2]#3{% + \LF@makecaption#1\LF@name{#3}% + \def\@tempa{#2}% + \ifx\@tempa\@empty\else +% \end{macrocode} +% If a list of long figures is requested, the following code uses the +% previously defined \cs{strcfstr} macro and \cs{ifLF@same} boolean +% to determine the name of the counter and set the output file to +% contain the |longfigure| information. +% +% The code writes to one of the following files. +% \begin{itemize} +% \item If the counter is |figure|, write to the |lof| file. +% \item If the counter is |table|, write to the |lot| file. +% \item Otherwise, write to |lft|, a file created here for this purpose. +% \end{itemize} +% +% \begin{macrocode} + {\let\\\space + \strcfstr{\LFcounter}{figure} + \ifLF@same\def\LFoutfile{lof}\else + \strcfstr{\LFcounter}{table} + \ifLF@same\def\LFoutfile{lot}\else + \def\LFoutfile{lft}\fi\fi + \addcontentsline{\LFoutfile}{\LFcounter} + {\expandafter\protect\expandafter\numberline\expandafter% + {\expandafter\csname the\LFcounter\endcsname}{#2}}}% + \fi +} +% \end{macrocode} +% The \cs{LF@c@ption} macro ends the process when it calls the +% \cs{LF@makecaption} macro, which typesets the caption. +% \begin{macrocode} +\def\LF@capti@n{% + \@ifstar + {\egroup\LF@c@ption\@gobble[]}% + {\egroup\@xdblarg{\LF@c@ption\@firstofone}}} +% \end{macrocode} +% +% If you want to redefine how the |longfigure| is captioned, +% you need to override the following macro. +% The first argument is the name of the counter +% (for example, |Figure|), the second argument is the number of the counter, and the +% third argument is the caption itself. +% \begin{macrocode} +\def\LF@makecaption#1#2#3{% + \LF@mcol\LF@cols c{\hbox to\z@{\hss\parbox[t]\LFcapwidth{% + \sbox\@tempboxa{#1{#2: }#3}% + \ifdim\wd\@tempboxa>\hsize + #1{#2: }#3% + \else + \hbox to\hsize{\hfil\box\@tempboxa\hfil}% + \fi + \endgraf\vskip\baselineskip}% + \hss}}} +\def\LF@output{% + \ifnum\outputpenalty <-\@Mi + \ifnum\outputpenalty > -\LF@end@pen + \LF@err{floats and marginpars not allowed in a longfigure}\@ehc + \else + \setbox\z@\vbox{\unvbox\@cclv}% + \ifdim \ht\LF@lastfoot>\ht\LF@foot + \dimen@\pagegoal + \advance\dimen@-\ht\LF@lastfoot + \ifdim\dimen@<\ht\z@ + \setbox\@cclv\vbox{\unvbox\z@\copy\LF@foot\vss}% + \@makecol + \@outputpage + \setbox\z@\vbox{\box\LF@head}% + \fi + \fi + \global\@colroom\@colht + \global\vsize\@colht + \vbox + {\unvbox\z@\box\ifvoid\LF@lastfoot\LF@foot\else + \LF@lastfoot\fi}% + \fi + \else + \setbox\@cclv\vbox{\unvbox\@cclv\copy\LF@foot\vss}% + \@makecol + \@outputpage + \global\vsize\@colroom + \copy\LF@head\nobreak + \fi} +\def\LF@end@hd@ft#1{% + \LF@echunk + \ifx\LF@start\endgraf + \LF@err + {Longfigure head or foot not at start of table}% + {Increase LFchunksize}% + \fi + \setbox#1\box\z@ + \LF@get@widths + \LF@bchunk} +% \end{macrocode} +% The following four macros do not have an \cs{LT} prefix in the |longtable| package, +% but they must be redefined to have an \cs{LF} prefix in order to avoid a namespace clash; +% \begin{macrocode} +\def\endLFfirsthead{\LF@end@hd@ft\LF@firsthead} +\def\endLFhead{\LF@end@hd@ft\LF@head} +\def\endLFfoot{\LF@end@hd@ft\LF@foot} +\def\endLFlastfoot{\LF@end@hd@ft\LF@lastfoot} + % +\def\LF@startpbox#1{% + \bgroup + \let\@footnotetext\LF@p@ftntext + \setlength\hsize{#1}% + \@arrayparboxrestore + \vrule \@height \ht\@arstrutbox \@width \z@} +\def\LF@endpbox{% + \@finalstrut\@arstrutbox + \egroup + \the\LF@p@ftn + \global\LF@p@ftn{}% + \hfil} +\def\LF@p@ftntext#1{% + \edef\@tempa{\the\LF@p@ftn\noexpand\footnotetext[\the\c@footnote]}% + \global\LF@p@ftn\expandafter{\@tempa{#1}}}% +% \end{macrocode} +% \subsection{References} +% +% Carlisle, D. 2004. +% \emph{The longtable Package}. +% Included in the ``Comprehensive \TeX\ Archive Network.'' \url{http://ctan.org}. +% +% Lazarides, Y. 2010. +% \TeX stackexchange, online forum. \url{http://tex.stackexchange.com/questions/7992}. +% +% Sch\"opf, R, B. Raichle, and C. Rowley. 2001. +% \emph{A New Implementation of \LaTeX's \texttt{verbatim} and \texttt{verbatim*} Environments}. +% Originally appeared in TUGboat 1990, 11(2), 284--296. +% +% Thanh, H., S. Rahtz, H. Hagen, and H. Henkel. 2009. +% ``The pdf\TeX\ User's Manual,'' Revision 655, corresponding to pdf\TeX\ 1.40.11. +% \url{www.tug.org/applications/pdftex}. +% +% Wilson, P. 2001. +% \emph{Glisterings}. In TUGboat 22(4), 339--340. +% +% +% \iffalse +%</longfigure> +% \fi +%\Finale +%\endinput |