159 lines
6.3 KiB
Text
159 lines
6.3 KiB
Text
|
%
|
||
|
% O P T I O N A L . S T Y
|
||
|
% ~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
% ver 2.2b Jan 2005
|
||
|
%
|
||
|
% Enable multiple versions of a document to be printed from one source file,
|
||
|
% especially if most of the text is shared between versions.
|
||
|
%
|
||
|
% Copyright 1993,1999,2001,2005 by Donald Arseneau (asnd@triumf.ca).
|
||
|
% This software is released under the terms of the LaTeX Project Public
|
||
|
% License (ftp://ctan.tug.org/tex-archive/macros/latex/base/lppl.txt).
|
||
|
% (Essentially: Free to use, copy, distribute (sell) and change, but, if
|
||
|
% changed, that fact must be made apparent to the user.) It has a
|
||
|
% status of "maintained".
|
||
|
%
|
||
|
%
|
||
|
% HOW TO USE
|
||
|
% ~~~~~~~~~~
|
||
|
% One way to use this package is to declare (for example)
|
||
|
%
|
||
|
% \usepackage[opta]{optional}
|
||
|
%
|
||
|
% at the beginning of your document, and flag optional text throughout
|
||
|
% your document like:
|
||
|
%
|
||
|
% \opt{opta}{Do this if option opta was declared}
|
||
|
% \opt{optb}{Do this if option optb was declared}
|
||
|
% \opt{optx,opty}{Do this if either option optx or opty}
|
||
|
% \opt{}{Never print this text!}
|
||
|
% \opt{opta}{\input{appendices}}
|
||
|
% \optv{xam}{Type: \verb|[root /]$ rm -r *|.}
|
||
|
%
|
||
|
% Note that both the package option and the "\opt" argument can contain
|
||
|
% lists of options although, in practice, one or the other should be a
|
||
|
% single option name. Lists are allowed in both places to allow more
|
||
|
% flexibility in the style of use. (But making the definitions much more
|
||
|
% difficult, Grrr.)
|
||
|
%
|
||
|
% Just as for "\includeonly", you will have to edit the main document
|
||
|
% file to switch option codes (i.e., change the "\usepackage" line).
|
||
|
% There are, however, several ways to use this package without altering
|
||
|
% the main document file: separate files, file-name sensing, interactive
|
||
|
% prompting, and command-line option selection.
|
||
|
%
|
||
|
% Typically, different versions of a document will require different
|
||
|
% document class and package setup, besides the different tags for
|
||
|
% optional.sty. In that case it is best to have a separate main file
|
||
|
% for each version of the document. Each stub file will declare the
|
||
|
% document class and load some packages (including this one) and then
|
||
|
% input the rest of the document from a file common to all versions.
|
||
|
%
|
||
|
% \documentclass[A0]{poster}
|
||
|
% \usepackage[poster]{optional}
|
||
|
% \input{my_paper}
|
||
|
%
|
||
|
% If the different opt-tags match the different stub file names (file
|
||
|
% poster.tex will typeset the "poster" version) then you can specify
|
||
|
%
|
||
|
% \usepackage[\jobname]{optional}
|
||
|
%
|
||
|
% Alternatively, this "\jobname" technique can make use of symbolic links,
|
||
|
% if your computer system supports them, by having a single main input
|
||
|
% file accessed under different names (and different "\jobname"s).
|
||
|
%
|
||
|
% Another scheme is to invoke LaTeX with the command line such as:
|
||
|
%
|
||
|
% latex "\def\UseOption{opta,optb}\input{file}"
|
||
|
%
|
||
|
% (with quoting appropriate to your operating system) then options "opta"
|
||
|
% and "optb" will be used in addition to any options specified with the
|
||
|
% "\usepackage" command.
|
||
|
%
|
||
|
% You can prompt yourself to specify the option(s) with every run
|
||
|
% through LaTeX:
|
||
|
%
|
||
|
% \usepackage{optional}
|
||
|
% \newcommand{\ExplainOptions}{man = users manual, check = checklist,
|
||
|
% ref = reference card, post = poster.}
|
||
|
% \AskOption
|
||
|
%
|
||
|
% The definition of "\ExplainOptions" is optional; it only serves to help
|
||
|
% the person who answers the question. The "\AskOption" is also optional;
|
||
|
% it will be executed automatically whenever optional.sty sees no list of
|
||
|
% options. This method is too tedious to use much.
|
||
|
%
|
||
|
% The normal restrictions forbidding special characters in package options
|
||
|
% and reference tags apply also the the tags used by the "\opt" command.
|
||
|
%
|
||
|
% These are not `comment' macros: The optional text must be well-formed
|
||
|
% with balanced braces, even if not printed. The "\opt" command *IS*
|
||
|
% completely `expandable' which means it is robust and can even be used
|
||
|
% in messages ("\typeout").
|
||
|
%
|
||
|
% As usual, "\verb" commands and verbatim environments cannot be used
|
||
|
% in the argument to "\opt". For this purpose there is a variant form
|
||
|
% of "\opt" called "\optv" (optional verbatim) which may have a limited
|
||
|
% class of verbatim material in the argument. It can do so by leaving
|
||
|
% the braces around the argument, which may have undesired side effects.
|
||
|
% For an "\optv" argument to be successfully ignored, the verbatim material
|
||
|
% must have balanced braces etc.
|
||
|
%
|
||
|
% The "\opt" command is only intended for small sections of text. If you
|
||
|
% need to optionally include whole sections or chapters, put that material
|
||
|
% in a separate file, and "\opt"-ionally use an "\input" command:
|
||
|
%
|
||
|
% \opt{internal}{\input{prog_listings}}
|
||
|
%
|
||
|
%====================== END INSTRUCTIONS ========================
|
||
|
|
||
|
\ProvidesPackage{optional}[2005/01/26 ver 2.2b; \space
|
||
|
Optional inclusion/omission]
|
||
|
% Initialize used-option-list to \@gobble to eat the comma when the first
|
||
|
% entry is `appended'.
|
||
|
\@ifundefined{UseOption}{\let\UseOption\@gobble}{}
|
||
|
\DeclareOption*{\edef\UseOption{\UseOption,\CurrentOption}}
|
||
|
\ProcessOptions
|
||
|
\AtBeginDocument{\Opl@Setup}
|
||
|
|
||
|
\newcommand*\opt[1]{\if\Opl@notlisted{#1}\expandafter\@gobble
|
||
|
\else \expandafter\@firstofone \fi}
|
||
|
|
||
|
\newcommand*\optv[1]{\if\Opl@notlisted{#1}\expandafter\@gobble\fi}
|
||
|
|
||
|
% This initial definition forces immediate setup if \opt used in the preamble
|
||
|
\def\Opl@notlisted{\fi \Opl@Setup \if\Opl@notlisted}
|
||
|
|
||
|
\newcommand\AskOption{%
|
||
|
\@ifundefined{ExplainOptions}{}{\typeout{\ExplainOptions}}%
|
||
|
\typein[\UseOption]{Specify which optional text to process:}%
|
||
|
}
|
||
|
|
||
|
\def\Opl@Setup{%
|
||
|
\ifx\UseOption\@gobble\AskOption\fi
|
||
|
\let\Opl@notlisted\@empty % initialize list of checks
|
||
|
\@for\@tempa:=\UseOption\do{%
|
||
|
\ifx\@tempa\@empty\else\expandafter\Opl@oneop\expandafter{\@tempa}\fi}%
|
||
|
\ifx\Opl@notlisted\@empty \PackageWarning{optional}%
|
||
|
{No options were selected, so all optional text will be printed}%
|
||
|
\let\opt\@secondoftwo
|
||
|
\else
|
||
|
\typeout{Using optional text marked with \UseOption. }%
|
||
|
\toks@\expandafter{\Opl@notlisted}%
|
||
|
\edef\@tempa{\def\noexpand\Opl@notlisted####1{,\the\toks@,}}\@tempa
|
||
|
\fi
|
||
|
\let\Opl@Setup\@empty \let\Opl@oneop\undefined
|
||
|
\let\AskOption\undefined \let\ExplainOptions\undefined
|
||
|
}
|
||
|
\begingroup
|
||
|
\catcode`\Z= 3 % special delimiter
|
||
|
\gdef\Opl@oneop#1{%
|
||
|
\@ifundefined{Opl@Match@#1}{%
|
||
|
\toks@\expandafter{\Opl@notlisted}%
|
||
|
\edef\Opl@notlisted{\the\toks@ \csname Opl@Match@#1\endcsname ,####1,#1,Z}%
|
||
|
\@namedef{Opl@Match@#1}##1,#1,##2Z{##2}%
|
||
|
}\relax
|
||
|
}
|
||
|
\endgroup
|
||
|
\endinput
|