File: optional.sty

package info (click to toggle)
tetex-src 3.0.dfsg.2-1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 122,292 kB
  • ctags: 2,709
  • sloc: makefile: 2,323; perl: 1,820; sh: 1,378; lisp: 448; python: 335; xml: 175; sed: 138; ansic: 138; yacc: 52
file content (133 lines) | stat: -rw-r--r-- 5,315 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
%      O P T I O N A L . S T Y            ver 2.2  Sept 2001
%
% 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 by Donald Arseneau (asnd@reg.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, the name must be changed.)
%
% 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, two ways to use this package without altering 
% the main document file: command-line option selection and interactive 
% prompting.
%
% If you invoke LaTeX with the command line:
%
%     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.
%
% Alternatively, 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 here also.
%
% 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}}
%
% DEFINITIONS

\ProvidesPackage{optional}[2001/09/14 ver 2.2; \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