% \iffalse meta-comment % % newfile.dtx % Copyright 2002 Peter R. Wilson % % This program is provided under the terms of the % LaTeX Project Public License distributed from CTAN % archives in directory macros/latex/base/lppl.txt. % % Author: Peter Wilson (CUA) (now at: peter.r.wilson@boeing.com) % %<*driver> \documentclass{ltxdoc} \EnableCrossrefs \CodelineIndex \setcounter{StandardModuleDepth}{1} \begin{document} \DocInput{newfile.dtx} \end{document} % % % \fi % % \CheckSum{329} % % \DoNotIndex{\',\.,\@M,\@@input,\@addtoreset,\@arabic,\@badmath} % \DoNotIndex{\@centercr,\@cite} % \DoNotIndex{\@dotsep,\@empty,\@float,\@gobble,\@gobbletwo,\@ignoretrue} % \DoNotIndex{\@input,\@ixpt,\@m} % \DoNotIndex{\@minus,\@mkboth,\@ne,\@nil,\@nomath,\@plus,\@set@topoint} % \DoNotIndex{\@tempboxa,\@tempcnta,\@tempdima,\@tempdimb} % \DoNotIndex{\@tempswafalse,\@tempswatrue,\@viipt,\@viiipt,\@vipt} % \DoNotIndex{\@vpt,\@warning,\@xiipt,\@xipt,\@xivpt,\@xpt,\@xviipt} % \DoNotIndex{\@xxpt,\@xxvpt,\\,\ ,\addpenalty,\addtolength,\addvspace} % \DoNotIndex{\advance,\Alph,\alph} % \DoNotIndex{\arabic,\ast,\begin,\begingroup,\bfseries,\bgroup,\box} % \DoNotIndex{\bullet} % \DoNotIndex{\cdot,\cite,\CodelineIndex,\cr,\day,\DeclareOption} % \DoNotIndex{\def,\DisableCrossrefs,\divide,\DocInput,\documentclass} % \DoNotIndex{\DoNotIndex,\egroup,\ifdim,\else,\fi,\em,\endtrivlist} % \DoNotIndex{\EnableCrossrefs,\end,\end@dblfloat,\end@float,\endgroup} % \DoNotIndex{\endlist,\everycr,\everypar,\ExecuteOptions,\expandafter} % \DoNotIndex{\fbox} % \DoNotIndex{\filedate,\filename,\fileversion,\fontsize,\framebox,\gdef} % \DoNotIndex{\global,\halign,\hangindent,\hbox,\hfil,\hfill,\hrule} % \DoNotIndex{\hsize,\hskip,\hspace,\hss,\if@tempswa,\ifcase,\or,\fi,\fi} % \DoNotIndex{\ifhmode,\ifvmode,\ifnum,\iftrue,\ifx,\fi,\fi,\fi,\fi,\fi} % \DoNotIndex{\input} % \DoNotIndex{\jobname,\kern,\leavevmode,\let,\leftmark} % \DoNotIndex{\list,\llap,\long,\m@ne,\m@th,\mark,\markboth,\markright} % \DoNotIndex{\month,\newcommand,\newcounter,\newenvironment} % \DoNotIndex{\NeedsTeXFormat,\newdimen} % \DoNotIndex{\newlength,\newpage,\nobreak,\noindent,\null,\number} % \DoNotIndex{\numberline,\OldMakeindex,\OnlyDescription,\p@} % \DoNotIndex{\pagestyle,\par,\paragraph,\paragraphmark,\parfillskip} % \DoNotIndex{\penalty,\PrintChanges,\PrintIndex,\ProcessOptions} % \DoNotIndex{\protect,\ProvidesClass,\raggedbottom,\raggedright} % \DoNotIndex{\refstepcounter,\relax,\renewcommand,\reset@font} % \DoNotIndex{\rightmargin,\rightmark,\rightskip,\rlap,\rmfamily,\roman} % \DoNotIndex{\roman,\secdef,\selectfont,\setbox,\setcounter,\setlength} % \DoNotIndex{\settowidth,\sfcode,\skip,\sloppy,\slshape,\space} % \DoNotIndex{\symbol,\the,\trivlist,\typeout,\tw@,\undefined,\uppercase} % \DoNotIndex{\usecounter,\usefont,\usepackage,\vfil,\vfill,\viiipt} % \DoNotIndex{\viipt,\vipt,\vskip,\vspace} % \DoNotIndex{\wd,\xiipt,\year,\z@} % % \changes{v1.0}{2002/06/22}{First public release} % \changes{v1.0a}{2002/07/07}{Corrected documentation} % % \def\fileversion{v1.0} % \def\filedate{2002/06/22} % \def\fileversion{v1.0a} % \def\filedate{2002/07/07} % \newcommand*{\Lpack}[1]{\textsf {#1}} ^^A typeset a package % \newcommand*{\Lopt}[1]{\textsf {#1}} ^^A typeset an option % \newcommand*{\file}[1]{\texttt {#1}} ^^A typeset a file % \newcommand*{\Lcount}[1]{\textsl {\small#1}} ^^A typeset a counter % \newcommand*{\pstyle}[1]{\textsl {#1}} ^^A typeset a pagestyle % \newcommand*{\Lenv}[1]{\texttt {#1}} ^^A typeset an environment % % \title{The \Lpack{newfile} package\thanks{This % file has version number \fileversion, last revised % \filedate.}} % % \author{% % Peter Wilson\\ % Catholic University of America \\ % Now at \texttt{peter.r.wilson@boeing.com} % } % \date{\filedate} % \maketitle % \begin{abstract} % The \Lpack{newfile} package provides convenient user level commands % for reading and writing new files during a LaTeX run. % \end{abstract} % \tableofcontents % % % \section{Introduction} % % TeX has a maximum of 16 input and 16 output \emph{streams} % for reading and writing % files. The \Lpack{newfile} package provides means of associating % several different files with a particular stream. % % The \Lpack{newfile} package requires the \Lpack{verbatim} % package~\cite{VERBATIM}, which is one of the required packages in % a LaTeX distribution. % % This manual is typeset according to the conventions of the % \LaTeX{} \textsc{docstrip} utility which enables the automatic % extraction of the \LaTeX{} macro source files~\cite{GOOSSENS94}. % % Section~\ref{sec:usc} describes the usage of the package. % Commented source code for the package is in Section~\ref{sec:code}. % % \section{The \Lpack{newfile} package} \label{sec:usc} % % % \DescribeMacro{\newoutputstream} % \DescribeMacro{\newinputstream} % The command |\newoutputstream|\marg{stream} creates a new stream % called \meta{stream} for writing out text and commands. The \meta{stream} % should be just alphabetic characters with no spaces; for example |myout|. % The command |\newinputstream|\marg{stream} creates a new stream for % reading from a file. The \meta{stream} names must be unique --- you cannot % use the same name for both an input and an output stream. % % If you try and create too many streams, TeX will tell you via an error % message. % % These two commands also attempt to create two other new commands, % called respectively % |\atstreamopen| and |\atstreamclose|. If these commands % already exist then they are left untouched, otherwise they are % created (like using |\providecommand{\atstreamopen|. Any pre-existing contents of \meta{filname} % are deleted. % % \DescribeMacro{\closeoutputstream} % The macro |\closeoutputstream|\marg{stream} calls the macro % |\atstreamclose|, closes the output stream % \meta{stream} and closes whatever file % is currently attached to \meta{stream}. It then detaches the file from % the stream. % % \DescribeEnv{writeverbatim} % The |writeverbatim| environment takes one argument, the name of an output % stream, which must be open. The contents of the environment are written % out verbatim to the file currently attached to the stream. % % \DescribeMacro{\addtostream} % The command |\addtostream|\marg{stream}\marg{text} writes \meta{text} % to the file currently attached to the output stream \meta{stream}, which % must be open. Any commands within \meta{text} will be processed before % being written. To prevent this, put |\protect| before any command that % you do not want expanding. % % \DescribeMacro{\openinputfile} % The macro |\openinputfile|\marg{filename}\marg{stream} opens the % file called \meta{filename} and the input stream \meta{stream}. It % then attaches the file to the stream for reading and calls the macro % |\atstreamopen|. It is an error if \meta{filename} can not be found. % % \DescribeMacro{\closeinputstream} % The macro |\closeinputstream|\marg{stream} calls the macro % |\atstreamclose|, closes the input stream % \meta{stream} and closes whatever file % is currently attached to \meta{stream}. It then detaches the file from % the stream. % % \DescribeMacro{\readstream} % The macro |\readstream|\marg{stream} reads the contents of the file that % is currently associated with the input stream \meta{stream}. This provides % the same functionality as |\input|\marg{filename} does. % % \DescribeMacro{\readaline} % The macro |\readaline|\marg{stream} reads what TeX considers to be % one line from the file that % is currently associated with the input stream \meta{stream}. Multiple lines % can be read by calling |\readaline| multiple times. A warning is issued % if there are no more lines to be read (i.e., the end of the file has % been reached). % % % \DescribeMacro{\readverbatim} % The macro |\readverbatim|\marg{stream} reads the contents of the file that % is currently associated with the input stream \meta{stream} as |verbatim| % text. This provides % the same functionality as the \Lpack{verbatim} package's % |\verbatiminput|\marg{filename} command does. % % \DescribeMacro{\streamvfont} % Text read in verbatim is typeset using the font specified by % |\streamvfont|\marg{font}. The default is % |\streamvfont{\normalfont\ttfamily}|. To typeset in a smaller font, try % for example, % |\streamvfont{\small\ttfamily}|. % % % \DescribeMacro{\numbervstream} % \DescribeMacro{\marginnumbervstream} % \DescribeMacro{\streamvnumfont} % The declaration |\numbervstream| causes |\readverbatim| to number each % line it reads. % The declaration |\marginnumbervstream| is similar to |\numbervstream| % except it puts the numbers in the margin. % The |streamvline| counter is used for the line numbering. Both % the numbering declarations (re)set it to zero. The numbers are % typeset in the font specified by |\streamvnumfont|\marg{font}. % The default is |\streamvnumfont{\footnotesize}|. % % \DescribeMacro{\plainvstream} % The declaration |\plainvstream| stops any numbering. The default % is |\plainvstream|. % % \DescribeEnv{comment} % The |comment| environment, which is part of the \Lpack{verbatim} % package, throws away everything inside the environment. % % The \Lpack{verbatim} package~\cite{VERBATIM} provides some other % facilities, apart from % the |comment| environment, and its documentation explains them. % % \section{Examples} % % \subsection{Output stream} % % This example is inspired by the \Lpack{endfloat} package~\cite{ENDFLOAT} % which provides a more sophisticated approach than shown below. The % example demonstrates the use of an output stream. % % Suppose that in an \Lpack{article} class document you want all the % figures to be collected at the end, but to specify them at the appropriate % places in the body of the text. % % \begin{macrocode} %<*ex> % \end{macrocode} % \begin{macrocode} \documentclass{article} \usepackage{newfile} ... % \end{macrocode} % Create a new output stream called |figs| and open it to write to file % |figures.tex|. % \begin{macrocode} \newoutputstream{figs} \openoutputfile{figures.out}{figs} ... % \end{macrocode} % Write out verbatim the first |figure| environment to the |figs| stream. % \begin{macrocode} \begin{writeverbatim}{figs} \begin{figure} ... \end{figure} \end{writeverbatim} ... % \end{macrocode} % After the last |figure| is written to |figs|, close the |figs| output % stream, which also closes the |figures.out| file. % \begin{macrocode} \begin{writeverbatim}{figs} \begin{figure} ... \end{figure} \end{writeverbatim} \closeoutputstream{figs} ... % \end{macrocode} % At the end |\input| |figures.out| to typeset the figures. % \begin{macrocode} \input{figures.out} \end{document} % \end{macrocode} % % \subsection{An output and input stream} % % This example is the kind of thing that the \Lpack{answers} % package~\cite{ANSWERS} does rather better. The example illustrates % the use of an output and an input stream. % % Suppose you are writing a document that includes questions and answers % and you want all the answers at the end. It is most convenient if you % can write the answer to each question as it is posed, and then only % print them at the end. % % \setcounter{CodelineNo}{0} % \begin{macrocode} \documentclass{article} \usepackage{newfile} ... % \end{macrocode} % Create new output and input streams called |ans| and |ansin|. Just to % demonstrate the use of the |\atstreamopen...| command, redefine % |\atstreamopenansin| so that it will start a section called % `Answers to all the questions'. Then open the |ans| stream to write to % a file called |answers.all|. % \begin{macrocode} \newoutputstream{ans} \newinputstream{ansin} \renewcommand{\atstreamopenansin}{\section{Answers to all the questions}} \openoutputfile{answers.all}{ans} ... % \end{macrocode} % For each question, write out the answer verbatim to the |ans| stream. % \begin{macrocode} This is a question. \begin{writeverbatim}{ans} This is the answer to a question. \end{writeverbatim} ... % \end{macrocode} % At the end, close the |ans| stream and open the |ansin| stream to read from % the file |answers.all|. Opening the stream will also start the new % `Answers to all the questions' section (from |\atstreamopenansin|). Then % read from the |ansin| stream. % \begin{macrocode} \closeoutputstream{ans} \openinputfile{answers.all}{ansin} \readstream{ansin} % \end{macrocode} % Finally, close the |ansin| stream, and we are done. % \begin{macrocode} \closeinputstream{ansin} \end{document} % \end{macrocode} % % If desired, instead of inserting the answers at the end of the question % document, |answers.all| could have been |\input| into a seperate % answer document. % % Along the same lines as above, perhaps the original document is % a \Lpack{book} class, with questions (and answers) at the end of each % chapter. A seperate answer file could be produced for each chapter, like: % \setcounter{CodelineNo}{0} % \begin{macrocode} ... \newoutputstream{ansout} \newinputstream{ansin} ... \chapter{First chapter} % chapter 1 \openoutputfile{\jobname\thechapter.ans}{ansout} % \end{macrocode} % The |\jobname| is the name of the main LaTeX document file, without % the |.tex| extension, so if the name of the LaTeX source file is % |mybook.tex| the above line creates a file called |mybook1.ans|. % \begin{macrocode} ... \begin{writeverbatim}{ansout} An answer \end{writeverbatim} ... \closeoutputstream{ansout} \chapter{Another chapter} % chapter N \openoutputfile{\jobname\thechapter.ans}{ansout} ... \closeoutputstream{ansout} \chapter{Answers} \section{Chapter 1} \openinputstream{\jobname1.ans}{ansin} \readstream{ansin} \closestream{ansin} ... \section{Chapter N} \openinputstream{\jobnameN.ans}{ansin} \readstream{ansin} \closestream{ansin} ... % \end{macrocode} % % The above example shows how you can associate different files with a single % stream. % % \subsection{Multiple streams} % % This is a more complex example, again inspired by the \Lpack{endfloat} % package. In a \Lpack{book} class document you want % all the % figures and tables to be collected at the end, % but to specify them at the appropriate % places in the body of the text. % % \setcounter{CodelineNo}{0} % \begin{macrocode} \documentclass{book} \usepackage{newfile} ... % \end{macrocode} % Create and open two new output streams, one for figures (|figs|) and the % other (|tabs|) for tables. % For demonstration purposes, also create a new input stream called figtab. % \begin{macrocode} \newoutputstream{figs} \openoutputfile{figures.out}{figs} \newoutputstream{tabs} \openoutputfile{tables.out}{tabs} \newinputstream{figtab} ... % \end{macrocode} % There is a slight difficulty with this example, as in the \Lpack{book} % class, figures and table numbers start anew with each chapter and the % chapter number is preprended to the sequence number. We can make a % start on solving this by creating a new pseudo chapter number and changing % the default definitions of the figure and table numbers (which are % |\renewcommand{\thefigure}{\thechapter.\arabic{figure}}| and similarly % for tables). % \begin{macrocode} \newcounter{pseudochapter} \renewcommand{\thepseudochapter}{\arabic{pseudochapter}} \renewcommand{\thefigure}{\thepseudochapter.\arabic{figure}} \renewcommand{\thetable}{\thepseudochapter.\arabic{table}} ... % \end{macrocode} % Do the usual things at the start of the document. % \begin{macrocode} \begin{document} \maketitle \tableofcontents \listoffigures .. % \end{macrocode} % At the start of each chapter we need to set the |pseudochapter| counter % to the chapter number, and write this to the output streams so % that there is a record of which chapters the figures and tables came from % Normally, each chapter resets the figure and table numbers, but as % these will now be at the end, we have to fake the start of chapters % in the output files. We can do all of this by the |\addtostream| macro. % \begin{macrocode} \chapter{First} % \end{macrocode} % The next bit of code will result in \\ % |\setcounter{pseudochapter}{N}| \\ % where |N| is the number of this chapter, appearing in the output files. % \begin{macrocode} \addtostream{figs}{\protect\setcounter{pseudochapter}{\thechapter}} \addtostream{tabs}{\protect\setcounter{pseudochapter}{\thechapter}} % \end{macrocode} % The next bit of code results in the following two lines in the output files:\\ % |\refstepcounter{chapter}| \\ % |\addtocounter{chapter}{-1}| \\ % The first of these has the effect of resetting the figure and table % counters by increasing the chapter counter by one. The second line resets % the chapter counter back to its original value. % \begin{macrocode} \addtostream{figs}{\protect\refstepcounter{chapter}} \addtostream{figs}{\protect\addtocounter{chapter}{-1}} \addtostream{tabs}{\protect\refstepcounter{chapter}} \addtostream{tabs}{\protect\addtocounter{chapter}{-1}} % \end{macrocode} % Write out verbatim each figure to the |figs| stream. % \begin{macrocode} \begin{writeverbatim}{figs} \begin{figure} ... \end{figure} \end{writeverbatim} ... % \end{macrocode} % and write each table verbatim to the |tabs| stream. % \begin{macrocode} \begin{writeverbatim}{tabs} \begin{table} ... \end{table} \end{writeverbatim} ... % \end{macrocode} % When we have done all the chapters, figures and tables, % close the two output streams. % \begin{macrocode} \closeoutputstream{figs} \closeoutputstream{tabs} % \end{macrocode} % Then if we want the figures to be typeset before the tables, open % the |figtab| stream to read from |figures.out|, read the stream and % close it. % \begin{macrocode} \openinputfile{figures.out}{figtab} \readstream{figtab} \closestream{figtab} % \end{macrocode} % We can use the same |figtab| stream for reading the tables. % \begin{macrocode} \openinputfile{tables.out}{figtab} \readstream{figtab} \closestream{figtab} \end{document} % \end{macrocode} % \begin{macrocode} % % \end{macrocode} % % Note that the \Lpack{endfloat} package~\cite{ENDFLOAT} will produce the % same effect as the previous example, but much simply. % % % \StopEventually{} % % % \section{The package code} \label{sec:code} % % This package can only be used with LaTeX2e, and requires the % \Lpack{verbatim} package~\cite{VERBATIM}, which is one of the required % packages for a LaTeX distribution. % \setcounter{CodelineNo}{0} % \begin{macrocode} %<*outin> \NeedsTeXFormat{LaTeX2e}[1996/06/01] \ProvidesPackage{newfile}[2002/06/21 v1.0 Output and input files] \RequirePackage{verbatim} % \end{macrocode} % % To try and avoid name clashes with other packages, each internal macro % in this package includes the character string `|stre@m|'. % % \begin{macro}{\newoutputstream} % |\newoutputstream|\marg{stream} creates a new output stream called \meta{stream}. % Different files may be associated with the \meta{stream}. Note that % TeX permits no more than 16 output streams. % \begin{macrocode} \newcommand{\newoutputstream}[1]{% \@ifundefined{#1outstre@m}% {\expandafter\newwrite\csname #1outstre@m\endcsname \csname newif\expandafter\endcsname \csname ifstre@m#1open\endcsname \global\csname stre@m#1openfalse\endcsname \expandafter\ifx\csname atstreamopen#1\endcsname\relax \global\@namedef{atstreamopen#1}{}% \fi \expandafter\ifx\csname atstreamclose#1\endcsname\relax \global\@namedef{atstreamclose#1}{}% \fi }% {\PackageError{newfile}{Output stream #1 is already defined}{\@ehc}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\newinputstream} % |\newinputstream|\marg{stream} creates a new input stream called \meta{stream}. % Different files may be associated with the \meta{stream}. Note that % TeX permits no more than 16 input streams. % \begin{macrocode} \newcommand{\newinputstream}[1]{% \@ifundefined{#1instre@m}% {\expandafter\newread\csname #1instre@m\endcsname \csname newif\expandafter\endcsname \csname ifstre@m#1open\endcsname \global\csname stre@m#1openfalse\endcsname \expandafter\ifx\csname atstreamopen#1\endcsname\relax \global\@namedef{atstreamopen#1}{}% \fi \expandafter\ifx\csname atstreamclose#1\endcsname\relax \global\@namedef{atstreamclose#1}{}% \fi }% {\PackageError{newfile}{Input stream #1 is already defined}{\@ehc}}} % \end{macrocode} % \end{macro} % % Some checking macros will be useful as some of the checks occur in % multiple places. % % \begin{macro}{\@ifstre@mopen} % |\@ifstre@mopen|\marg{stream}\marg{TRUE code}\marg{FALSE code} % checks if stream \meta{stream} is currently open. % \begin{macrocode} \newcommand{\@ifstre@mopen}[3]{% \csname ifstre@m#1open\endcsname#2\else#3\fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\instre@mandopen} % |\instre@mandopen|\marg{stream}\marg{TRUE code} checks if \meta{stream} % is an input stream and is open. If so, it executes \meta{TRUE code}. % \begin{macrocode} \newcommand{\instre@mandopen}[2]{% \@ifundefined{#1instre@m}{% \PackageError{newfile}{#1\space is not an input stream}{\@ehc}}% {\@ifstre@mopen{#1}{#2}{% \PackageError{newfile}{Input stream #1\space is not open}{\@ehc}}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\instre@mandclosed} % |\instre@mandclosed|\marg{stream}\marg{TRUE code} checks if \meta{stream} % is an input stream and is closed (not open). % If so, it executes \meta{TRUE code}. % \begin{macrocode} \newcommand{\instre@mandclosed}[2]{% \@ifundefined{#1instre@m}{% \PackageError{newfile}{#1\space is not an input stream}{\@ehc}}% {\@ifstre@mopen{#1}{% \PackageError{newfile}{Input stream #1\space is open}{\@ehc}}{#2}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\outstre@mandopen} % |\outstre@mandopen|\marg{stream}\marg{TRUE code} checks if \meta{stream} % is an output stream and is open. If so, it executes \meta{TRUE code}. % \begin{macrocode} \newcommand{\outstre@mandopen}[2]{% \@ifundefined{#1outstre@m}{% \PackageError{newfile}{#1\space is not an output stream}{\@ehc}}% {\@ifstre@mopen{#1}{#2}{% \PackageError{newfile}{Output stream #1\space is not open}{\@ehc}}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\outstre@mandclosed} % |\outtre@mandclosed|\marg{stream}\marg{TRUE code} checks if \meta{stream} % is an output stream and is closed (not open). % If so, it executes \meta{TRUE code}. % \begin{macrocode} \newcommand{\outstre@mandclosed}[2]{% \@ifundefined{#1outstre@m}{% \PackageError{newfile}{#1\space is not an output stream}{\@ehc}}% {\@ifstre@mopen{#1}{% \PackageError{newfile}{Output stream #1\space is open}{\@ehc}}{#2}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\openoutputfile} % |\openoutputfile|\marg{filename}\marg{stream} opens the file called % \meta{filename} and attaches it to the stream \meta{stream} for % writing. However, if the |\nofiles| command has been given the % file is \emph{not} attached to the stream. No more than one file can be % attached to a stream at any given time. % \begin{macrocode} \newcommand{\openoutputfile}[2]{% \outstre@mandclosed{#2}{% \global\@namedef{#1@filename}{#1}% \if@filesw \immediate\openout\@nameuse{#2outstre@m}=\@nameuse{#1@filename}% \fi \global\csname stre@m#2opentrue\endcsname% \@nameuse{atstreamopen#2}% }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\closeoutputstream} % |\closeoutputstream|\marg{stream} closes the stream \meta{stream}. % \begin{macrocode} \newcommand{\closeoutputstream}[1]{% \outstre@mandopen{#1}{% \@nameuse{atstreamclose#1}% \immediate\closeout\@nameuse{#1outstre@m}% \global\csname stre@m#1openfalse\endcsname}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\openinputfile} % |\openinputfile|\marg{filename}\marg{stream} opens the file called % \meta{filename} and attaches it to the stream \meta{stream} for % reading. The file is added to the list of files. % No more than one file can be attached to a stream at % any given time. % \begin{macrocode} \newcommand{\openinputfile}[2]{% \IfFileExists{#1}{% file exists \instre@mandclosed{#2}{% \@addtofilelist{#1}% \global\@namedef{#1@filename}{#1}% \immediate\openin\@nameuse{#2instre@m}=\@nameuse{#1@filename}% \global\csname stre@m#2opentrue\endcsname% \@nameuse{atstreamopen#2}}}% {% file not found \PackageError{newfile}{Can't find file #1}{\@ehc}% }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\closeinputstream} % |\closeinputstream|\marg{stream} closes the stream \meta{stream}. % \begin{macrocode} \newcommand{\closeinputstream}[1]{% \instre@mandopen{#1}{% \@nameuse{atstreamclose#1}% \immediate\closein\@nameuse{#1instre@m}% \global\csname stre@m#1openfalse\endcsname}% } % \end{macrocode} % \end{macro} % % \begin{environment}{writeverbatim} % |\begin{writeverbatim}|\marg{stream} writes the contents of % the environment as verbatim text to the given \meta{stream}. % \begin{macrocode} \def\writeverbatim#1{% \@bsphack \let\do\@makeother\dospecials \catcode`\^^M\active \verbatim@startline \verbatim@addtoline \verbatim@finish \def\verbatim@processline{% \immediate\write\@nameuse{#1outstre@m}{\the\verbatim@line}}% \verbatim@start} \def\endwriteverbatim{\@esphack} % \end{macrocode} % \end{environment} % % \begin{macro}{\addtostream} % |\addtostream|\marg{stream}\marg{text} writes \meta{text} to the % given \meta{stream}. % \begin{macrocode} \newcommand{\addtostream}[2]{% \@bsphack \outstre@mandopen{#1}{% {\let\protect\string \immediate\write\@nameuse{#1outstre@m}{#2}% }}% \@esphack } % \end{macrocode} % \end{macro} % % \begin{macro}{\ifstre@mnoteof} % \begin{macro}{\checkstre@mnoteof} % |\checkstre@mnoteof|\marg{stream} sets |\ifstre@mnoteof| to TRUE if % \meta{stream} is not at the end of the file (i.e., it is the opposite % of |\ifeof|). % \begin{macrocode} \newif\ifstre@mnoteof \newcommand{\checkstre@meof}[1]{% \stre@mnoteoftrue\ifeof\@nameuse{#1instre@m}\stre@mnoteoffalse\fi} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\readstream} % |\readstream|\marg{stream} reads the contents of % the given \meta{stream} as |\input| text. % \begin{macrocode} \def\readstream#1{ \instre@mandopen{#1}{% \loop \checkstre@meof{#1} \ifstre@mnoteof \read\@nameuse{#1instre@m} to\temptokstre@m \temptokstre@m \repeat }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\readaline} % |\readaline|\marg{stream} reads what TeX considers to be one line % from the given \meta{stream} as |\input| text. % \begin{macrocode} \def\readaline#1{ \instre@mandopen{#1}{% \ifeof\@nameuse{#1instre@m} \PackageWarning{newfile}{No more to read from stream #1} \else \read\@nameuse{#1instre@m} to\temptokstre@m \temptokstre@m \fi }% } % \end{macrocode} % \end{macro} % % % \begin{macro}{\readverbatim} % \begin{macro}{\stre@mverbatim@input} % \begin{macro}{\verbatim@readstre@m} % |\readverbatim|\marg{stream} reads the contents of % the given \meta{stream} as verbatim text. % % The read verbatim code is a slight variation on code from the % \Lpack{verbatim} package. Most of the setup is done by the macros % |\stre@mverbatim@input|\marg{setup}\marg{stream} and % |\verbatim@readstre@m|\marg{stream}. Finally, |\verbatim@read@file| % is a \Lpack{verbatim} package macro. % \begin{macrocode} \def\readverbatim{\begingroup \@ifstar{\stre@mverbatim@input\relax}% {\stre@mverbatim@input{\frenchspacing\@vobeyspaces}}} \def\stre@mverbatim@input#1#2{% \@ifstre@mopen{#2}% {\@verbatim #1\relax \def\verbatim@in@stream{\@nameuse{#2instre@m}} \verbatim@readstre@m{#2}\endtrivlist\endgroup\@doendpe}% {\PackageError{newfile}{Stream #2 is not open}{\@ehc}\endgroup}% } \def\verbatim@readstre@m#1{% \verbatim@startline \expandafter\endlinechar\expandafter\m@ne \expandafter\verbatim@read@file \expandafter\endlinechar\the\endlinechar\relax \verbatim@finish } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\plainvstream} % A macro that sets |\verbatim@processline| to its default definition. % \begin{macrocode} \newcommand{\plainvstream}{% \def\verbatim@processline{\the\verbatim@line\par}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\streamvnumfont} % \begin{macro}{\stre@mvnfont} % We need a counter for numbering lines read in verbatim. % % |\streamvnumfont|\marg{font} defines |\stre@mvnfont| to be \meta{font}. % \begin{macrocode} \newcounter{streamvline} \newcommand{\streamvnumfont}[1]{\def\stre@mvnfont{#1}} \streamvnumfont{\footnotesize} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\streamvfont} % \begin{macro}{\verbatim@font} % |\streamvfont|\marg{font} defines |\verbatim@font| to use \meta{font}. % \begin{macrocode} \newcommand{\verbatimfont}[1]{% \def\verbatim@font{#1% \hyphenchar\font\m@ne \let\do\do@noligs \verbatim@nolig@list}} \verbatimfont{\normalfont\ttfamily} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\numbervstream} % |\numbervstream| puts numbers at the start of each line read verbatim. % \begin{macrocode} \newcommand{\numbervstream}{% \setcounter{streamvline}{0}% \def\verbatim@processline{% \addtocounter{streamvline}{1}% \leavevmode {\stre@mvnfont \thestreamvline}\space \the\verbatim@line\par}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\marginnumbervstream} % |\marginnumbervstream| puts numbers in the margin at the start of % each line read verbatim. % \begin{macrocode} \newcommand{\marginnumbervstream}{% \setcounter{streamvline}{0}% \def\verbatim@processline{% \addtocounter{streamvline}{1}% \leavevmode \llap{{\stre@mvnfont \thestreamvline} \hskip\@totalleftmargin} \the\verbatim@line\par}% } % \end{macrocode} % \end{macro} % % The end of the \Lpack{newfile} package. % \begin{macrocode} % % \end{macrocode} % % % % \bibliographystyle{alpha} % % \begin{thebibliography}{GMS94} % % \bibitem[GMS94]{GOOSSENS94} % Michel Goossens, Frank Mittelbach, and Alexander Samarin. % \newblock \emph{The LaTeX Companion}. % \newblock Addison-Wesley Publishing Company, 1994. % % \bibitem[MG95]{ENDFLOAT} % James Darrell McCauley and Jeff Goldberg. % \newblock `The \texttt{endfloat} package'. % \newblock October, 1995. % % \bibitem[Pif96]{ANSWERS} % Mike Piff. % \newblock `Production of solution sheets in LaTeX2e'. % \newblock July, 1996. % % \bibitem[SRR99]{VERBATIM} % Rainer Sch\"{o}pf, Bernd Raichle, and Chris Rowley. % \newblock `A New Implementation of LaTeX's \texttt{verbatim} and % \texttt{verbatim*} Environments'. % \newblock December, 1999. % % \end{thebibliography} % % % \Finale % \PrintIndex % \endinput %% \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 \~}