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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
|
%^^A* legal notices
% \iffalse
%
% This file is part of the Frankenstein bundle, comprising the
% files listed in the file Manifest.txt. You should have
% received the complete bundle when you received this file.
%
% Copyright 1995-2001 Matt Swift <swift@alum.mit.edu>.
%
% This file contains both the code and documentation for the
% includex LaTeX package. It will work ONLY if it is placed in
% a proper directory. Files called README, INSTALL,
% includex.tex includex.ins, and includex.dvi
% should have also been distributed to you with this file. See
% README for more information on 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{227}
%
% \begin{abstract}
% Includex allows you to include just the contents of one source file into
% another, ignoring the text outside the
% \code{\begin{document}}\lips\code{\end{document}} in the included file.
%
% This package is useful but may have problems and is unsupported.
%
% See also the \package{newclude} package.
% \end{abstract}
% \tableofcontents
%
% \part{Discussion}
% \section{Including Files}
%
% \DescribeMacro{\include*}
% \cs\include was always pretty useless to me because it did a \cs\clearpage
% before and after the \cs\input. The macro |\include*| is defined below to be
% like \cs\include but without the \cs\clearpage s.
%
% The other thing we do is define a command \cs\includedoc, which includes a
% file which is allowed to have its own \cs\documentclass and |\begin{document}|
% and |\end{document}| and \cs\usepackage commands.
%
% This opens up a whole new world of truly modular \LaTeX{} files. There is
% even nothing special about extracting the |document| environment, we can
% extract \emph{any} environment, or perhaps even other things.
%
% There are some problems, however. Maybe the \cs\usepackage is necessary,
% maybe it would conflict. Same with other commands like the \cs\newcommand
% family. It is simply not (yet) an issue in \LaTeX{} design to consider the
% implications of parent files. The problems are not insurmountable. We can
% begin by working with a convention, and ultimately maybe make some changes in
% certain macros. I will be getting to all this. I admit I have not looked
% carefully to see whether the design specifications of \LaTeX3{} address these
% important issues.
%
% The macros here will be useful in many circumstances, when the included files
% are themselves simple.
%
% \DescribeMacro{\includedoc}
% \DescribeMacro{\includedoc*}
% \DescribeMacro{\includedocskip}
% \DescribeMacro{\includedocskip*}
% There are now two main commands, \cs\includedoc and \cs\includedocskip,
% each with a |*| version analogous to the new \cmd{include*}. Each take a
% filename as an argument just like \cs\include.
%
% \cs\includedoc\marg{filename} reads everything in the file except for
% \cs\documentclass, \cs\usepackage, |\begin{document}|, |\end{document}|
% (and whatever follows it).
%
% \cs\includedocskip\marg{filename} does the same except it also skips
% everything between \cs\documentclass and |\begin{document}|.
%
% \DescribeMacro{\disable}
% At present there is a makeshift way to ignore additional commands when
% using \cs\includedoc and \cs\includedocskip. If you want to cause \cs\foo
% which takes no arguments to be disabled, say |\disable{\let\foo\relax}|. If
% \cs\foo takes one mandatory argument, say |\let\foo\Gobble| instead. If
% \cs\foo takes one optional and one mandatory, say |\let\foo\GobbleOM|. If
% \cs\foo takes two mandatory arguments, say |\let\foo\GobbleMM|. For other
% permutations of arguments, you can extrapolate from the macros defined
% below.
%
% \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{extra ways to include files}
\def\DoXPackageS {}
\def\fileversion{v0.6a}
\def\filedate{1999/02/23}
\def\docdate{1999/02/23}
\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{includex}[\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{Requirements}
%
% Now we declare the package, check for \LaTeX2e, and load the other packages
% needed.
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{includex}
\RequirePackage{moredefs}
% \end{macrocode}
%
% \section{Disabling things}
%
% \begin{macro}{\disable}
% This allows the disabling hacks.
% \begin{macrocode}
\ReserveCS\DisableMonster % This line is elsewhere for main package
\newcommand\disable[1] {%
\g@addto@macro\DisableMonster{#1}%
}
% \end{macrocode}
% \end{macro}
%
% \section{New things}
%
% \begin{macro}{\sc@saved@include}
% \begin{macro}{\include}
% \begin{macro}{\sc@include}
% \begin{macro}{\sc@@include}
% This is a simple redefinition of \cs\include without the \cs\clearpage
% commands. Nothing tricky going on.
% \begin{macrocode}
\newlet\sc@saved@include\include
\renewcommand\include {%
\@ifstar
\sc@include
\sc@saved@include
}
\newcommand\sc@include {%
\relax
\ifnum\@auxout=\@partaux
\@latex@error{\string\include\space cannot be nested}\@eha
\else
\expandafter\sc@@include
\fi
}
\newcommand\sc@@include[1] {%
\if@filesw
\immediate\write\@mainaux{\string\@input{#1.aux}}%
\fi
\@tempswatrue
\if@partsw
\@tempswafalse
\edef\@tempb{#1}%
\@for \@tempa:=\@partlist
\do{\ifx\@tempa
\@tempb
\@tempswatrue
\fi}%
\fi
\if@tempswa
\let\@auxout\@partaux
\if@filesw
\immediate\openout\@partaux #1.aux%
\immediate\write\@partaux{\relax}%
\fi
\@input@{#1.tex}%
\@writeckpt{#1}%
\if@filesw
% NOTE: Robin took out the \immediate here.
% \immediate\closeout\@partaux
\closeout\@partaux
\fi
\else
\@nameuse{cp@#1}%
\fi
\let\@auxout\@mainaux
}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% Now we start dealing with the much more tricky extraction of the |document|
% environment.
%
% We start with considering how to quit inputting a file. The idea is to make
% the |\end{document}| command of the included file call \cs\endinput. But
% there is a hitch that characters on the line after the |\end{document}| get
% inserted when you don't want them to. To beat that limitation, we have to do
% some work.
%
% \begin{macro}{\sc@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\sc@radical@shutdown
% \end{macrocode}
% First log a message that we're about to do some crazy things. In case
% something ever goes wrong, this might help.
% \begin{macrocode}
\addto@macro\sc@radical@shutdown {%
\PackageInfo{includex}{\protect\sc@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\sc@radical@shutdown{\catcode`\%=14} % 14 = comment
\addto@macro\sc@radical@shutdown{\catcode`\^=7} % 7 = superscript
% \end{macrocode}
% \begin{macro}{\sc@disable@char}
% Next, we define a command we weill use in a loop in a moment.
% \begin{macrocode}
\newcommand\sc@disable@char[1] {%
\addto@macro\sc@radical@shutdown
{\catcode`#1=14}} % 14 = comment
% \end{macrocode}
% \end{macro}
% 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\sc@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}
\sc@disable@char\#
% \end{macrocode}
% 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\sc@radical@shutdown{\endinput}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\sc@radical@shutdown@aftergroup}
% We need to use |\sc@radical@shutdown| this way.
% \begin{macrocode}
\newcommand\sc@radical@shutdown@aftergroup {%
\aftergroup\sc@radical@shutdown
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\sc@begindoc@toks}
% \begin{macro}{\sc@enddoc@toks}
% These are for \cs\AtBeginIncludedDocument and \cs\AtEndIncludedDocument.
% \begin{macrocode}
\newtoks\sc@begindoc@toks
\sc@begindoc@toks{}
\newtoks\sc@enddoc@toks
\sc@enddoc@toks{}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\AtBeginIncludedDocument}
% The analogue of \cs\AtBeginDocument.
% \begin{macrocode}
\newcommand\AtBeginIncludedDocument[1] {%
\sc@begindoc@toks\expandafter{\the\sc@begindoc@toks#1}%
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\AtEndIncludedDocument}
% The analogue of \cs\AtEndDocument
% \begin{macrocode}
\newcommand\AtEndIncludedDocument[1] {%
\sc@enddoc@toks\expandafter{\the\sc@enddoc@toks#1}%
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\includedoc}
% \begin{macro}{\includedoc*}
% Now we start from the other end, defining the user command.
% \begin{macrocode}
\newcommand\includedoc {%
% Robin's new:
\@ifstar {%
\def\sc@includebit@cmd{\include*}\sc@includebit
}{% ELSE
\let\sc@includebit@cmd\include\sc@includebit
}%
}
% My old:
% {\sc@includebit}
% {\clearpage
% \sc@includebit[\clearpage]}}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\sc@includebit}
% The commented-out code is for some eventual extensions.
%
% Interface is \cmd{sc@includebit}\oarg{postlude}\marg{file} (where
% \oarg{postlude} is command(s) to be executed after the inclusion is
% complete); it is assumed that \cmd{sc@includebit@cmd} is either \cs\include
% or \cmd{include*}
% \begin{macrocode}
\newcounter{sc@count}
\newcounter{bit}
\newcommand\sc@includebit [2] [] {%
\setcounter{sc@count}{\thebit}%
\begingroup
\DisableMonster
\let\usepackage\GobbleOM
% Robin's new:
\def\enddocument {%
\makeatletter
\the\sc@enddoc@toks
\sc@radical@shutdown@aftergroup
}
% My old:
% \let\enddocument\sc@radical@shutdown@aftergroup
\let\documentclass\GobbleOM
\let\documentstyle\GobbleOM % why worry about branching if 2.09..
\def\document {%
\the\sc@begindoc@toks
}%
\def\IncludedJobname {#2}%
\sc@includebit@cmd{#2}%
\endgroup
\par
#1
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\includedocskip}
% \begin{macro}{\includedocskip*}
% Now we make a similar command that \emph{entirely} skips the preamble,
% whereas \cs\includedoc only skipped those commands that we specifically
% disabled. Obviously this whole business of the preamble needs to be
% radically reconceived if convenient modularity of documents is to be had. At
% the moment, no distinction is made between things like \cs\newcommand and
% \cs\usepackage that should be exported to a parent file, and those things that
% should not.
% \begin{macrocode}
\newcommand\includedocskip {%
\@ifstar {%
\sc@includebitskip
}{% ELSE
\clearpage
\sc@includebitskip[\clearpage]%
}%
}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% I tried combining |\sc@includebitskip| and |\sc@includebit| but something
% changed when I used a conditional to do this. I'm sure the problem could be
% figured out and the two combined.
%
% \begin{macro}{\sc@includebitskip}
% We begin skipping with the \cs\documentclass or \cs\documentstyle command, and
% stop with the |\begin{document}| command. With some hacking to the new
% |verbatim| environment, this could be done. I haven't done this yet, so this
% is implemented by stuffing everything into a macro argument. I can't think
% of a \cs\begin occurring between \cs\documentclass the \cs\begin document, but
% that will screw things up if it does.
%
% The commented lines here are once again for a future extension.
% \begin{macrocode}
\newcommand\sc@includebitskip [2] [] {%
\setcounter{sc@count}{\thebit}%
\begingroup
\DisableMonster
\let\enddocument\sc@radical@shutdown@aftergroup
\long\def\documentclass ##1\begin{%
\begingroup
\def\@currenvir{document}%
\GobbleM
}% "{document}" is still to be read.
\let\documentstyle\documentclass
\include*{#2}%
\endgroup
\par
#1\relax
}
% \end{macrocode}
% \end{macro}
%
% \Finale
|