%^^A* legal notices % \iffalse % % This program is part of the Frankenstein bundle for LaTeX. % % Copyright 1995-2001 Matt Swift . % % This file contains both the code and documentation for the % newclude LaTeX package. It will work ONLY if it is placed in a % proper directory. Files called README, INSTALL, newclude.tex % and newclude.ins should have also been distributed to you % with this file. See them for more information on how to typeset % the documentation with LaTeX and how to generate a version of this % file that will work faster than this one. % % This program is free software; you may redistribute it and/or % modify it under the conditions of the LaTeX Project Public % License, either version 1.2 or (at your option) any later version. % The latest version of this license is in % http://www.latex-project.org/lppl.txt, and version 1.2 or later is % part of all distributions of LaTeX version 1999/12/01 or later. % % This program is distributed in the hope that it will be useful, % but without any warranty; without even the implied warranty of % merchantability or fitness for a particular purpose. See the % LaTeX Project Public License for more details. % % \fi % %^^A* checks % %^^A NOTE: The character table, with two %'s, will get written to all files. %% \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 \~} % % \CheckSum{208} % % \begin{abstract} % \package{Newclude} is a backwards-compatible reimplementation of the % \LaTeX{} system for including files. The princpal new features are: (1) % the restriction that \cs\clearpage{}s must surround an included file is % removed, (2) the restriction that \cs\include{}s cannot be nested is % removed, and (3) the provision of hooks executed before and after the % contents of an included file. Newclude accomplishes the first two by using % a single \ext{aux} file instead of many. % % Still in development, but already useful in many situations, are new % commands that include partial contents of independent \LaTeX{} files, which % can also be processed on their own (that is, files that contain % \cs\documentclass, |\begin{document}|, etc.). \package{Newclude} absorbs % and supersedes the former package \package{includex}. % \end{abstract} % \clearpage % \tableofcontents % % \part{Discussion} % % \section{Introduction} % % Let us call a file that might be included into another document with a % command in the \cs\include family a \term{part}. When a part is actually % included during a particular processing run, let us call it an \term{included % part}, and when it is not included, let us call it an \term{unincluded part}. % Notice that an unincluded part is \emph{not} the same as a file that was % never a candidate for inclusion with a command in the \cs\include family. % % The \package{newclude} package adds these features to the standard LaTeX{} % inclusion system: % \begin{enumerate} % \item\label{item:hooks} Hooks \cs\AtBeginInclude and \cs\AtEndInclude are provided. % \item\label{item:hooks:opt} Optional arguments to \cs\include and friends % override current values of \cs\AtBeginInclude and \cs\AtEndInclude. % \item \cname{include*} is like \cs\include but with arbitrary commands % rather than \cs\clearpage{}s surrounding the part. % \item \cs\include and friends can be nested. % \item \cs\includeall cancels the effect of \cs\includeonly. % \item \cs\IfAllowed\meta{filename} is a new conditional that branches, % depending on what has been declared in an \cs\includeonly. % \item Commands \cs\includedoc etc.\ include a part that can be processed % independently. These features are in development. % \end{enumerate} % % \package{Newclude} accepts three mutually-exclusive package options, with % \option{tag} the default when no package option is given. % % Loading \package{newclude} with the \option{simple} option provides only % features \ref{item:hooks} and~\ref{item:hooks:opt}. If you don't use either % of these new features, the standard \LaTeX{} and \package{newclude} inclusion % systems will behave identically except in some unusual and benign odd cases % relating the the parsing of the new optional arguments to \cs\include, which % are discussed below in that command's documentation. % % The options \option{tag} and \option{allocate} each implement all the above % features with a different method. Each method introduces different % discrepancies from standard \LaTeX{} which are discussed below in sections % \ref{opt:tag} and~\ref{opt:allocate}. If I discover how to make one method % never inferior to the other, I will remove the other option from the package. % % \section{Usage} % % \DescribeMacro\include % \DescribeMacro\AtBeginInclude % \DescribeMacro\AtEndInclude % \cs\include\oarg{prehook}\marg{filename}\oarg{posthook} behaves like % standard \LaTeX{}'s \cs\include except that it can be nested and the % contents of the two hook arguments, when they are given, are inserted at % the beginning and end of the part whenever it is included, overriding the % current values of \cs\AtBeginInclude and \cs\AtEndInclude. % % \caveat{Right square braces (|]|s) in the optional arguments must be % surrounded by curly braces to avoid confusing the argument parser.} % % \caveat{A left square brace (|[|) that immediately follows an % \cs\include command's mandatory \meta{filename} argument (after optional % whitespace) will be considered to delimit the beginning of the % \meta{posthook} argument. If you want an actual left brace character in % this position, you must precede it with something that will terminate % \TeX's search for an optional argument, such as \cs\relax, |{}|, or a % paragraph division (explicit or implicit).} % % The commands \cs\AtBeginInclude\meta{tokens} and % \cs\AtEndInclude\meta{tokens} are analagous to standard \LaTeX{}'s commands % \cs\AtBeginDocument\meta{tokens} and \cs\AtEndDocument\meta{tokens}. % % FIX: multiple instances concatenate? % % FIX give name to what's held by atbegininclude so that an override can mention it % % When the optional argument \meta{prehook} is given to \cs\include, its % contents will be used instead of whatever has been specified with % \cs\AtBeginInclude, for that one inclusion. Likewise, \meta{posthook} will % be used in place of whatever has been specified with \cs\AtEndInclude for % that one inclusion. % % For example, putting the \cs\chapter declaration in the \meta{prehook} % argument allows the chapter name, and, optionally, a corresponding \LaTeX{} % label, to be kept in the including file, rather than the included file: % \begin{codeexample} % \include [\chapter{Whales} % \label{ch:whales}] % {big-cetecea} % \end{codeexample} % % The \meta{posthook} argument can be used, for example, to delimit or undo % declarations made in the \meta{prehook} or the included file: FIX: better % example, since these coudl simple appear before/after the \cs\include % without ill effect. % \begin{codeexample} % \include [\begingroup\larger] % this part in larger type % {manifesto} % [\endgroup] % \end{codeexample} % % \DescribeMacro{\include*} % \DescribeMacro\IncludeSurround % \DescribeMacro\DefaultIncludeSurround % \cname{include*}\oarg{prehook}\marg{filename}\oarg{posthook} is like % \cs\include but omits the usual \cs\clearpage{}s that surround an included % part, replacing them with \cs\IncludeSurround, which defaults to % \cs\DefaultIncludeSurround. The contents of \cs\IncludeSurround are % inserted before the \meta{prehook} or whatever has been specified with % \cs\AtBeginInclude, and after the \meta{posthook} or whatever has been % specified with \cs\AtEndInclude. % % \caveat{A space gets inserted after an \cname{include*} unless it is % suppressed by a |%| immediately following. Combined with trailing spaces % in the included file, this may lead to unwanted spaces. For this reason, % \cs\DefaultIncludeSurround is initialized to \cname{par}. When the user % must explicitly change \cs\IncludeSurround to achieve totally smooth flow % from main file to included file, they are more likely to consult this % documentation if they spot a problem. Package and class writers should % take this difficulty into account when changing \cs\DefaultIncludeSurround.} % % \DescribeMacro\includeonly % The \cs\includeonly command is reimplemented, but its usage and behavior is % the same as the standard \LaTeX{} version. % % \DescribeMacro\includeall % The \cs\includeall command cancels the effect of any \cs\includeonly % command presently in effect. % % If you write an \cs\includeonly so that each file appears on its own line, % it is particularly easy to add and remove files to include by commenting % out their lines, but it becomes laborious to comment out the entire % \cs\includeonly command. It's easy, however, to uncomment a single % \cs\includeall command when you want to process the entire document. (Or % \cs\includeall could be inserted from the command line that invokes % \LaTeX{}, and so on.) % % \section{Experimental features} % % \DescribeMacro\includeenv % \cs\includeenv\oarg{prehook}\marg{filename}\marg{environment name}% % \marg{instance}\oarg{posthook} % \cs\includeenv*\oarg{prehook}\marg{filename}\marg{environment name}% % \marg{instance}\oarg{posthook} % % \cs\includeenv includes the contents of a single \LaTeX{} environment that % appears in \meta{filename}. The environment is specified by giving its % name (\meta{environment}) and an instance of that environment in the file % (\meta{instance}). Presently, \meta{instance} is ignored, so that it will % always be the contents of the first occurrence in \meta{filename} of a % \LaTeX{} environment with the name \meta{environment} that will be % included. In the future, the \meta{instance} argument may be used to % specify the $n$th instance of the environment within the file, or further % specify the environment to be extracted in some other way. % % FIX: right now they're required; skip text up to documentclass OR the target, % then branch? % % Good preamble syntactic sugar: |\let\TheMarkupDeclarations\begin| % % \todo{You can insert a \cs\usepackage into the main aux file and have it % loaded properly. If we discover a \cs\usepackage that is not a formatting % package, one strategy is to insert a corresponding \cs\usepackage into the % (main) aux file and then bail after the preamble.} % % \todo{You can't skip verbatim text via macro argument processing and sugar. % this means that a major reimplementation of skipping using verbatim methods % will have to be done.} % % The included file is permitted (but not required) to have its own % \cs\documentclass command and \code{\begin{document}}\lips % \cs{\end{document}} pair. \cs\includeenv extracts the specified % environment by processing the preamble if one exists, skipping text up % until the beginning of the specified environment, processing the contents % of the environment, and skipping the rest of the included part. % % Notice that while a \code{\begin{document}}\lips\code{\end{document}} pair % may not technically delimit a \LaTeX{} environment, you may nevertheless % (because it looks exactly like an environment) set \meta{environment} to % |document| to extract the contents of the \env{document} ``environment'' of % \meta{filename}. % % Consider the following issues when you are tempted to use this % command. Maybe the \cs\usepackage you are about to disregard is necessary % to processing the part's contents. Maybe it conflicts with a package % already loaded at top level. Maybe both! The same holds of course for the % defining commands like \cs\newcommand that one expects to find in a % package. % % A deep problem with the design of a \LaTeX{} source file exists with % respect to the function of the preamble. The preamble contains % declarations that determine how the document below will be formatted. % Unfortunately, there is no way to make the distinction between: % \begin{enumerate} % \item % declarations that signal that certain markup will appear in the document % that are either not defined in the \LaTeX{} kernel or are used with a % different syntax % \item declarations that describe how a certain instance % of the document should be formatted % \end{enumerate} % Examples in the first category are \code{\usepackage{url}} and \code{FIX % example}, and examples in the second are \code{\usepackage{times}} and % \code{FIX}. When you want to include the document or a part of it in % another document, it is absolutely necessary to make this distinction so % that declarations in category (1) can be processed and declarations in % category (2) can be ignored. ^^A FIX: \cat{} is a compsci command? % % Adopting a convention on the use of the preamble can overcome this design % problem, but it will not fix the problem for legacy files whose preambles % do not obey the convention. Legacy files that contain category (1) % declarations in their preambles must either be altered or specifically % accommodated with additional commands. % % The convention I suggest is to |\usepackage{preamble}|. \cs\beginmarkup % \cs\endmarkup. FIX. Can we arrange to load % % When \cs\includeenv encounters a \cs\usepackage command in the included % part, it looks at the packages in the argument of \cs\usepackage and issues % a warning if the package is not already loaded and does not appear on a % list of packages known whose use falls entirely within category (2). (See % the \cs\DeclareFormattingPackage command below.) % % The \cs\documentclass command is of course also a category (1) declaration. % Presently, if \cs\includeenv detects that the arguments to an included % \cs\documentclass command differ from the arguments of the % \cs\documentclass command of the including document, it will issue a % warning, and continue. In the future, I hope to make this behavior smarter % by having \cs\includeenv take specific actions for specific combinations of % arguments. For example, if the included document's class implies the use % of markup not defined in the parent's class, an appropriate action would be % to define the missing markup commands. A document of class \class{report} % and a document of class \class{article}, on the other hand, do not (I don't % think) declare different markup, so that there should be no warning in this % case. % % \DescribeMacro{\includeenv*} % \cname{includeenv*} is analogous to \cname{include*}, that is, it surrounds % the included part with \cs\IncludeSurround rather than \cs\clearpage. % % \DescribeMacro\includedoc % \DescribeMacro{\includedoc*} % \cs\includedoc\oarg{prehook}\marg{file name}\oarg{posthook} is shorthand % for % \cs\includeenv\oarg{prehook}\marg{filename}\marg{|document|}\marg{}\oarg{posthook}. % % \cname{includedoc*} is analogous to \cname{includeenv*}. % % \section{Options} % % \subsection{Simple}\label{opt:simple} % % If the \option{simple} option is given, the only new feature provided is the % hooks (features \ref{item:hooks} and~\ref{item:hooks:opt} above). As % with standard \LaTeX{}, \cs\clearpage{}s surround an \cs\include and nesting % \cs\include{}s gives an error. \package{Newclude} will only behave % differently than standard \LaTeX{} command scans for % possible optional arguments will make a different. % % % \subsection{Tag}\label{opt:tag} % The \option{tag} option causes \LaTeX{} to use just one \ext{aux} file. % This option, which is the default, works well. I am aware of the following % two differences from the kernel's including system: % % \begin{enumerate} % \item % If the \LaTeX{} process is stopped during the processing of a part, all % information normally stored in an \ext{aux} file from that point in the % document forward is lost. In the kernel's system, processing the document % twice more would recover any \ext{aux} information previously generated for % parts. % % If \LaTeX{} is always invoked in \cs\nonstopmode (e.g., by \auctex), then % this difference is only going to occur when there are catastrophic errors % that cause even \cs\nonstopmode to terminate processing. % % \item Other packages and classes that redefine kernel commands that write to % \cname{@auxout} will cause problems. % \end{enumerate} % % The first difference must be accepted. The second difference can be removed % on a case by case basis, by specifically coding compatibility with such % packages and classes. I intend to do this. Here is a list of such packages % and classes known to me: % % \begin{tabular}{l} % \meta{none so far} % \end{tabular} % If you discover any more for this list, please write me! % % It's also very easy to revise the other package to be compatible with % \package{newclude} as it is now. See section~\ref{adapt} below, which % includes a list of relevant kernel commands. % % \subsection{Allocate}\label{opt:allocate} % % The second way (the \option{allocate} option) represents my first attempt at % a solution, and until I am sure it has no advantages over \option{tag} under % any circumstances, it will continue to be an option. % % The \option{allocate} option causes \LaTeX{} to dynamically allocate \TeX{} % output streams to each part as they are needed. Streams are allocated when % processing of the part begins, and are reclaimed after the ejection of the % last page to which the part has contributed. Like the old system, a separate % \ext{aux} file is created for each part. The limitation of this % implementation is that \TeX{} only possesses 16 output streams. Each of the % commands \cs\tableofcontents, \cs\listoffigures, \cs\listoftables, % \cs\makeglossary, and \cs\makeindex causes \LaTeX{} to use one output stream. % The remainder (minus any streams required by packages and classes) are % available for the including system. If $n$ streams are available, the level % of nesting possible is $n - 1$ minus the maximum number of parts that occur % on the same page. For example, if 10 streams are available and the parts % never appear on the same page (the old behavior required by the % \cs\clearpage{}s), then 8 levels of nesting are possible (which is 8, not 7 % more than with the old system). The maximum number of parts that may % contribute the to same page is calculated with the same equation. Note: % \TeX's page-breaking algorithm looks ahead until it has more than enough % material to fill one page. You must count all the new \ext{aux} files that % are opened during a look-ahead as contributing to the page in question, even % if some of the later ones do not actually contribute to the page after the % break is chosen. % % The \option{allocate} solution is itself implemented in two ways. The system % either reserves a fixed number of output streams from the start, or will % dynamically claim and free them as needed. The dynamic solution is the % default. I do not see much use for the static solution at present. If the % dynamic system claims streams that are later required, then it is simply a % question of whether \package{newclude} or the other feature is going to % signal an error about having no more streams to allocate. % % \section{Programmers' interface} % % \DescribeMacro\IfAllowed % \cs\IfAllowed\marg{part name}\marg{true}\marg{false} executes \meta{true} % if \meta{part-name} is on the list of files to be included and \meta{false} % otherwise. If there is no list, executes \meta{true}. % % \DescribeMacro\IncludeName % \cs\IncludeName expands to the name of the part currently being processed. % In the toplevel source file, it will expand to \cs\jobname. % % \DescribeMacro\ParentName % \cs\ParentName expands to the name of the part that includes the part % currently being processed. In the toplevel source file, expanding % \cs\ParentName will generate a warning and expand to \cs\jobname (which is % also what \cs\IncludeName expands to). % % FIX: root source file? toplevel? master? principle source? glossary! % % \DescribeMacro\DeclareFormattingPackage % \cs\DeclareFormattingPackage\marg{package name} declares \meta{package % name} to be a package that only makes formatting declarations, that is, the % effect of using it falls entirely within category (2). If a formatting % package occurs in a \cs\usepackage declaration in the preamble of a part % included by \cs\includeenv, no warning will be given. An example of a % formatting package is the \package{times} package. No facility is provided % to distinguish the case when a package is used with or without certain % package options, so do not declare a package as a formatting package unless % it is so regardless of the options it is passed. % % If you send me the names of formatting packages, I will include them in the % next release of \package{newclude}. Meanwhile, you may declare them in % \file{newclude.cfg}. Do the same for your local formatting packages if you % wish. It does no harm to declare a package as a formatting package more % than once. % % \DescribeMacro\ifSkipPreamble % \DescribeMacro\SkipPreambletrue % \DescribeMacro\SkipPreamblefalse % % \DescribeMacro\Disable % \DescribeMacro\DisableAll % \cs\Disable\marg{tokens} provides a way to ignore additional commands when % using \cs\includeenv and friends. If you want to cause the macro \cs\foo % which takes no arguments to be entirely ignored in parts, issue the command % \code{\Disable{\let\foo\relax}} any time before including the parts you % want to affect. If \cs\foo takes one mandatory argument, write % \code{\let\foo\Gobble} instead. If \cs\foo takes one optional and one % mandatory, write \code{\let\foo\GobbleOM}. And so on. For other examples, % see the gobbling commands in the \package{moredefs} package (which % \package{newclude} requires), or write your own. % % The arguments to \cs\Disable are accumulated and executed by the command % \cs\DisableAll, which is executed inside a group that contains a part when % it is included. % % There is no way to undo the effect of issuing a \cs\Disable command. % % \section{How to play nicely with \package{newclude}}\label{adapt} % % To adapt a package or class for use with the \option{tag} option of % \package{newclude}: % \begin{enumerate} % \item replace |\immediate\write\@auxout| with \cs{\@writeaux} % \item replace |\protected@write\@auxout| with \cs{\protected@writeaux} % \item add % \begin{codeexample} % \providecommand\@writeaux {% % \immediate\write\@auxout % } % \providecommand\protected@writeaux {% % \protected@write\@auxout % } % \end{codeexample} % \end{enumerate} % % \StopEventually{} % % \part{Implementation} % % \section{Version control} % % \begin{macro}{\fileinfo} % \begin{macro}{\DoXUsepackagE} % \begin{macro}{\HaveECitationS} % \begin{macro}{\fileversion} % \begin{macro}{\filedate} % \begin{macro}{\docdate} % \begin{macro}{\PPOptArg} % These definitions must be the first ones in the file. % \begin{macrocode} \def\fileinfo{A new system for including files (Frankenstein's backbone)} \def\DoXPackageS {} \def\fileversion{v2} \def\filedate{1999/11/02} \def\docdate{1999/11/02} \edef\PPOptArg {% \filedate\space \fileversion\space \fileinfo } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % If we're loading this file from a \cs\ProcessDTXFile command (see the % \package{compsci} package), then \cs\JusTLoaDInformatioN will be defined; % othewise we assume it is not (that's why the FunkY NamE). % % If we're loading from \cs\ProcessDTXFile, we want to load the packages listed % in \cs\DoXPackageS (needed to typeset the documentation for this file) and % then bail out. Otherwise, we're using this file in a normal way as a % package, so do nothing. \cs\DoXPackageS, if there are any, are declared in % the \ext{dtx} file, and, if you're reading the typeset documentation of this % package, would appear just above. (It's OK to call \cs\usepackage with an % empty argument or \cs\relax, by the way.) % \begin{macrocode} \makeatletter% A special comment to help create bst files. Don't change! \@ifundefined{JusTLoaDInformatioN} {% }{% ELSE (we know the compsci package is already loaded, too) \UndefineCS\JusTLoaDInformatioN \SaveDoXVarS \eExpand\csname DoXPackageS\endcsname\In {%use \csname in case it's undefined \usepackage{#1}% }% \RestoreDoXVarS \makeatother \endinput }% A special comment to help create bst files. Don't change! % \end{macrocode} % % Now we check for \LaTeX2e and declare the LaTeX package. % \begin{macrocode} \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{newclude}[\PPOptArg] % \end{macrocode}^^A special comment to help create bst files. Don't change! % % ^^A NOTE: We have to compensate for the above backslashes, which are not % ^^A actually in the .dtx file the author works on, by adding to the % ^^A CheckSum. %% % \AddToCheckSum{17}^^A `dtx-update-checksum' automatically handles this. % \AddToCheckSum{7}^^A The half a macrocode env. at the top is missed, however... % \AddToCheckSum{10}^^A ... and so are the 5 \defs from the .dtx file % ^^A that precede it. % \IfCitations {% % \AddToCheckSum{2}^^A When \initelyHavECitationS is defined in % } ^^A the .dtx file, we need 2 more in the CheckSum. % % % \section{Review of the kernel's inclusion system} % % One \ext{aux} file is written to disk for the \term{principle source} and one % for each of the included \term{parts}. The reason to have a separate ones % for the parts is so that information from the last time the part was included % is retained in subsequent runs even when the part is excluded by % \cs\includeonly. Suppose a part is processed once, and on a subsequent run % its name is removed from the \cs\includeonly list. This run will still read % in the part's \ext{aux} file, since the \ext{aux} file of any part that was % \cs\included during the last run is always read. But the information therein % is not going to be regenerated in this run, since the part will not be % processed. The main \ext{aux} file is created anew with each run, so this % information would be lost if it resided there. % % To handle writing these multiple \ext{aux} files, the kernel uses two of % \TeX's output streams. When a routine writes to an auxiliary file, it writes % to \cname{@auxout}, which is \cs\let to either \cname{@mainaux}, the % \ext{aux} file for the principle source, or \cname{@partaux} the \ext{aux} % file for all the parts each in turn. % % When encountering an \cs\include command, but before deciding whether or not % to actually load the part, the kernel writes a command to \cname{@mainaux} % that will load the part's \ext{aux} file. The main \ext{aux} % file is loaded by \cs\document, so that \emph{all} \ext{aux} files are read % in every time the principle source is processed. % % If a part is actually loaded, a \term{checkpoint} is written to the part's % \ext{aux} file consisting of a snapshot of the counters (a record of the % values of all \LaTeX{} counters). On the next run, if the part is not % actually loaded, the information in its \ext{aux} file has nevertheless % already been processed by \cs\document. Processing the checkpoint causes a % macro to be defined that when invoked restores the counter state. When % \cs\include does not actually load a part it calls this checkpoint macro % instead to alter the present counter state. % % This system has pitfalls as well as benefits. It is useful to keep the % bibliography, citations, cross references, and page numbers up to date in % certain situations, but the results can be confusing sometimes, because % checkpoints are not documented. (Perhaps this is remedied in the 2d edition % of the \LaTeX{} manual.) How, besides reading the code, or finding out the % hard way, is anyone supposed to guess that rearranging two ``deactivated'' % \cs\include statements in a principle source will bring havoc on the page % numbers? % % \section{Discussion of \package{newclude}'s inclusion system} % % The simple removal of the \cs\clearpage{}s that surround an included part % would cause a problem involving the delayed action of \cs\write commands. % Suppose a part ending with a \cs\write command ends halfway down a page, and % another \cs\write occurs in the principle source immediately (or soon) after % the inclusion. The first must be written to \cname{@partaux} and the second % to \cname{@mainaux}. If we close \cname{@partaux} while the first \cs\write % is still pending, that is, before the current page has been shipped out, then % the \cs\write will be destined for a closed stream and therefore go to the % log file and terminal. The \cs\clearpage{}s solve this by flushing all % pending \cs\writes. Then we can close \cname{@partaux} immediately and % reopen \cname{@mainaux}. % % Successful removal of the \cs\clearpage{}s can be accomplished either by % having the entire document use just one auxiliary file, or by allocating % additional output streams so that it becomes possible to avoid closing % \cname{@partaux} until after the current page is shipped out when all the % \cs\write{}'s to it have been completed. % % \section{Package initialization} % % \begin{macrocode} \RequirePackage{moredefs} % \end{macrocode} % % \begin{macrocode} \InitCS\sc@t@a \DeclareOption{simple} {% \input{simple.sto} \let\sc@t@a\endinput } %^^A\DeclareOption{group} {% %^^A \AtEndOfPackage {\input{group.sto}} %^^A} \DeclareOption{tag} {% \AtEndOfPackage {\input{tag.sto}} } \DeclareOption{allocate} {% \AtEndOfPackage {\input{allocate.sto}} } \DeclareBooleanOptions{dynamic}{static} \ExecuteOptions{tag} \ProcessOptions % \end{macrocode} % If the \option{simple} option has been given, end right here. % \begin{macrocode} \sc@t@a % \end{macrocode} % % \section{Simple} % % The above option processing causes the file \file{simple.sto} to be loaded % when the \option{simple} is given. After it is loaded, processing stops. % When the \option{simple} option is not given, \package{newclude} package code % continues in section~\ref{sec:common}. % % \input{simple.sto} % % \section{Common}\label{sec:common} % % The code in this section is common to the \option{tag} and \option{allocate} % options. % % \begin{macro}{\nc@t@a} % \begin{macro}{\nc@t@b} % \begin{macro}{\nc@t@c} % \begin{macro}{\nc@toks@a} % Scratch variables. % \begin{macrocode} \ReserveCS\nc@t@a \ReserveCS\nc@t@b \ReserveCS\nc@t@c \newtokens\nc@toks@a % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\IncludeSurround} % \begin{macro}{\DefaultIncludeSurround} % \mbox{} % \begin{macrocode} \newcommand\DefaultIncludeSurround {% \par } \newlet\IncludeSurround\DefaultIncludeSurround % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\c@IncludeDepth} % With nested \cs\include{}s, we need some way for the various ones to % distinguish themselves, so we keep track of the nested depth with the % |IncludeDepth| counter. % \begin{macrocode} \newcounter{IncludeDepth} % starts at 0 % \end{macrocode} % \end{macro} % % \begin{macro}{\IfAllowed} % \begin{macro}{\includeonly} % \begin{macro}{\includeall} % I think it's more efficient to define a macro for each included part on the % list than it is to search through the list possibly twice for each one. % Other opinions on making this whole thing more efficient? % % We are using the usual \LaTeX{} trick of undefined control sequences % comparing equally with \cs\relax. Empty control sequences are \emph{not} % the same. Should be followed by \meta{true clause} then \meta{false % clause}. % \begin{macrocode} \newcommand\IfAllowed [1] {% \@firstoftwo } \newcommand\includeall {% \let\includeonly\Gobble } \defcommand\includeonly [1] {% \@partswtrue % \DTypeout{INCLUDEONLY}% \edef\@partlist {\zap@space#1 \@empty}% \@for\nc@t@a:=\@partlist \do {% \InitName*{nc@part@\nc@t@a}% }% \defcommand\IfAllowed [1] {% args: part-name \@ifundefined{nc@part@##1} {% % \DTypeout{##1 NOTALLOWED}% \let\nc@t@c\@secondoftwo }{% ELSE % \DTypeout{##1 ALLOWED}% \let\nc@t@c\@firstoftwo }% \nc@t@c }% % \DTypeout{ENDINCLUDEONLY}% } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\include} % \begin{macro}{\include*} % This is the principle user command. The scratch variable \cname{nc@t@b} % contains what really surrounds the included file. % \begin{macrocode} \def\include {% \@ifstar {% \let\nc@t@b\IncludeSurround \nc@include }{% ELSE \let\nc@t@b\clearpage \nc@include }% } % \end{macrocode} % \end{macro} % \end{macro} % % % \section{Experimental common} % % \begin{macro}{\Disable} % \begin{macro}{\DisableAll} % This allows the disabling hacks. % \begin{macrocode} \ReserveCS\DisableAll \newcommand\Disable [1] {% \g@addto@macro\DisableAll{#1}% } % \end{macrocode} % \end{macro} % \end{macro} % % We start with considering how to quit inputting a file. The idea is to make % the \code{\end{document}} command of the part call \cs\endinput. But there % is a hitch that characters on the line after the \code{\end{document}} get % inserted when you don't want them to. To beat that limitation, we have to do % some work. % % \begin{macro}{\nc@radical@shutdown} % We will add a bunch of commands to this macro, with the idea of \cs\catcode{}ing % everything and its brother to a comment. This would be a brute force % method! % \begin{macrocode} \ReserveCS\nc@radical@shutdown % \end{macrocode} % First log a message that we're about to do some crazy things. In case % something goes wrong, this might help. % \begin{macrocode} \addto@macro\nc@radical@shutdown {% \MonsterInfo{newclude} {\protect\nc@radical@shutdown\space beginning}} % \end{macrocode} % Now we start adding \cs\catcode commands. These first two should be % redundant; but just in case someone changed things\lips. % \begin{macrocode} \addto@macro\nc@radical@shutdown{\catcode`\%=14} % 14 = comment \addto@macro\nc@radical@shutdown{\catcode`\^=7} % 7 = superscript % \end{macrocode} % \begin{macro}{\nc@disable@char} % Next, we define a command we weill use in a loop in a moment. % \begin{macrocode} \newcommand\nc@disable@char[1] {% \addto@macro\nc@radical@shutdown {\catcode`#1=14}} % 14 = comment % \end{macrocode} % The following list contains every keyboard char except these three, which are % treated specially: |%#|. % The first is already a comment, and we handle the second in a moment. Each % character in the following list is \cs\catcode{}d to a comment: % \begin{macrocode} \@tfor\sc@t@a:=abcdefghijklmnopqrstuvwxyz% ABCDEFGHIJKLMNOPQRSTUVWXYZ% ~!@$&*()_+-=[]|/?.,<>% 1234567890% `'";:% \^\\\{\}\ % this is really the chars "^\{}" and space \do {\expandafter\nc@disable@char\sc@t@a} % \end{macrocode} % We add |#| separately, because it's tricky or impossible to put it into the % list we just used. % \begin{macrocode} \nc@disable@char\# % \end{macrocode} % \end{macro} % We end the macro with \cs\endinput. This has to come after all the previous, % otherwise, \TeX{} goes ahead and reads to the end of the line immediately, % with regular catcodes. This is a good theory, I'm not sure it's necessary. % \begin{macrocode} \addto@macro\nc@radical@shutdown{\endinput} % \end{macrocode} % \end{macro} % % \begin{macro}{\nc@radical@shutdown@aftergroup} % We need to use \cname{nc@radical@shutdown} this way. % \begin{macrocode} \newcommand\nc@radical@shutdown@aftergroup {% \aftergroup\nc@radical@shutdown } % \end{macrocode} % \end{macro} % % \begin{macro}{\includedoc} % \begin{macro}{\includedoc*} % \mbox{} % \begin{macrocode} \newcommand\includedoc {% \md@check@star \Expand \sc@star@nothing\In {% \IncludeEnv##1{document}{}% }% } % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\includedocskip} % \begin{macro}{\includedocskip*} % \mbox{} % \begin{macrocode} \newcommand\includedocskip {% \md@check@star \Expand \sc@star@nothing\In {% \IncludeEnvSkip##1{document}{}% }% } % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\IncludeEnv} % \begin{macro}{\nc@includeenv} % \begin{macro}{\nc@@includeenv} % \mbox{} % \begin{macrocode} \newcommand\IncludeEnv [2] {% args: environment instance \md@check@star \@ifnextchar [ {% ^^A for Emacs: ] \nc@includeenv{#1}{#2}% }{% ELSE \nc@includeenv{#1}{#2}[]% }% } \NewName{nc@includeenv} {#1#2[#3]} {% args: environment instance [prehook] \@ifnextchar [ {% ^^A for Emacs: ] \nc@@includeenv {#1}{#2}{#3}% }{% ELSE \nc@@includeenv {#1}{#2}{#3}[]% }% } \NewName{nc@@includeenv} {#1#2#3[#4]} {% args: environment instance prehook [posthook] \begingroup \DisableAll \let\documentclass\GobbleOM \let\usepackage\GobbleOM \expandafter\def\csname end#1\endcsname {% \makeatletter % POSTHOOK \nc@radical@shutdown@aftergroup }% \expandafter\def\csname #1\endcsname {} % PREHOOK \endgroup \par \Expand \sc@star@nothing\In {% \include##1{#2}% }% } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \begin{macrocode} \NewName {nc@@includeenvskip} {#1#2#3[#4]} {% args: environment instance prehook [posthook] \begingroup \DisableAll \expandafter\def\csname end#1\endcsname {% \makeatletter % POSTHOOK \nc@radical@shutdown@aftergroup }% \expandafter\def\csname #1\endcsname {} % PREHOOK \long\def\documentclass ##1\begin{document}{% \begingroup \def\@currenvir{document}% } \endgroup \par #1% } % \end{macrocode} % % \section{Tag} % % The code in this section is processed when the \option{tag} package option is % given (or, because the \option{tag} option is the default, when no package % options are given.) % % \input{tag.sto} % % \section{Allocate} % % The code in this section is processed when the \option{allocate} package % option is given. % % \input{allocate.sto} % % \section{Benign packages} % % \begin{macro}{\DeclareFormattingPackage} % \begin{macro}{\nc@formatting@packages} % \mbox{} % \begin{macrocode} \newcommand\DeclareFormattingPackage [1] {% \addto@macro\nc@formatting@packages{,#1}% } \newcommand\nc@formatting@packages {times,helvetic} % \end{macrocode} % \end{macro} % \end{macro} % % \Finale