fweb-1.62/ 40755 10061 1115 0 6602703124 11417 5ustar krommesusersfweb-1.62/Boot/ 40755 10061 1115 0 6602703167 12331 5ustar krommesusersfweb-1.62/Boot/amiga/ 40755 10061 1115 0 6602703105 13377 5ustar krommesusersfweb-1.62/Boot/misc/ 40755 10061 1115 0 6602703170 13256 5ustar krommesusersfweb-1.62/Boot/misc/custom.h100644 10061 1115 34102 6602703161 15056 0ustar krommesusers#if(0) FTANGLE v1.60, created with UNIX on "Thursday, September 24, 1998 at 16:12." COMMAND LINE: "./ftangle ./custom -uSUN -mMISC -mCC -= /u/krommes/Fweb/1.62/Boot/misc/custom.h -# -v" RUN TIME: "Friday, September 25, 1998 at 8:02." WEB FILE: "./custom.web" CHANGE FILE: (none) #endif /* --- BOOTSTRAPPING --- */ /* To bootstrap yourself onto a new system, you should modify this file \ appropriately. In most cases, you set a flag by saying ``#define \ FLAG''---i.e., you make a null definition. Don't set these flags to~0 \ or~1. However, in a few cases the macros are not flags and must be given \ the appropriate definition. */ /* --- MACHINE COMPILER FLAG --- */ /* This must be in lower case. Presently these are drawn from the list \ {ansi, bsd, dsu, ibmpc, mac, misc, mvs, sgi, sun, vax}. These \ flags may be used in #define statements within the source code to tailor \ things to a particular compiler or operating system. If you use \ ./configure to generate custom.h, there will be no definition following \ this comment. */ #ifndef misc #define misc #endif /* |misc| */ /* --- FWEB SYSTEM NAME --- */ /* This is a string such as ``IBM-PC/DOS'' or ``VAX/VMS''. It is printed \ when FWEB starts up. */ #define THE_SYSTEM "Vanilla" /* --- An optional local banner, printed after the system name above. --- */ #define LOCAL_BANNER "" /* Does your compiler understand the ANSI preprocessor command \#error? \ If it does, define |HAVE_ERROR|. (I haven't figured out a general \ autoconf test yet; it seems to be impossible in principle.) */ #define HAVE_ERROR 0 /* The C preprocessor is run by the \.{-H} option. */ #define RUN_CPP "gcc -E" /* Occasionally a system command is issued to rename a file. Here's how to \ do that. */ #define MV "mv" /* Do we bother with translations to the internal |ASCII| representation? \ If so, define |TRANSLATE_ASCII|. Don't bother on |ASCII| machines. */ #define TRANSLATE_ASCII 0 /* For \It{debugging} of target machines whose character set differs from \ the one on which you're working, define |DEBUG_XCHR|. \It{Usually, this \ flag should not be defined.} When it is defined, the |TRANSLATE_ASCII| \ flag is automatically turned on, and the value of the style-file field \ `xchr' is relevant. \It{Don't use this flag unless you're a system \ developer!!!} */ #define DEBUG_XCHR 0 /* Does the operating system have a Unix-like path? \ That is, does it have the form ``/u/krommes'' rather than the VMS form \ ``ux3:[krommes]''? If so, define |UNIX_PATH|. */ #define UNIX_PATH 1 /* If the |getenv| call to obtain an environment variable is supported \ (it usually is) define |HAVE_GETENV|. */ #define HAVE_GETENV 1 /* --- FILE NAMES and EXTENSIONS --- */ /* Name of the null file. This macro merely defines the default value of \ the style-file parameter `null_file', so it's not essential to add any more \ machines here. */ #define NULL_FILE_NAME "/dev/null"/* For Unix systems. */ /* Name of \FWEB's initialization file. Please see below, after the \ definition of |SMALL_MEMORY|. */ /* Name of \FWEB's default style file. \It{Please don't change this unless \ you absolutely have to! Use the `-z' option instead.} */ #define STYLE_FILE_NAME "fweb.sty" /* Here are the default file extensions for each language. These merely \ set default style-file parameters, so it's not essential that you change \ anything here. See the parameters `suffix.C', `suffix.N', etc. */ #define C_EXT "c" #define V_EXT "mk" #define X_EXT "sty" /* Unix. */ #define Cpp_EXT "C" /* Per \.{gcc}. */ #define R_EXT "r" #define R90_EXT "r90" #define N_EXT "f" #define N90_EXT "f90" #define HAVE_TMPNAM 1 #define HAVE_TEMPNAM 0 /* The |FANCY_SPLIT| flag is used for buffering the output lines of C~code. \ Define this if the C~compiler CAN'T continue an incomplete line with a \ backslash. (ANSI compilers should be able to.) \ {\bf (This code may not be fully debugged yet!)} */ #define FANCY_SPLIT 0 /* --- INCLUDING FILES --- */ /* The code is written in C, and various header files of the form \ ``<*.h>'' are included near the beginning of each source file. The \ names of these files are standardized by ANSI. Unfortunately, not everyone \ has gotten around to ANSI yet. Therefore, here we include important files \ whose names may be nonstandard or whose functions may fluctuate. */ /* Does the ANSI exist? If so, say so here. This is supposed \ to contain prototypes for the following functions used by \FWEB: |abort|, \ |abs|, |atof|, |atoi|, |atol|, |calloc|, |exit|, |free|, |getenv|, \ |realloc|, |strtod|, |strtol|. If it doesn't, either find the prototypes \ in another file and include it here, or actually give the prototypes here. */ #define HAVE_STDLIB_H 1 #define HAVE_STDARG_H 1 /* Does the ANSI exist? If so, include it here. This is \ supposed to define the |NULL| pointer, and the type |size_t|. Sometimes \ these are defined in other places as well. */ #define HAVE_STDDEF_H 1 /* Other stuff handled by autoconf. */ #define HAVE_STRING_H 1 #define HAVE_MEMORY_H 0 #define HAVE_FLOAT_H 1 /* Does (non-ANSI) exist? You may find some useful stuff in \ here. But don't use it unless you have to. */ /* _P include */ /* Must we include an extra file for memory management? E.g., for \ Microsoft, ; for Borland; . Not necessary for ANSI; \ it's in . */ /* _P include */ /* Numerical limits. We use the following ANSI macros: |INT_MAX|, \ |INT_MIN|, |LONG_MAX|, |LONG_MIN|, and |ULONG_MAX|, which are found in \ . If you can't find those macros, define the flag \ |HAVE_VALUES_H|, and possibly include another file with different names for \ the limits, such as on the Sun. The flag |HAVE_VALUES_H| \ assumes that the macros |MAXINT| and |MAXLONG| are defined. If they are \ not, you must define them here. */ #define HAVE_LIMITS_H 1 #define HAVE_VALUES_H 0 /* Please note that additional files are included automatically \ (essentially immediately after this file is read; see ). \ These were considered to be standard, but that might be a mistake. Those \ files are: , , , , . \ Remember that by convention these files should limit themselves to being \ included only once. Therefore, if for some reason you need to include one \ of these somewhere in this file, you should be able to do it without \ difficulty; the later automatic include just won't be done if those files \ are following standard protocol. */ #define ANSI_CTYPE_H 0 /* --- VARIABLE-LENGTH ARGUMENT LISTS --- */ /* For convenience, FWEB attempts to use functions with variable numbers of \ arguments. We attempt to support two conventions: ANSI, and Sun's. If \ this feature is supported, define the flag |VARIABLE_ARGUMENTS|, say \ whether |va_start| has one or two arguments, and include the associated \ header file ( for ANSI). */ /* Does the compiler allow ANSI-style variable arguments? */ #define VARIABLE_ARGUMENTS 1 /* Is |va_start| defined with one argument (Sun's convention) or two \ (ANSI)? */ #define NUM_VA_ARGS 2 #define HAVE_STDARG_H 1 /* --- ADDITIONAL PROTOTYPES --- */ /* You may wish to collect any additional prototypes that are required and \ put them into your own header file that you include here. */ /* If the flag |HAVE_STD_PROTOTYPES| is false, it causes the file \ "stdlib0.h" to be loaded. This contains ANSI prototypes that for some \ reason aren't provided with the gcc environment on the Sun. */ #define HAVE_STD_PROTOTYPES 1 /* Define the flag |OLD_PROTOTYPES| for compilers that don't support the \ new (ANSI) style of function declaration and prototyping. The new style is \ |fcn(int i,char *s){}|; the old style is |fcn(i,s) int i; char *s; {}|. */ #define OLD_PROTOTYPES 1 /* ANSI also introduces the type |void|. If your compiler doesn't \ understand the constructions |void *| and |void fcn()|, define |NO_VOID|. */ #define NO_VOID 0 /* --- SPECIAL TYPES --- */ /* |const| seems to be an annoyance; not all compilers treat it the same \ way. We really only want it for debugging, anyway, so we mostly just \ remove it. It's kept when compiling on the Sun with gcc, because it \ gives the developer more checks on the code. If you want to keep it, \ define |KEEP_CONST|. */ #define KEEP_CONST 0 /* For personal computers, the kind of pointer is an issue. They must be \ |huge|. If your compiler understands |huge|, define |HUGE_POINTERS|. */ #define HUGE_POINTERS 0 /* --- SPECIAL FUNCTIONS --- */ /* The ANSI |sprintf| function returns the number of characters written. \ If this is the case on your system, define |ANSI_SPRINTF|. (It's always \ safe to not define it.) */ #define ANSI_SPRINTF 0 /* The ANSI |sscanf| does some cute things with scansets, but it doesn't \ always work. */ #define ANSI_SSCANF 0 /* The ANSI |system| function is supposed to take |NULL| as an argument, \ which means check if a command processor exists. If this works properly, \ defined |ANSI_SYSTEM|. (It doesn't work on the Sun.) */ #define ANSI_SYSTEM 0 /* --- ANNOYING WARNINGS --- */ /* Sometimes the compiler can't understand that the \ control flow can never get to the bottom of a function. To avoid warning \ complaints, we have the following: */ #define DUMMY_RETURN(value) return value /* --- UNUSUAL NAMES --- */ /* Put here any definitions that override standard names. For example, for \ some ancient on the MAC one had to say ``#define getc agetc''. */ /* Nothing to be done. */ /* --- DIRECTORY SPECIFICATIONS --- */ /* Directory specifications are delimited in different ways under the various \ operating systems. Unix: '/'; IBM-PC: '\\'; VAX/VMS: ']'. */ #define PREFIX_END_CHAR '/' /* The Unix convention. */ /* --- TIMING --- */ /* First of all, we have a flag to say whether timing information is \ printed at the end of the run. (If you can't figure out the timing \ routines for your machine or don't want a timing information line at the \ end of your terminal output, don't define this.) Beginning with fweb-1.53, \ timing is turned off by default. */ #define TIMING 0 /* --- Number of decimal places for timing information in seconds. (Use \ at least 2 for supercomputers.) --- */ #define TIMING_WIDTH 1 /* There's supposed to be a function |clock()| that returns the cpu time, \ in units of |CLOCKS_PER_SEC|. The type of |clock| is |clock_t|. If that \ is defined, define the flag |CLOCK_T_DEFINED|; otherwise, say |typedef ... \ clock_t| here. */ #define CLOCK_T_DEFINED 1 /* Some systems don't define |CLOCKS_PER_SEC|. If not, we try |CLK_TCK|. \ If that's not defined, it defaults to 1000000. If that's not appropriate, \ define |CLOCKS_PER_SEC| here. */ /* \ #define CLOCKS_PER_SEC 1000000 \ */ /* Are there system routines that return wall-clock time in sub-second units? \ First, look for |gettimeofday| ($\mu$sec timing). */ #define HAVE_GETTIMEOFDAY 0 /* Otherwise, does the file sys/timeb.h exist that along with |ftime| gives \ millisecond timing for wall-clock time? We check for the header file, not \ |ftime| itself, since |ftime| may be in a Berkeley compatibility library, \ not in libc. */ #define HAVE_SYS_TIMEB_H 0 /* Do we use our own version of |difftime()|, which computes the difference \ of two wall clock times? If so, define |NEW_DIFFTIME|. This flag should \ always be defined if |HAVE_SYS_TIMEB_H| is defined above. */ #define NEW_DIFFTIME 1 /* --- MAKING IT FIT --- */ /* Sometimes the compiler can't handle functions or switches that are too \ large. In that case, define |FCN_CALLS|. That converts certain in-line \ code (such as in the syntax production analyzer) into function calls (at \ the price of slowing things down a bit). */ #define FCN_CALLS 0 /* The personal computers are starved for memory. For those machines, we \ specify smaller default values for the lengths of dynamic arrays; define \ |SMALL_MEMORY|. (You can always use the `-y' option to override these \ defaults.) */ #define SMALL_MEMORY 0 /* Name of \FWEB's default initialization file. Please don't change these \ conventions unless you absolutely have to!!! Also, note that these \ definitions are overridden by the environment variable |FWEB_INI|, if it is \ defined. */ #ifndef SMALL_MEMORY #define SMALL_MEMORY 0 #endif #if SMALL_MEMORY #define FWEB_INI "fweb.ini" #else #define FWEB_INI ".fweb" #endif /* --- MEMORY ALLOCATIONS --- */ /* The ANSI |calloc| routine takes two arguments: |void \ *calloc(size_t,size_t)|. If the system doesn't have a standard |calloc| \ routine, or if the name isn't standard, you must define an UPPERCASE macro \ that does the same thing. (The name isn't standard on personal computers \ because one is dealing with |huge| allocations.) If you define \ |NON_ANSI_CALLOC|, you must define |CALLOC|, |REALLOC|, and |FREE|. E.g., the \ relevant definitions for Borland are \ \begintt \ #define CALLOC farcalloc \ #define REALLOC(oldblock,nbytes) \ \ farrealloc((void far *)(oldblock),(unsigned long)(nbytes)) \ #define FREE(block) farfree((void far *)(block)) \ \endtt \ */ #define NON_ANSI_CALLOC 0 /* |IBMPC| */ /* Do we supply below a routine that obtains the available memory, such \ as Borland's farcoreleft()? */ #define PRINT_AVAILABLE_MEMORY 0 /* The function call that obtains the memory is called |CORE_LEFT|. This \ function is assumed to return an |unsigned long int|. For Microsoft, we had \ to write our own routine |_hmemavl|; see below. For Borland, the routine \ should be called |farcoreleft|. For the other machines, we don't have \ anything as yet. */ /* The following flag is defined only by \common.web}. */ #ifdef COMMON_FCNS_ #if(part==0 || part==1) /* Give here the C code for any additional functions that are \ compiler-specific or missing from your implementation, such as maybe \ |strtod|. Note that these are bracketed with the flag COMMON_FCNS_ so they \ are compiled into just one module, namely common.c. You must \ always supply some version of the debugging routine |trap|, which must \ return~0 as a minimum. */ /* The default |trap| function for debugging. */ int trap(void) {return 0;} #endif /* |part == 1| */ #endif /* |COMMON_FCNS_| */ fweb-1.62/Boot/misc/READ_ME.MISC100644 10061 1115 5365 6602703170 15135 0ustar krommesusers --- The VOID --- Version 1.30 May 15, 1993 This subdirectory contains vanilla-flavored bootstrap files for bringing FWEB up on an unknown machine that is specifically NOT fully ANSI-compatible. See READ_ME.FWEB for a description of the files and for instructions on using the make facility. To bootstrap, please see the instructions in READ_ME.FWEB. When bringing FWEB up on a new machine, you should have a minimum of difficulties if your compiler is fully ANSI. If it is, you should NOT be using the code here; try the ./configure procedure described in READ_ME.FWEB, or use the code in boot/unix/ansi/. However, if it is not, try beginning with this code. You may encounter one or more of the following difficulties: * DIFFICULTIES WITH FUNCTION PROTOTYPING. New with the ANSI standard is the concept of function prototyping; the ``old-style'' of declarations is allegedly obsolete. The FWEB source code is macroed up in such a way that bootstrap code with or without function prototyping can be generated. The MISC code uses no function prototypes and old-style declarations, so you're probably safe here. * MISSING HEADER FILES. One of the great services the ANSI standard provided was to standarize the headers and library routines. You may have to scrounge around to find your system's versions of the proper header files, or in some cases declare certain library routines yourself. The custom.h template that is provided uses ANSI includes as a start. * MISSING LIBRARY ROUTINES. See the above remark. You might have to write a few replacement routines. If so, please let me know what they were. * PROBLEMS WITH SIGNED VS. UNSIGNED, or LONG VS. INT. Considerable effort has been made to get a consistent and portable set of data types. Working with 16-bit arithmetic on the Mac and IBM-PC exposed a variety of difficulties, many inherited from previous authors. These may not all be fixed. It's best to work with 32-bit ints if you can. Otherwise, watch out for the arithmetic. If you're working with 16 bit arithmetic, definitely start with boot/ibm/pc/custom.h rather than boot/misc/custom.h. * PROBLEMS WITH MEMORY ALLOCATION. In some cases, very long arrays must be allocated. Be sure calloc (see the get_mem0 function in common.web) can handle the arguments it's being given. * PROBLEMS WITH THE IMPLEMENTATION OF THE TIMING ROUTINES. Again, ANSI standardized all this, but not everybody's caught up. The machine-specific code is localized in the C header file os.h, which #includes custom.h, then does a few more things. In a pinch, you could edit os.h as well as custom.h. However, if you do, please let me know. * * * Please keep a careful list of all bugs and fixes, and report them. Thanks. fweb-1.62/Boot/misc/defaults.mk100644 10061 1115 7664 6602703170 15530 0ustar krommesusers# Generated automatically from defaults.mk.in and misc.ini by FWEB_configure. # --- START of SYSTEM CONFIGURATION SECTION --- # # --- Supporting VPATH --- top_srcdir = ./.. srcdir = . VPATH = . # --- Names of system commands --- # (Used in the Makefile and possibly internally to FWEB.) MAKE = make MV = mv RM = rm TOUCH = touch # --- COMPILING --- # --- Compiler name --- CC = cc # An FWEB flag, either CC or GCC. This flag isn't used for bootstrapping; it # is required for properly regenerating custom.h by tangling custom.web. If # you're on the Sun and working with gcc, say ``COMPILER = GCC''. COMPILER = CC # --- Compiler options --- # Debugging and optimization options for the C compiler. CFLAGS = # How to run the C preprocessor CPP = # Header file search directory (-Idir) and any other miscellaneous options # for the C preprocessor and compiler. CPPFLAGS = # (Compiler macro definitions. In addition, see the discussion of PARTn # below.) DEFS = # --- The actual compile command used by the Makefile. --- COMPILE = $(CC) -c $(CFLAGS) $(CPPFLAGS) $(DEFS) -Dconst= # --- LINKING --- # --- Extensions for object files --- # $(O) is used for targets in the Makefile. $(OBJ) is the suffix used in # the link line. (Sometimes $(OBJ) can be null if the compiler understands # defaults and the length of the command line is an issue, as it is on some # personal computers.) O = o OBJ = .$(O) # TERMCAP0 is either a file name, or null. If the termcap library is # available, TERMCAP0 should be null and LIBS should include -ltermcap. # If the termcap library is not available, TERMCAP0 should be termcap0.$(O). TERMCAP0 = # --- Linker options --- # Stripping (-s) and other miscellaneous options for the linker. LDFLAGS = -g # Library options -l and -L to pass to the linker. LIBS = -lm # --- The actual link command used by the Makefile. --- # TRY NOT TO CHANGE THIS LINE. LINK = $(CC) $(LDFLAGS) -o $(@) # --- MISCELLANEOUS --- # --- How to print a dvi file --- ECHO = echo # Use this to prevent actual printing. PRINT_DVI = $(ECHO) lpr -d # --- FWEB flags indicating type of machine on which you're tangling # (HOME_MACHINE) and for which machine you're generating C code. --- HOME_MACHINE = MISC MACHINE = MISC # --- FWEB file suffixes --- # (For IBM-PC, shorten to ``hwe'') HWEB = hweb # --- Splitting FTANGLE & FWEAVE into several parts, especially for small # compilers on personal computers. Here's an example for the IBM-PC, # Microsoft compiler --- # --------------------------------------------------------------------------- #PART1 = /Dpart=1 #PART2 = /Dpart=2 #PART3 = /Dpart=3 #FTANGLE2 = ftangle2.$(O) #FTANGLE3 = ftangle3.$(O) #FWEAVE2 = fweave2.$(O) #FWEAVE3 = fweave3.$(O) #PROD2 = prod2.$(O) #RATFOR2 = ratfor2.$(O) #RESERVED2 = reservd2.$(O) #COMMON2 = common2.$(O) # --------------------------------------------------------------------------- # The PARTn macros are compiler options that define the macro |part| #to be n, for example ``-Dpart=2'' PART1 = PART2 = PART3 = # Here are the names of the second and third parts of the object files. FTANGLE2 = FTANGLE3 = FWEAVE2 = FWEAVE3 = PROD2 = RATFOR2 = RESERVED2 = COMMON2 = # --- INSTALLATION INFORMATION --- INSTALL = /bin/install -c INSTALL_PROGRAM = $(INSTALL) INSTALL_DATA = $(INSTALL) -m 644 # Top-level path for executable binaries (usually /usr/local): exec_prefix = /usr/local # Where the processors go: bindir = $(exec_prefix)/bin # Top-level path for everything else (usually /usr/local) prefix = /usr/local doc_prefix = $(prefix) # Where the Unix man pages go: manext = 1 mandir = $(doc_prefix)/man/man$(manext) # Where the emacs info* files go: infodir = $(doc_prefix)/info # Where the source file fweb.texinfo goes: texinfodir = $(infodir) # Where the fwebmac.sty macro package used by FWEAVE goes, as well as the # file fweb.tex needed for weaving the FWEB source code, go: texdir = $(prefix)/lib/tex/inputs # --- END of SYSTEM CONFIGURATION SECTION --- fweb-1.62/Boot/ibm/ 40755 10061 1115 0 6602703177 13101 5ustar krommesusersfweb-1.62/Boot/ibm/mvs/ 40755 10061 1115 0 6602703172 13701 5ustar krommesusersfweb-1.62/Boot/ibm/mvs/custom.h100644 10061 1115 34044 6602703161 15504 0ustar krommesusers#if(0) FTANGLE v1.60, created with UNIX on "Thursday, September 24, 1998 at 16:12." COMMAND LINE: "./ftangle ./custom -uSUN -mMVS -mCC -= /u/krommes/Fweb/1.62/Boot/ibm/mvs/custom.h -# -v" RUN TIME: "Friday, September 25, 1998 at 8:02." WEB FILE: "./custom.web" CHANGE FILE: (none) #endif /* --- BOOTSTRAPPING --- */ /* To bootstrap yourself onto a new system, you should modify this file \ appropriately. In most cases, you set a flag by saying ``#define \ FLAG''---i.e., you make a null definition. Don't set these flags to~0 \ or~1. However, in a few cases the macros are not flags and must be given \ the appropriate definition. */ /* --- MACHINE COMPILER FLAG --- */ /* This must be in lower case. Presently these are drawn from the list \ {ansi, bsd, dsu, ibmpc, mac, misc, mvs, sgi, sun, vax}. These \ flags may be used in #define statements within the source code to tailor \ things to a particular compiler or operating system. If you use \ ./configure to generate custom.h, there will be no definition following \ this comment. */ #ifndef mvs #define mvs #endif /* |mvs| */ /* --- FWEB SYSTEM NAME --- */ /* This is a string such as ``IBM-PC/DOS'' or ``VAX/VMS''. It is printed \ when FWEB starts up. */ #define THE_SYSTEM "IBM/MVS" /* --- An optional local banner, printed after the system name above. --- */ #define LOCAL_BANNER "" /* Does your compiler understand the ANSI preprocessor command \#error? \ If it does, define |HAVE_ERROR|. (I haven't figured out a general \ autoconf test yet; it seems to be impossible in principle.) */ #define HAVE_ERROR 1 /* The C preprocessor is run by the \.{-H} option. */ #define RUN_CPP "gcc -E" /* Occasionally a system command is issued to rename a file. Here's how to \ do that. */ #define MV "mv" /* Do we bother with translations to the internal |ASCII| representation? \ If so, define |TRANSLATE_ASCII|. Don't bother on |ASCII| machines. */ #define TRANSLATE_ASCII 1 /* For \It{debugging} of target machines whose character set differs from \ the one on which you're working, define |DEBUG_XCHR|. \It{Usually, this \ flag should not be defined.} When it is defined, the |TRANSLATE_ASCII| \ flag is automatically turned on, and the value of the style-file field \ `xchr' is relevant. \It{Don't use this flag unless you're a system \ developer!!!} */ #define DEBUG_XCHR 0 /* Does the operating system have a Unix-like path? \ That is, does it have the form ``/u/krommes'' rather than the VMS form \ ``ux3:[krommes]''? If so, define |UNIX_PATH|. */ #define UNIX_PATH 1 /* If the |getenv| call to obtain an environment variable is supported \ (it usually is) define |HAVE_GETENV|. */ #define HAVE_GETENV 0 /* --- FILE NAMES and EXTENSIONS --- */ /* Name of the null file. This macro merely defines the default value of \ the style-file parameter `null_file', so it's not essential to add any more \ machines here. */ #define NULL_FILE_NAME "'NULLFILE'" /* Name of \FWEB's initialization file. Please see below, after the \ definition of |SMALL_MEMORY|. */ /* Name of \FWEB's default style file. \It{Please don't change this unless \ you absolutely have to! Use the `-z' option instead.} */ #define STYLE_FILE_NAME "fweb.sty" /* Here are the default file extensions for each language. These merely \ set default style-file parameters, so it's not essential that you change \ anything here. See the parameters `suffix.C', `suffix.N', etc. */ #define C_EXT "c" #define V_EXT "mk" #define X_EXT "sty" /* Non-unix. */ #define Cpp_EXT "C" #define R_EXT "rat" #define R90_EXT "rat90" #define N_EXT "for" #define N90_EXT "for90" #define HAVE_TMPNAM 1 #define HAVE_TEMPNAM 0 /* The |FANCY_SPLIT| flag is used for buffering the output lines of C~code. \ Define this if the C~compiler CAN'T continue an incomplete line with a \ backslash. (ANSI compilers should be able to.) \ {\bf (This code may not be fully debugged yet!)} */ #define FANCY_SPLIT 0 /* --- INCLUDING FILES --- */ /* The code is written in C, and various header files of the form \ ``<*.h>'' are included near the beginning of each source file. The \ names of these files are standardized by ANSI. Unfortunately, not everyone \ has gotten around to ANSI yet. Therefore, here we include important files \ whose names may be nonstandard or whose functions may fluctuate. */ /* Does the ANSI exist? If so, say so here. This is supposed \ to contain prototypes for the following functions used by \FWEB: |abort|, \ |abs|, |atof|, |atoi|, |atol|, |calloc|, |exit|, |free|, |getenv|, \ |realloc|, |strtod|, |strtol|. If it doesn't, either find the prototypes \ in another file and include it here, or actually give the prototypes here. */ #define HAVE_STDLIB_H 1 #define HAVE_STDARG_H 1 /* Does the ANSI exist? If so, include it here. This is \ supposed to define the |NULL| pointer, and the type |size_t|. Sometimes \ these are defined in other places as well. */ #define HAVE_STDDEF_H 1 /* Other stuff handled by autoconf. */ #define HAVE_STRING_H 1 #define HAVE_MEMORY_H 0 #define HAVE_FLOAT_H 1 /* Does (non-ANSI) exist? You may find some useful stuff in \ here. But don't use it unless you have to. */ /* _P include */ /* Must we include an extra file for memory management? E.g., for \ Microsoft, ; for Borland; . Not necessary for ANSI; \ it's in . */ /* _P include */ /* Numerical limits. We use the following ANSI macros: |INT_MAX|, \ |INT_MIN|, |LONG_MAX|, |LONG_MIN|, and |ULONG_MAX|, which are found in \ . If you can't find those macros, define the flag \ |HAVE_VALUES_H|, and possibly include another file with different names for \ the limits, such as on the Sun. The flag |HAVE_VALUES_H| \ assumes that the macros |MAXINT| and |MAXLONG| are defined. If they are \ not, you must define them here. */ #define HAVE_LIMITS_H 1 #define HAVE_VALUES_H 0 /* Please note that additional files are included automatically \ (essentially immediately after this file is read; see ). \ These were considered to be standard, but that might be a mistake. Those \ files are: , , , , . \ Remember that by convention these files should limit themselves to being \ included only once. Therefore, if for some reason you need to include one \ of these somewhere in this file, you should be able to do it without \ difficulty; the later automatic include just won't be done if those files \ are following standard protocol. */ #define ANSI_CTYPE_H 0 /* --- VARIABLE-LENGTH ARGUMENT LISTS --- */ /* For convenience, FWEB attempts to use functions with variable numbers of \ arguments. We attempt to support two conventions: ANSI, and Sun's. If \ this feature is supported, define the flag |VARIABLE_ARGUMENTS|, say \ whether |va_start| has one or two arguments, and include the associated \ header file ( for ANSI). */ /* Does the compiler allow ANSI-style variable arguments? */ #define VARIABLE_ARGUMENTS 1 /* Is |va_start| defined with one argument (Sun's convention) or two \ (ANSI)? */ #define NUM_VA_ARGS 2 #define HAVE_STDARG_H 1 /* --- ADDITIONAL PROTOTYPES --- */ /* You may wish to collect any additional prototypes that are required and \ put them into your own header file that you include here. */ /* If the flag |HAVE_STD_PROTOTYPES| is false, it causes the file \ "stdlib0.h" to be loaded. This contains ANSI prototypes that for some \ reason aren't provided with the gcc environment on the Sun. */ #define HAVE_STD_PROTOTYPES 1 /* Define the flag |OLD_PROTOTYPES| for compilers that don't support the \ new (ANSI) style of function declaration and prototyping. The new style is \ |fcn(int i,char *s){}|; the old style is |fcn(i,s) int i; char *s; {}|. */ #define OLD_PROTOTYPES 0 /* ANSI also introduces the type |void|. If your compiler doesn't \ understand the constructions |void *| and |void fcn()|, define |NO_VOID|. */ #define NO_VOID 0 /* --- SPECIAL TYPES --- */ /* |const| seems to be an annoyance; not all compilers treat it the same \ way. We really only want it for debugging, anyway, so we mostly just \ remove it. It's kept when compiling on the Sun with gcc, because it \ gives the developer more checks on the code. If you want to keep it, \ define |KEEP_CONST|. */ #define KEEP_CONST 0 /* For personal computers, the kind of pointer is an issue. They must be \ |huge|. If your compiler understands |huge|, define |HUGE_POINTERS|. */ #define HUGE_POINTERS 0 /* --- SPECIAL FUNCTIONS --- */ /* The ANSI |sprintf| function returns the number of characters written. \ If this is the case on your system, define |ANSI_SPRINTF|. (It's always \ safe to not define it.) */ #define ANSI_SPRINTF 1 /* The ANSI |sscanf| does some cute things with scansets, but it doesn't \ always work. */ #define ANSI_SSCANF 0 /* The ANSI |system| function is supposed to take |NULL| as an argument, \ which means check if a command processor exists. If this works properly, \ defined |ANSI_SYSTEM|. (It doesn't work on the Sun.) */ #define ANSI_SYSTEM 0 /* --- ANNOYING WARNINGS --- */ /* Sometimes the compiler can't understand that the \ control flow can never get to the bottom of a function. To avoid warning \ complaints, we have the following: */ #define DUMMY_RETURN(value) return value /* --- UNUSUAL NAMES --- */ /* Put here any definitions that override standard names. For example, for \ some ancient on the MAC one had to say ``#define getc agetc''. */ /* Nothing to be done. */ /* --- DIRECTORY SPECIFICATIONS --- */ /* Directory specifications are delimited in different ways under the various \ operating systems. Unix: '/'; IBM-PC: '\\'; VAX/VMS: ']'. */ #define PREFIX_END_CHAR '/' /* The Unix convention. */ /* --- TIMING --- */ /* First of all, we have a flag to say whether timing information is \ printed at the end of the run. (If you can't figure out the timing \ routines for your machine or don't want a timing information line at the \ end of your terminal output, don't define this.) Beginning with fweb-1.53, \ timing is turned off by default. */ #define TIMING 0 /* --- Number of decimal places for timing information in seconds. (Use \ at least 2 for supercomputers.) --- */ #define TIMING_WIDTH 1 /* There's supposed to be a function |clock()| that returns the cpu time, \ in units of |CLOCKS_PER_SEC|. The type of |clock| is |clock_t|. If that \ is defined, define the flag |CLOCK_T_DEFINED|; otherwise, say |typedef ... \ clock_t| here. */ #define CLOCK_T_DEFINED 1 /* Some systems don't define |CLOCKS_PER_SEC|. If not, we try |CLK_TCK|. \ If that's not defined, it defaults to 1000000. If that's not appropriate, \ define |CLOCKS_PER_SEC| here. */ /* \ #define CLOCKS_PER_SEC 1000000 \ */ /* Are there system routines that return wall-clock time in sub-second units? \ First, look for |gettimeofday| ($\mu$sec timing). */ #define HAVE_GETTIMEOFDAY 0 /* Otherwise, does the file sys/timeb.h exist that along with |ftime| gives \ millisecond timing for wall-clock time? We check for the header file, not \ |ftime| itself, since |ftime| may be in a Berkeley compatibility library, \ not in libc. */ #define HAVE_SYS_TIMEB_H 0 /* Do we use our own version of |difftime()|, which computes the difference \ of two wall clock times? If so, define |NEW_DIFFTIME|. This flag should \ always be defined if |HAVE_SYS_TIMEB_H| is defined above. */ #define NEW_DIFFTIME 0 /* --- MAKING IT FIT --- */ /* Sometimes the compiler can't handle functions or switches that are too \ large. In that case, define |FCN_CALLS|. That converts certain in-line \ code (such as in the syntax production analyzer) into function calls (at \ the price of slowing things down a bit). */ #define FCN_CALLS 0 /* The personal computers are starved for memory. For those machines, we \ specify smaller default values for the lengths of dynamic arrays; define \ |SMALL_MEMORY|. (You can always use the `-y' option to override these \ defaults.) */ #define SMALL_MEMORY 0 /* Name of \FWEB's default initialization file. Please don't change these \ conventions unless you absolutely have to!!! Also, note that these \ definitions are overridden by the environment variable |FWEB_INI|, if it is \ defined. */ #ifndef SMALL_MEMORY #define SMALL_MEMORY 0 #endif #if SMALL_MEMORY #define FWEB_INI "fweb.ini" #else #define FWEB_INI ".fweb" #endif /* --- MEMORY ALLOCATIONS --- */ /* The ANSI |calloc| routine takes two arguments: |void \ *calloc(size_t,size_t)|. If the system doesn't have a standard |calloc| \ routine, or if the name isn't standard, you must define an UPPERCASE macro \ that does the same thing. (The name isn't standard on personal computers \ because one is dealing with |huge| allocations.) If you define \ |NON_ANSI_CALLOC|, you must define |CALLOC|, |REALLOC|, and |FREE|. E.g., the \ relevant definitions for Borland are \ \begintt \ #define CALLOC farcalloc \ #define REALLOC(oldblock,nbytes) \ \ farrealloc((void far *)(oldblock),(unsigned long)(nbytes)) \ #define FREE(block) farfree((void far *)(block)) \ \endtt \ */ #define NON_ANSI_CALLOC 0 /* |IBMPC| */ /* Do we supply below a routine that obtains the available memory, such \ as Borland's farcoreleft()? */ #define PRINT_AVAILABLE_MEMORY 0 /* The function call that obtains the memory is called |CORE_LEFT|. This \ function is assumed to return an |unsigned long int|. For Microsoft, we had \ to write our own routine |_hmemavl|; see below. For Borland, the routine \ should be called |farcoreleft|. For the other machines, we don't have \ anything as yet. */ /* The following flag is defined only by \common.web}. */ #ifdef COMMON_FCNS_ #if(part==0 || part==1) /* Give here the C code for any additional functions that are \ compiler-specific or missing from your implementation, such as maybe \ |strtod|. Note that these are bracketed with the flag COMMON_FCNS_ so they \ are compiled into just one module, namely common.c. You must \ always supply some version of the debugging routine |trap|, which must \ return~0 as a minimum. */ /* The default |trap| function for debugging. */ int trap(void) {return 0;} #endif /* |part == 1| */ #endif /* |COMMON_FCNS_| */ fweb-1.62/Boot/ibm/mvs/READ_ME.MVS100644 10061 1115 632 6602703172 15442 0ustar krommesusers --- BOOTSTRAPPING FWEB with MVS --- Version 1.30 May 15, 1993 This directory is intended to handle non-ASCII machines, specifically IBM EBCDIC machines. The bootstrap has been tested so far only with the MVS operating system. You may have to make some changes in custom.h for your system. If you do so, please let me know. Version 1.30 hasn't yet been test for MVS. Sorry.fweb-1.62/Boot/ibm/mvs/defaults.mk100644 10061 1115 7661 6602703172 16150 0ustar krommesusers# Generated automatically from defaults.mk.in and mvs.ini by FWEB_configure. # --- START of SYSTEM CONFIGURATION SECTION --- # # --- Supporting VPATH --- top_srcdir = ./.. srcdir = . VPATH = . # --- Names of system commands --- # (Used in the Makefile and possibly internally to FWEB.) MAKE = make MV = mv RM = rm TOUCH = touch # --- COMPILING --- # --- Compiler name --- CC = cc # An FWEB flag, either CC or GCC. This flag isn't used for bootstrapping; it # is required for properly regenerating custom.h by tangling custom.web. If # you're on the Sun and working with gcc, say ``COMPILER = GCC''. COMPILER = CC # --- Compiler options --- # Debugging and optimization options for the C compiler. CFLAGS = # How to run the C preprocessor CPP = # Header file search directory (-Idir) and any other miscellaneous options # for the C preprocessor and compiler. CPPFLAGS = # (Compiler macro definitions. In addition, see the discussion of PARTn # below.) DEFS = # --- The actual compile command used by the Makefile. --- COMPILE = $(CC) -c $(CFLAGS) $(CPPFLAGS) $(DEFS) -Dconst= # --- LINKING --- # --- Extensions for object files --- # $(O) is used for targets in the Makefile. $(OBJ) is the suffix used in # the link line. (Sometimes $(OBJ) can be null if the compiler understands # defaults and the length of the command line is an issue, as it is on some # personal computers.) O = o OBJ = .$(O) # TERMCAP0 is either a file name, or null. If the termcap library is # available, TERMCAP0 should be null and LIBS should include -ltermcap. # If the termcap library is not available, TERMCAP0 should be termcap0.$(O). TERMCAP0 = # --- Linker options --- # Stripping (-s) and other miscellaneous options for the linker. LDFLAGS = -g # Library options -l and -L to pass to the linker. LIBS = -lm # --- The actual link command used by the Makefile. --- # TRY NOT TO CHANGE THIS LINE. LINK = $(CC) $(LDFLAGS) -o $(@) # --- MISCELLANEOUS --- # --- How to print a dvi file --- ECHO = echo # Use this to prevent actual printing. PRINT_DVI = $(ECHO) lpr -d # --- FWEB flags indicating type of machine on which you're tangling # (HOME_MACHINE) and for which machine you're generating C code. --- HOME_MACHINE = MVS MACHINE = MVS # --- FWEB file suffixes --- # (For IBM-PC, shorten to ``hwe'') HWEB = hweb # --- Splitting FTANGLE & FWEAVE into several parts, especially for small # compilers on personal computers. Here's an example for the IBM-PC, # Microsoft compiler --- # --------------------------------------------------------------------------- #PART1 = /Dpart=1 #PART2 = /Dpart=2 #PART3 = /Dpart=3 #FTANGLE2 = ftangle2.$(O) #FTANGLE3 = ftangle3.$(O) #FWEAVE2 = fweave2.$(O) #FWEAVE3 = fweave3.$(O) #PROD2 = prod2.$(O) #RATFOR2 = ratfor2.$(O) #RESERVED2 = reservd2.$(O) #COMMON2 = common2.$(O) # --------------------------------------------------------------------------- # The PARTn macros are compiler options that define the macro |part| #to be n, for example ``-Dpart=2'' PART1 = PART2 = PART3 = # Here are the names of the second and third parts of the object files. FTANGLE2 = FTANGLE3 = FWEAVE2 = FWEAVE3 = PROD2 = RATFOR2 = RESERVED2 = COMMON2 = # --- INSTALLATION INFORMATION --- INSTALL = /bin/install -c INSTALL_PROGRAM = $(INSTALL) INSTALL_DATA = $(INSTALL) -m 644 # Top-level path for executable binaries (usually /usr/local): exec_prefix = /usr/local # Where the processors go: bindir = $(exec_prefix)/bin # Top-level path for everything else (usually /usr/local) prefix = /usr/local doc_prefix = $(prefix) # Where the Unix man pages go: manext = 1 mandir = $(doc_prefix)/man/man$(manext) # Where the emacs info* files go: infodir = $(doc_prefix)/info # Where the source file fweb.texinfo goes: texinfodir = $(infodir) # Where the fwebmac.sty macro package used by FWEAVE goes, as well as the # file fweb.tex needed for weaving the FWEB source code, go: texdir = $(prefix)/lib/tex/inputs # --- END of SYSTEM CONFIGURATION SECTION --- fweb-1.62/Boot/ibm/pc/ 40755 10061 1115 0 6602703176 13502 5ustar krommesusersfweb-1.62/Boot/ibm/pc/microsoft/ 40755 10061 1115 0 6602703173 15504 5ustar krommesusersfweb-1.62/Boot/ibm/pc/microsoft/custom.h100644 10061 1115 35434 6602703162 17313 0ustar krommesusers#if(0) FTANGLE v1.60, created with UNIX on "Thursday, September 24, 1998 at 16:12." COMMAND LINE: "./ftangle ./custom -uSUN -mIBMPC -mCC -= /u/krommes/Fweb/1.62/Boot/ibm/pc/microsoft/custom.h -# -v" RUN TIME: "Friday, September 25, 1998 at 8:02." WEB FILE: "./custom.web" CHANGE FILE: (none) #endif /* --- BOOTSTRAPPING --- */ /* To bootstrap yourself onto a new system, you should modify this file \ appropriately. In most cases, you set a flag by saying ``#define \ FLAG''---i.e., you make a null definition. Don't set these flags to~0 \ or~1. However, in a few cases the macros are not flags and must be given \ the appropriate definition. */ /* --- MACHINE COMPILER FLAG --- */ /* This must be in lower case. Presently these are drawn from the list \ {ansi, bsd, dsu, ibmpc, mac, misc, mvs, sgi, sun, vax}. These \ flags may be used in #define statements within the source code to tailor \ things to a particular compiler or operating system. If you use \ ./configure to generate custom.h, there will be no definition following \ this comment. */ #ifndef ibmpc #define ibmpc #endif /* |ibmpc| */ /* --- FWEB SYSTEM NAME --- */ /* This is a string such as ``IBM-PC/DOS'' or ``VAX/VMS''. It is printed \ when FWEB starts up. */ #define THE_SYSTEM "IBM-PC/MSDOS" /* --- An optional local banner, printed after the system name above. --- */ #define LOCAL_BANNER "" /* Does your compiler understand the ANSI preprocessor command \#error? \ If it does, define |HAVE_ERROR|. (I haven't figured out a general \ autoconf test yet; it seems to be impossible in principle.) */ #define HAVE_ERROR 1 /* The C preprocessor is run by the \.{-H} option. */ #define RUN_CPP "gcc -E" /* Occasionally a system command is issued to rename a file. Here's how to \ do that. */ #define MV "rename" /* Do we bother with translations to the internal |ASCII| representation? \ If so, define |TRANSLATE_ASCII|. Don't bother on |ASCII| machines. */ #define TRANSLATE_ASCII 0 /* For \It{debugging} of target machines whose character set differs from \ the one on which you're working, define |DEBUG_XCHR|. \It{Usually, this \ flag should not be defined.} When it is defined, the |TRANSLATE_ASCII| \ flag is automatically turned on, and the value of the style-file field \ `xchr' is relevant. \It{Don't use this flag unless you're a system \ developer!!!} */ #define DEBUG_XCHR 0 /* Does the operating system have a Unix-like path? \ That is, does it have the form ``/u/krommes'' rather than the VMS form \ ``ux3:[krommes]''? If so, define |UNIX_PATH|. */ #define UNIX_PATH 1 /* If the |getenv| call to obtain an environment variable is supported \ (it usually is) define |HAVE_GETENV|. */ #define HAVE_GETENV 1 /* --- FILE NAMES and EXTENSIONS --- */ /* Name of the null file. This macro merely defines the default value of \ the style-file parameter `null_file', so it's not essential to add any more \ machines here. */ #define NULL_FILE_NAME "nul" /* Name of \FWEB's initialization file. Please see below, after the \ definition of |SMALL_MEMORY|. */ /* Name of \FWEB's default style file. \It{Please don't change this unless \ you absolutely have to! Use the `-z' option instead.} */ #define STYLE_FILE_NAME "fweb.sty" /* Here are the default file extensions for each language. These merely \ set default style-file parameters, so it's not essential that you change \ anything here. See the parameters `suffix.C', `suffix.N', etc. */ #define C_EXT "c" #define V_EXT "mk" #define X_EXT "sty" /* Non-unix. */ #define Cpp_EXT "C" #define R_EXT "rat" #define R90_EXT "rat90" #define N_EXT "for" #define N90_EXT "for90" #define HAVE_TMPNAM 1 #define HAVE_TEMPNAM 0 /* The |FANCY_SPLIT| flag is used for buffering the output lines of C~code. \ Define this if the C~compiler CAN'T continue an incomplete line with a \ backslash. (ANSI compilers should be able to.) \ {\bf (This code may not be fully debugged yet!)} */ #define FANCY_SPLIT 0 /* --- INCLUDING FILES --- */ /* The code is written in C, and various header files of the form \ ``<*.h>'' are included near the beginning of each source file. The \ names of these files are standardized by ANSI. Unfortunately, not everyone \ has gotten around to ANSI yet. Therefore, here we include important files \ whose names may be nonstandard or whose functions may fluctuate. */ /* Does the ANSI exist? If so, say so here. This is supposed \ to contain prototypes for the following functions used by \FWEB: |abort|, \ |abs|, |atof|, |atoi|, |atol|, |calloc|, |exit|, |free|, |getenv|, \ |realloc|, |strtod|, |strtol|. If it doesn't, either find the prototypes \ in another file and include it here, or actually give the prototypes here. */ #define HAVE_STDLIB_H 1 #define HAVE_STDARG_H 1 /* Does the ANSI exist? If so, include it here. This is \ supposed to define the |NULL| pointer, and the type |size_t|. Sometimes \ these are defined in other places as well. */ #define HAVE_STDDEF_H 1 /* Other stuff handled by autoconf. */ #define HAVE_STRING_H 1 #define HAVE_MEMORY_H 0 #define HAVE_FLOAT_H 1 /* Does (non-ANSI) exist? You may find some useful stuff in \ here. But don't use it unless you have to. */ /* _P include */ /* Must we include an extra file for memory management? E.g., for \ Microsoft, ; for Borland; . Not necessary for ANSI; \ it's in . */ _P include /* Numerical limits. We use the following ANSI macros: |INT_MAX|, \ |INT_MIN|, |LONG_MAX|, |LONG_MIN|, and |ULONG_MAX|, which are found in \ . If you can't find those macros, define the flag \ |HAVE_VALUES_H|, and possibly include another file with different names for \ the limits, such as on the Sun. The flag |HAVE_VALUES_H| \ assumes that the macros |MAXINT| and |MAXLONG| are defined. If they are \ not, you must define them here. */ #define HAVE_LIMITS_H 1 #define HAVE_VALUES_H 0 /* Please note that additional files are included automatically \ (essentially immediately after this file is read; see ). \ These were considered to be standard, but that might be a mistake. Those \ files are: , , , , . \ Remember that by convention these files should limit themselves to being \ included only once. Therefore, if for some reason you need to include one \ of these somewhere in this file, you should be able to do it without \ difficulty; the later automatic include just won't be done if those files \ are following standard protocol. */ #define ANSI_CTYPE_H 1 /* --- VARIABLE-LENGTH ARGUMENT LISTS --- */ /* For convenience, FWEB attempts to use functions with variable numbers of \ arguments. We attempt to support two conventions: ANSI, and Sun's. If \ this feature is supported, define the flag |VARIABLE_ARGUMENTS|, say \ whether |va_start| has one or two arguments, and include the associated \ header file ( for ANSI). */ /* Does the compiler allow ANSI-style variable arguments? */ #define VARIABLE_ARGUMENTS 1 /* Is |va_start| defined with one argument (Sun's convention) or two \ (ANSI)? */ #define NUM_VA_ARGS 2 #define HAVE_STDARG_H 1 /* --- ADDITIONAL PROTOTYPES --- */ /* You may wish to collect any additional prototypes that are required and \ put them into your own header file that you include here. */ /* If the flag |HAVE_STD_PROTOTYPES| is false, it causes the file \ "stdlib0.h" to be loaded. This contains ANSI prototypes that for some \ reason aren't provided with the gcc environment on the Sun. */ #define HAVE_STD_PROTOTYPES 1 /* Define the flag |OLD_PROTOTYPES| for compilers that don't support the \ new (ANSI) style of function declaration and prototyping. The new style is \ |fcn(int i,char *s){}|; the old style is |fcn(i,s) int i; char *s; {}|. */ #define OLD_PROTOTYPES 0 /* ANSI also introduces the type |void|. If your compiler doesn't \ understand the constructions |void *| and |void fcn()|, define |NO_VOID|. */ #define NO_VOID 0 /* --- SPECIAL TYPES --- */ /* |const| seems to be an annoyance; not all compilers treat it the same \ way. We really only want it for debugging, anyway, so we mostly just \ remove it. It's kept when compiling on the Sun with gcc, because it \ gives the developer more checks on the code. If you want to keep it, \ define |KEEP_CONST|. */ #define KEEP_CONST 0 /* For personal computers, the kind of pointer is an issue. They must be \ |huge|. If your compiler understands |huge|, define |HUGE_POINTERS|. */ #define HUGE_POINTERS 1 /* --- SPECIAL FUNCTIONS --- */ /* The ANSI |sprintf| function returns the number of characters written. \ If this is the case on your system, define |ANSI_SPRINTF|. (It's always \ safe to not define it.) */ #define ANSI_SPRINTF 1 /* The ANSI |sscanf| does some cute things with scansets, but it doesn't \ always work. */ #define ANSI_SSCANF 1 /* The ANSI |system| function is supposed to take |NULL| as an argument, \ which means check if a command processor exists. If this works properly, \ defined |ANSI_SYSTEM|. (It doesn't work on the Sun.) */ #define ANSI_SYSTEM 1 /* --- ANNOYING WARNINGS --- */ /* Sometimes the compiler can't understand that the \ control flow can never get to the bottom of a function. To avoid warning \ complaints, we have the following: */ #define DUMMY_RETURN(value) return value /* --- UNUSUAL NAMES --- */ /* Put here any definitions that override standard names. For example, for \ some ancient on the MAC one had to say ``#define getc agetc''. */ /* Nothing to be done. */ /* --- DIRECTORY SPECIFICATIONS --- */ /* Directory specifications are delimited in different ways under the various \ operating systems. Unix: '/'; IBM-PC: '\\'; VAX/VMS: ']'. */ #define PREFIX_END_CHAR '\\' /* IBM is perverse. */ /* --- TIMING --- */ /* First of all, we have a flag to say whether timing information is \ printed at the end of the run. (If you can't figure out the timing \ routines for your machine or don't want a timing information line at the \ end of your terminal output, don't define this.) Beginning with fweb-1.53, \ timing is turned off by default. */ #define TIMING 0 /* --- Number of decimal places for timing information in seconds. (Use \ at least 2 for supercomputers.) --- */ #define TIMING_WIDTH 1 /* There's supposed to be a function |clock()| that returns the cpu time, \ in units of |CLOCKS_PER_SEC|. The type of |clock| is |clock_t|. If that \ is defined, define the flag |CLOCK_T_DEFINED|; otherwise, say |typedef ... \ clock_t| here. */ #define CLOCK_T_DEFINED 1 /* Some systems don't define |CLOCKS_PER_SEC|. If not, we try |CLK_TCK|. \ If that's not defined, it defaults to 1000000. If that's not appropriate, \ define |CLOCKS_PER_SEC| here. */ /* \ #define CLOCKS_PER_SEC 1000000 \ */ /* Are there system routines that return wall-clock time in sub-second units? \ First, look for |gettimeofday| ($\mu$sec timing). */ #define HAVE_GETTIMEOFDAY 0 /* Otherwise, does the file sys/timeb.h exist that along with |ftime| gives \ millisecond timing for wall-clock time? We check for the header file, not \ |ftime| itself, since |ftime| may be in a Berkeley compatibility library, \ not in libc. */ #define HAVE_SYS_TIMEB_H 1 /* Do we use our own version of |difftime()|, which computes the difference \ of two wall clock times? If so, define |NEW_DIFFTIME|. This flag should \ always be defined if |HAVE_SYS_TIMEB_H| is defined above. */ #define NEW_DIFFTIME 1 /* --- MAKING IT FIT --- */ /* Sometimes the compiler can't handle functions or switches that are too \ large. In that case, define |FCN_CALLS|. That converts certain in-line \ code (such as in the syntax production analyzer) into function calls (at \ the price of slowing things down a bit). */ #define FCN_CALLS 1 /* The personal computers are starved for memory. For those machines, we \ specify smaller default values for the lengths of dynamic arrays; define \ |SMALL_MEMORY|. (You can always use the `-y' option to override these \ defaults.) */ #define SMALL_MEMORY 1 /* Name of \FWEB's default initialization file. Please don't change these \ conventions unless you absolutely have to!!! Also, note that these \ definitions are overridden by the environment variable |FWEB_INI|, if it is \ defined. */ #ifndef SMALL_MEMORY #define SMALL_MEMORY 0 #endif #if SMALL_MEMORY #define FWEB_INI "fweb.ini" #else #define FWEB_INI ".fweb" #endif /* --- MEMORY ALLOCATIONS --- */ /* The ANSI |calloc| routine takes two arguments: |void \ *calloc(size_t,size_t)|. If the system doesn't have a standard |calloc| \ routine, or if the name isn't standard, you must define an UPPERCASE macro \ that does the same thing. (The name isn't standard on personal computers \ because one is dealing with |huge| allocations.) If you define \ |NON_ANSI_CALLOC|, you must define |CALLOC|, |REALLOC|, and |FREE|. E.g., the \ relevant definitions for Borland are \ \begintt \ #define CALLOC farcalloc \ #define REALLOC(oldblock,nbytes) \ \ farrealloc((void far *)(oldblock),(unsigned long)(nbytes)) \ #define FREE(block) farfree((void far *)(block)) \ \endtt \ */ #define NON_ANSI_CALLOC 1 /* |IBMPC| */ #define CALLOC halloc #define REALLOC hrealloc #define FREE hfree /* Do we supply below a routine that obtains the available memory, such \ as Borland's farcoreleft()? */ #define PRINT_AVAILABLE_MEMORY 1 /* The function call that obtains the memory is called |CORE_LEFT|. This \ function is assumed to return an |unsigned long int|. For Microsoft, we had \ to write our own routine |_hmemavl|; see below. For Borland, the routine \ should be called |farcoreleft|. For the other machines, we don't have \ anything as yet. */ #define CORE_LEFT _hmemavl() /* The following flag is defined only by \common.web}. */ #ifdef COMMON_FCNS_ #if(part==0 || part==1) /* Give here the C code for any additional functions that are \ compiler-specific or missing from your implementation, such as maybe \ |strtod|. Note that these are bracketed with the flag COMMON_FCNS_ so they \ are compiled into just one module, namely common.c. You must \ always supply some version of the debugging routine |trap|, which must \ return~0 as a minimum. */ /* For Microsoft, we must write our own routine to find out about memory, \ since no heap management is done for the huge model. */ #ifdef mcc /* This flag is defined by the Microsoft compiler. */ #include #define DOS_GET_MEM 0x48 unsigned long _hmemavl(void) { union REGS inregs,outregs; inregs.h.ah= DOS_GET_MEM; inregs.x.bx= 0xFFFF;/* Force the request to fail by giving a number \ that's too big. */ intdos(&inregs,&outregs);/* Make DOS system call. */ /* When the allocation fails, \.{BX} will return the size of the largest \ block of memory available in paragraphs. */ return 16*(unsigned long)outregs.x.bx; } #endif /* mcc */ /* The default |trap| function for debugging. */ int trap(void) {return 0;} #endif /* |part == 1| */ #endif /* |COMMON_FCNS_| */ fweb-1.62/Boot/ibm/pc/microsoft/READ_ME.MCC100644 10061 1115 21272 6602703173 17245 0ustar krommesusers --- COMPILING WITH THE MICROSOFT C COMPILER --- It is not profitable to compile FWEB with any compiler that puts it into low memory; it's too big. See the alternative in ../gnu. The following discussion, circa 1993, is included for historical interest. * HISTORICAL REMARKS ON BOOTSTRAPPING NOTE: The bootstrap code has been only tested so far with the Microsoft C compiler. (It may be tested with TURBO-C++; check with me.) If you attempt to use another compiler, you may encounter difficulties; consult with me. ALSO NOTE: If you have one of the original 8088 machines, with no hardware speed-up enhancements, you will likely find FWEB unusably slow for jobs of any substantial length. There's no problem with enhanced versions. Give it a try. (Thorsten Ohl has proposed and tested a buffering scheme that should give some improvements in run time. However, that has not yet been implemented in the master FWEB sources.) Several significant difficulties were encountered while attempting to make FWEB work on the IBM-PC: (1) memory limitations; (2) pointer problems; (3) compiler bugs. Most likely, any gross difficulties you encounter with bootstrapping FWEB will be related to one of these three areas. That doesn't mean that you won't encounter bugs with FWEB itself, but remember that FWEB does run successfully on a variety of machines, so suspect one of the three areas above first. (1) MEMORY LIMITATIONS. FWEB is a large, sophisticated program. Therefore, when you first attempt to compile and link the bootstrap code supplied in this directory, STRIP DOWN YOUR SYSTEM AS MUCH AS YOU CAN so that maximum memory is available to the compiler. Try to make CHKDSK report about 600K of main memory available. Of course, the compiler will complain if it can't find enough memory, but I've encountered situations in which the compiler ran through to the end without complaining but produced faulty code that was corrected when the available memory was enlarged. If the Borland compiler finishes with ``Available memory 0'', don't trust the result. At present, FWEB should compile successfully with either the Borland Turbo C compiler or the Microsoft C compiler. (To select which compiler to use, you must either use the make file or define certain macros from the compiler's command line; see below.) To accomplish even this much, a relatively major restructuring had to be done to reduce the size of the various object modules. Nevertheless, you may find that some other compilers choke on individual functions that are too large; for example, there are a few extremely large switch statements. You may be able to tell your compiler to increase the size of its internal tables by some sort of command-line option. If not, if there's enough demand I will eventually try to figure out how to subdivide things up further. A different sort of memory problem arises when you have obtained a working FWEB, but IT complains about running out of memory when working on some particularly large source code. In round numbers, FTANGLE.EXE and FWEAVE.EXE are each about 200K. That leaves you probably 300K to 400K of memory, which is enough to handle fairly sizable codes (including FTANGLE and FWEAVE themselves). However, if FWEB complains you may need to change the default allocation sizes for the various internal tables. This is done via the -y... command-line option (which can be put into FWEB.INI); see the user manual. (2) POINTER PROBLEMS. FWEB allocates almost all of its memory dynamically (at run time). In particular, it can allocate blocks of memory that are longer than 64K bytes. This means that pointers must be able to point anywhere and that pointer arithmetic must be the most general possible. On the pc, pointers are 32 bits long, but they are divided into segment:offset parts, where each of segment and offset are 16 bits long. Generally by default, the compilers implement pointer arithmetic only on the offset portion; this speeds things up. It is, however, not satisfactory. For Borland, Microsoft, and almost certainly for the other compilers as well, YOU MUST EXPLICITLY USE THE ***HUGE*** MEMORY MODEL. This not only ensures that arithmetic is done on the full 32 bit pointers, it also ensures that the pointers have unique, normalized representations so that inequalities involving pointers can be tested correctly. Although maintaining the normalized form slows things down, it seems to be a price one has to pay. Some compilers make a distinction between ``far'' pointers and ``huge'' pointers. Both of these are 32 bits, but only the huge pointer is normalized. Peculiarly, sometimes even in the huge memory model pointers are far by default, not huge. If you want them to be huge, you have to declare them explicitly. Thus, almost all FWEB pointers had to be explicitly declared huge, a tedious and annoying exercise. It's quite conceivable that I didn't get that entirely correct, since in a few cases the pointers dare not be huge; there may be some residual bugs lurking here. If you are using some other compiler, you must make sure that the memory model and pointer declarations allow for the full range of operations on 32 bit pointers. (3) COMPILER and other BUGS I've encountered compiler bugs using both the Microsoft and Borland compilers. I originally switched from Microsoft to Borland partly because an older version of Microsoft crashed when generating the huge memory model (and partly because Borland seemed to be able to handle larger functions). Microsoft 6.0 seems to work OK. --- COMPILING FWEB --- As explained in INSTALL_FWEB.tex, the compile and link information is all contained in the Unix-style make file MAKEFILE. MAKEFILE includes a default file, DEFAULTS.MK, in order to define certain macros. If you look into DEFAULTS.MK, you will find that the compile and link lines are defined by macros, so they can be easily changed. Note, in particular, that the macro "ibmpc" must be defined from the compiler's command line. Also note the use of compiler-command-line options to suppress or turn on various kinds of compiler warning messages. You may still get a few warnings, for example about unused variables (I'll clean this up in the future), but as long as they're warnings, not errors, they're probably harmless. If you get an error that isn't immediately apparent, check with me. Although it is costly in terms of both space and speed, you should for awhile generate code that checks for stack overflow. This is done with the option settings as supplied. Note also the constructions involving /Dpart=1, /Dpart=2, or /Dpart=3. These define preprocessor macros that are used to split FTANGLE.C and FWEAVE.C into three parts so the compiler doesn't run out of heap space. The splitting is simply done by commenting out two-thirds of the code at a time. This seems not to be necessary with Borland with maximum memory, so you might be able disable this if you want. To bootstrap with BORLAND, say MAKE boot To bootstrap with MICROSOFT (I've tested with version 6.0; previous version may or may not work), say NMAKE boot The bootstrap entry to the make file requires the TOUCH facility in order to ensure that the *.c and *.h files are the newest. Microsoft doesn't provide a separate TOUCH utility, but if you don't have a TOUCH of your own, instead of saying ``NMAKE boot, say NMAKE -t *.c *.h NMAKE all If you run out of heap space during the compile, try executing the offending compile line by itself, rather than via NMAKE. (For version 1.23, I had this problem with part 1 of fweave.) Once you get the bootstrap code compiled and linked successfully, you may be tempted to say ``NMAKE'' (or ``NMAKE all''), which should now recreate the *.c and *.h files by tangling the web sources. Unfortunately, you may find that the FTANGLE you have created attempts to allocate too much memory to coexist with NMAKE. You may have to run FTANGLE directly, or from a simple batch file. [If you will only be tangling small jobs, you can reduce the amount of memory FTANGLE allocates by inserting appropriate ``-y...'' commands in the style file. (Read about memory allocation in the user manual.) However, if you wish to make FTANGLE do itself and FWEAVE, then it needs to be essentially as big as it is configured by default.] I make no promises to debug something that's not compiled with Borland or Microsoft, but I'll probably be able to recognize where the difficulty lies. --- RUNNING FWEB --- Various test/demo files are provided to help you debug your new processors. See INSTALL_FWEB.tex for details. Finally, let it be noted that the IBM-PC version of FWEB hasn't been tested very thoroughly. Consider yourself a pioneer, and good luck! (Many thanks to Arnold Kritz and Thorsten Ohl, the first pioneers.) fweb-1.62/Boot/ibm/pc/microsoft/defaults.mk100644 10061 1115 10173 6602703173 17763 0ustar krommesusers# Generated automatically from defaults.mk.in and pc.microsoft.ini by FWEB_configure. # --- START of SYSTEM CONFIGURATION SECTION --- # Parameter settings from pc.ini. # --- Supporting VPATH --- top_srcdir = ./.. srcdir = . VPATH = . # --- Names of system commands --- # (Used in the Makefile and possibly internally to FWEB.) MAKE = nmake MV = rename RM = del TOUCH = $(MAKE) -t # --- COMPILING --- # --- Compiler name --- CC = cl # An FWEB flag, either CC or GCC. This flag isn't used for bootstrapping; it # is required for properly regenerating custom.h by tangling custom.web. If # you're on the Sun and working with gcc, say ``COMPILER = GCC''. COMPILER = CC # --- Compiler options --- # Debugging and optimization options for the C compiler. CFLAGS = # How to run the C preprocessor CPP = # Header file search directory (-Idir) and any other miscellaneous options # for the C preprocessor and compiler. CPPFLAGS = /I. /Id:c700include # (Compiler macro definitions. In addition, see the discussion of PARTn # below.) DEFS = /Dibmpc /Dmcc # --- The actual compile command used by the Makefile. --- COMPILE = $(CC) /c $(CFLAGS) $(CPPFLAGS) $(DEFS) /Fo$* # --- LINKING --- # --- Extensions for object files --- # $(O) is used for targets in the Makefile. $(OBJ) is the suffix used in # the link line. (Sometimes $(OBJ) can be null if the compiler understands # defaults and the length of the command line is an issue, as it is on some # personal computers.) O = obj OBJ = # TERMCAP0 is either a file name, or null. If the termcap library is # available, TERMCAP0 should be null and LIBS should include -ltermcap. # If the termcap library is not available, TERMCAP0 should be termcap0.$(O). TERMCAP0 = # --- Linker options --- # Stripping (-s) and other miscellaneous options for the linker. LDFLAGS = /AH /F 5000 # Library options -l and -L to pass to the linker. LIBS = # --- The actual link command used by the Makefile. --- # TRY NOT TO CHANGE THIS LINE. LINK = $(CC) $(LDFLAGS) /Fe$*$(LOAD_RATFOR) # --- MISCELLANEOUS --- # --- How to print a dvi file --- ECHO = echo # Use this to prevent actual printing. PRINT_DVI = $(ECHO) lpr -d # --- FWEB flags indicating type of machine on which you're tangling # (HOME_MACHINE) and for which machine you're generating C code. --- HOME_MACHINE = IBMPC MACHINE = IBMPC # --- FWEB file suffixes --- # (For IBM-PC, shorten to ``hwe'') HWEB = hwe # --- Splitting FTANGLE & FWEAVE into several parts, especially for small # compilers on personal computers. Here's an example for the IBM-PC, # Microsoft compiler --- # --------------------------------------------------------------------------- #PART1 = /Dpart=1 #PART2 = /Dpart=2 #PART3 = /Dpart=3 #FTANGLE2 = ftangle2.$(O) #FTANGLE3 = ftangle3.$(O) #FWEAVE2 = fweave2.$(O) #FWEAVE3 = fweave3.$(O) #PROD2 = prod2.$(O) #RATFOR2 = ratfor2.$(O) #RESERVED2 = reservd2.$(O) #COMMON2 = common2.$(O) # --------------------------------------------------------------------------- # The PARTn macros are compiler options that define the macro |part| #to be n, for example ``-Dpart=2'' PART1 = /Dpart=1 PART2 = /Dpart=2 PART3 = /Dpart=3 # Here are the names of the second and third parts of the object files. FTANGLE2 = ftangle2.$(O) FTANGLE3 = ftangle3.$(O) FWEAVE2 = fweave2.$(O) FWEAVE3 = fweave3.$(O) PROD2 = prod2.$(O) RATFOR2 = ratfor2.$(O) RESERVED2 = reservd2.$(O) COMMON2 = common2.$(O) # --- INSTALLATION INFORMATION --- INSTALL = copy INSTALL_PROGRAM = $(INSTALL) INSTALL_DATA = $(INSTALL) # Top-level path for executable binaries (usually /usr/local): exec_prefix = /usr/local # Where the processors go: bindir = $(exec_prefix)/bin # Top-level path for everything else (usually /usr/local) prefix = /usr/local doc_prefix = $(prefix) # Where the Unix man pages go: manext = 1 mandir = $(doc_prefix)/man/man$(manext) # Where the emacs info* files go: infodir = $(doc_prefix)/info # Where the source file fweb.texinfo goes: texinfodir = $(infodir) # Where the fwebmac.sty macro package used by FWEAVE goes, as well as the # file fweb.tex needed for weaving the FWEB source code, go: texdir = $(prefix)/lib/tex/inputs # --- END of SYSTEM CONFIGURATION SECTION --- fweb-1.62/Boot/ibm/pc/gnu/ 40755 10061 1115 0 6602703175 14272 5ustar krommesusersfweb-1.62/Boot/ibm/pc/gnu/custom.h100644 10061 1115 34121 6602703163 16070 0ustar krommesusers#if(0) FTANGLE v1.60, created with UNIX on "Thursday, September 24, 1998 at 16:12." COMMAND LINE: "./ftangle ./custom -uSUN -mANSI -mCC -mSYS_NAME= MSDOS/GNU -mF_CALLS= 1 -mPREFIX_END_CHR= '\\' -mNULL_NAME= NUL -= /u/krommes/Fweb/1.62/Boot/ibm/pc/gnu/custom.h -# -v" RUN TIME: "Friday, September 25, 1998 at 8:02." WEB FILE: "./custom.web" CHANGE FILE: (none) #endif /* --- BOOTSTRAPPING --- */ /* To bootstrap yourself onto a new system, you should modify this file \ appropriately. In most cases, you set a flag by saying ``#define \ FLAG''---i.e., you make a null definition. Don't set these flags to~0 \ or~1. However, in a few cases the macros are not flags and must be given \ the appropriate definition. */ /* --- MACHINE COMPILER FLAG --- */ /* This must be in lower case. Presently these are drawn from the list \ {ansi, bsd, dsu, ibmpc, mac, misc, mvs, sgi, sun, vax}. These \ flags may be used in #define statements within the source code to tailor \ things to a particular compiler or operating system. If you use \ ./configure to generate custom.h, there will be no definition following \ this comment. */ #ifndef ansi #define ansi #endif /* --- FWEB SYSTEM NAME --- */ /* This is a string such as ``IBM-PC/DOS'' or ``VAX/VMS''. It is printed \ when FWEB starts up. */ #define THE_SYSTEM "MSDOS/GNU" /* --- An optional local banner, printed after the system name above. --- */ #define LOCAL_BANNER "" /* Does your compiler understand the ANSI preprocessor command \#error? \ If it does, define |HAVE_ERROR|. (I haven't figured out a general \ autoconf test yet; it seems to be impossible in principle.) */ #define HAVE_ERROR 1 /* The C preprocessor is run by the \.{-H} option. */ #define RUN_CPP "gcc -E" /* Occasionally a system command is issued to rename a file. Here's how to \ do that. */ #define MV "mv" /* Do we bother with translations to the internal |ASCII| representation? \ If so, define |TRANSLATE_ASCII|. Don't bother on |ASCII| machines. */ #define TRANSLATE_ASCII 0 /* For \It{debugging} of target machines whose character set differs from \ the one on which you're working, define |DEBUG_XCHR|. \It{Usually, this \ flag should not be defined.} When it is defined, the |TRANSLATE_ASCII| \ flag is automatically turned on, and the value of the style-file field \ `xchr' is relevant. \It{Don't use this flag unless you're a system \ developer!!!} */ #define DEBUG_XCHR 0 /* Does the operating system have a Unix-like path? \ That is, does it have the form ``/u/krommes'' rather than the VMS form \ ``ux3:[krommes]''? If so, define |UNIX_PATH|. */ #define UNIX_PATH 1 /* If the |getenv| call to obtain an environment variable is supported \ (it usually is) define |HAVE_GETENV|. */ #define HAVE_GETENV 1 /* --- FILE NAMES and EXTENSIONS --- */ /* Name of the null file. This macro merely defines the default value of \ the style-file parameter `null_file', so it's not essential to add any more \ machines here. */ #define NULL_FILE_NAME "NUL" /* Name of \FWEB's initialization file. Please see below, after the \ definition of |SMALL_MEMORY|. */ /* Name of \FWEB's default style file. \It{Please don't change this unless \ you absolutely have to! Use the `-z' option instead.} */ #define STYLE_FILE_NAME "fweb.sty" /* Here are the default file extensions for each language. These merely \ set default style-file parameters, so it's not essential that you change \ anything here. See the parameters `suffix.C', `suffix.N', etc. */ #define C_EXT "c" #define V_EXT "mk" #define X_EXT "sty" /* Unix. */ #define Cpp_EXT "C" /* Per \.{gcc}. */ #define R_EXT "r" #define R90_EXT "r90" #define N_EXT "f" #define N90_EXT "f90" #define HAVE_TMPNAM 1 #define HAVE_TEMPNAM 0 /* The |FANCY_SPLIT| flag is used for buffering the output lines of C~code. \ Define this if the C~compiler CAN'T continue an incomplete line with a \ backslash. (ANSI compilers should be able to.) \ {\bf (This code may not be fully debugged yet!)} */ #define FANCY_SPLIT 0 /* --- INCLUDING FILES --- */ /* The code is written in C, and various header files of the form \ ``<*.h>'' are included near the beginning of each source file. The \ names of these files are standardized by ANSI. Unfortunately, not everyone \ has gotten around to ANSI yet. Therefore, here we include important files \ whose names may be nonstandard or whose functions may fluctuate. */ /* Does the ANSI exist? If so, say so here. This is supposed \ to contain prototypes for the following functions used by \FWEB: |abort|, \ |abs|, |atof|, |atoi|, |atol|, |calloc|, |exit|, |free|, |getenv|, \ |realloc|, |strtod|, |strtol|. If it doesn't, either find the prototypes \ in another file and include it here, or actually give the prototypes here. */ #define HAVE_STDLIB_H 1 #define HAVE_STDARG_H 1 /* Does the ANSI exist? If so, include it here. This is \ supposed to define the |NULL| pointer, and the type |size_t|. Sometimes \ these are defined in other places as well. */ #define HAVE_STDDEF_H 1 /* Other stuff handled by autoconf. */ #define HAVE_STRING_H 1 #define HAVE_MEMORY_H 0 #define HAVE_FLOAT_H 1 /* Does (non-ANSI) exist? You may find some useful stuff in \ here. But don't use it unless you have to. */ /* _P include */ /* Must we include an extra file for memory management? E.g., for \ Microsoft, ; for Borland; . Not necessary for ANSI; \ it's in . */ /* _P include */ /* Numerical limits. We use the following ANSI macros: |INT_MAX|, \ |INT_MIN|, |LONG_MAX|, |LONG_MIN|, and |ULONG_MAX|, which are found in \ . If you can't find those macros, define the flag \ |HAVE_VALUES_H|, and possibly include another file with different names for \ the limits, such as on the Sun. The flag |HAVE_VALUES_H| \ assumes that the macros |MAXINT| and |MAXLONG| are defined. If they are \ not, you must define them here. */ #define HAVE_LIMITS_H 1 #define HAVE_VALUES_H 0 /* Please note that additional files are included automatically \ (essentially immediately after this file is read; see ). \ These were considered to be standard, but that might be a mistake. Those \ files are: , , , , . \ Remember that by convention these files should limit themselves to being \ included only once. Therefore, if for some reason you need to include one \ of these somewhere in this file, you should be able to do it without \ difficulty; the later automatic include just won't be done if those files \ are following standard protocol. */ #define ANSI_CTYPE_H 1 /* --- VARIABLE-LENGTH ARGUMENT LISTS --- */ /* For convenience, FWEB attempts to use functions with variable numbers of \ arguments. We attempt to support two conventions: ANSI, and Sun's. If \ this feature is supported, define the flag |VARIABLE_ARGUMENTS|, say \ whether |va_start| has one or two arguments, and include the associated \ header file ( for ANSI). */ /* Does the compiler allow ANSI-style variable arguments? */ #define VARIABLE_ARGUMENTS 1 /* Is |va_start| defined with one argument (Sun's convention) or two \ (ANSI)? */ #define NUM_VA_ARGS 2 #define HAVE_STDARG_H 1 /* --- ADDITIONAL PROTOTYPES --- */ /* You may wish to collect any additional prototypes that are required and \ put them into your own header file that you include here. */ /* If the flag |HAVE_STD_PROTOTYPES| is false, it causes the file \ "stdlib0.h" to be loaded. This contains ANSI prototypes that for some \ reason aren't provided with the gcc environment on the Sun. */ #define HAVE_STD_PROTOTYPES 1 /* Define the flag |OLD_PROTOTYPES| for compilers that don't support the \ new (ANSI) style of function declaration and prototyping. The new style is \ |fcn(int i,char *s){}|; the old style is |fcn(i,s) int i; char *s; {}|. */ #define OLD_PROTOTYPES 0 /* ANSI also introduces the type |void|. If your compiler doesn't \ understand the constructions |void *| and |void fcn()|, define |NO_VOID|. */ #define NO_VOID 0 /* --- SPECIAL TYPES --- */ /* |const| seems to be an annoyance; not all compilers treat it the same \ way. We really only want it for debugging, anyway, so we mostly just \ remove it. It's kept when compiling on the Sun with gcc, because it \ gives the developer more checks on the code. If you want to keep it, \ define |KEEP_CONST|. */ #define KEEP_CONST 0 /* For personal computers, the kind of pointer is an issue. They must be \ |huge|. If your compiler understands |huge|, define |HUGE_POINTERS|. */ #define HUGE_POINTERS 0 /* --- SPECIAL FUNCTIONS --- */ /* The ANSI |sprintf| function returns the number of characters written. \ If this is the case on your system, define |ANSI_SPRINTF|. (It's always \ safe to not define it.) */ #define ANSI_SPRINTF 1 /* The ANSI |sscanf| does some cute things with scansets, but it doesn't \ always work. */ #define ANSI_SSCANF 1 /* The ANSI |system| function is supposed to take |NULL| as an argument, \ which means check if a command processor exists. If this works properly, \ defined |ANSI_SYSTEM|. (It doesn't work on the Sun.) */ #define ANSI_SYSTEM 1 /* --- ANNOYING WARNINGS --- */ /* Sometimes the compiler can't understand that the \ control flow can never get to the bottom of a function. To avoid warning \ complaints, we have the following: */ #define DUMMY_RETURN(value) return value /* --- UNUSUAL NAMES --- */ /* Put here any definitions that override standard names. For example, for \ some ancient on the MAC one had to say ``#define getc agetc''. */ /* Nothing to be done. */ /* --- DIRECTORY SPECIFICATIONS --- */ /* Directory specifications are delimited in different ways under the various \ operating systems. Unix: '/'; IBM-PC: '\\'; VAX/VMS: ']'. */ #define PREFIX_END_CHAR '\\' /* --- TIMING --- */ /* First of all, we have a flag to say whether timing information is \ printed at the end of the run. (If you can't figure out the timing \ routines for your machine or don't want a timing information line at the \ end of your terminal output, don't define this.) Beginning with fweb-1.53, \ timing is turned off by default. */ #define TIMING 0 /* --- Number of decimal places for timing information in seconds. (Use \ at least 2 for supercomputers.) --- */ #define TIMING_WIDTH 1 /* There's supposed to be a function |clock()| that returns the cpu time, \ in units of |CLOCKS_PER_SEC|. The type of |clock| is |clock_t|. If that \ is defined, define the flag |CLOCK_T_DEFINED|; otherwise, say |typedef ... \ clock_t| here. */ #define CLOCK_T_DEFINED 1 /* Some systems don't define |CLOCKS_PER_SEC|. If not, we try |CLK_TCK|. \ If that's not defined, it defaults to 1000000. If that's not appropriate, \ define |CLOCKS_PER_SEC| here. */ /* \ #define CLOCKS_PER_SEC 1000000 \ */ /* Are there system routines that return wall-clock time in sub-second units? \ First, look for |gettimeofday| ($\mu$sec timing). */ #define HAVE_GETTIMEOFDAY 0 /* Otherwise, does the file sys/timeb.h exist that along with |ftime| gives \ millisecond timing for wall-clock time? We check for the header file, not \ |ftime| itself, since |ftime| may be in a Berkeley compatibility library, \ not in libc. */ #define HAVE_SYS_TIMEB_H 0 /* Do we use our own version of |difftime()|, which computes the difference \ of two wall clock times? If so, define |NEW_DIFFTIME|. This flag should \ always be defined if |HAVE_SYS_TIMEB_H| is defined above. */ #define NEW_DIFFTIME 0 /* --- MAKING IT FIT --- */ /* Sometimes the compiler can't handle functions or switches that are too \ large. In that case, define |FCN_CALLS|. That converts certain in-line \ code (such as in the syntax production analyzer) into function calls (at \ the price of slowing things down a bit). */ #define FCN_CALLS 1 /* The personal computers are starved for memory. For those machines, we \ specify smaller default values for the lengths of dynamic arrays; define \ |SMALL_MEMORY|. (You can always use the `-y' option to override these \ defaults.) */ #define SMALL_MEMORY 0 /* Name of \FWEB's default initialization file. Please don't change these \ conventions unless you absolutely have to!!! Also, note that these \ definitions are overridden by the environment variable |FWEB_INI|, if it is \ defined. */ #ifndef SMALL_MEMORY #define SMALL_MEMORY 0 #endif #if SMALL_MEMORY #define FWEB_INI "fweb.ini" #else #define FWEB_INI ".fweb" #endif /* --- MEMORY ALLOCATIONS --- */ /* The ANSI |calloc| routine takes two arguments: |void \ *calloc(size_t,size_t)|. If the system doesn't have a standard |calloc| \ routine, or if the name isn't standard, you must define an UPPERCASE macro \ that does the same thing. (The name isn't standard on personal computers \ because one is dealing with |huge| allocations.) If you define \ |NON_ANSI_CALLOC|, you must define |CALLOC|, |REALLOC|, and |FREE|. E.g., the \ relevant definitions for Borland are \ \begintt \ #define CALLOC farcalloc \ #define REALLOC(oldblock,nbytes) \ \ farrealloc((void far *)(oldblock),(unsigned long)(nbytes)) \ #define FREE(block) farfree((void far *)(block)) \ \endtt \ */ #define NON_ANSI_CALLOC 0 /* |IBMPC| */ /* Do we supply below a routine that obtains the available memory, such \ as Borland's farcoreleft()? */ #define PRINT_AVAILABLE_MEMORY 0 /* The function call that obtains the memory is called |CORE_LEFT|. This \ function is assumed to return an |unsigned long int|. For Microsoft, we had \ to write our own routine |_hmemavl|; see below. For Borland, the routine \ should be called |farcoreleft|. For the other machines, we don't have \ anything as yet. */ /* The following flag is defined only by \common.web}. */ #ifdef COMMON_FCNS_ #if(part==0 || part==1) /* Give here the C code for any additional functions that are \ compiler-specific or missing from your implementation, such as maybe \ |strtod|. Note that these are bracketed with the flag COMMON_FCNS_ so they \ are compiled into just one module, namely common.c. You must \ always supply some version of the debugging routine |trap|, which must \ return~0 as a minimum. */ /* The default |trap| function for debugging. */ int trap(void) {return 0;} #endif /* |part == 1| */ #endif /* |COMMON_FCNS_| */ fweb-1.62/Boot/ibm/pc/gnu/READ_ME.GNU100644 10061 1115 3273 6602703175 16043 0ustar krommesusers --- COMPILING FOR EXTENDED MEMORY --- The files in this subdirectory are intended for use with ports of 32-bit compilers such as D. J. Delorie's djgpp, available from oak.oakland.edu:/SimTel/vendors/djgpp. The basic procedure is: - Copy {defaults.mk,custom.h,*lnk} to fweb\Web (or wherever your Makefile and web files are). - Examine what's in defaults.mk, which is included into the Makefile. It's set up for use with gcc, but you may wish to include some compiler flags such as `-O'. - Say `make help' to see the principal targets in the Makefile. - Say `make -n' to see what will happen. You can use Microsoft's nmake instead of make. - With djgpp, you may have to replace a_type.h by an empty file. (Otherwise, there are conflicts with the declarations of the termcap routines that lead to error messages. This shouldn't happen, but I couldn't figure out exactly what was going on.) - When you say `make', the files `ftangle' and `fweave' (NOT `ftangle.exe' and `fweave.exe') are produced. (To make ftangle without ratfor, say `make ftangle0'.) If the link line doesn't work because it's too long, you can link by hand by saying gcc @t_lnk # => ftangle gcc @t0_lnk # => ftangle0 gcc @w_lnk # => fweave - These files must be run by a memory extender. With djgpp, that is go32.exe. In that environment, you can say coff2exe ftangle coff2exe fweave This produces `ftangle.exe' and `fweave.exe', which include `stub.exe' (which in turn calls go32.exe). These executables will then run in extended memory when go32.exe is in the search path. - In order for all this to work, you need appropriate statements in config.sys and autoexec.bat. ... (Discussion not finished.) fweb-1.62/Boot/ibm/pc/gnu/defaults.mk100644 10061 1115 10057 6602703175 16552 0ustar krommesusers# Generated automatically from defaults.mk.in and pc.gnu.ini by FWEB_configure. # --- START of SYSTEM CONFIGURATION SECTION --- # # --- Supporting VPATH --- top_srcdir = ./.. srcdir = . VPATH = . # --- Names of system commands --- # (Used in the Makefile and possibly internally to FWEB.) MAKE = nmake MV = rename RM = del TOUCH = $(MAKE) -t # --- COMPILING --- # --- Compiler name --- CC = gcc # An FWEB flag, either CC or GCC. This flag isn't used for bootstrapping; it # is required for properly regenerating custom.h by tangling custom.web. If # you're on the Sun and working with gcc, say ``COMPILER = GCC''. COMPILER = GCC # --- Compiler options --- # Debugging and optimization options for the C compiler. CFLAGS = # How to run the C preprocessor CPP = # Header file search directory (-Idir) and any other miscellaneous options # for the C preprocessor and compiler. CPPFLAGS = # (Compiler macro definitions. In addition, see the discussion of PARTn # below.) DEFS = # --- The actual compile command used by the Makefile. --- COMPILE = $(CC) -c $(CFLAGS) $(CPPFLAGS) $(DEFS) -Dconst= -o $(@) # --- LINKING --- # --- Extensions for object files --- # $(O) is used for targets in the Makefile. $(OBJ) is the suffix used in # the link line. (Sometimes $(OBJ) can be null if the compiler understands # defaults and the length of the command line is an issue, as it is on some # personal computers.) O = o OBJ = .$(O) # TERMCAP0 is either a file name, or null. If the termcap library is # available, TERMCAP0 should be null and LIBS should include -ltermcap. # If the termcap library is not available, TERMCAP0 should be termcap0.$(O). TERMCAP0 = # --- Linker options --- # Stripping (-s) and other miscellaneous options for the linker. LDFLAGS = # Library options -l and -L to pass to the linker. LIBS = -lm # --- The actual link command used by the Makefile. --- # TRY NOT TO CHANGE THIS LINE. LINK = $(CC) $(LDFLAGS) -o $(@) # --- MISCELLANEOUS --- # --- How to print a dvi file --- ECHO = echo # Use this to prevent actual printing. PRINT_DVI = $(ECHO) lpr -d # --- FWEB flags indicating type of machine on which you're tangling # (HOME_MACHINE) and for which machine you're generating C code. --- HOME_MACHINE = ANSI MACHINE = ANSI # --- FWEB file suffixes --- # (For IBM-PC, shorten to ``hwe'') HWEB = hwe # --- Splitting FTANGLE & FWEAVE into several parts, especially for small # compilers on personal computers. Here's an example for the IBM-PC, # Microsoft compiler --- # --------------------------------------------------------------------------- #PART1 = /Dpart=1 #PART2 = /Dpart=2 #PART3 = /Dpart=3 #FTANGLE2 = ftangle2.$(O) #FTANGLE3 = ftangle3.$(O) #FWEAVE2 = fweave2.$(O) #FWEAVE3 = fweave3.$(O) #PROD2 = prod2.$(O) #RATFOR2 = ratfor2.$(O) #RESERVED2 = reservd2.$(O) #COMMON2 = common2.$(O) # --------------------------------------------------------------------------- # The PARTn macros are compiler options that define the macro |part| #to be n, for example ``-Dpart=2'' PART1 = -Dpart=1 PART2 = -Dpart=2 PART3 = -Dpart=3 # Here are the names of the second and third parts of the object files. FTANGLE2 = ftangle2.$(O) FTANGLE3 = ftangle3.$(O) FWEAVE2 = fweave2.$(O) FWEAVE3 = fweave3.$(O) PROD2 = prod2.$(O) RATFOR2 = ratfor2.$(O) RESERVED2 = reservd2.$(O) COMMON2 = common2.$(O) # --- INSTALLATION INFORMATION --- INSTALL = copy INSTALL_PROGRAM = $(INSTALL) INSTALL_DATA = $(INSTALL) # Top-level path for executable binaries (usually /usr/local): exec_prefix = /usr/local # Where the processors go: bindir = $(exec_prefix)/bin # Top-level path for everything else (usually /usr/local) prefix = /usr/local doc_prefix = $(prefix) # Where the Unix man pages go: manext = 1 mandir = $(doc_prefix)/man/man$(manext) # Where the emacs info* files go: infodir = $(doc_prefix)/info # Where the source file fweb.texinfo goes: texinfodir = $(infodir) # Where the fwebmac.sty macro package used by FWEAVE goes, as well as the # file fweb.tex needed for weaving the FWEB source code, go: texdir = $(prefix)/lib/tex/inputs # --- END of SYSTEM CONFIGURATION SECTION --- fweb-1.62/Boot/ibm/pc/gnu/w_lnk100644 10061 1115 202 6602703175 15376 0ustar krommesusers-o fweave fweave.o fweave2.o fweave3.o common.o common2.o prod.o prod2.o reserved.o reservd2.o style.o ratfor0.o termcap0.o -lm fweb-1.62/Boot/ibm/pc/gnu/t_lnk100644 10061 1115 214 6602703175 15376 0ustar krommesusers-o ftangle ftangle.o ftangle2.o ftangle3.o common.o common2.o reserved.o reservd2.o ratfor.o ratfor2.o eval.o macs.o style.o termcap0.o -lm fweb-1.62/Boot/ibm/pc/gnu/t0_lnk100644 10061 1115 204 6602703175 15455 0ustar krommesusers-o ftangle0 ftangle.o ftangle2.o ftangle3.o common.o common2.o reserved.o reservd2.o ratfor0.o eval.o macs.o style.o termcap0.o -lm fweb-1.62/Boot/ibm/pc/READ_ME.PC100644 10061 1115 3174 6602703176 15124 0ustar krommesusers --- FWEB FOR THE IBM-PC --- Version 1.5x September 13, 1995 * EXECUTABLE BINARIES In the present release, the executable binaries ftangle.exe --- The full-blown ftangle, including Ratfor. ftangle0.exe --- Ftangle without Ratfor. fweave.exe --- The fweave processor. MAY BE supplied. If they are present, they will be found in the /pub/fweb/executables subdirectory. If they are not present, it means that I haven't had time to produce them yet. If you need them desperately, please notify me. * ENVIRONMENT VARIABLES The processors look for environment variables such as ``HOME''. If ``HOME'' is not defined on your system, say something like set HOME=. NOTE that there is no white space before or after the equals sign. (It won't work right otherwise.) To see what environment variables are set, simply say ``set''. * COMPILING IT YOURSELF. This directory contains the following subdirectories: microsoft --- Stuff for use with the Microsoft C compiler gnu --- For compiling with a `gcc for DOS' such as djgpp. FWEB has grown so large that the stuff in the microsoft subdirectory is virtually useless. Although the processors fit in low memory, they can't allocate enough space to do anything. Fortunately, there are now compilers that provide a 32-bit environment that works nicely with extended memory. In particular, a port of the gnu C compiler is available. I used djgpp, written by D.J. Delorie and available from oak.oakland.edu:/SimTel/vendors/djgpp. Bootstrapping files for that environment are found in the gnu subdirectory. See the READ_ME file there for further discussion. fweb-1.62/Boot/ibm/READ_ME.IBM100644 10061 1115 1027 6602703177 14623 0ustar krommesusers --- The boot/ibm SUBDIRECTORY --- Here you will find machine-dependent files for IBM operating systems, especially the custom.h and defaults.mk files necessary for bootstrapping. Presently you have your choice of the following machines or compiler environments (each one of which has its own subdirectory): mvs --- Any EBCDIC machine pc --- Any IBM-PC compatible The IBM RISC-6000 is a Unix machine with an ANSI compiler. You should be able to use ./configure to bootstrap. See READ_ME.FWEB for installation details.fweb-1.62/Boot/vax/ 40755 10061 1115 0 6602703213 13117 5ustar krommesusersfweb-1.62/Boot/vax/custom.h100644 10061 1115 34043 6602703166 14732 0ustar krommesusers#if(0) FTANGLE v1.60, created with UNIX on "Thursday, September 24, 1998 at 16:12." COMMAND LINE: "./ftangle ./custom -uSUN -mVAX -mCC -= /u/krommes/Fweb/1.62/Boot/vax/custom.h -# -v" RUN TIME: "Friday, September 25, 1998 at 8:03." WEB FILE: "./custom.web" CHANGE FILE: (none) #endif /* --- BOOTSTRAPPING --- */ /* To bootstrap yourself onto a new system, you should modify this file \ appropriately. In most cases, you set a flag by saying ``#define \ FLAG''---i.e., you make a null definition. Don't set these flags to~0 \ or~1. However, in a few cases the macros are not flags and must be given \ the appropriate definition. */ /* --- MACHINE COMPILER FLAG --- */ /* This must be in lower case. Presently these are drawn from the list \ {ansi, bsd, dsu, ibmpc, mac, misc, mvs, sgi, sun, vax}. These \ flags may be used in #define statements within the source code to tailor \ things to a particular compiler or operating system. If you use \ ./configure to generate custom.h, there will be no definition following \ this comment. */ #ifndef vax #define vax #endif /* |vax| */ /* --- FWEB SYSTEM NAME --- */ /* This is a string such as ``IBM-PC/DOS'' or ``VAX/VMS''. It is printed \ when FWEB starts up. */ #define THE_SYSTEM "VAX/VMS" /* --- An optional local banner, printed after the system name above. --- */ #define LOCAL_BANNER "" /* Does your compiler understand the ANSI preprocessor command \#error? \ If it does, define |HAVE_ERROR|. (I haven't figured out a general \ autoconf test yet; it seems to be impossible in principle.) */ #define HAVE_ERROR 1 /* The C preprocessor is run by the \.{-H} option. */ #define RUN_CPP "gcc -E" /* Occasionally a system command is issued to rename a file. Here's how to \ do that. */ #define MV "mv" /* Do we bother with translations to the internal |ASCII| representation? \ If so, define |TRANSLATE_ASCII|. Don't bother on |ASCII| machines. */ #define TRANSLATE_ASCII 0 /* For \It{debugging} of target machines whose character set differs from \ the one on which you're working, define |DEBUG_XCHR|. \It{Usually, this \ flag should not be defined.} When it is defined, the |TRANSLATE_ASCII| \ flag is automatically turned on, and the value of the style-file field \ `xchr' is relevant. \It{Don't use this flag unless you're a system \ developer!!!} */ #define DEBUG_XCHR 0 /* Does the operating system have a Unix-like path? \ That is, does it have the form ``/u/krommes'' rather than the VMS form \ ``ux3:[krommes]''? If so, define |UNIX_PATH|. */ #define UNIX_PATH 0 /* If the |getenv| call to obtain an environment variable is supported \ (it usually is) define |HAVE_GETENV|. */ #define HAVE_GETENV 1 /* --- FILE NAMES and EXTENSIONS --- */ /* Name of the null file. This macro merely defines the default value of \ the style-file parameter `null_file', so it's not essential to add any more \ machines here. */ #define NULL_FILE_NAME "nl:" /* Name of \FWEB's initialization file. Please see below, after the \ definition of |SMALL_MEMORY|. */ /* Name of \FWEB's default style file. \It{Please don't change this unless \ you absolutely have to! Use the `-z' option instead.} */ #define STYLE_FILE_NAME "fweb.sty" /* Here are the default file extensions for each language. These merely \ set default style-file parameters, so it's not essential that you change \ anything here. See the parameters `suffix.C', `suffix.N', etc. */ #define C_EXT "c" #define V_EXT "mk" #define X_EXT "sty" /* Non-unix. */ #define Cpp_EXT "C" #define R_EXT "rat" #define R90_EXT "rat90" #define N_EXT "for" #define N90_EXT "for90" #define HAVE_TMPNAM 1 #define HAVE_TEMPNAM 0 /* The |FANCY_SPLIT| flag is used for buffering the output lines of C~code. \ Define this if the C~compiler CAN'T continue an incomplete line with a \ backslash. (ANSI compilers should be able to.) \ {\bf (This code may not be fully debugged yet!)} */ #define FANCY_SPLIT 1 /* --- INCLUDING FILES --- */ /* The code is written in C, and various header files of the form \ ``<*.h>'' are included near the beginning of each source file. The \ names of these files are standardized by ANSI. Unfortunately, not everyone \ has gotten around to ANSI yet. Therefore, here we include important files \ whose names may be nonstandard or whose functions may fluctuate. */ /* Does the ANSI exist? If so, say so here. This is supposed \ to contain prototypes for the following functions used by \FWEB: |abort|, \ |abs|, |atof|, |atoi|, |atol|, |calloc|, |exit|, |free|, |getenv|, \ |realloc|, |strtod|, |strtol|. If it doesn't, either find the prototypes \ in another file and include it here, or actually give the prototypes here. */ #define HAVE_STDLIB_H 1 #define HAVE_STDARG_H 1 /* Does the ANSI exist? If so, include it here. This is \ supposed to define the |NULL| pointer, and the type |size_t|. Sometimes \ these are defined in other places as well. */ #define HAVE_STDDEF_H 1 /* Other stuff handled by autoconf. */ #define HAVE_STRING_H 1 #define HAVE_MEMORY_H 0 #define HAVE_FLOAT_H 1 /* Does (non-ANSI) exist? You may find some useful stuff in \ here. But don't use it unless you have to. */ /* _P include */ /* Must we include an extra file for memory management? E.g., for \ Microsoft, ; for Borland; . Not necessary for ANSI; \ it's in . */ /* _P include */ /* Numerical limits. We use the following ANSI macros: |INT_MAX|, \ |INT_MIN|, |LONG_MAX|, |LONG_MIN|, and |ULONG_MAX|, which are found in \ . If you can't find those macros, define the flag \ |HAVE_VALUES_H|, and possibly include another file with different names for \ the limits, such as on the Sun. The flag |HAVE_VALUES_H| \ assumes that the macros |MAXINT| and |MAXLONG| are defined. If they are \ not, you must define them here. */ #define HAVE_LIMITS_H 1 #define HAVE_VALUES_H 0 /* Please note that additional files are included automatically \ (essentially immediately after this file is read; see ). \ These were considered to be standard, but that might be a mistake. Those \ files are: , , , , . \ Remember that by convention these files should limit themselves to being \ included only once. Therefore, if for some reason you need to include one \ of these somewhere in this file, you should be able to do it without \ difficulty; the later automatic include just won't be done if those files \ are following standard protocol. */ #define ANSI_CTYPE_H 0 /* --- VARIABLE-LENGTH ARGUMENT LISTS --- */ /* For convenience, FWEB attempts to use functions with variable numbers of \ arguments. We attempt to support two conventions: ANSI, and Sun's. If \ this feature is supported, define the flag |VARIABLE_ARGUMENTS|, say \ whether |va_start| has one or two arguments, and include the associated \ header file ( for ANSI). */ /* Does the compiler allow ANSI-style variable arguments? */ #define VARIABLE_ARGUMENTS 1 /* Is |va_start| defined with one argument (Sun's convention) or two \ (ANSI)? */ #define NUM_VA_ARGS 2 #define HAVE_STDARG_H 1 /* --- ADDITIONAL PROTOTYPES --- */ /* You may wish to collect any additional prototypes that are required and \ put them into your own header file that you include here. */ /* If the flag |HAVE_STD_PROTOTYPES| is false, it causes the file \ "stdlib0.h" to be loaded. This contains ANSI prototypes that for some \ reason aren't provided with the gcc environment on the Sun. */ #define HAVE_STD_PROTOTYPES 1 /* Define the flag |OLD_PROTOTYPES| for compilers that don't support the \ new (ANSI) style of function declaration and prototyping. The new style is \ |fcn(int i,char *s){}|; the old style is |fcn(i,s) int i; char *s; {}|. */ #define OLD_PROTOTYPES 1 /* ANSI also introduces the type |void|. If your compiler doesn't \ understand the constructions |void *| and |void fcn()|, define |NO_VOID|. */ #define NO_VOID 0 /* --- SPECIAL TYPES --- */ /* |const| seems to be an annoyance; not all compilers treat it the same \ way. We really only want it for debugging, anyway, so we mostly just \ remove it. It's kept when compiling on the Sun with gcc, because it \ gives the developer more checks on the code. If you want to keep it, \ define |KEEP_CONST|. */ #define KEEP_CONST 0 /* For personal computers, the kind of pointer is an issue. They must be \ |huge|. If your compiler understands |huge|, define |HUGE_POINTERS|. */ #define HUGE_POINTERS 0 /* --- SPECIAL FUNCTIONS --- */ /* The ANSI |sprintf| function returns the number of characters written. \ If this is the case on your system, define |ANSI_SPRINTF|. (It's always \ safe to not define it.) */ #define ANSI_SPRINTF 1 /* The ANSI |sscanf| does some cute things with scansets, but it doesn't \ always work. */ #define ANSI_SSCANF 0 /* The ANSI |system| function is supposed to take |NULL| as an argument, \ which means check if a command processor exists. If this works properly, \ defined |ANSI_SYSTEM|. (It doesn't work on the Sun.) */ #define ANSI_SYSTEM 0 /* --- ANNOYING WARNINGS --- */ /* Sometimes the compiler can't understand that the \ control flow can never get to the bottom of a function. To avoid warning \ complaints, we have the following: */ #define DUMMY_RETURN(value) return value /* --- UNUSUAL NAMES --- */ /* Put here any definitions that override standard names. For example, for \ some ancient on the MAC one had to say ``#define getc agetc''. */ /* Nothing to be done. */ /* --- DIRECTORY SPECIFICATIONS --- */ /* Directory specifications are delimited in different ways under the various \ operating systems. Unix: '/'; IBM-PC: '\\'; VAX/VMS: ']'. */ #define PREFIX_END_CHAR ']' /* The VAX has a peculiar format. */ /* --- TIMING --- */ /* First of all, we have a flag to say whether timing information is \ printed at the end of the run. (If you can't figure out the timing \ routines for your machine or don't want a timing information line at the \ end of your terminal output, don't define this.) Beginning with fweb-1.53, \ timing is turned off by default. */ #define TIMING 0 /* --- Number of decimal places for timing information in seconds. (Use \ at least 2 for supercomputers.) --- */ #define TIMING_WIDTH 1 /* There's supposed to be a function |clock()| that returns the cpu time, \ in units of |CLOCKS_PER_SEC|. The type of |clock| is |clock_t|. If that \ is defined, define the flag |CLOCK_T_DEFINED|; otherwise, say |typedef ... \ clock_t| here. */ #define CLOCK_T_DEFINED 1 /* Some systems don't define |CLOCKS_PER_SEC|. If not, we try |CLK_TCK|. \ If that's not defined, it defaults to 1000000. If that's not appropriate, \ define |CLOCKS_PER_SEC| here. */ /* \ #define CLOCKS_PER_SEC 1000000 \ */ /* Are there system routines that return wall-clock time in sub-second units? \ First, look for |gettimeofday| ($\mu$sec timing). */ #define HAVE_GETTIMEOFDAY 0 /* Otherwise, does the file sys/timeb.h exist that along with |ftime| gives \ millisecond timing for wall-clock time? We check for the header file, not \ |ftime| itself, since |ftime| may be in a Berkeley compatibility library, \ not in libc. */ #define HAVE_SYS_TIMEB_H 0 /* Do we use our own version of |difftime()|, which computes the difference \ of two wall clock times? If so, define |NEW_DIFFTIME|. This flag should \ always be defined if |HAVE_SYS_TIMEB_H| is defined above. */ #define NEW_DIFFTIME 0 /* --- MAKING IT FIT --- */ /* Sometimes the compiler can't handle functions or switches that are too \ large. In that case, define |FCN_CALLS|. That converts certain in-line \ code (such as in the syntax production analyzer) into function calls (at \ the price of slowing things down a bit). */ #define FCN_CALLS 0 /* The personal computers are starved for memory. For those machines, we \ specify smaller default values for the lengths of dynamic arrays; define \ |SMALL_MEMORY|. (You can always use the `-y' option to override these \ defaults.) */ #define SMALL_MEMORY 0 /* Name of \FWEB's default initialization file. Please don't change these \ conventions unless you absolutely have to!!! Also, note that these \ definitions are overridden by the environment variable |FWEB_INI|, if it is \ defined. */ #ifndef SMALL_MEMORY #define SMALL_MEMORY 0 #endif #if SMALL_MEMORY #define FWEB_INI "fweb.ini" #else #define FWEB_INI ".fweb" #endif /* --- MEMORY ALLOCATIONS --- */ /* The ANSI |calloc| routine takes two arguments: |void \ *calloc(size_t,size_t)|. If the system doesn't have a standard |calloc| \ routine, or if the name isn't standard, you must define an UPPERCASE macro \ that does the same thing. (The name isn't standard on personal computers \ because one is dealing with |huge| allocations.) If you define \ |NON_ANSI_CALLOC|, you must define |CALLOC|, |REALLOC|, and |FREE|. E.g., the \ relevant definitions for Borland are \ \begintt \ #define CALLOC farcalloc \ #define REALLOC(oldblock,nbytes) \ \ farrealloc((void far *)(oldblock),(unsigned long)(nbytes)) \ #define FREE(block) farfree((void far *)(block)) \ \endtt \ */ #define NON_ANSI_CALLOC 0 /* |IBMPC| */ /* Do we supply below a routine that obtains the available memory, such \ as Borland's farcoreleft()? */ #define PRINT_AVAILABLE_MEMORY 0 /* The function call that obtains the memory is called |CORE_LEFT|. This \ function is assumed to return an |unsigned long int|. For Microsoft, we had \ to write our own routine |_hmemavl|; see below. For Borland, the routine \ should be called |farcoreleft|. For the other machines, we don't have \ anything as yet. */ /* The following flag is defined only by \common.web}. */ #ifdef COMMON_FCNS_ #if(part==0 || part==1) /* Give here the C code for any additional functions that are \ compiler-specific or missing from your implementation, such as maybe \ |strtod|. Note that these are bracketed with the flag COMMON_FCNS_ so they \ are compiled into just one module, namely common.c. You must \ always supply some version of the debugging routine |trap|, which must \ return~0 as a minimum. */ /* The default |trap| function for debugging. */ int trap(void) {return 0;} #endif /* |part == 1| */ #endif /* |COMMON_FCNS_| */ fweb-1.62/Boot/vax/READ_ME.VAX100644 10061 1115 3326 6602703212 14673 0ustar krommesusers --- BOOTSTRAPPING FWEB on VAX/VMS --- This subdirectory contains bootstrap files for VAX/VMS. (This information has not been updated or tested since 1993.) To bootstrap, do the following from your top-level fweb directory: BOOT :== [.boot.vax] copy 'BOOT'/.fweb SYS$LOGIN copy 'BOOT'/custom.h [.web] copy 'BOOT'/fweb.opt [.web] * Edit the file 'BOOT'/defaults.mk to specify the name of your compiler, form of the compile and link line, etc. Then, say @'BOOT'compile_fweb In COMPILE_FWEB.COM, the executable files are shortened by linking the run time library dynamically. See the file FWEB.OPT. This is optional. If it doesn't work, don't use it. During the compiles, you may receive warning messages---for example, ``Includes of library modules are not portable.'' Such warnings about portablility can be ignored (and will never appear if you turn off ``/standard=portable''). At least one user has run out of memory while compiling FTANGLE.C and FWEAVE.C. If this happens to you, you can compile each of those several times, following the procedure developed for the memory-starved IBM-PC. As an example, consider FTANGLE: The first time, use the compiler's command-line options ``/DEFINE="part=1"'' and ``/OBJECT=ftangle1.obj''; the second time replace '1' by '2'; do it once more, replacing '2' by '3'". Then link FTANGLE1.OBJ, FTANGLE2.OBJ, and FTANGLE3.OBJ with the other files, naming the result FTANGLE.EXE. This procedure works for FTANGLE.C, FWEAVE.C, and RESERVED.C. The original development for FWEB was done on a VAX. Although I am now working on a Sun, a VAX/VMS version is briefly tested for each release. I should be able to emulate and resolve any problems you encounter rather quickly. fweb-1.62/Boot/vax/compile_fweb.com100644 10061 1115 1233 6602703213 16346 0ustar krommesusers$! --- Simple command procedure for compiling and linking FWEB with VAX/VMS --- $! Version 1.30--beta $! January 1, 1993 $! BEFORE USING THIS PROCEDURE, you must move some files around. Please see $! $FWEB:[boot.vax]READ_ME.VAX for a detailed discussion. $! If you're bold, remove the /debug option from the cc command. $ set verify $ ccd := cc/debug $ ccd ftangle $ ccd common $ ccd eval $ ccd macs $ ccd ratfor $ ccd reserved $ ccd style $ ccd termcap0 $ link ftangle,common,eval,macs,ratfor,reserved,style,termcap0,fweb/opt $ ccd fweave $ ccd prod $ ccd ratfor0 $ link fweave,common,prod,ratfor0,reserved,style,termcap0,fweb/opt $ set noverify fweb-1.62/Boot/vax/defaults.mk100644 10061 1115 7651 6602703213 15365 0ustar krommesusers# Generated automatically from defaults.mk.in and vax.ini by FWEB_configure. # --- START of SYSTEM CONFIGURATION SECTION --- # # --- Supporting VPATH --- top_srcdir = ./.. srcdir = . VPATH = . # --- Names of system commands --- # (Used in the Makefile and possibly internally to FWEB.) MAKE = make MV = mv RM = rm TOUCH = touch # --- COMPILING --- # --- Compiler name --- CC = cc # An FWEB flag, either CC or GCC. This flag isn't used for bootstrapping; it # is required for properly regenerating custom.h by tangling custom.web. If # you're on the Sun and working with gcc, say ``COMPILER = GCC''. COMPILER = CC # --- Compiler options --- # Debugging and optimization options for the C compiler. CFLAGS = # How to run the C preprocessor CPP = # Header file search directory (-Idir) and any other miscellaneous options # for the C preprocessor and compiler. CPPFLAGS = # (Compiler macro definitions. In addition, see the discussion of PARTn # below.) DEFS = # --- The actual compile command used by the Makefile. --- COMPILE = $(CC) -c $(CFLAGS) $(CPPFLAGS) $(DEFS) -Dconst= # --- LINKING --- # --- Extensions for object files --- # $(O) is used for targets in the Makefile. $(OBJ) is the suffix used in # the link line. (Sometimes $(OBJ) can be null if the compiler understands # defaults and the length of the command line is an issue, as it is on some # personal computers.) O = o OBJ = .$(O) # TERMCAP0 is either a file name, or null. If the termcap library is # available, TERMCAP0 should be null and LIBS should include -ltermcap. # If the termcap library is not available, TERMCAP0 should be termcap0.$(O). TERMCAP0 = # --- Linker options --- # Stripping (-s) and other miscellaneous options for the linker. LDFLAGS = -g # Library options -l and -L to pass to the linker. LIBS = # --- The actual link command used by the Makefile. --- # TRY NOT TO CHANGE THIS LINE. LINK = $(CC) $(LDFLAGS) -o $(@) # --- MISCELLANEOUS --- # --- How to print a dvi file --- ECHO = echo # Use this to prevent actual printing. PRINT_DVI = print_dvi # --- FWEB flags indicating type of machine on which you're tangling # (HOME_MACHINE) and for which machine you're generating C code. --- HOME_MACHINE = VAX MACHINE = VAX # --- FWEB file suffixes --- # (For IBM-PC, shorten to ``hwe'') HWEB = hweb # --- Splitting FTANGLE & FWEAVE into several parts, especially for small # compilers on personal computers. Here's an example for the IBM-PC, # Microsoft compiler --- # --------------------------------------------------------------------------- #PART1 = /Dpart=1 #PART2 = /Dpart=2 #PART3 = /Dpart=3 #FTANGLE2 = ftangle2.$(O) #FTANGLE3 = ftangle3.$(O) #FWEAVE2 = fweave2.$(O) #FWEAVE3 = fweave3.$(O) #PROD2 = prod2.$(O) #RATFOR2 = ratfor2.$(O) #RESERVED2 = reservd2.$(O) #COMMON2 = common2.$(O) # --------------------------------------------------------------------------- # The PARTn macros are compiler options that define the macro |part| #to be n, for example ``-Dpart=2'' PART1 = PART2 = PART3 = # Here are the names of the second and third parts of the object files. FTANGLE2 = FTANGLE3 = FWEAVE2 = FWEAVE3 = PROD2 = RATFOR2 = RESERVED2 = COMMON2 = # --- INSTALLATION INFORMATION --- INSTALL = /bin/install -c INSTALL_PROGRAM = $(INSTALL) INSTALL_DATA = $(INSTALL) -m 644 # Top-level path for executable binaries (usually /usr/local): exec_prefix = /usr/local # Where the processors go: bindir = $(exec_prefix)/bin # Top-level path for everything else (usually /usr/local) prefix = /usr/local doc_prefix = $(prefix) # Where the Unix man pages go: manext = 1 mandir = $(doc_prefix)/man/man$(manext) # Where the emacs info* files go: infodir = $(doc_prefix)/info # Where the source file fweb.texinfo goes: texinfodir = $(infodir) # Where the fwebmac.sty macro package used by FWEAVE goes, as well as the # file fweb.tex needed for weaving the FWEB source code, go: texdir = $(prefix)/lib/tex/inputs # --- END of SYSTEM CONFIGURATION SECTION --- fweb-1.62/Boot/vax/fweb.com100644 10061 1115 1233 6602703213 14636 0ustar krommesusers$! This is a sample COM file that defines FWEAVE and FTANGLE to be foreign $! procedures, since they take command-line arguments. They can be abbreviated $! to the first four letters. $! $! The example assumes that the logical name TEX$FWEB has already been defined $! to point to the area where fweave.exe and ftangle.exe have been placed. $! That might be your own subdirectory, or a system area. An example of how $! to define TEX$FWEB is the text between quotes on the next line: $! "$ define tex$fweb ux2:[krommes.tex.fweb]" $! $! In the following, the first '$' indicates a foreign procedure. $ fwea*ve :== $tex$fweb:fweave $ ftan*gle :== $tex$fweb:ftangle fweb-1.62/Boot/vax/fweb.opt100644 10061 1115 34 6602703213 14620 0ustar krommesuserssys$share:vaxcrtl.exe/share fweb-1.62/Boot/unix/ 40755 10061 1115 0 6602703211 13302 5ustar krommesusersfweb-1.62/Boot/unix/ansi/ 40755 10061 1115 0 6602703201 14233 5ustar krommesusersfweb-1.62/Boot/unix/ansi/custom.h100644 10061 1115 34074 6602703157 16055 0ustar krommesusers#if(0) FTANGLE v1.60, created with UNIX on "Thursday, September 24, 1998 at 16:12." COMMAND LINE: "./ftangle ./custom -uSUN -mANSI -mCC -= /u/krommes/Fweb/1.62/Boot/unix/ansi/custom.h -# -v" RUN TIME: "Friday, September 25, 1998 at 8:02." WEB FILE: "./custom.web" CHANGE FILE: (none) #endif /* --- BOOTSTRAPPING --- */ /* To bootstrap yourself onto a new system, you should modify this file \ appropriately. In most cases, you set a flag by saying ``#define \ FLAG''---i.e., you make a null definition. Don't set these flags to~0 \ or~1. However, in a few cases the macros are not flags and must be given \ the appropriate definition. */ /* --- MACHINE COMPILER FLAG --- */ /* This must be in lower case. Presently these are drawn from the list \ {ansi, bsd, dsu, ibmpc, mac, misc, mvs, sgi, sun, vax}. These \ flags may be used in #define statements within the source code to tailor \ things to a particular compiler or operating system. If you use \ ./configure to generate custom.h, there will be no definition following \ this comment. */ #ifndef ansi #define ansi #endif /* --- FWEB SYSTEM NAME --- */ /* This is a string such as ``IBM-PC/DOS'' or ``VAX/VMS''. It is printed \ when FWEB starts up. */ #define THE_SYSTEM "ANSI/UNIX" /* --- An optional local banner, printed after the system name above. --- */ #define LOCAL_BANNER "" /* Does your compiler understand the ANSI preprocessor command \#error? \ If it does, define |HAVE_ERROR|. (I haven't figured out a general \ autoconf test yet; it seems to be impossible in principle.) */ #define HAVE_ERROR 1 /* The C preprocessor is run by the \.{-H} option. */ #define RUN_CPP "gcc -E" /* Occasionally a system command is issued to rename a file. Here's how to \ do that. */ #define MV "mv" /* Do we bother with translations to the internal |ASCII| representation? \ If so, define |TRANSLATE_ASCII|. Don't bother on |ASCII| machines. */ #define TRANSLATE_ASCII 0 /* For \It{debugging} of target machines whose character set differs from \ the one on which you're working, define |DEBUG_XCHR|. \It{Usually, this \ flag should not be defined.} When it is defined, the |TRANSLATE_ASCII| \ flag is automatically turned on, and the value of the style-file field \ `xchr' is relevant. \It{Don't use this flag unless you're a system \ developer!!!} */ #define DEBUG_XCHR 0 /* Does the operating system have a Unix-like path? \ That is, does it have the form ``/u/krommes'' rather than the VMS form \ ``ux3:[krommes]''? If so, define |UNIX_PATH|. */ #define UNIX_PATH 1 /* If the |getenv| call to obtain an environment variable is supported \ (it usually is) define |HAVE_GETENV|. */ #define HAVE_GETENV 1 /* --- FILE NAMES and EXTENSIONS --- */ /* Name of the null file. This macro merely defines the default value of \ the style-file parameter `null_file', so it's not essential to add any more \ machines here. */ #define NULL_FILE_NAME "/dev/null"/* For Unix systems. */ /* Name of \FWEB's initialization file. Please see below, after the \ definition of |SMALL_MEMORY|. */ /* Name of \FWEB's default style file. \It{Please don't change this unless \ you absolutely have to! Use the `-z' option instead.} */ #define STYLE_FILE_NAME "fweb.sty" /* Here are the default file extensions for each language. These merely \ set default style-file parameters, so it's not essential that you change \ anything here. See the parameters `suffix.C', `suffix.N', etc. */ #define C_EXT "c" #define V_EXT "mk" #define X_EXT "sty" /* Unix. */ #define Cpp_EXT "C" /* Per \.{gcc}. */ #define R_EXT "r" #define R90_EXT "r90" #define N_EXT "f" #define N90_EXT "f90" #define HAVE_TMPNAM 1 #define HAVE_TEMPNAM 0 /* The |FANCY_SPLIT| flag is used for buffering the output lines of C~code. \ Define this if the C~compiler CAN'T continue an incomplete line with a \ backslash. (ANSI compilers should be able to.) \ {\bf (This code may not be fully debugged yet!)} */ #define FANCY_SPLIT 0 /* --- INCLUDING FILES --- */ /* The code is written in C, and various header files of the form \ ``<*.h>'' are included near the beginning of each source file. The \ names of these files are standardized by ANSI. Unfortunately, not everyone \ has gotten around to ANSI yet. Therefore, here we include important files \ whose names may be nonstandard or whose functions may fluctuate. */ /* Does the ANSI exist? If so, say so here. This is supposed \ to contain prototypes for the following functions used by \FWEB: |abort|, \ |abs|, |atof|, |atoi|, |atol|, |calloc|, |exit|, |free|, |getenv|, \ |realloc|, |strtod|, |strtol|. If it doesn't, either find the prototypes \ in another file and include it here, or actually give the prototypes here. */ #define HAVE_STDLIB_H 1 #define HAVE_STDARG_H 1 /* Does the ANSI exist? If so, include it here. This is \ supposed to define the |NULL| pointer, and the type |size_t|. Sometimes \ these are defined in other places as well. */ #define HAVE_STDDEF_H 1 /* Other stuff handled by autoconf. */ #define HAVE_STRING_H 1 #define HAVE_MEMORY_H 0 #define HAVE_FLOAT_H 1 /* Does (non-ANSI) exist? You may find some useful stuff in \ here. But don't use it unless you have to. */ /* _P include */ /* Must we include an extra file for memory management? E.g., for \ Microsoft, ; for Borland; . Not necessary for ANSI; \ it's in . */ /* _P include */ /* Numerical limits. We use the following ANSI macros: |INT_MAX|, \ |INT_MIN|, |LONG_MAX|, |LONG_MIN|, and |ULONG_MAX|, which are found in \ . If you can't find those macros, define the flag \ |HAVE_VALUES_H|, and possibly include another file with different names for \ the limits, such as on the Sun. The flag |HAVE_VALUES_H| \ assumes that the macros |MAXINT| and |MAXLONG| are defined. If they are \ not, you must define them here. */ #define HAVE_LIMITS_H 1 #define HAVE_VALUES_H 0 /* Please note that additional files are included automatically \ (essentially immediately after this file is read; see ). \ These were considered to be standard, but that might be a mistake. Those \ files are: , , , , . \ Remember that by convention these files should limit themselves to being \ included only once. Therefore, if for some reason you need to include one \ of these somewhere in this file, you should be able to do it without \ difficulty; the later automatic include just won't be done if those files \ are following standard protocol. */ #define ANSI_CTYPE_H 1 /* --- VARIABLE-LENGTH ARGUMENT LISTS --- */ /* For convenience, FWEB attempts to use functions with variable numbers of \ arguments. We attempt to support two conventions: ANSI, and Sun's. If \ this feature is supported, define the flag |VARIABLE_ARGUMENTS|, say \ whether |va_start| has one or two arguments, and include the associated \ header file ( for ANSI). */ /* Does the compiler allow ANSI-style variable arguments? */ #define VARIABLE_ARGUMENTS 1 /* Is |va_start| defined with one argument (Sun's convention) or two \ (ANSI)? */ #define NUM_VA_ARGS 2 #define HAVE_STDARG_H 1 /* --- ADDITIONAL PROTOTYPES --- */ /* You may wish to collect any additional prototypes that are required and \ put them into your own header file that you include here. */ /* If the flag |HAVE_STD_PROTOTYPES| is false, it causes the file \ "stdlib0.h" to be loaded. This contains ANSI prototypes that for some \ reason aren't provided with the gcc environment on the Sun. */ #define HAVE_STD_PROTOTYPES 1 /* Define the flag |OLD_PROTOTYPES| for compilers that don't support the \ new (ANSI) style of function declaration and prototyping. The new style is \ |fcn(int i,char *s){}|; the old style is |fcn(i,s) int i; char *s; {}|. */ #define OLD_PROTOTYPES 0 /* ANSI also introduces the type |void|. If your compiler doesn't \ understand the constructions |void *| and |void fcn()|, define |NO_VOID|. */ #define NO_VOID 0 /* --- SPECIAL TYPES --- */ /* |const| seems to be an annoyance; not all compilers treat it the same \ way. We really only want it for debugging, anyway, so we mostly just \ remove it. It's kept when compiling on the Sun with gcc, because it \ gives the developer more checks on the code. If you want to keep it, \ define |KEEP_CONST|. */ #define KEEP_CONST 0 /* For personal computers, the kind of pointer is an issue. They must be \ |huge|. If your compiler understands |huge|, define |HUGE_POINTERS|. */ #define HUGE_POINTERS 0 /* --- SPECIAL FUNCTIONS --- */ /* The ANSI |sprintf| function returns the number of characters written. \ If this is the case on your system, define |ANSI_SPRINTF|. (It's always \ safe to not define it.) */ #define ANSI_SPRINTF 1 /* The ANSI |sscanf| does some cute things with scansets, but it doesn't \ always work. */ #define ANSI_SSCANF 1 /* The ANSI |system| function is supposed to take |NULL| as an argument, \ which means check if a command processor exists. If this works properly, \ defined |ANSI_SYSTEM|. (It doesn't work on the Sun.) */ #define ANSI_SYSTEM 1 /* --- ANNOYING WARNINGS --- */ /* Sometimes the compiler can't understand that the \ control flow can never get to the bottom of a function. To avoid warning \ complaints, we have the following: */ #define DUMMY_RETURN(value) return value /* --- UNUSUAL NAMES --- */ /* Put here any definitions that override standard names. For example, for \ some ancient on the MAC one had to say ``#define getc agetc''. */ /* Nothing to be done. */ /* --- DIRECTORY SPECIFICATIONS --- */ /* Directory specifications are delimited in different ways under the various \ operating systems. Unix: '/'; IBM-PC: '\\'; VAX/VMS: ']'. */ #define PREFIX_END_CHAR '/' /* The Unix convention. */ /* --- TIMING --- */ /* First of all, we have a flag to say whether timing information is \ printed at the end of the run. (If you can't figure out the timing \ routines for your machine or don't want a timing information line at the \ end of your terminal output, don't define this.) Beginning with fweb-1.53, \ timing is turned off by default. */ #define TIMING 0 /* --- Number of decimal places for timing information in seconds. (Use \ at least 2 for supercomputers.) --- */ #define TIMING_WIDTH 1 /* There's supposed to be a function |clock()| that returns the cpu time, \ in units of |CLOCKS_PER_SEC|. The type of |clock| is |clock_t|. If that \ is defined, define the flag |CLOCK_T_DEFINED|; otherwise, say |typedef ... \ clock_t| here. */ #define CLOCK_T_DEFINED 1 /* Some systems don't define |CLOCKS_PER_SEC|. If not, we try |CLK_TCK|. \ If that's not defined, it defaults to 1000000. If that's not appropriate, \ define |CLOCKS_PER_SEC| here. */ /* \ #define CLOCKS_PER_SEC 1000000 \ */ /* Are there system routines that return wall-clock time in sub-second units? \ First, look for |gettimeofday| ($\mu$sec timing). */ #define HAVE_GETTIMEOFDAY 0 /* Otherwise, does the file sys/timeb.h exist that along with |ftime| gives \ millisecond timing for wall-clock time? We check for the header file, not \ |ftime| itself, since |ftime| may be in a Berkeley compatibility library, \ not in libc. */ #define HAVE_SYS_TIMEB_H 0 /* Do we use our own version of |difftime()|, which computes the difference \ of two wall clock times? If so, define |NEW_DIFFTIME|. This flag should \ always be defined if |HAVE_SYS_TIMEB_H| is defined above. */ #define NEW_DIFFTIME 0 /* --- MAKING IT FIT --- */ /* Sometimes the compiler can't handle functions or switches that are too \ large. In that case, define |FCN_CALLS|. That converts certain in-line \ code (such as in the syntax production analyzer) into function calls (at \ the price of slowing things down a bit). */ #define FCN_CALLS 0 /* The personal computers are starved for memory. For those machines, we \ specify smaller default values for the lengths of dynamic arrays; define \ |SMALL_MEMORY|. (You can always use the `-y' option to override these \ defaults.) */ #define SMALL_MEMORY 0 /* Name of \FWEB's default initialization file. Please don't change these \ conventions unless you absolutely have to!!! Also, note that these \ definitions are overridden by the environment variable |FWEB_INI|, if it is \ defined. */ #ifndef SMALL_MEMORY #define SMALL_MEMORY 0 #endif #if SMALL_MEMORY #define FWEB_INI "fweb.ini" #else #define FWEB_INI ".fweb" #endif /* --- MEMORY ALLOCATIONS --- */ /* The ANSI |calloc| routine takes two arguments: |void \ *calloc(size_t,size_t)|. If the system doesn't have a standard |calloc| \ routine, or if the name isn't standard, you must define an UPPERCASE macro \ that does the same thing. (The name isn't standard on personal computers \ because one is dealing with |huge| allocations.) If you define \ |NON_ANSI_CALLOC|, you must define |CALLOC|, |REALLOC|, and |FREE|. E.g., the \ relevant definitions for Borland are \ \begintt \ #define CALLOC farcalloc \ #define REALLOC(oldblock,nbytes) \ \ farrealloc((void far *)(oldblock),(unsigned long)(nbytes)) \ #define FREE(block) farfree((void far *)(block)) \ \endtt \ */ #define NON_ANSI_CALLOC 0 /* |IBMPC| */ /* Do we supply below a routine that obtains the available memory, such \ as Borland's farcoreleft()? */ #define PRINT_AVAILABLE_MEMORY 0 /* The function call that obtains the memory is called |CORE_LEFT|. This \ function is assumed to return an |unsigned long int|. For Microsoft, we had \ to write our own routine |_hmemavl|; see below. For Borland, the routine \ should be called |farcoreleft|. For the other machines, we don't have \ anything as yet. */ /* The following flag is defined only by \common.web}. */ #ifdef COMMON_FCNS_ #if(part==0 || part==1) /* Give here the C code for any additional functions that are \ compiler-specific or missing from your implementation, such as maybe \ |strtod|. Note that these are bracketed with the flag COMMON_FCNS_ so they \ are compiled into just one module, namely common.c. You must \ always supply some version of the debugging routine |trap|, which must \ return~0 as a minimum. */ /* The default |trap| function for debugging. */ int trap(void) {return 0;} #endif /* |part == 1| */ #endif /* |COMMON_FCNS_| */ fweb-1.62/Boot/unix/ansi/READ_ME.ANSI100644 10061 1115 2011 6602703201 16072 0ustar krommesusers --- The ANSI-C BOOTSTRAP --- Version 1.30 May 15, 1993 (Before trying to bootstrap ``by hand'', consider whether you can use the new ./configure installation procedure. See READ_ME.FWEB for details.) This is (almost) fully ANSI code that SHOULD BE USED WHENEVER POSSIBLE. Compilers for which this code has been tested include CRAY: scc IBM-RS/6000: cc Silicon Graphics Personal Iris: cc NeXT: gcc If you are an IBM-PC user, please refer to boot/ibm/pc/READ_ME.PC for further information. Presently, FWEB departs from the ANSI standard in that (1) not all external names are unique when truncated to six characters; (2) some user routines begin with underscores. These will be fixed someday. Meanwhile, my apologies. Try the gnu gcc compiler if you have trouble. To bootstrap, please see the instructions in READ_ME.FWEB. I am very interested in ensuring that this code is really ANSI-compatible, so please let me know about any compiler problems you encounter. Thanks. fweb-1.62/Boot/unix/ansi/defaults.mk100644 10061 1115 7664 6602703201 16505 0ustar krommesusers# Generated automatically from defaults.mk.in and ansi.ini by FWEB_configure. # --- START of SYSTEM CONFIGURATION SECTION --- # # --- Supporting VPATH --- top_srcdir = ./.. srcdir = . VPATH = . # --- Names of system commands --- # (Used in the Makefile and possibly internally to FWEB.) MAKE = make MV = mv RM = rm TOUCH = touch # --- COMPILING --- # --- Compiler name --- CC = gcc # An FWEB flag, either CC or GCC. This flag isn't used for bootstrapping; it # is required for properly regenerating custom.h by tangling custom.web. If # you're on the Sun and working with gcc, say ``COMPILER = GCC''. COMPILER = GCC # --- Compiler options --- # Debugging and optimization options for the C compiler. CFLAGS = # How to run the C preprocessor CPP = # Header file search directory (-Idir) and any other miscellaneous options # for the C preprocessor and compiler. CPPFLAGS = # (Compiler macro definitions. In addition, see the discussion of PARTn # below.) DEFS = # --- The actual compile command used by the Makefile. --- COMPILE = $(CC) -c $(CFLAGS) $(CPPFLAGS) $(DEFS) -Dconst= # --- LINKING --- # --- Extensions for object files --- # $(O) is used for targets in the Makefile. $(OBJ) is the suffix used in # the link line. (Sometimes $(OBJ) can be null if the compiler understands # defaults and the length of the command line is an issue, as it is on some # personal computers.) O = o OBJ = .$(O) # TERMCAP0 is either a file name, or null. If the termcap library is # available, TERMCAP0 should be null and LIBS should include -ltermcap. # If the termcap library is not available, TERMCAP0 should be termcap0.$(O). TERMCAP0 = # --- Linker options --- # Stripping (-s) and other miscellaneous options for the linker. LDFLAGS = # Library options -l and -L to pass to the linker. LIBS = -lm # --- The actual link command used by the Makefile. --- # TRY NOT TO CHANGE THIS LINE. LINK = $(CC) $(LDFLAGS) -o $(@) # --- MISCELLANEOUS --- # --- How to print a dvi file --- ECHO = echo # Use this to prevent actual printing. PRINT_DVI = $(ECHO) lpr -d # --- FWEB flags indicating type of machine on which you're tangling # (HOME_MACHINE) and for which machine you're generating C code. --- HOME_MACHINE = ANSI MACHINE = ANSI # --- FWEB file suffixes --- # (For IBM-PC, shorten to ``hwe'') HWEB = hweb # --- Splitting FTANGLE & FWEAVE into several parts, especially for small # compilers on personal computers. Here's an example for the IBM-PC, # Microsoft compiler --- # --------------------------------------------------------------------------- #PART1 = /Dpart=1 #PART2 = /Dpart=2 #PART3 = /Dpart=3 #FTANGLE2 = ftangle2.$(O) #FTANGLE3 = ftangle3.$(O) #FWEAVE2 = fweave2.$(O) #FWEAVE3 = fweave3.$(O) #PROD2 = prod2.$(O) #RATFOR2 = ratfor2.$(O) #RESERVED2 = reservd2.$(O) #COMMON2 = common2.$(O) # --------------------------------------------------------------------------- # The PARTn macros are compiler options that define the macro |part| #to be n, for example ``-Dpart=2'' PART1 = PART2 = PART3 = # Here are the names of the second and third parts of the object files. FTANGLE2 = FTANGLE3 = FWEAVE2 = FWEAVE3 = PROD2 = RATFOR2 = RESERVED2 = COMMON2 = # --- INSTALLATION INFORMATION --- INSTALL = /bin/install -c INSTALL_PROGRAM = $(INSTALL) INSTALL_DATA = $(INSTALL) -m 644 # Top-level path for executable binaries (usually /usr/local): exec_prefix = /usr/local # Where the processors go: bindir = $(exec_prefix)/bin # Top-level path for everything else (usually /usr/local) prefix = /usr/local doc_prefix = $(prefix) # Where the Unix man pages go: manext = 1 mandir = $(doc_prefix)/man/man$(manext) # Where the emacs info* files go: infodir = $(doc_prefix)/info # Where the source file fweb.texinfo goes: texinfodir = $(infodir) # Where the fwebmac.sty macro package used by FWEAVE goes, as well as the # file fweb.tex needed for weaving the FWEB source code, go: texdir = $(prefix)/lib/tex/inputs # --- END of SYSTEM CONFIGURATION SECTION --- fweb-1.62/Boot/unix/dsu/ 40755 10061 1115 0 6602703202 14075 5ustar krommesusersfweb-1.62/Boot/unix/dsu/custom.h100644 10061 1115 34070 6602703160 15704 0ustar krommesusers#if(0) FTANGLE v1.60, created with UNIX on "Thursday, September 24, 1998 at 16:12." COMMAND LINE: "./ftangle ./custom -uSUN -mDSU -mCC -= /u/krommes/Fweb/1.62/Boot/unix/dsu/custom.h -# -v" RUN TIME: "Friday, September 25, 1998 at 8:02." WEB FILE: "./custom.web" CHANGE FILE: (none) #endif /* --- BOOTSTRAPPING --- */ /* To bootstrap yourself onto a new system, you should modify this file \ appropriately. In most cases, you set a flag by saying ``#define \ FLAG''---i.e., you make a null definition. Don't set these flags to~0 \ or~1. However, in a few cases the macros are not flags and must be given \ the appropriate definition. */ /* --- MACHINE COMPILER FLAG --- */ /* This must be in lower case. Presently these are drawn from the list \ {ansi, bsd, dsu, ibmpc, mac, misc, mvs, sgi, sun, vax}. These \ flags may be used in #define statements within the source code to tailor \ things to a particular compiler or operating system. If you use \ ./configure to generate custom.h, there will be no definition following \ this comment. */ #ifndef dsu #define dsu #endif /* |dsu| */ /* --- FWEB SYSTEM NAME --- */ /* This is a string such as ``IBM-PC/DOS'' or ``VAX/VMS''. It is printed \ when FWEB starts up. */ #define THE_SYSTEM "DECstation/ULTRIX" /* --- An optional local banner, printed after the system name above. --- */ #define LOCAL_BANNER "" /* Does your compiler understand the ANSI preprocessor command \#error? \ If it does, define |HAVE_ERROR|. (I haven't figured out a general \ autoconf test yet; it seems to be impossible in principle.) */ #define HAVE_ERROR 0 /* The C preprocessor is run by the \.{-H} option. */ #define RUN_CPP "gcc -E" /* Occasionally a system command is issued to rename a file. Here's how to \ do that. */ #define MV "mv" /* Do we bother with translations to the internal |ASCII| representation? \ If so, define |TRANSLATE_ASCII|. Don't bother on |ASCII| machines. */ #define TRANSLATE_ASCII 0 /* For \It{debugging} of target machines whose character set differs from \ the one on which you're working, define |DEBUG_XCHR|. \It{Usually, this \ flag should not be defined.} When it is defined, the |TRANSLATE_ASCII| \ flag is automatically turned on, and the value of the style-file field \ `xchr' is relevant. \It{Don't use this flag unless you're a system \ developer!!!} */ #define DEBUG_XCHR 0 /* Does the operating system have a Unix-like path? \ That is, does it have the form ``/u/krommes'' rather than the VMS form \ ``ux3:[krommes]''? If so, define |UNIX_PATH|. */ #define UNIX_PATH 1 /* If the |getenv| call to obtain an environment variable is supported \ (it usually is) define |HAVE_GETENV|. */ #define HAVE_GETENV 1 /* --- FILE NAMES and EXTENSIONS --- */ /* Name of the null file. This macro merely defines the default value of \ the style-file parameter `null_file', so it's not essential to add any more \ machines here. */ #define NULL_FILE_NAME "/dev/null"/* For Unix systems. */ /* Name of \FWEB's initialization file. Please see below, after the \ definition of |SMALL_MEMORY|. */ /* Name of \FWEB's default style file. \It{Please don't change this unless \ you absolutely have to! Use the `-z' option instead.} */ #define STYLE_FILE_NAME "fweb.sty" /* Here are the default file extensions for each language. These merely \ set default style-file parameters, so it's not essential that you change \ anything here. See the parameters `suffix.C', `suffix.N', etc. */ #define C_EXT "c" #define V_EXT "mk" #define X_EXT "sty" /* Unix. */ #define Cpp_EXT "C" /* Per \.{gcc}. */ #define R_EXT "r" #define R90_EXT "r90" #define N_EXT "f" #define N90_EXT "f90" #define HAVE_TMPNAM 1 #define HAVE_TEMPNAM 0 /* The |FANCY_SPLIT| flag is used for buffering the output lines of C~code. \ Define this if the C~compiler CAN'T continue an incomplete line with a \ backslash. (ANSI compilers should be able to.) \ {\bf (This code may not be fully debugged yet!)} */ #define FANCY_SPLIT 1 /* --- INCLUDING FILES --- */ /* The code is written in C, and various header files of the form \ ``<*.h>'' are included near the beginning of each source file. The \ names of these files are standardized by ANSI. Unfortunately, not everyone \ has gotten around to ANSI yet. Therefore, here we include important files \ whose names may be nonstandard or whose functions may fluctuate. */ /* Does the ANSI exist? If so, say so here. This is supposed \ to contain prototypes for the following functions used by \FWEB: |abort|, \ |abs|, |atof|, |atoi|, |atol|, |calloc|, |exit|, |free|, |getenv|, \ |realloc|, |strtod|, |strtol|. If it doesn't, either find the prototypes \ in another file and include it here, or actually give the prototypes here. */ #define HAVE_STDLIB_H 1 #define HAVE_STDARG_H 1 /* Does the ANSI exist? If so, include it here. This is \ supposed to define the |NULL| pointer, and the type |size_t|. Sometimes \ these are defined in other places as well. */ #define HAVE_STDDEF_H 0 /* Other stuff handled by autoconf. */ #define HAVE_STRING_H 1 #define HAVE_MEMORY_H 0 #define HAVE_FLOAT_H 1 /* Does (non-ANSI) exist? You may find some useful stuff in \ here. But don't use it unless you have to. */ _P include /* Must we include an extra file for memory management? E.g., for \ Microsoft, ; for Borland; . Not necessary for ANSI; \ it's in . */ /* _P include */ /* Numerical limits. We use the following ANSI macros: |INT_MAX|, \ |INT_MIN|, |LONG_MAX|, |LONG_MIN|, and |ULONG_MAX|, which are found in \ . If you can't find those macros, define the flag \ |HAVE_VALUES_H|, and possibly include another file with different names for \ the limits, such as on the Sun. The flag |HAVE_VALUES_H| \ assumes that the macros |MAXINT| and |MAXLONG| are defined. If they are \ not, you must define them here. */ #define HAVE_LIMITS_H 1 #define HAVE_VALUES_H 0 /* Please note that additional files are included automatically \ (essentially immediately after this file is read; see ). \ These were considered to be standard, but that might be a mistake. Those \ files are: , , , , . \ Remember that by convention these files should limit themselves to being \ included only once. Therefore, if for some reason you need to include one \ of these somewhere in this file, you should be able to do it without \ difficulty; the later automatic include just won't be done if those files \ are following standard protocol. */ #define ANSI_CTYPE_H 0 /* --- VARIABLE-LENGTH ARGUMENT LISTS --- */ /* For convenience, FWEB attempts to use functions with variable numbers of \ arguments. We attempt to support two conventions: ANSI, and Sun's. If \ this feature is supported, define the flag |VARIABLE_ARGUMENTS|, say \ whether |va_start| has one or two arguments, and include the associated \ header file ( for ANSI). */ /* Does the compiler allow ANSI-style variable arguments? */ #define VARIABLE_ARGUMENTS 0 /* Is |va_start| defined with one argument (Sun's convention) or two \ (ANSI)? */ #define NUM_VA_ARGS 2 #define HAVE_STDARG_H 1 /* --- ADDITIONAL PROTOTYPES --- */ /* You may wish to collect any additional prototypes that are required and \ put them into your own header file that you include here. */ /* If the flag |HAVE_STD_PROTOTYPES| is false, it causes the file \ "stdlib0.h" to be loaded. This contains ANSI prototypes that for some \ reason aren't provided with the gcc environment on the Sun. */ #define HAVE_STD_PROTOTYPES 1 /* Define the flag |OLD_PROTOTYPES| for compilers that don't support the \ new (ANSI) style of function declaration and prototyping. The new style is \ |fcn(int i,char *s){}|; the old style is |fcn(i,s) int i; char *s; {}|. */ #define OLD_PROTOTYPES 1 /* ANSI also introduces the type |void|. If your compiler doesn't \ understand the constructions |void *| and |void fcn()|, define |NO_VOID|. */ #define NO_VOID 1 /* --- SPECIAL TYPES --- */ /* |const| seems to be an annoyance; not all compilers treat it the same \ way. We really only want it for debugging, anyway, so we mostly just \ remove it. It's kept when compiling on the Sun with gcc, because it \ gives the developer more checks on the code. If you want to keep it, \ define |KEEP_CONST|. */ #define KEEP_CONST 0 /* For personal computers, the kind of pointer is an issue. They must be \ |huge|. If your compiler understands |huge|, define |HUGE_POINTERS|. */ #define HUGE_POINTERS 0 /* --- SPECIAL FUNCTIONS --- */ /* The ANSI |sprintf| function returns the number of characters written. \ If this is the case on your system, define |ANSI_SPRINTF|. (It's always \ safe to not define it.) */ #define ANSI_SPRINTF 0 /* The ANSI |sscanf| does some cute things with scansets, but it doesn't \ always work. */ #define ANSI_SSCANF 0 /* The ANSI |system| function is supposed to take |NULL| as an argument, \ which means check if a command processor exists. If this works properly, \ defined |ANSI_SYSTEM|. (It doesn't work on the Sun.) */ #define ANSI_SYSTEM 0 /* --- ANNOYING WARNINGS --- */ /* Sometimes the compiler can't understand that the \ control flow can never get to the bottom of a function. To avoid warning \ complaints, we have the following: */ #define DUMMY_RETURN(value) /* --- UNUSUAL NAMES --- */ /* Put here any definitions that override standard names. For example, for \ some ancient on the MAC one had to say ``#define getc agetc''. */ /* Nothing to be done. */ /* --- DIRECTORY SPECIFICATIONS --- */ /* Directory specifications are delimited in different ways under the various \ operating systems. Unix: '/'; IBM-PC: '\\'; VAX/VMS: ']'. */ #define PREFIX_END_CHAR '/' /* The Unix convention. */ /* --- TIMING --- */ /* First of all, we have a flag to say whether timing information is \ printed at the end of the run. (If you can't figure out the timing \ routines for your machine or don't want a timing information line at the \ end of your terminal output, don't define this.) Beginning with fweb-1.53, \ timing is turned off by default. */ #define TIMING 0 /* --- Number of decimal places for timing information in seconds. (Use \ at least 2 for supercomputers.) --- */ #define TIMING_WIDTH 1 /* There's supposed to be a function |clock()| that returns the cpu time, \ in units of |CLOCKS_PER_SEC|. The type of |clock| is |clock_t|. If that \ is defined, define the flag |CLOCK_T_DEFINED|; otherwise, say |typedef ... \ clock_t| here. */ #define CLOCK_T_DEFINED 1 /* Some systems don't define |CLOCKS_PER_SEC|. If not, we try |CLK_TCK|. \ If that's not defined, it defaults to 1000000. If that's not appropriate, \ define |CLOCKS_PER_SEC| here. */ /* \ #define CLOCKS_PER_SEC 1000000 \ */ /* Are there system routines that return wall-clock time in sub-second units? \ First, look for |gettimeofday| ($\mu$sec timing). */ #define HAVE_GETTIMEOFDAY 0 /* Otherwise, does the file sys/timeb.h exist that along with |ftime| gives \ millisecond timing for wall-clock time? We check for the header file, not \ |ftime| itself, since |ftime| may be in a Berkeley compatibility library, \ not in libc. */ #define HAVE_SYS_TIMEB_H 1 /* Do we use our own version of |difftime()|, which computes the difference \ of two wall clock times? If so, define |NEW_DIFFTIME|. This flag should \ always be defined if |HAVE_SYS_TIMEB_H| is defined above. */ #define NEW_DIFFTIME 1 /* --- MAKING IT FIT --- */ /* Sometimes the compiler can't handle functions or switches that are too \ large. In that case, define |FCN_CALLS|. That converts certain in-line \ code (such as in the syntax production analyzer) into function calls (at \ the price of slowing things down a bit). */ #define FCN_CALLS 0 /* The personal computers are starved for memory. For those machines, we \ specify smaller default values for the lengths of dynamic arrays; define \ |SMALL_MEMORY|. (You can always use the `-y' option to override these \ defaults.) */ #define SMALL_MEMORY 0 /* Name of \FWEB's default initialization file. Please don't change these \ conventions unless you absolutely have to!!! Also, note that these \ definitions are overridden by the environment variable |FWEB_INI|, if it is \ defined. */ #ifndef SMALL_MEMORY #define SMALL_MEMORY 0 #endif #if SMALL_MEMORY #define FWEB_INI "fweb.ini" #else #define FWEB_INI ".fweb" #endif /* --- MEMORY ALLOCATIONS --- */ /* The ANSI |calloc| routine takes two arguments: |void \ *calloc(size_t,size_t)|. If the system doesn't have a standard |calloc| \ routine, or if the name isn't standard, you must define an UPPERCASE macro \ that does the same thing. (The name isn't standard on personal computers \ because one is dealing with |huge| allocations.) If you define \ |NON_ANSI_CALLOC|, you must define |CALLOC|, |REALLOC|, and |FREE|. E.g., the \ relevant definitions for Borland are \ \begintt \ #define CALLOC farcalloc \ #define REALLOC(oldblock,nbytes) \ \ farrealloc((void far *)(oldblock),(unsigned long)(nbytes)) \ #define FREE(block) farfree((void far *)(block)) \ \endtt \ */ #define NON_ANSI_CALLOC 0 /* |IBMPC| */ /* Do we supply below a routine that obtains the available memory, such \ as Borland's farcoreleft()? */ #define PRINT_AVAILABLE_MEMORY 0 /* The function call that obtains the memory is called |CORE_LEFT|. This \ function is assumed to return an |unsigned long int|. For Microsoft, we had \ to write our own routine |_hmemavl|; see below. For Borland, the routine \ should be called |farcoreleft|. For the other machines, we don't have \ anything as yet. */ /* The following flag is defined only by \common.web}. */ #ifdef COMMON_FCNS_ #if(part==0 || part==1) /* Give here the C code for any additional functions that are \ compiler-specific or missing from your implementation, such as maybe \ |strtod|. Note that these are bracketed with the flag COMMON_FCNS_ so they \ are compiled into just one module, namely common.c. You must \ always supply some version of the debugging routine |trap|, which must \ return~0 as a minimum. */ /* The default |trap| function for debugging. */ int trap(void) {return 0;} #endif /* |part == 1| */ #endif /* |COMMON_FCNS_| */ fweb-1.62/Boot/unix/dsu/READ_ME.DSU100644 10061 1115 1140 6602703202 15637 0ustar krommesusers --- BOOTSTRAPPING FWEB on the DECSTATION --- Version 1.30 May 15, 1993 Before trying this bootstrap, try ./configure. See READ_ME.FWEB for details. This subdirectory contains bootstrap files for the DECstation/ULTRIX. The MIPS compiler seemed to have trouble with function prototyping and var_args, so they were turned off. Because of turning off var_args, I can't be sure that all error messages will work correctly. If they do not, please let me know. In any event, I do have a DECstation available, so I should be able to emulate any problems people may run into. fweb-1.62/Boot/unix/dsu/defaults.mk100644 10061 1115 7661 6602703202 16344 0ustar krommesusers# Generated automatically from defaults.mk.in and dsu.ini by FWEB_configure. # --- START of SYSTEM CONFIGURATION SECTION --- # # --- Supporting VPATH --- top_srcdir = ./.. srcdir = . VPATH = . # --- Names of system commands --- # (Used in the Makefile and possibly internally to FWEB.) MAKE = make MV = mv RM = rm TOUCH = touch # --- COMPILING --- # --- Compiler name --- CC = cc # An FWEB flag, either CC or GCC. This flag isn't used for bootstrapping; it # is required for properly regenerating custom.h by tangling custom.web. If # you're on the Sun and working with gcc, say ``COMPILER = GCC''. COMPILER = CC # --- Compiler options --- # Debugging and optimization options for the C compiler. CFLAGS = # How to run the C preprocessor CPP = # Header file search directory (-Idir) and any other miscellaneous options # for the C preprocessor and compiler. CPPFLAGS = # (Compiler macro definitions. In addition, see the discussion of PARTn # below.) DEFS = # --- The actual compile command used by the Makefile. --- COMPILE = $(CC) -c $(CFLAGS) $(CPPFLAGS) $(DEFS) -Dconst= # --- LINKING --- # --- Extensions for object files --- # $(O) is used for targets in the Makefile. $(OBJ) is the suffix used in # the link line. (Sometimes $(OBJ) can be null if the compiler understands # defaults and the length of the command line is an issue, as it is on some # personal computers.) O = o OBJ = .$(O) # TERMCAP0 is either a file name, or null. If the termcap library is # available, TERMCAP0 should be null and LIBS should include -ltermcap. # If the termcap library is not available, TERMCAP0 should be termcap0.$(O). TERMCAP0 = # --- Linker options --- # Stripping (-s) and other miscellaneous options for the linker. LDFLAGS = -g # Library options -l and -L to pass to the linker. LIBS = -lm # --- The actual link command used by the Makefile. --- # TRY NOT TO CHANGE THIS LINE. LINK = $(CC) $(LDFLAGS) -o $(@) # --- MISCELLANEOUS --- # --- How to print a dvi file --- ECHO = echo # Use this to prevent actual printing. PRINT_DVI = $(ECHO) lpr -d # --- FWEB flags indicating type of machine on which you're tangling # (HOME_MACHINE) and for which machine you're generating C code. --- HOME_MACHINE = DSU MACHINE = DSU # --- FWEB file suffixes --- # (For IBM-PC, shorten to ``hwe'') HWEB = hweb # --- Splitting FTANGLE & FWEAVE into several parts, especially for small # compilers on personal computers. Here's an example for the IBM-PC, # Microsoft compiler --- # --------------------------------------------------------------------------- #PART1 = /Dpart=1 #PART2 = /Dpart=2 #PART3 = /Dpart=3 #FTANGLE2 = ftangle2.$(O) #FTANGLE3 = ftangle3.$(O) #FWEAVE2 = fweave2.$(O) #FWEAVE3 = fweave3.$(O) #PROD2 = prod2.$(O) #RATFOR2 = ratfor2.$(O) #RESERVED2 = reservd2.$(O) #COMMON2 = common2.$(O) # --------------------------------------------------------------------------- # The PARTn macros are compiler options that define the macro |part| #to be n, for example ``-Dpart=2'' PART1 = PART2 = PART3 = # Here are the names of the second and third parts of the object files. FTANGLE2 = FTANGLE3 = FWEAVE2 = FWEAVE3 = PROD2 = RATFOR2 = RESERVED2 = COMMON2 = # --- INSTALLATION INFORMATION --- INSTALL = /bin/install -c INSTALL_PROGRAM = $(INSTALL) INSTALL_DATA = $(INSTALL) -m 644 # Top-level path for executable binaries (usually /usr/local): exec_prefix = /usr/local # Where the processors go: bindir = $(exec_prefix)/bin # Top-level path for everything else (usually /usr/local) prefix = /usr/local doc_prefix = $(prefix) # Where the Unix man pages go: manext = 1 mandir = $(doc_prefix)/man/man$(manext) # Where the emacs info* files go: infodir = $(doc_prefix)/info # Where the source file fweb.texinfo goes: texinfodir = $(infodir) # Where the fwebmac.sty macro package used by FWEAVE goes, as well as the # file fweb.tex needed for weaving the FWEB source code, go: texdir = $(prefix)/lib/tex/inputs # --- END of SYSTEM CONFIGURATION SECTION --- fweb-1.62/Boot/unix/sgi/ 40755 10061 1115 0 6602703203 14065 5ustar krommesusersfweb-1.62/Boot/unix/sgi/custom.h100644 10061 1115 34053 6602703164 15700 0ustar krommesusers#if(0) FTANGLE v1.60, created with UNIX on "Thursday, September 24, 1998 at 16:12." COMMAND LINE: "./ftangle ./custom -uSUN -mSGI -mCC -= /u/krommes/Fweb/1.62/Boot/unix/sgi/custom.h -# -v" RUN TIME: "Friday, September 25, 1998 at 8:02." WEB FILE: "./custom.web" CHANGE FILE: (none) #endif /* --- BOOTSTRAPPING --- */ /* To bootstrap yourself onto a new system, you should modify this file \ appropriately. In most cases, you set a flag by saying ``#define \ FLAG''---i.e., you make a null definition. Don't set these flags to~0 \ or~1. However, in a few cases the macros are not flags and must be given \ the appropriate definition. */ /* --- MACHINE COMPILER FLAG --- */ /* This must be in lower case. Presently these are drawn from the list \ {ansi, bsd, dsu, ibmpc, mac, misc, mvs, sgi, sun, vax}. These \ flags may be used in #define statements within the source code to tailor \ things to a particular compiler or operating system. If you use \ ./configure to generate custom.h, there will be no definition following \ this comment. */ #ifndef sgi #define sgi #endif /* |sgi| */ /* --- FWEB SYSTEM NAME --- */ /* This is a string such as ``IBM-PC/DOS'' or ``VAX/VMS''. It is printed \ when FWEB starts up. */ #define THE_SYSTEM "Iris" /* --- An optional local banner, printed after the system name above. --- */ #define LOCAL_BANNER "" /* Does your compiler understand the ANSI preprocessor command \#error? \ If it does, define |HAVE_ERROR|. (I haven't figured out a general \ autoconf test yet; it seems to be impossible in principle.) */ #define HAVE_ERROR 0 /* The C preprocessor is run by the \.{-H} option. */ #define RUN_CPP "gcc -E" /* Occasionally a system command is issued to rename a file. Here's how to \ do that. */ #define MV "mv" /* Do we bother with translations to the internal |ASCII| representation? \ If so, define |TRANSLATE_ASCII|. Don't bother on |ASCII| machines. */ #define TRANSLATE_ASCII 0 /* For \It{debugging} of target machines whose character set differs from \ the one on which you're working, define |DEBUG_XCHR|. \It{Usually, this \ flag should not be defined.} When it is defined, the |TRANSLATE_ASCII| \ flag is automatically turned on, and the value of the style-file field \ `xchr' is relevant. \It{Don't use this flag unless you're a system \ developer!!!} */ #define DEBUG_XCHR 0 /* Does the operating system have a Unix-like path? \ That is, does it have the form ``/u/krommes'' rather than the VMS form \ ``ux3:[krommes]''? If so, define |UNIX_PATH|. */ #define UNIX_PATH 1 /* If the |getenv| call to obtain an environment variable is supported \ (it usually is) define |HAVE_GETENV|. */ #define HAVE_GETENV 1 /* --- FILE NAMES and EXTENSIONS --- */ /* Name of the null file. This macro merely defines the default value of \ the style-file parameter `null_file', so it's not essential to add any more \ machines here. */ #define NULL_FILE_NAME "/dev/null"/* For Unix systems. */ /* Name of \FWEB's initialization file. Please see below, after the \ definition of |SMALL_MEMORY|. */ /* Name of \FWEB's default style file. \It{Please don't change this unless \ you absolutely have to! Use the `-z' option instead.} */ #define STYLE_FILE_NAME "fweb.sty" /* Here are the default file extensions for each language. These merely \ set default style-file parameters, so it's not essential that you change \ anything here. See the parameters `suffix.C', `suffix.N', etc. */ #define C_EXT "c" #define V_EXT "mk" #define X_EXT "sty" /* Unix. */ #define Cpp_EXT "C" /* Per \.{gcc}. */ #define R_EXT "r" #define R90_EXT "r90" #define N_EXT "f" #define N90_EXT "f90" #define HAVE_TMPNAM 1 #define HAVE_TEMPNAM 0 /* The |FANCY_SPLIT| flag is used for buffering the output lines of C~code. \ Define this if the C~compiler CAN'T continue an incomplete line with a \ backslash. (ANSI compilers should be able to.) \ {\bf (This code may not be fully debugged yet!)} */ #define FANCY_SPLIT 0 /* --- INCLUDING FILES --- */ /* The code is written in C, and various header files of the form \ ``<*.h>'' are included near the beginning of each source file. The \ names of these files are standardized by ANSI. Unfortunately, not everyone \ has gotten around to ANSI yet. Therefore, here we include important files \ whose names may be nonstandard or whose functions may fluctuate. */ /* Does the ANSI exist? If so, say so here. This is supposed \ to contain prototypes for the following functions used by \FWEB: |abort|, \ |abs|, |atof|, |atoi|, |atol|, |calloc|, |exit|, |free|, |getenv|, \ |realloc|, |strtod|, |strtol|. If it doesn't, either find the prototypes \ in another file and include it here, or actually give the prototypes here. */ #define HAVE_STDLIB_H 1 #define HAVE_STDARG_H 1 /* Does the ANSI exist? If so, include it here. This is \ supposed to define the |NULL| pointer, and the type |size_t|. Sometimes \ these are defined in other places as well. */ #define HAVE_STDDEF_H 0 /* Other stuff handled by autoconf. */ #define HAVE_STRING_H 1 #define HAVE_MEMORY_H 0 #define HAVE_FLOAT_H 1 /* Does (non-ANSI) exist? You may find some useful stuff in \ here. But don't use it unless you have to. */ _P include /* Must we include an extra file for memory management? E.g., for \ Microsoft, ; for Borland; . Not necessary for ANSI; \ it's in . */ /* _P include */ /* Numerical limits. We use the following ANSI macros: |INT_MAX|, \ |INT_MIN|, |LONG_MAX|, |LONG_MIN|, and |ULONG_MAX|, which are found in \ . If you can't find those macros, define the flag \ |HAVE_VALUES_H|, and possibly include another file with different names for \ the limits, such as on the Sun. The flag |HAVE_VALUES_H| \ assumes that the macros |MAXINT| and |MAXLONG| are defined. If they are \ not, you must define them here. */ #define HAVE_LIMITS_H 1 #define HAVE_VALUES_H 0 /* Please note that additional files are included automatically \ (essentially immediately after this file is read; see ). \ These were considered to be standard, but that might be a mistake. Those \ files are: , , , , . \ Remember that by convention these files should limit themselves to being \ included only once. Therefore, if for some reason you need to include one \ of these somewhere in this file, you should be able to do it without \ difficulty; the later automatic include just won't be done if those files \ are following standard protocol. */ #define ANSI_CTYPE_H 0 /* --- VARIABLE-LENGTH ARGUMENT LISTS --- */ /* For convenience, FWEB attempts to use functions with variable numbers of \ arguments. We attempt to support two conventions: ANSI, and Sun's. If \ this feature is supported, define the flag |VARIABLE_ARGUMENTS|, say \ whether |va_start| has one or two arguments, and include the associated \ header file ( for ANSI). */ /* Does the compiler allow ANSI-style variable arguments? */ #define VARIABLE_ARGUMENTS 0 /* Is |va_start| defined with one argument (Sun's convention) or two \ (ANSI)? */ #define NUM_VA_ARGS 2 #define HAVE_STDARG_H 1 /* --- ADDITIONAL PROTOTYPES --- */ /* You may wish to collect any additional prototypes that are required and \ put them into your own header file that you include here. */ /* If the flag |HAVE_STD_PROTOTYPES| is false, it causes the file \ "stdlib0.h" to be loaded. This contains ANSI prototypes that for some \ reason aren't provided with the gcc environment on the Sun. */ #define HAVE_STD_PROTOTYPES 1 /* Define the flag |OLD_PROTOTYPES| for compilers that don't support the \ new (ANSI) style of function declaration and prototyping. The new style is \ |fcn(int i,char *s){}|; the old style is |fcn(i,s) int i; char *s; {}|. */ #define OLD_PROTOTYPES 1 /* ANSI also introduces the type |void|. If your compiler doesn't \ understand the constructions |void *| and |void fcn()|, define |NO_VOID|. */ #define NO_VOID 1 /* --- SPECIAL TYPES --- */ /* |const| seems to be an annoyance; not all compilers treat it the same \ way. We really only want it for debugging, anyway, so we mostly just \ remove it. It's kept when compiling on the Sun with gcc, because it \ gives the developer more checks on the code. If you want to keep it, \ define |KEEP_CONST|. */ #define KEEP_CONST 0 /* For personal computers, the kind of pointer is an issue. They must be \ |huge|. If your compiler understands |huge|, define |HUGE_POINTERS|. */ #define HUGE_POINTERS 0 /* --- SPECIAL FUNCTIONS --- */ /* The ANSI |sprintf| function returns the number of characters written. \ If this is the case on your system, define |ANSI_SPRINTF|. (It's always \ safe to not define it.) */ #define ANSI_SPRINTF 0 /* The ANSI |sscanf| does some cute things with scansets, but it doesn't \ always work. */ #define ANSI_SSCANF 0 /* The ANSI |system| function is supposed to take |NULL| as an argument, \ which means check if a command processor exists. If this works properly, \ defined |ANSI_SYSTEM|. (It doesn't work on the Sun.) */ #define ANSI_SYSTEM 0 /* --- ANNOYING WARNINGS --- */ /* Sometimes the compiler can't understand that the \ control flow can never get to the bottom of a function. To avoid warning \ complaints, we have the following: */ #define DUMMY_RETURN(value) /* --- UNUSUAL NAMES --- */ /* Put here any definitions that override standard names. For example, for \ some ancient on the MAC one had to say ``#define getc agetc''. */ /* Nothing to be done. */ /* --- DIRECTORY SPECIFICATIONS --- */ /* Directory specifications are delimited in different ways under the various \ operating systems. Unix: '/'; IBM-PC: '\\'; VAX/VMS: ']'. */ #define PREFIX_END_CHAR '/' /* The Unix convention. */ /* --- TIMING --- */ /* First of all, we have a flag to say whether timing information is \ printed at the end of the run. (If you can't figure out the timing \ routines for your machine or don't want a timing information line at the \ end of your terminal output, don't define this.) Beginning with fweb-1.53, \ timing is turned off by default. */ #define TIMING 0 /* --- Number of decimal places for timing information in seconds. (Use \ at least 2 for supercomputers.) --- */ #define TIMING_WIDTH 1 /* There's supposed to be a function |clock()| that returns the cpu time, \ in units of |CLOCKS_PER_SEC|. The type of |clock| is |clock_t|. If that \ is defined, define the flag |CLOCK_T_DEFINED|; otherwise, say |typedef ... \ clock_t| here. */ #define CLOCK_T_DEFINED 0 /* Some systems don't define |CLOCKS_PER_SEC|. If not, we try |CLK_TCK|. \ If that's not defined, it defaults to 1000000. If that's not appropriate, \ define |CLOCKS_PER_SEC| here. */ /* \ #define CLOCKS_PER_SEC 1000000 \ */ /* Are there system routines that return wall-clock time in sub-second units? \ First, look for |gettimeofday| ($\mu$sec timing). */ #define HAVE_GETTIMEOFDAY 0 /* Otherwise, does the file sys/timeb.h exist that along with |ftime| gives \ millisecond timing for wall-clock time? We check for the header file, not \ |ftime| itself, since |ftime| may be in a Berkeley compatibility library, \ not in libc. */ #define HAVE_SYS_TIMEB_H 0 /* Do we use our own version of |difftime()|, which computes the difference \ of two wall clock times? If so, define |NEW_DIFFTIME|. This flag should \ always be defined if |HAVE_SYS_TIMEB_H| is defined above. */ #define NEW_DIFFTIME 1 /* --- MAKING IT FIT --- */ /* Sometimes the compiler can't handle functions or switches that are too \ large. In that case, define |FCN_CALLS|. That converts certain in-line \ code (such as in the syntax production analyzer) into function calls (at \ the price of slowing things down a bit). */ #define FCN_CALLS 0 /* The personal computers are starved for memory. For those machines, we \ specify smaller default values for the lengths of dynamic arrays; define \ |SMALL_MEMORY|. (You can always use the `-y' option to override these \ defaults.) */ #define SMALL_MEMORY 0 /* Name of \FWEB's default initialization file. Please don't change these \ conventions unless you absolutely have to!!! Also, note that these \ definitions are overridden by the environment variable |FWEB_INI|, if it is \ defined. */ #ifndef SMALL_MEMORY #define SMALL_MEMORY 0 #endif #if SMALL_MEMORY #define FWEB_INI "fweb.ini" #else #define FWEB_INI ".fweb" #endif /* --- MEMORY ALLOCATIONS --- */ /* The ANSI |calloc| routine takes two arguments: |void \ *calloc(size_t,size_t)|. If the system doesn't have a standard |calloc| \ routine, or if the name isn't standard, you must define an UPPERCASE macro \ that does the same thing. (The name isn't standard on personal computers \ because one is dealing with |huge| allocations.) If you define \ |NON_ANSI_CALLOC|, you must define |CALLOC|, |REALLOC|, and |FREE|. E.g., the \ relevant definitions for Borland are \ \begintt \ #define CALLOC farcalloc \ #define REALLOC(oldblock,nbytes) \ \ farrealloc((void far *)(oldblock),(unsigned long)(nbytes)) \ #define FREE(block) farfree((void far *)(block)) \ \endtt \ */ #define NON_ANSI_CALLOC 0 /* |IBMPC| */ /* Do we supply below a routine that obtains the available memory, such \ as Borland's farcoreleft()? */ #define PRINT_AVAILABLE_MEMORY 0 /* The function call that obtains the memory is called |CORE_LEFT|. This \ function is assumed to return an |unsigned long int|. For Microsoft, we had \ to write our own routine |_hmemavl|; see below. For Borland, the routine \ should be called |farcoreleft|. For the other machines, we don't have \ anything as yet. */ /* The following flag is defined only by \common.web}. */ #ifdef COMMON_FCNS_ #if(part==0 || part==1) /* Give here the C code for any additional functions that are \ compiler-specific or missing from your implementation, such as maybe \ |strtod|. Note that these are bracketed with the flag COMMON_FCNS_ so they \ are compiled into just one module, namely common.c. You must \ always supply some version of the debugging routine |trap|, which must \ return~0 as a minimum. */ /* The default |trap| function for debugging. */ int trap(void) {return 0;} #endif /* |part == 1| */ #endif /* |COMMON_FCNS_| */ fweb-1.62/Boot/unix/sgi/READ_ME.SGI100644 10061 1115 1075 6602703203 15625 0ustar krommesusers --- BOOTSTRAPPING FWEB on the SILICON GRAPHICS PERSONAL IRIS --- Version 1.30 May 15, 1993 This subdirectory contains bootstrap files for Silicon Graphics workstations. First, see whether you can't bootstrap using ./configure (see READ_ME.FWEB) or the ansi version; see the discussion in boot/unix/ansi/READ_ME.ANSI. I have been able to do this successfully for version 4D1-3.3.2. If you get compiler errors from the ansi version, then try the stuff in this subdirectory: To bootstrap, please see the instructions in READ_ME.FWEB. fweb-1.62/Boot/unix/sgi/defaults.mk100644 10061 1115 7617 6602703203 16335 0ustar krommesusers# Generated automatically from defaults.mk.in and sgi.ini by FWEB_configure. # --- START of SYSTEM CONFIGURATION SECTION --- # # --- Supporting VPATH --- top_srcdir = ./.. srcdir = . VPATH = . # --- Names of system commands --- # (Used in the Makefile and possibly internally to FWEB.) MAKE = make MV = mv RM = rm TOUCH = touch # --- COMPILING --- # --- Compiler name --- CC = cc # An FWEB flag, either CC or GCC. This flag isn't used for bootstrapping; it # is required for properly regenerating custom.h by tangling custom.web. If # you're on the Sun and working with gcc, say ``COMPILER = GCC''. COMPILER = CC # --- Compiler options --- # Debugging and optimization options for the C compiler. CFLAGS = # How to run the C preprocessor CPP = # Header file search directory (-Idir) and any other miscellaneous options # for the C preprocessor and compiler. CPPFLAGS = # (Compiler macro definitions. In addition, see the discussion of PARTn # below.) DEFS = # --- The actual compile command used by the Makefile. --- COMPILE = $(CC) -c $(CFLAGS) $(CPPFLAGS) $(DEFS) -Dconst= # --- LINKING --- # --- Extensions for object files --- # $(O) is used for targets in the Makefile. $(OBJ) is the suffix used in # the link line. (Sometimes $(OBJ) can be null if the compiler understands # defaults and the length of the command line is an issue, as it is on some # personal computers.) O = o OBJ = .$(O) # TERMCAP0 is either a file name, or null. If the termcap library is # available, TERMCAP0 should be null and LIBS should include -ltermcap. # If the termcap library is not available, TERMCAP0 should be termcap0.$(O). TERMCAP0 = # --- Linker options --- # Stripping (-s) and other miscellaneous options for the linker. LDFLAGS = -g # Library options -l and -L to pass to the linker. LIBS = -lm # --- The actual link command used by the Makefile. --- # TRY NOT TO CHANGE THIS LINE. LINK = $(CC) $(LDFLAGS) -o $(@) # --- MISCELLANEOUS --- # --- How to print a dvi file --- ECHO = echo # Use this to prevent actual printing. PRINT_DVI = $(ECHO) lpr -d # --- FWEB flags indicating type of machine on which you're tangling # (HOME_MACHINE) and for which machine you're generating C code. --- HOME_MACHINE = SGI MACHINE = SGI # --- FWEB file suffixes --- # (For IBM-PC, shorten to ``hwe'') HWEB = hweb # --- Splitting FTANGLE & FWEAVE into several parts, especially for small # compilers on personal computers. Here's an example for the IBM-PC, # Microsoft compiler --- # --------------------------------------------------------------------------- #PART1 = /Dpart=1 #PART2 = /Dpart=2 #PART3 = /Dpart=3 #FTANGLE2 = ftangle2.$(O) #FTANGLE3 = ftangle3.$(O) #FWEAVE2 = fweave2.$(O) #FWEAVE3 = fweave3.$(O) #PROD2 = prod2.$(O) #RATFOR2 = ratfor2.$(O) #RESERVED2 = reservd2.$(O) #COMMON2 = common2.$(O) # --------------------------------------------------------------------------- # The PARTn macros are compiler options that define the macro |part| #to be n, for example ``-Dpart=2'' PART1 = PART2 = PART3 = # Here are the names of the second and third parts of the object files. FTANGLE2 = FTANGLE3 = FWEAVE2 = FWEAVE3 = PROD2 = RATFOR2 = RESERVED2 = COMMON2 = # --- INSTALLATION INFORMATION --- INSTALL = /bin/install -c INSTALL_PROGRAM = $(INSTALL) INSTALL_DATA = $(INSTALL) -m 644 # Top-level path for executable binaries (usually /usr/local): exec_prefix = # Where the processors go: bindir = $(exec_prefix)/bin # Top-level path for everything else (usually /usr/local) prefix = doc_prefix = $(prefix) # Where the Unix man pages go: manext = 1 mandir = $(doc_prefix)/man/man$(manext) # Where the emacs info* files go: infodir = $(doc_prefix)/info # Where the source file fweb.texinfo goes: texinfodir = $(infodir) # Where the fwebmac.sty macro package used by FWEAVE goes, as well as the # file fweb.tex needed for weaving the FWEB source code, go: texdir = $(prefix)/ # --- END of SYSTEM CONFIGURATION SECTION --- fweb-1.62/Boot/unix/sun/ 40755 10061 1115 0 6602703210 14106 5ustar krommesusersfweb-1.62/Boot/unix/sun/cc/ 40755 10061 1115 0 6602703205 14477 5ustar krommesusersfweb-1.62/Boot/unix/sun/cc/custom.h100644 10061 1115 34072 6602703164 16311 0ustar krommesusers#if(0) FTANGLE v1.60, created with UNIX on "Thursday, September 24, 1998 at 16:12." COMMAND LINE: "./ftangle ./custom -uSUN -mSUN -uGCC -mCC -= /u/krommes/Fweb/1.62/Boot/unix/sun/cc/custom.h -# -v" RUN TIME: "Friday, September 25, 1998 at 8:03." WEB FILE: "./custom.web" CHANGE FILE: (none) #endif /* --- BOOTSTRAPPING --- */ /* To bootstrap yourself onto a new system, you should modify this file \ appropriately. In most cases, you set a flag by saying ``#define \ FLAG''---i.e., you make a null definition. Don't set these flags to~0 \ or~1. However, in a few cases the macros are not flags and must be given \ the appropriate definition. */ /* --- MACHINE COMPILER FLAG --- */ /* This must be in lower case. Presently these are drawn from the list \ {ansi, bsd, dsu, ibmpc, mac, misc, mvs, sgi, sun, vax}. These \ flags may be used in #define statements within the source code to tailor \ things to a particular compiler or operating system. If you use \ ./configure to generate custom.h, there will be no definition following \ this comment. */ #ifndef sun #define sun #endif /* |sun| */ /* --- FWEB SYSTEM NAME --- */ /* This is a string such as ``IBM-PC/DOS'' or ``VAX/VMS''. It is printed \ when FWEB starts up. */ #define THE_SYSTEM "SunOS/UNIX" /* --- An optional local banner, printed after the system name above. --- */ #define LOCAL_BANNER "" /* Does your compiler understand the ANSI preprocessor command \#error? \ If it does, define |HAVE_ERROR|. (I haven't figured out a general \ autoconf test yet; it seems to be impossible in principle.) */ #define HAVE_ERROR 0 /* The C preprocessor is run by the \.{-H} option. */ #define RUN_CPP "gcc -E" /* Occasionally a system command is issued to rename a file. Here's how to \ do that. */ #define MV "mv" /* Do we bother with translations to the internal |ASCII| representation? \ If so, define |TRANSLATE_ASCII|. Don't bother on |ASCII| machines. */ #define TRANSLATE_ASCII 0 /* For \It{debugging} of target machines whose character set differs from \ the one on which you're working, define |DEBUG_XCHR|. \It{Usually, this \ flag should not be defined.} When it is defined, the |TRANSLATE_ASCII| \ flag is automatically turned on, and the value of the style-file field \ `xchr' is relevant. \It{Don't use this flag unless you're a system \ developer!!!} */ #define DEBUG_XCHR 0 /* Does the operating system have a Unix-like path? \ That is, does it have the form ``/u/krommes'' rather than the VMS form \ ``ux3:[krommes]''? If so, define |UNIX_PATH|. */ #define UNIX_PATH 1 /* If the |getenv| call to obtain an environment variable is supported \ (it usually is) define |HAVE_GETENV|. */ #define HAVE_GETENV 1 /* --- FILE NAMES and EXTENSIONS --- */ /* Name of the null file. This macro merely defines the default value of \ the style-file parameter `null_file', so it's not essential to add any more \ machines here. */ #define NULL_FILE_NAME "/dev/null"/* For Unix systems. */ /* Name of \FWEB's initialization file. Please see below, after the \ definition of |SMALL_MEMORY|. */ /* Name of \FWEB's default style file. \It{Please don't change this unless \ you absolutely have to! Use the `-z' option instead.} */ #define STYLE_FILE_NAME "fweb.sty" /* Here are the default file extensions for each language. These merely \ set default style-file parameters, so it's not essential that you change \ anything here. See the parameters `suffix.C', `suffix.N', etc. */ #define C_EXT "c" #define V_EXT "mk" #define X_EXT "sty" /* Unix. */ #define Cpp_EXT "C" /* Per \.{gcc}. */ #define R_EXT "r" #define R90_EXT "r90" #define N_EXT "f" #define N90_EXT "f90" #define HAVE_TMPNAM 1 #define HAVE_TEMPNAM 0 /* The |FANCY_SPLIT| flag is used for buffering the output lines of C~code. \ Define this if the C~compiler CAN'T continue an incomplete line with a \ backslash. (ANSI compilers should be able to.) \ {\bf (This code may not be fully debugged yet!)} */ #define FANCY_SPLIT 1 /* --- INCLUDING FILES --- */ /* The code is written in C, and various header files of the form \ ``<*.h>'' are included near the beginning of each source file. The \ names of these files are standardized by ANSI. Unfortunately, not everyone \ has gotten around to ANSI yet. Therefore, here we include important files \ whose names may be nonstandard or whose functions may fluctuate. */ /* Does the ANSI exist? If so, say so here. This is supposed \ to contain prototypes for the following functions used by \FWEB: |abort|, \ |abs|, |atof|, |atoi|, |atol|, |calloc|, |exit|, |free|, |getenv|, \ |realloc|, |strtod|, |strtol|. If it doesn't, either find the prototypes \ in another file and include it here, or actually give the prototypes here. */ #define HAVE_STDLIB_H 1 #define HAVE_STDARG_H 1 /* Does the ANSI exist? If so, include it here. This is \ supposed to define the |NULL| pointer, and the type |size_t|. Sometimes \ these are defined in other places as well. */ #define HAVE_STDDEF_H 0 /* Other stuff handled by autoconf. */ #define HAVE_STRING_H 1 #define HAVE_MEMORY_H 0 #define HAVE_FLOAT_H 1 /* Does (non-ANSI) exist? You may find some useful stuff in \ here. But don't use it unless you have to. */ _P include /* Must we include an extra file for memory management? E.g., for \ Microsoft, ; for Borland; . Not necessary for ANSI; \ it's in . */ /* _P include */ /* Numerical limits. We use the following ANSI macros: |INT_MAX|, \ |INT_MIN|, |LONG_MAX|, |LONG_MIN|, and |ULONG_MAX|, which are found in \ . If you can't find those macros, define the flag \ |HAVE_VALUES_H|, and possibly include another file with different names for \ the limits, such as on the Sun. The flag |HAVE_VALUES_H| \ assumes that the macros |MAXINT| and |MAXLONG| are defined. If they are \ not, you must define them here. */ #define HAVE_LIMITS_H 0 #define HAVE_VALUES_H 1 /* Please note that additional files are included automatically \ (essentially immediately after this file is read; see ). \ These were considered to be standard, but that might be a mistake. Those \ files are: , , , , . \ Remember that by convention these files should limit themselves to being \ included only once. Therefore, if for some reason you need to include one \ of these somewhere in this file, you should be able to do it without \ difficulty; the later automatic include just won't be done if those files \ are following standard protocol. */ #define ANSI_CTYPE_H 0 /* --- VARIABLE-LENGTH ARGUMENT LISTS --- */ /* For convenience, FWEB attempts to use functions with variable numbers of \ arguments. We attempt to support two conventions: ANSI, and Sun's. If \ this feature is supported, define the flag |VARIABLE_ARGUMENTS|, say \ whether |va_start| has one or two arguments, and include the associated \ header file ( for ANSI). */ /* Does the compiler allow ANSI-style variable arguments? */ #define VARIABLE_ARGUMENTS 1 /* Is |va_start| defined with one argument (Sun's convention) or two \ (ANSI)? */ #define NUM_VA_ARGS 1 #define HAVE_STDARG_H 0 /* --- ADDITIONAL PROTOTYPES --- */ /* You may wish to collect any additional prototypes that are required and \ put them into your own header file that you include here. */ /* If the flag |HAVE_STD_PROTOTYPES| is false, it causes the file \ "stdlib0.h" to be loaded. This contains ANSI prototypes that for some \ reason aren't provided with the gcc environment on the Sun. */ #define HAVE_STD_PROTOTYPES 1 /* Define the flag |OLD_PROTOTYPES| for compilers that don't support the \ new (ANSI) style of function declaration and prototyping. The new style is \ |fcn(int i,char *s){}|; the old style is |fcn(i,s) int i; char *s; {}|. */ #define OLD_PROTOTYPES 1 /* ANSI also introduces the type |void|. If your compiler doesn't \ understand the constructions |void *| and |void fcn()|, define |NO_VOID|. */ #define NO_VOID 1 /* --- SPECIAL TYPES --- */ /* |const| seems to be an annoyance; not all compilers treat it the same \ way. We really only want it for debugging, anyway, so we mostly just \ remove it. It's kept when compiling on the Sun with gcc, because it \ gives the developer more checks on the code. If you want to keep it, \ define |KEEP_CONST|. */ #define KEEP_CONST 0 /* For personal computers, the kind of pointer is an issue. They must be \ |huge|. If your compiler understands |huge|, define |HUGE_POINTERS|. */ #define HUGE_POINTERS 0 /* --- SPECIAL FUNCTIONS --- */ /* The ANSI |sprintf| function returns the number of characters written. \ If this is the case on your system, define |ANSI_SPRINTF|. (It's always \ safe to not define it.) */ #define ANSI_SPRINTF 0 /* The ANSI |sscanf| does some cute things with scansets, but it doesn't \ always work. */ #define ANSI_SSCANF 0 /* The ANSI |system| function is supposed to take |NULL| as an argument, \ which means check if a command processor exists. If this works properly, \ defined |ANSI_SYSTEM|. (It doesn't work on the Sun.) */ #define ANSI_SYSTEM 0 /* --- ANNOYING WARNINGS --- */ /* Sometimes the compiler can't understand that the \ control flow can never get to the bottom of a function. To avoid warning \ complaints, we have the following: */ #define DUMMY_RETURN(value) /* --- UNUSUAL NAMES --- */ /* Put here any definitions that override standard names. For example, for \ some ancient on the MAC one had to say ``#define getc agetc''. */ /* Nothing to be done. */ /* --- DIRECTORY SPECIFICATIONS --- */ /* Directory specifications are delimited in different ways under the various \ operating systems. Unix: '/'; IBM-PC: '\\'; VAX/VMS: ']'. */ #define PREFIX_END_CHAR '/' /* The Unix convention. */ /* --- TIMING --- */ /* First of all, we have a flag to say whether timing information is \ printed at the end of the run. (If you can't figure out the timing \ routines for your machine or don't want a timing information line at the \ end of your terminal output, don't define this.) Beginning with fweb-1.53, \ timing is turned off by default. */ #define TIMING 0 /* --- Number of decimal places for timing information in seconds. (Use \ at least 2 for supercomputers.) --- */ #define TIMING_WIDTH 1 /* There's supposed to be a function |clock()| that returns the cpu time, \ in units of |CLOCKS_PER_SEC|. The type of |clock| is |clock_t|. If that \ is defined, define the flag |CLOCK_T_DEFINED|; otherwise, say |typedef ... \ clock_t| here. */ #define CLOCK_T_DEFINED 1 /* Some systems don't define |CLOCKS_PER_SEC|. If not, we try |CLK_TCK|. \ If that's not defined, it defaults to 1000000. If that's not appropriate, \ define |CLOCKS_PER_SEC| here. */ /* \ #define CLOCKS_PER_SEC 1000000 \ */ /* Are there system routines that return wall-clock time in sub-second units? \ First, look for |gettimeofday| ($\mu$sec timing). */ #define HAVE_GETTIMEOFDAY 1 /* Otherwise, does the file sys/timeb.h exist that along with |ftime| gives \ millisecond timing for wall-clock time? We check for the header file, not \ |ftime| itself, since |ftime| may be in a Berkeley compatibility library, \ not in libc. */ #define HAVE_SYS_TIMEB_H 0 /* Do we use our own version of |difftime()|, which computes the difference \ of two wall clock times? If so, define |NEW_DIFFTIME|. This flag should \ always be defined if |HAVE_SYS_TIMEB_H| is defined above. */ #define NEW_DIFFTIME 1 /* --- MAKING IT FIT --- */ /* Sometimes the compiler can't handle functions or switches that are too \ large. In that case, define |FCN_CALLS|. That converts certain in-line \ code (such as in the syntax production analyzer) into function calls (at \ the price of slowing things down a bit). */ #define FCN_CALLS 0 /* The personal computers are starved for memory. For those machines, we \ specify smaller default values for the lengths of dynamic arrays; define \ |SMALL_MEMORY|. (You can always use the `-y' option to override these \ defaults.) */ #define SMALL_MEMORY 0 /* Name of \FWEB's default initialization file. Please don't change these \ conventions unless you absolutely have to!!! Also, note that these \ definitions are overridden by the environment variable |FWEB_INI|, if it is \ defined. */ #ifndef SMALL_MEMORY #define SMALL_MEMORY 0 #endif #if SMALL_MEMORY #define FWEB_INI "fweb.ini" #else #define FWEB_INI ".fweb" #endif /* --- MEMORY ALLOCATIONS --- */ /* The ANSI |calloc| routine takes two arguments: |void \ *calloc(size_t,size_t)|. If the system doesn't have a standard |calloc| \ routine, or if the name isn't standard, you must define an UPPERCASE macro \ that does the same thing. (The name isn't standard on personal computers \ because one is dealing with |huge| allocations.) If you define \ |NON_ANSI_CALLOC|, you must define |CALLOC|, |REALLOC|, and |FREE|. E.g., the \ relevant definitions for Borland are \ \begintt \ #define CALLOC farcalloc \ #define REALLOC(oldblock,nbytes) \ \ farrealloc((void far *)(oldblock),(unsigned long)(nbytes)) \ #define FREE(block) farfree((void far *)(block)) \ \endtt \ */ #define NON_ANSI_CALLOC 0 /* |IBMPC| */ /* Do we supply below a routine that obtains the available memory, such \ as Borland's farcoreleft()? */ #define PRINT_AVAILABLE_MEMORY 0 /* The function call that obtains the memory is called |CORE_LEFT|. This \ function is assumed to return an |unsigned long int|. For Microsoft, we had \ to write our own routine |_hmemavl|; see below. For Borland, the routine \ should be called |farcoreleft|. For the other machines, we don't have \ anything as yet. */ /* The following flag is defined only by \common.web}. */ #ifdef COMMON_FCNS_ #if(part==0 || part==1) /* Give here the C code for any additional functions that are \ compiler-specific or missing from your implementation, such as maybe \ |strtod|. Note that these are bracketed with the flag COMMON_FCNS_ so they \ are compiled into just one module, namely common.c. You must \ always supply some version of the debugging routine |trap|, which must \ return~0 as a minimum. */ /* The default |trap| function for debugging. */ int trap(void) {return 0;} #endif /* |part == 1| */ #endif /* |COMMON_FCNS_| */ fweb-1.62/Boot/unix/sun/cc/READ_ME.CC100644 10061 1115 715 6602703205 16062 0ustar krommesusers --- BOOTSTRAPPING FWEB with Sun/cc --- Please use gcc instead of cc if that's available on your system. (If it's not, you should get it; it's free, and it works.) One reason for using gcc is that its variable argument facilities conform to ANSI C. Sun's do not. Although FWEB has been macroed up to accept either convention, that code has not been tested thoroughly for the cc version. To bootstrap, please see the instructions in READ_ME.FWEB. fweb-1.62/Boot/unix/sun/cc/defaults.mk100644 10061 1115 7664 6602703205 16751 0ustar krommesusers# Generated automatically from defaults.mk.in and sun.cc.ini by FWEB_configure. # --- START of SYSTEM CONFIGURATION SECTION --- # # --- Supporting VPATH --- top_srcdir = ./.. srcdir = . VPATH = . # --- Names of system commands --- # (Used in the Makefile and possibly internally to FWEB.) MAKE = make MV = mv RM = rm TOUCH = touch # --- COMPILING --- # --- Compiler name --- CC = cc # An FWEB flag, either CC or GCC. This flag isn't used for bootstrapping; it # is required for properly regenerating custom.h by tangling custom.web. If # you're on the Sun and working with gcc, say ``COMPILER = GCC''. COMPILER = CC # --- Compiler options --- # Debugging and optimization options for the C compiler. CFLAGS = # How to run the C preprocessor CPP = # Header file search directory (-Idir) and any other miscellaneous options # for the C preprocessor and compiler. CPPFLAGS = # (Compiler macro definitions. In addition, see the discussion of PARTn # below.) DEFS = # --- The actual compile command used by the Makefile. --- COMPILE = $(CC) -c $(CFLAGS) $(CPPFLAGS) $(DEFS) -Dconst= # --- LINKING --- # --- Extensions for object files --- # $(O) is used for targets in the Makefile. $(OBJ) is the suffix used in # the link line. (Sometimes $(OBJ) can be null if the compiler understands # defaults and the length of the command line is an issue, as it is on some # personal computers.) O = o OBJ = .$(O) # TERMCAP0 is either a file name, or null. If the termcap library is # available, TERMCAP0 should be null and LIBS should include -ltermcap. # If the termcap library is not available, TERMCAP0 should be termcap0.$(O). TERMCAP0 = # --- Linker options --- # Stripping (-s) and other miscellaneous options for the linker. LDFLAGS = -g # Library options -l and -L to pass to the linker. LIBS = -lm # --- The actual link command used by the Makefile. --- # TRY NOT TO CHANGE THIS LINE. LINK = $(CC) $(LDFLAGS) -o $(@) # --- MISCELLANEOUS --- # --- How to print a dvi file --- ECHO = echo # Use this to prevent actual printing. PRINT_DVI = $(ECHO) lpr -d # --- FWEB flags indicating type of machine on which you're tangling # (HOME_MACHINE) and for which machine you're generating C code. --- HOME_MACHINE = SUN MACHINE = SUN # --- FWEB file suffixes --- # (For IBM-PC, shorten to ``hwe'') HWEB = hweb # --- Splitting FTANGLE & FWEAVE into several parts, especially for small # compilers on personal computers. Here's an example for the IBM-PC, # Microsoft compiler --- # --------------------------------------------------------------------------- #PART1 = /Dpart=1 #PART2 = /Dpart=2 #PART3 = /Dpart=3 #FTANGLE2 = ftangle2.$(O) #FTANGLE3 = ftangle3.$(O) #FWEAVE2 = fweave2.$(O) #FWEAVE3 = fweave3.$(O) #PROD2 = prod2.$(O) #RATFOR2 = ratfor2.$(O) #RESERVED2 = reservd2.$(O) #COMMON2 = common2.$(O) # --------------------------------------------------------------------------- # The PARTn macros are compiler options that define the macro |part| #to be n, for example ``-Dpart=2'' PART1 = PART2 = PART3 = # Here are the names of the second and third parts of the object files. FTANGLE2 = FTANGLE3 = FWEAVE2 = FWEAVE3 = PROD2 = RATFOR2 = RESERVED2 = COMMON2 = # --- INSTALLATION INFORMATION --- INSTALL = /bin/install -c INSTALL_PROGRAM = $(INSTALL) INSTALL_DATA = $(INSTALL) -m 644 # Top-level path for executable binaries (usually /usr/local): exec_prefix = /usr/local # Where the processors go: bindir = $(exec_prefix)/bin # Top-level path for everything else (usually /usr/local) prefix = /usr/local doc_prefix = $(prefix) # Where the Unix man pages go: manext = 1 mandir = $(doc_prefix)/man/man$(manext) # Where the emacs info* files go: infodir = $(doc_prefix)/info # Where the source file fweb.texinfo goes: texinfodir = $(infodir) # Where the fwebmac.sty macro package used by FWEAVE goes, as well as the # file fweb.tex needed for weaving the FWEB source code, go: texdir = $(prefix)/lib/tex/inputs # --- END of SYSTEM CONFIGURATION SECTION --- fweb-1.62/Boot/unix/sun/gcc/ 40755 10061 1115 0 6602703207 14650 5ustar krommesusersfweb-1.62/Boot/unix/sun/gcc/custom.h100644 10061 1115 34110 6602703166 16453 0ustar krommesusers#if(0) FTANGLE v1.60, created with UNIX on "Thursday, September 24, 1998 at 16:12." COMMAND LINE: "./ftangle ./custom -uSUN -mSUN -uCC -mGCC -= /u/krommes/Fweb/1.62/Boot/unix/sun/gcc/custom.h -# -v" RUN TIME: "Friday, September 25, 1998 at 8:03." WEB FILE: "./custom.web" CHANGE FILE: (none) #endif /* --- BOOTSTRAPPING --- */ /* To bootstrap yourself onto a new system, you should modify this file \ appropriately. In most cases, you set a flag by saying ``#define \ FLAG''---i.e., you make a null definition. Don't set these flags to~0 \ or~1. However, in a few cases the macros are not flags and must be given \ the appropriate definition. */ /* --- MACHINE COMPILER FLAG --- */ /* This must be in lower case. Presently these are drawn from the list \ {ansi, bsd, dsu, ibmpc, mac, misc, mvs, sgi, sun, vax}. These \ flags may be used in #define statements within the source code to tailor \ things to a particular compiler or operating system. If you use \ ./configure to generate custom.h, there will be no definition following \ this comment. */ #ifndef sun #define sun #endif /* |sun| */ /* --- FWEB SYSTEM NAME --- */ /* This is a string such as ``IBM-PC/DOS'' or ``VAX/VMS''. It is printed \ when FWEB starts up. */ #define THE_SYSTEM "SunOS/UNIX" /* --- An optional local banner, printed after the system name above. --- */ #define LOCAL_BANNER "" /* Does your compiler understand the ANSI preprocessor command \#error? \ If it does, define |HAVE_ERROR|. (I haven't figured out a general \ autoconf test yet; it seems to be impossible in principle.) */ #define HAVE_ERROR 1 /* The C preprocessor is run by the \.{-H} option. */ #define RUN_CPP "gcc -E" /* Occasionally a system command is issued to rename a file. Here's how to \ do that. */ #define MV "mv" /* Do we bother with translations to the internal |ASCII| representation? \ If so, define |TRANSLATE_ASCII|. Don't bother on |ASCII| machines. */ #define TRANSLATE_ASCII 0 /* For \It{debugging} of target machines whose character set differs from \ the one on which you're working, define |DEBUG_XCHR|. \It{Usually, this \ flag should not be defined.} When it is defined, the |TRANSLATE_ASCII| \ flag is automatically turned on, and the value of the style-file field \ `xchr' is relevant. \It{Don't use this flag unless you're a system \ developer!!!} */ #define DEBUG_XCHR 0 /* Does the operating system have a Unix-like path? \ That is, does it have the form ``/u/krommes'' rather than the VMS form \ ``ux3:[krommes]''? If so, define |UNIX_PATH|. */ #define UNIX_PATH 1 /* If the |getenv| call to obtain an environment variable is supported \ (it usually is) define |HAVE_GETENV|. */ #define HAVE_GETENV 1 /* --- FILE NAMES and EXTENSIONS --- */ /* Name of the null file. This macro merely defines the default value of \ the style-file parameter `null_file', so it's not essential to add any more \ machines here. */ #define NULL_FILE_NAME "/dev/null"/* For Unix systems. */ /* Name of \FWEB's initialization file. Please see below, after the \ definition of |SMALL_MEMORY|. */ /* Name of \FWEB's default style file. \It{Please don't change this unless \ you absolutely have to! Use the `-z' option instead.} */ #define STYLE_FILE_NAME "fweb.sty" /* Here are the default file extensions for each language. These merely \ set default style-file parameters, so it's not essential that you change \ anything here. See the parameters `suffix.C', `suffix.N', etc. */ #define C_EXT "c" #define V_EXT "mk" #define X_EXT "sty" /* Unix. */ #define Cpp_EXT "C" /* Per \.{gcc}. */ #define R_EXT "r" #define R90_EXT "r90" #define N_EXT "f" #define N90_EXT "f90" #define HAVE_TMPNAM 1 #define HAVE_TEMPNAM 0 /* The |FANCY_SPLIT| flag is used for buffering the output lines of C~code. \ Define this if the C~compiler CAN'T continue an incomplete line with a \ backslash. (ANSI compilers should be able to.) \ {\bf (This code may not be fully debugged yet!)} */ #define FANCY_SPLIT 0 /* --- INCLUDING FILES --- */ /* The code is written in C, and various header files of the form \ ``<*.h>'' are included near the beginning of each source file. The \ names of these files are standardized by ANSI. Unfortunately, not everyone \ has gotten around to ANSI yet. Therefore, here we include important files \ whose names may be nonstandard or whose functions may fluctuate. */ /* Does the ANSI exist? If so, say so here. This is supposed \ to contain prototypes for the following functions used by \FWEB: |abort|, \ |abs|, |atof|, |atoi|, |atol|, |calloc|, |exit|, |free|, |getenv|, \ |realloc|, |strtod|, |strtol|. If it doesn't, either find the prototypes \ in another file and include it here, or actually give the prototypes here. */ #define HAVE_STDLIB_H 1 #define HAVE_STDARG_H 1 /* Does the ANSI exist? If so, include it here. This is \ supposed to define the |NULL| pointer, and the type |size_t|. Sometimes \ these are defined in other places as well. */ #define HAVE_STDDEF_H 0 /* Other stuff handled by autoconf. */ #define HAVE_STRING_H 1 #define HAVE_MEMORY_H 0 #define HAVE_FLOAT_H 1 /* Does (non-ANSI) exist? You may find some useful stuff in \ here. But don't use it unless you have to. */ _P include /* Must we include an extra file for memory management? E.g., for \ Microsoft, ; for Borland; . Not necessary for ANSI; \ it's in . */ /* _P include */ /* Numerical limits. We use the following ANSI macros: |INT_MAX|, \ |INT_MIN|, |LONG_MAX|, |LONG_MIN|, and |ULONG_MAX|, which are found in \ . If you can't find those macros, define the flag \ |HAVE_VALUES_H|, and possibly include another file with different names for \ the limits, such as on the Sun. The flag |HAVE_VALUES_H| \ assumes that the macros |MAXINT| and |MAXLONG| are defined. If they are \ not, you must define them here. */ #define HAVE_LIMITS_H 1 #define HAVE_VALUES_H 0 /* Please note that additional files are included automatically \ (essentially immediately after this file is read; see ). \ These were considered to be standard, but that might be a mistake. Those \ files are: , , , , . \ Remember that by convention these files should limit themselves to being \ included only once. Therefore, if for some reason you need to include one \ of these somewhere in this file, you should be able to do it without \ difficulty; the later automatic include just won't be done if those files \ are following standard protocol. */ #define ANSI_CTYPE_H 1 /* --- VARIABLE-LENGTH ARGUMENT LISTS --- */ /* For convenience, FWEB attempts to use functions with variable numbers of \ arguments. We attempt to support two conventions: ANSI, and Sun's. If \ this feature is supported, define the flag |VARIABLE_ARGUMENTS|, say \ whether |va_start| has one or two arguments, and include the associated \ header file ( for ANSI). */ /* Does the compiler allow ANSI-style variable arguments? */ #define VARIABLE_ARGUMENTS 1 /* Is |va_start| defined with one argument (Sun's convention) or two \ (ANSI)? */ #define NUM_VA_ARGS 2 #define HAVE_STDARG_H 1 /* --- ADDITIONAL PROTOTYPES --- */ /* You may wish to collect any additional prototypes that are required and \ put them into your own header file that you include here. */ /* If the flag |HAVE_STD_PROTOTYPES| is false, it causes the file \ "stdlib0.h" to be loaded. This contains ANSI prototypes that for some \ reason aren't provided with the gcc environment on the Sun. */ #define HAVE_STD_PROTOTYPES 0 /* Define the flag |OLD_PROTOTYPES| for compilers that don't support the \ new (ANSI) style of function declaration and prototyping. The new style is \ |fcn(int i,char *s){}|; the old style is |fcn(i,s) int i; char *s; {}|. */ #define OLD_PROTOTYPES 0 /* ANSI also introduces the type |void|. If your compiler doesn't \ understand the constructions |void *| and |void fcn()|, define |NO_VOID|. */ #define NO_VOID 0 /* --- SPECIAL TYPES --- */ /* |const| seems to be an annoyance; not all compilers treat it the same \ way. We really only want it for debugging, anyway, so we mostly just \ remove it. It's kept when compiling on the Sun with gcc, because it \ gives the developer more checks on the code. If you want to keep it, \ define |KEEP_CONST|. */ #define KEEP_CONST 1 /* For personal computers, the kind of pointer is an issue. They must be \ |huge|. If your compiler understands |huge|, define |HUGE_POINTERS|. */ #define HUGE_POINTERS 0 /* --- SPECIAL FUNCTIONS --- */ /* The ANSI |sprintf| function returns the number of characters written. \ If this is the case on your system, define |ANSI_SPRINTF|. (It's always \ safe to not define it.) */ #define ANSI_SPRINTF 0 /* The ANSI |sscanf| does some cute things with scansets, but it doesn't \ always work. */ #define ANSI_SSCANF 1 /* The ANSI |system| function is supposed to take |NULL| as an argument, \ which means check if a command processor exists. If this works properly, \ defined |ANSI_SYSTEM|. (It doesn't work on the Sun.) */ #define ANSI_SYSTEM 0 /* --- ANNOYING WARNINGS --- */ /* Sometimes the compiler can't understand that the \ control flow can never get to the bottom of a function. To avoid warning \ complaints, we have the following: */ #define DUMMY_RETURN(value) return value /* --- UNUSUAL NAMES --- */ /* Put here any definitions that override standard names. For example, for \ some ancient on the MAC one had to say ``#define getc agetc''. */ /* Nothing to be done. */ /* --- DIRECTORY SPECIFICATIONS --- */ /* Directory specifications are delimited in different ways under the various \ operating systems. Unix: '/'; IBM-PC: '\\'; VAX/VMS: ']'. */ #define PREFIX_END_CHAR '/' /* The Unix convention. */ /* --- TIMING --- */ /* First of all, we have a flag to say whether timing information is \ printed at the end of the run. (If you can't figure out the timing \ routines for your machine or don't want a timing information line at the \ end of your terminal output, don't define this.) Beginning with fweb-1.53, \ timing is turned off by default. */ #define TIMING 0 /* --- Number of decimal places for timing information in seconds. (Use \ at least 2 for supercomputers.) --- */ #define TIMING_WIDTH 1 /* There's supposed to be a function |clock()| that returns the cpu time, \ in units of |CLOCKS_PER_SEC|. The type of |clock| is |clock_t|. If that \ is defined, define the flag |CLOCK_T_DEFINED|; otherwise, say |typedef ... \ clock_t| here. */ #define CLOCK_T_DEFINED 1 /* Some systems don't define |CLOCKS_PER_SEC|. If not, we try |CLK_TCK|. \ If that's not defined, it defaults to 1000000. If that's not appropriate, \ define |CLOCKS_PER_SEC| here. */ /* \ #define CLOCKS_PER_SEC 1000000 \ */ /* Are there system routines that return wall-clock time in sub-second units? \ First, look for |gettimeofday| ($\mu$sec timing). */ #define HAVE_GETTIMEOFDAY 1 /* Otherwise, does the file sys/timeb.h exist that along with |ftime| gives \ millisecond timing for wall-clock time? We check for the header file, not \ |ftime| itself, since |ftime| may be in a Berkeley compatibility library, \ not in libc. */ #define HAVE_SYS_TIMEB_H 0 /* Do we use our own version of |difftime()|, which computes the difference \ of two wall clock times? If so, define |NEW_DIFFTIME|. This flag should \ always be defined if |HAVE_SYS_TIMEB_H| is defined above. */ #define NEW_DIFFTIME 1 /* --- MAKING IT FIT --- */ /* Sometimes the compiler can't handle functions or switches that are too \ large. In that case, define |FCN_CALLS|. That converts certain in-line \ code (such as in the syntax production analyzer) into function calls (at \ the price of slowing things down a bit). */ #define FCN_CALLS 0 /* The personal computers are starved for memory. For those machines, we \ specify smaller default values for the lengths of dynamic arrays; define \ |SMALL_MEMORY|. (You can always use the `-y' option to override these \ defaults.) */ #define SMALL_MEMORY 0 /* Name of \FWEB's default initialization file. Please don't change these \ conventions unless you absolutely have to!!! Also, note that these \ definitions are overridden by the environment variable |FWEB_INI|, if it is \ defined. */ #ifndef SMALL_MEMORY #define SMALL_MEMORY 0 #endif #if SMALL_MEMORY #define FWEB_INI "fweb.ini" #else #define FWEB_INI ".fweb" #endif /* --- MEMORY ALLOCATIONS --- */ /* The ANSI |calloc| routine takes two arguments: |void \ *calloc(size_t,size_t)|. If the system doesn't have a standard |calloc| \ routine, or if the name isn't standard, you must define an UPPERCASE macro \ that does the same thing. (The name isn't standard on personal computers \ because one is dealing with |huge| allocations.) If you define \ |NON_ANSI_CALLOC|, you must define |CALLOC|, |REALLOC|, and |FREE|. E.g., the \ relevant definitions for Borland are \ \begintt \ #define CALLOC farcalloc \ #define REALLOC(oldblock,nbytes) \ \ farrealloc((void far *)(oldblock),(unsigned long)(nbytes)) \ #define FREE(block) farfree((void far *)(block)) \ \endtt \ */ #define NON_ANSI_CALLOC 0 /* |IBMPC| */ /* Do we supply below a routine that obtains the available memory, such \ as Borland's farcoreleft()? */ #define PRINT_AVAILABLE_MEMORY 0 /* The function call that obtains the memory is called |CORE_LEFT|. This \ function is assumed to return an |unsigned long int|. For Microsoft, we had \ to write our own routine |_hmemavl|; see below. For Borland, the routine \ should be called |farcoreleft|. For the other machines, we don't have \ anything as yet. */ /* The following flag is defined only by \common.web}. */ #ifdef COMMON_FCNS_ #if(part==0 || part==1) /* Give here the C code for any additional functions that are \ compiler-specific or missing from your implementation, such as maybe \ |strtod|. Note that these are bracketed with the flag COMMON_FCNS_ so they \ are compiled into just one module, namely common.c. You must \ always supply some version of the debugging routine |trap|, which must \ return~0 as a minimum. */ /* The default |trap| function for debugging. */ int trap(void) {return 0;} #endif /* |part == 1| */ #endif /* |COMMON_FCNS_| */ fweb-1.62/Boot/unix/sun/gcc/READ_ME.GCC100644 10061 1115 252 6602703207 16336 0ustar krommesusers --- BOOTSTRAPPING FWEB with gcc --- The GNU gcc compiler is PREFERRED. Please use it if possible. For bootstrapping instructions, please see READ_ME.FWEB. fweb-1.62/Boot/unix/sun/gcc/defaults.mk100644 10061 1115 7701 6602703207 17112 0ustar krommesusers# Generated automatically from defaults.mk.in and sun.gcc.ini by FWEB_configure. # --- START of SYSTEM CONFIGURATION SECTION --- # # --- Supporting VPATH --- top_srcdir = ./.. srcdir = . VPATH = . # --- Names of system commands --- # (Used in the Makefile and possibly internally to FWEB.) MAKE = make MV = mv RM = rm TOUCH = touch # --- COMPILING --- # --- Compiler name --- CC = gcc # An FWEB flag, either CC or GCC. This flag isn't used for bootstrapping; it # is required for properly regenerating custom.h by tangling custom.web. If # you're on the Sun and working with gcc, say ``COMPILER = GCC''. COMPILER = GCC # --- Compiler options --- # Debugging and optimization options for the C compiler. CFLAGS = # How to run the C preprocessor CPP = # Header file search directory (-Idir) and any other miscellaneous options # for the C preprocessor and compiler. CPPFLAGS = # (Compiler macro definitions. In addition, see the discussion of PARTn # below.) DEFS = # --- The actual compile command used by the Makefile. --- COMPILE = $(CC) -c $(CFLAGS) $(CPPFLAGS) $(DEFS) -Dconst= # --- LINKING --- # --- Extensions for object files --- # $(O) is used for targets in the Makefile. $(OBJ) is the suffix used in # the link line. (Sometimes $(OBJ) can be null if the compiler understands # defaults and the length of the command line is an issue, as it is on some # personal computers.) O = o OBJ = .$(O) # TERMCAP0 is either a file name, or null. If the termcap library is # available, TERMCAP0 should be null and LIBS should include -ltermcap. # If the termcap library is not available, TERMCAP0 should be termcap0.$(O). TERMCAP0 = # --- Linker options --- # Stripping (-s) and other miscellaneous options for the linker. LDFLAGS = -g # Library options -l and -L to pass to the linker. LIBS = -lm -ltermcap # --- The actual link command used by the Makefile. --- # TRY NOT TO CHANGE THIS LINE. LINK = $(CC) $(LDFLAGS) -o $(@) # --- MISCELLANEOUS --- # --- How to print a dvi file --- ECHO = echo # Use this to prevent actual printing. PRINT_DVI = $(ECHO) lpr -d # --- FWEB flags indicating type of machine on which you're tangling # (HOME_MACHINE) and for which machine you're generating C code. --- HOME_MACHINE = SUN MACHINE = SUN # --- FWEB file suffixes --- # (For IBM-PC, shorten to ``hwe'') HWEB = hweb # --- Splitting FTANGLE & FWEAVE into several parts, especially for small # compilers on personal computers. Here's an example for the IBM-PC, # Microsoft compiler --- # --------------------------------------------------------------------------- #PART1 = /Dpart=1 #PART2 = /Dpart=2 #PART3 = /Dpart=3 #FTANGLE2 = ftangle2.$(O) #FTANGLE3 = ftangle3.$(O) #FWEAVE2 = fweave2.$(O) #FWEAVE3 = fweave3.$(O) #PROD2 = prod2.$(O) #RATFOR2 = ratfor2.$(O) #RESERVED2 = reservd2.$(O) #COMMON2 = common2.$(O) # --------------------------------------------------------------------------- # The PARTn macros are compiler options that define the macro |part| #to be n, for example ``-Dpart=2'' PART1 = PART2 = PART3 = # Here are the names of the second and third parts of the object files. FTANGLE2 = FTANGLE3 = FWEAVE2 = FWEAVE3 = PROD2 = RATFOR2 = RESERVED2 = COMMON2 = # --- INSTALLATION INFORMATION --- INSTALL = /bin/install -c INSTALL_PROGRAM = $(INSTALL) INSTALL_DATA = $(INSTALL) -m 644 # Top-level path for executable binaries (usually /usr/local): exec_prefix = /usr/local # Where the processors go: bindir = $(exec_prefix)/bin # Top-level path for everything else (usually /usr/local) prefix = /usr/local doc_prefix = $(prefix) # Where the Unix man pages go: manext = 1 mandir = $(doc_prefix)/man/man$(manext) # Where the emacs info* files go: infodir = $(doc_prefix)/info # Where the source file fweb.texinfo goes: texinfodir = $(infodir) # Where the fwebmac.sty macro package used by FWEAVE goes, as well as the # file fweb.tex needed for weaving the FWEB source code, go: texdir = $(prefix)/lib/tex/inputs # --- END of SYSTEM CONFIGURATION SECTION --- fweb-1.62/Boot/unix/sun/READ_ME.SUN100644 10061 1115 1206 6602703210 15665 0ustar krommesusers --- BOOTSTRAPPING FWEB on the SUN --- This subdirectory contains bootstrap files for SunOS/Unix (developed on a Sparcstation 1). There are two further subdirectories: .../unix/sun/cc and .../unix/sun/gcc. The cc subdirectory is for Sun's standard cc environment (which isn't ANSI). The gcc subdirectory is for the GNU gcc environment, which is closer to ANSI. USE GCC IF YOU CAN. The cc environment is a mess, and is no longer supported To bootstrap, see the instructions in READ_ME.FWEB. All my FWEB development work is now being done on a SUN, so if you have any difficulties I should be able to help you readily. fweb-1.62/Boot/unix/READ_ME.UNIX100644 10061 1115 1622 6602703211 15201 0ustar krommesusers --- THE FWEB/UNIX SUBDIRECTORY --- Here you will find machine-dependent files for Unix operating systems, especially the custom.h and defaults.mk files necessary for bootstrapping when you can't use ./configure (see READ_ME.FWEB). Presently you have your choice of the following machines or compiler environments (each one of which has its own subdirectory): ansi --- Fully ANSI compiler apollo --- Apollo/UNIX dsu --- DecStation/ULTRIX sgi --- Silicon Graphics/IRIX sun --- Sun (This is split into two subdirectories) cc --- Sun's cc environment gcc --- GNU gcc environment (PREFERRED). Unix manual pages for FWEB are contained in the file manual/fweb.1. (However, these are not the principal source of on-line documentation for FWEB. That is now the info file fweb.info. A Postscript version is provided in manual/fweb.ps.) fweb-1.62/Boot/READ_ME.BOOT100644 10061 1115 2163 6602703167 14211 0ustar krommesusers --- BOOTSTRAPPING WHEN ./configure DOESN'T WORK --- Normally, the installation procedure is, in brief, cd Web ./configure make For more discussion, see READ_ME.FWEB. When you can't use ./configure (when you can't run an sh script), you can still proceed. The files in this subdirectory help in various situations. In addition to READ_MEs, each boot subdirectory includes the two files defaults.mk (included into Web/Makefile) and custom.h. These should be copied to the Web subdirectory and possibly edited to reflect the idiosyncracies of your particular system. ibm --- For IBM mainframes and personal computers. misc --- When nothing else is appropriate. unix --- For Unix systems. The vanilla ANSI-C bootstrap is included here. vax --- For VMS. For version 1.6x, the only files that are relevant (i.e., tested) are ibm/pc/gnu --- For working with 32-bit compilers and extended memory. unix/ansi --- For a fully ANSI-compliant Unix environment. For example, to compile files for a generic ANSI bootstrap, you would cd fweb-1.60 cp boot/unix/ansi/{defaults.mk,custom.h} Web cd Web make fweb-1.62/Demos/ 40755 10061 1115 0 6602703104 12464 5ustar krommesusersfweb-1.62/Manual/ 40755 10061 1115 0 6602703127 12637 5ustar krommesusersfweb-1.62/Manual/READ_ME.MANUAL100644 10061 1115 3376 6602703124 14735 0ustar krommesusers --- The Fweb/Manual SUBDIRECTORY --- All FWEB documentation is maintained with texinfo. The installation procedure will automatically install the relevant fweb.info files. To obtain printed documentation, print fweb.ps or say tex fweb.texi assuming that the relevant texinfo macros are installed on your system. This relies on the files fweb.??s being present. `make install' does not install those files by default. If you are generating documentation from the installed fweb.texi, you must say instead texi2dvi fweb.texi which regenerates fweb.??s. (The version of texinfo.tex used for this release is included; a few minor changes have been made, marked by `JAK'.) `make install' automatically generates and installs the files fweb.info*. The following files are kept in this directory: Man pages: fweb.1 --- Unix man pages (very abbreviated information). Texinfo: fweb.texi --- Source code for the .info files. fweb.cps --- Concept index for fweb.texi. fweb.fns --- Function index for fweb.texi. fweb.vrs --- Parameter index for fweb.texi. fweb.ps --- Postscript form of the the user manual. texinfo.tex --- TeX macros for texinfo. FWEB macros: fwebmac.web --- Source code for the FWEB macro package. fwebmac.sty --- The tangled output from above; \input into the TeX files produced by FWEAVE. LaTeX2e packages: fwebinsert.sty --- Permits insertion of woven output into a LaTeX document. fwebnum.sty --- Numbers sections consecutively instead than using the default article 1.2.3 style. idxmerge.sty --- Used for merging indexes of several distinct web files. Miscellaneous: fweb.tex --- TeX macros needed for weaving the FWEB source code. index.tex --- A skeleton for printing a stand-alone index. fweb-1.62/Manual/fweb.tex100644 10061 1115 5562 6602703124 14406 0ustar krommesusers% Copyright (C) 1987 Princeton University % This file (was) part of CWEB. % This program by Silvio Levy is based on a program by D. E. Knuth. % It is distributed WITHOUT ANY WARRANTY, express or implied. % $Revision: 0.5$ -- April 1987 % * * * % FWEB is a substantial modification by John A. Krommes of CWEB v. 0.5 % to handle multiple languages, Fortran, and Ratfor statement translation. % It is distributed with EVEN LESS WARRANTY than was CWEB. % These macros help typeset the woven FWEB output, and should be input % after fwebmac.sty. A convenient way to do that automatically is to say in % the style file fweb.sty `limbo.begin = "\\input fweb"'. % Include these macros only once. \ifx\FWEBTeXisloaded\relax\endinput\else\let\FWEBTeXisloaded\relax\fi \def\version{1.60} \def\vdate{January 1, 1997} % * * * % The following stuff was inherited from CWEB (now modified for LaTeX2e). % Here is TeX material that gets inserted after \input webmac \def\hang{\hangindent 3em\indent\ignorespaces} \ifnoLaTeXe \font\ninerm=cmr9 \font\revfont=cmr10 scaled\magstep1 \else % \def\ninerm{\fontfamily{\rmdefault}\fontseries{m}\fontshape{n}% \small} \def\revfont{\fontfamily{\rmdefault}\fontseries{m}\fontshape{n}% \large} \fi \let\mc=\ninerm % Medium caps \def\ceeref{{\it The C Reference Manual}} \def\Cb{$\Wtypewriter|\ldots\.|$} % C brackets (|...|) \def\ttv{\Wtypewriter{\char'174}} % vertical (|) in typewriter font \mathchardef\RA="3221 % right arrow \mathchardef\BA="3224 % double arrow %\def\({} % kludge for alphabetizing certain module names \def\Revision{\FWEB\ version \version} \ifLaTeXisloaded \author{{\revfont\Revision}} \date{{\revfont\vdate}} \else \contentspageno=1 % should be odd \def\topofcontents{ \titlefalse % include headline on the contents page \def\rheader{\hfil}\def\lheader{\hfil} \centerline{\titlefont\Wtitle} \vskip 15pt \centerline{\revfont\Revision} \medskip \centerline{\revfont\vdate} \vfill } \pageno=\contentspageno \advance\pageno by 1 \fi % --- This stuff is added for FWEB --- %\let\cmntfont\Csc % This is how to define a new font for comments. \identicalpageheadstrue \let\lb\{ % Avoids (spurious) FWEB warning about unmatched { in comment. \let\vb\vertbar % Use inside typewriter mode. \def\slashstar{/*} % Avoids (spurious) compiler warning about nested comments. \def\starslash{*/} % Similar to above. \def\dleft{[\![} \def\dright{]\!]} % double brackets \def\cee{code} % We talk about ``code'' text, not C text. %\def\It#1{{\it #1}} % This could be made fancier. \let\It\emph % The \LaTeX\ way. \def\ast{\mathbin{*}} % Test of better spacing for binary times. % --- Beautify index (see the `lethead.prefix' entry in fweb.sty) --- %\def\letter#1{} % A null default. \def\letter#1{\hbox{\let\\\WBS\let\|\vertbar\let\&\WAM\def\@{@}% \kern2em--- {\tt #1} ---}\smallskip} % Kill off annoying warnings. \overfullrule=0pt % * * * fweb-1.62/Manual/fweb.1100644 10061 1115 24410 6602703124 13757 0ustar krommesusers.TH FWEB 1 "September 23, 1998" .UC 4 .SH NAME ftangle,fweave \- WEB processors for C, C++, Fortran, Ratfor, and TeX .SH SYNOPSIS .B ftangle -| .br | [[\-option] ...] src_file[.web] [change_file[.ch]] .br .B fweave --| .br .SH DESCRIPTION (This man page is obsolete and is no longer maintained; please see `info fweb' for up-to-date and detailed tree-structured information.) .B FWEB is an extension of Knuth's .B WEB system to handle the languages C, C++, Fortran (both Fortran-77 and Fortran-90), Ratfor, and TeX. The philosophy of .B WEB and all details about using FWEB may be found in the user manual .B fweb.tex, available on-line as the .B texinfo (GNU hypertext system) entry .B `info FWEB'. See also .RS .B http://w3.pppl.gov/~krommes/fweb_toc.html. .RE An \fIinitialization file \fRnamed .B .fweb (Unix sytems) or .B fweb.ini (personal computers) may be placed in your home directory. (For Unix systems, that is the value of .B $HOME. The name can be overridden by the environment variable .B FWEB_INI.) In this file can be placed any option that is allowed on the command line (one option per line). If the option begins with a hyphen, it is processed before the command line; if it begins with an ampersand, it is processed after the command line (rarely necessary); if it begins with neither, it is interpreted as a file name and processed after the command line. A \fIstyle file\fR patterned after the utility .B makeindex and named .B fweb.sty may be placed in your current directory. (The directory can be overridden by the environment variable .B FWEB_STYLE_DIR.) This file is used to customize the appearance of the index and many other parameters controlling the operation of the processors. See the documentation for detailed discussion. The following list just provides a very brief summary of the command-line options. Please refer to the texinfo entry for more details. .SM FWEB Options .PP .TP 8 .B filename The first file name identifies the .B FWEB source file. (If the name does not contain a period, the extension .B .web is added automatically.) If a second file name is present, it identifies the change file. (If that name does not contain a period, the extension .B .ch is added automatically.) For an alternative approach to processing extensions, see the \-e option. .TP .B \-1 Turn on brief debugging mode for .B FWEAVE. .TP .B \-2 Turn on verbose debugging mode for .B FWEAVE. .TP .B \-@ Display information about control codes. .TP .B \-A Turn on ASCII translations. .TP .B \-B Turn off audible beeps. .TP .B \-b Number .B do and .B if blocks in woven Fortran and Ratfor output. .TP .B \-C\fIn Set the color mode to \fIn\fR, where \fIn\fR is 0 (no color), 1 (ANSI color), 2 (bilevel), 3 (trilevel), or 4 (user-defined). .TP .B \-c Set the global language to C. .TP .B \-c++ Set the global language to C++. .TP .B \-D\fI[letters] Display information about reserved words of the current language (beginning with \fI[letters] if present). .TP .B \-d\fI[nnnnn] Convert unnumbered .B do...enddo constructions to standard Fortran. .TP .B \-E\fIc Change the delimiter of a file-name extension to \fIc. .TP .B \-e Turn on automatic file-name completion, using the style-file parameters .B ext.web, ext.ch, ext.hweb, and .B ext.hch. .TP .B \-F Compare output files with old versions. .TP .B \-f Turn off module references for functions, macro names, etc. .TP .B \-H Scan #include files for typedef and/or class declarations. .TP .B \-h A brief message about where to get help. .TP .B \-I\fIdirectory Append a directory to the list of directories to be searched for include files. .TP .B \-i Read include files named by the .B @I command, but don't print contents. .TP .B \-i! Don't even read include files named by the .B @I command. .TP .B \-j Inhibit multiple includes of the same file. .TP .B \-k Recognize lower-case versions of Fortran/Ratfor I/O keywords such as BLOCKSIZE. .TP .B \-L\fIl Select language \fIl. .TP .B -l\fI[mmm[:nnn]] Echo the input lines between .I mmm and .I nnn. .TP .B \-m\fIid[=text] Define an .B FWEB macro. .TP .B \-m4 Understand (for formatting purposes) the commands of the .B m4 preprocessor. .TP .B \-m; Automatically append pseudo-semicolons to the end of .B WEB macro definitions. \fI(Not recommended.) .TP .B \-n Set the global language to Fortran-77. .TP .B \-n9 Set the global language to Fortran-90. .TP .B \-n; For Fortran-77, supply semicolons automatically (default). .TP .B \-n: In Fortran, place statement labels on separate lines. .TP .B \-nb Number the .B do\fR's and .B if\fR's in Fortran. .TP .B \-nC Throw away all commet lines. .TP .B \-np Print semicolons in woven Fortran output. .TP .B \-n\e Use free-form syntax for Fortran-90; continue lines with backslashes. .TP .B \-n& As above, but continue lines with ampersands. .TP .B \-n/ In Fortran, make .B '//' denote the start of a short comment instead of concatenation. (Use .B '\\/' for concatenation.) .TP .B \-n! In Fortran, make .B '!' denote the start of a short comment instead of the logical negation. .TP .B \-n) In Fortran, reverse array indices. .TP .B \-o Turn off .B FWEAVE's mechanisms for overloading operators. .TP .B \-P\fIletter Select the TeX processor, where .I letter is either .B 'T' for .B TeX or .B 'L' for .B LaTeX. The default is LaTeX. \fINote well that Plain TeX is no longer supported! .TP .B \-p\fIstyleentry Buffer up a style-file entry, to be processed just before the local style file is read. .TP .B \-r Set the global language to Ratfor-77. .TP .B \-r9 Set the global language to Ratfor-90. .TP .B \-rb Number the .B do\fR's and .B if\fR's in Ratfor. .TP .B \-rk\fI[letters] Suppress comments about particular Ratfor statement expansions. .TP .B \-rK\fI[letters] Include comments about particular Ratfor statement expansions. .TP .B \-r; For Ratfor, turn on the auto-semi mode and assume the ``obviously continued'' syntax. \fI(Not recommended.) .TP .B \-r/ In Ratfor, make .B '//' denote the start of a short comment instead of concatenation. (Use .B '\\/' for concatenation.) .TP .B \-r! In Ratfor, make .B '!' denote the start of a short comment instead of the logical negation. .TP .B \-r) In Ratfor, reverse array indices. .TP .B \-s Print statistics about memory usage. .TP .B \-sm\fI[nnn] As above, but also display the dynamic memory allocations as they occur. .TP .B \-T Miscellaneous flag-setting commands for .B ftangle; see texinfo entry. .TP .B \-t\fIln[{...}] Truncate identifiers of language .I l to be of length .I n, after optionally filtering out the characters listed between the braces. .TP .B \-U Convert reserved output tokens to lower case. .TP .B \-u\fIid Undefine a predefined or command-line macro. .TP .B \-v Make all comments verbatim. .TP .B \-W@\fIflag Set module warning flag [0 for no warnings, or the logical OR of 1 (never used) and/or 2 (multiple uses)]. .TP .B \-W1 Completely cross-reference single-character identifiers. .TP .B \-W[ Turn on special processing of bracketed array indices. .TP .B \-WH Turn on processing of bracketed array indices. .TP .B \-Wd Don't print @d or @D statements in woven output. .TP .B \-Wf Don't print @f statements in woven output. .TP .B \-WF Don't print @F statements in woven output. .TP .B \-Wl Don't print @l statements in woven output. .TP .B \-Wm Don't print @m or @M statements in woven output. .TP .B \-Wv Don't print @v statements in woven output. .TP .B \-Ww Don't print @w or @W statements in woven output. .TP .B \-w\fI[file_name] Print .B `\\input file_name' instead of .B `\\input fwebmac.sty' at beginning of .B tex output file. With no argument, print nothing. .TP .B \-X\fI[letters] Print selected cross-reference information; the opposite of .B '-x'. .TP .B \-x\fI[letters] Reduce or eliminate cross-reference information. The optional letters can be one of .B 'c', 'i', 'm', or .B '*', referring respectively to the table of contents, index, module list, or all cross-reference information. .TP .B \-y\fIa[a][nnnn] Override default for dynamic memory allocation. If .I nnnn is omitted, then simply query the default. The command .B '-y' with no argument queries everything. .TP .B \-Z\fI[letters] Display default values of style-file parameters (starting with .I letters if present). .TP .B \-z\fI[file_name] Override default style-file name. .TP .B \-. Don't recognize dot constants in Fortran and Ratfor. .TP .B \-\e Explicitly escape continued strings. .TP .B \-( Continue parenthesized strings with backslashes. .TP .B \-:\fI[nnnnn] Set the starting automatic statement number for \Fortran\ and \Ratfor. .TP .B \->\fI[l=][name] Redirect output. .TP .B \-= Same as above (and easier to type). .TP .B \-# Turn off comments about line numbers and modules in woven output. .TP .B \-+ Don't interpret the compound assignment operators in Fortran and Ratfor. .TP .B \-/ In Fortran and Ratfor, make .B '//' denote the start of a short comment instead of concatenation. (Use .B '\\/' for concatenation.) .TP .B \-! In Fortran and Ratfor, make .B '!' denote the start of a short comment instead of logical negation. .SH MANUAL Further documentation can be obtained from texinfo, available online through the info browser, either via emacs or stand-alone (menu item .B fweb), by saying .B `ftangle -h' or in printed form by saying (from the top-level .B FWEB installation directory, if it is available) .B `lpr Manual/fweb.ps' or .B `texi2dvi Manual/fweb.texinfo'. .PP .SH FILES .TP .B $HOME/.fweb \- Optional initialization file (supplied by user). .TP .B ./fweb.sty \- Optional style file for configuring the style of an individual document (supplied by user). .SH ENVIRONMENT VARIABLES .TP .B FWEB_INCLUDES \- Colon-delimited list of directories to be searched for include files. .TP .B FWEB_INI \- Name of the initialization file in user's home directory. .TP .B FWEB_STYLE_DIR \- Directory in which the style file resides. .SH BUGS Please send bug reports and suggestions to .B krommes@princeton.edu. FWEB is a spare-time activity, so response may be slow and messages may not be acknowledged individually. However, your input is very useful and much appreciated. .PP .SH AUTHORS .PP .B FWEB was written by John A. Krommes, Princeton University. It is a substantial revision and update (more than 50% new) of version 0.5 of Silvio Levy's .B CWEB, which in turn was based on Donald Knuth's original Pascal .B WEB. The latter was designed for documenting and maintaining TeX. fweb-1.62/Manual/fweb.texi100644 10061 1115 1462505 6602703125 14645 0ustar krommesusers\input texinfo @c -*-texinfo-*- @def@ifhtml{@doignore{ifhtml}} @setfilename fweb.info @settitle FWEB @macro Fprog{name} @sc{\name\} @end macro @macro FWEB @Fprog{Fweb} @end macro @macro FWEAVE @Fprog{Fweave} @end macro @macro FTANGLE @Fprog{Ftangle} @end macro @macro ASP @iftex @tex`\hbox{\tt@@\char`\ }'@end tex @end iftex @ifinfo @w{@samp{@@ }}@c @end ifinfo @end macro @macro PI @tex $\pi$ @end tex @ifinfo @var{pi}@c @end ifinfo @end macro @macro EQUIV @tex $\equiv$ @end tex @ifinfo ==@c @end ifinfo @end macro @ @ifinfo This file documents FWEB... Copyright 1993--1998 John A. Krommes Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. @c @ignore Permission is granted to process this file through TeX and print the results, provided the printed document carries a copying permission notice identical to this one except for the removal of this paragraph (this paragraph not being relevant to the printed manual). @c @end ignore Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the section entitled ``Copying'' is included exactly as in the original, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the author. @end ifinfo @titlepage @title FWEB @subtitle A WEB system of structured documentation @subtitle for multiple languages @author By John A. Krommes @page @vskip 0pt plus 1filll Copyright @copyright{} 1993--1998 John A. Krommes Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the section entitled ``Copying'' is included exactly as in the original, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the author. @end titlepage @node Top,Copying,(dir),(dir) @ifhtml NOTE: Because of last-minute translation problems with texi2html operating on the macro-expanded version of fweb.texi, user-defined macro expansion has temporarily been turned off in this html version. Multitable is also giving trouble, as is @samp in section names. These are probably problems with texi2html; sorry for the inconvenience. @end ifhtml @unnumbered @FWEB{} This Texinfo documentation describes @FWEB{} Version 1.61. @quotation @itemize @bullet @item To learn about new features of this version, see @ref{V1.61}. @item For a quick introduction to, and review of the structure of an @FWEB{} source file, see @ref{Structure}. @item If you used to receive e-mail information about @FWEB{} but don't any longer, it's probably because you need to update your e-mail address in the @code{fweb-users} mailing list. Subscription instructions can be found in @ref{Support}. @item Bug reports and suggestions are much appreciated, but are no longer acknowledged individually. See @ref{Support}. @item The next major release, @FWEB{} Version 2.00, is planned for no earlier than January 1, 2000. @end itemize @end quotation @ifinfo If you're perusing this documentation for the first time, try first reading the discussion at just the top-level nodes in order to get a general sense of what's here. Lower-level nodes have many details, but most of them are unnecessary for the casual user. One can obtained a TeX'd copy of the present documention by saying @samp{texi2dvi fweb.texi}, assuming that the relevant @code{texinfo} macros have been installed on one's system. (@file{texinfo.tex} and the script @code{texi2dvi} are included in the standard GNU distributions.) @end ifinfo This documentation is now accessible on the World-Wide Web from @quotation @url{http://w3.pppl.gov/~krommes/fweb_toc.html}. @end quotation Other sources of information about @FWEB{} are the archival files of the @code{fweb-users} and @code{fweb-installers} mailing lists. To learn how to obtain those, see @ref{Support}. If you are learning @FWEB{} for the first time, you will probably find that this (unfinished) manual is not sufficiently pedagogical. For background, please refer to Knuth's book cited in @ref{Intro}. You should also browse through @ref{Concepts}, in particular @ref{Structure}. @ifinfo The first part of this master menu lists the major nodes in this Info document. The rest of the menu lists all of the lower-level nodes in the document. @end ifinfo @menu * Copying:: Your rights; NO WARRANTY. * Intro:: An introduction to @FWEB{}. * Concepts:: General concepts of WEB programming. * Files:: Files used by @FWEB{}. * Starting:: Command-line syntax and options * @@ commands: AT commands. @FWEB{} commands. * Comments:: Commenting styles. * Languages:: Languages. * Macros:: Macro definitions and preprocessing. * Ratfor:: RATional FORtran. * Documentation:: Features and hints about working with @FWEAVE{}. * Index:: The index produced by @FWEB{}. * Customization:: Customizing @FWEB{}, learning about parameters, etc. * Hints:: Various usage tips, etc. * New features:: New features/changes in the current version. * Support:: Help, bug reports, etc. * Installing:: Installing @FWEB{}. * Concept index:: Significant concepts. * Option and command index:: Command-line options, @@ commands, etc. * Parameter index:: Style-file parameters. --- The Detailed Node Listing --- INTRODUCTION to @FWEB{} * History:: History of literate programming. * Features:: Special features of @FWEB{}. WEB CONCEPTS * Processors:: @FTANGLE{} and @FWEAVE{}. * Phases:: Phases of operation of the @FWEB{} processors. * Structure:: The structure of a web. * Modules:: Use of named and unnamed modules. FILES * Input files:: Input files. * Output files:: Output files. * Change files:: Change files. Input files * Completion:: Automatic file-name completion. RUNNING @FWEB{} * Syntax:: Command-line syntax. * Options:: Command-line options. Command-line options * Negating options:: How to invert the meaning of an option. * -1:: Brief debugging mode. * -2:: Verbose debugging mode. * -@@: -AT. Display information about control codes. * -A: -A_. Turn on ASCII translations. * -B: -B_. Turn off audible beeps. * -b:: Number blocks. * -C: -C_. Set the color mode. * -c:: Set global language to C. * -c++: -cpp. Set global language to C++. * -D: -D_. Display information about @FWEB{}'s reserved words. * -d:: Convert unnumbered `do...enddo's to Fortran--77. * -E: -E_. Change the delimiter of a file-name extension. * -e:: Turn on automatic file-name completion. * -F: -F_. Compare output files with old versions. * -f:: Turn off module references for identifiers. * -H: -H_. Scan #include files to format typedef and/or class commands. * -h:: Where to get help. * -I: -I_. Append a directory to search list for include files. * -i:: Don't print contents of @@I include files. * -i!:: Don't even read @@I include files. * -j:: Inhibit multiple includes of the same file. * -k:: Don't recognize lower-case forms of Fortran I/O keywords. * -L: -L_. Select global language. * -l:: Echo the input line. * -M: -M_. Set output message level. * -m:: Define an @FWEB{} macro. * -m4:: Understand the m4 built-in commands. * -m;:: Append pseudo-semicolons to @FWEB{} macro definitions. * -n:: Set global language to Fortran--77. * -n9:: Set global language to Fortran--90. * -n@@;: -nAT;. For Fortran, supply pseudo-semicolons automatically (default). * -n;:: For Fortran, supply actual semicolons automatically. * -ncolon:: In Fortran, place statement labels on separate lines. * -nb:: In Fortran, number the ifs and dos. * -nC:: In Fortran, ignore single-line comments ('C', 'c', or '*'). * -np:: Print semicolons in woven Fortran output. * -n\:: In Fortran--90, free-form syntax continued with '\\'. * -n&:: In Fortran--90, free-form syntax continued with '&'. * -n/:: In Fortran, recognize '//' as the start of a short comment. * -n!:: In Fortran, make '!' denote the start of a short comment. * -n):: In Fortran, reverse array indices. * -o:: Turn off @FWEAVE{}'s mechanisms for overloading operators. * -q:: Don't translate Ratfor. * -P: -P_. Select TeX processor. * -p:: Set style parameter. * -r:: Set the global language to Ratfor--77. * -r9:: Set the global language to Ratfor--90. * -rb:: In Ratfor, number the ifs and dos. * -rg:: Set |goto| parameters. * -rk:: Suppress comments about Ratfor statement translation. * -rK: -rK_. Write out comments about Ratfor statement translation. * -r@@;: -rAT;. Turn on Ratfor's auto-semi mode, using pseudo-semicolons. * -r;:: Turn on Ratfor's auto-semi mode, using actual semicolons. * -r/:: In Ratfor, recognize '//' as the start of a short comment. * -r!:: In Ratfor, make '!' denote the start of a short comment. * -r):: In Ratfor, reverse array indices. * -s:: Print statistics about memory usage. * -T: -T_. Flag-setting commands for @FTANGLE{}. * -t:: Truncate identifiers. * -U: -U_. Convert reserved output tokens to lower case. * -u:: Undefined a predefined or command-line macro. * -V: -V_. Print version number. * -v:: Make all comments verbatim. * -W: -W_. Flag-setting commands for @FWEAVE{}. * -w:: Change name of @FWEB{}'s macro package. * -X: -X_. Print selected cross-reference information. * -x:: Reduce or eliminate cross-reference information. * -y:: Allocate dynamic memory. * -Z: -Z_. Display default values of style-file parameters. * -z:: Change name of style file. * -.:: Don't recognize dot constants. * -\:: Explicitly escape continued strings. * -(: -lp. Continue parenthesized strings with backslashes. * -colon:: Set starting automatic statement number * ->:: Redirect tangled output. * -=:: Redirect tangled output. * -#:: Don't print comments about line numbers and module names in tangled output. * -+: -plus. Don't interpret compound assignment operators. * -/:: Recognize '//' as the start of a short comment. * -!:: Make '!' denoted the start of a short comment. * Info options:: Information options. @samp{-T}: Flag-setting options for @FTANGLE{} * -TD:: Permit processing of deferred macro definitions. * -Tb:: Permit built-functions such as @code{$IF} to be redefined. * -Tm:: Permib user-defined macros to be redefined. * -Tv:: Don't print header info at top of output. * -T%:: Don't retain trailing comments. * -T#:: Don't insert @samp{#line} command after @samp{@@%}. @samp{-W}: Flag-setting options for @FWEAVE{} * -W@@: -WAT. Set module warning flag. * -W1:: Completely cross-reference single-character identifiers. * -W[:: Turn on processing of bracketed array indices. * -WH: -WH_. Send extra arguments to the C preprocessor. Commands that inhibit printing: * -Wd: -Wnoprint. Don't print @@d or @@D in woven output. * -Wf: -Wnoprint. Don't print @@f. * -WF: -Wnoprint. Don't print @@F. * -Wl: -Wnoprint. Don't print @@l. * -Wm: -Wnoprint. Don't print @@m or @@M. * -Wv: -Wnoprint. Don't print @@v. * -Ww: -Wnoprint. Don't print @@w or @@W. @FWEB{} COMMANDS * @@0: AT0. Turn off debugging. * @@1: AT1. Display irreducible scraps. * @@2: AT2. Display detailed scrap reductions. Literal control characters: * @@@@: ATAT. Insert an '@@'. * @@|: AT|. Vertical bar/optional line break. Beginning of section: * @@ : ATspace. Begin minor section. * @@*: AT*. Begin major section. Beginning of code part: * @@<: AT<. Begin module name. * @@>: AT>. End module name. * @@A: ATA_. Begin code part. * @@a: ATa. Begin code part and mark next identifier. Control codes b--z: * @@B: ATB_. Insert left brace; suppress default insertion of breakpoint command. * @@b: ATb. Insert breakpoint command. * @@c: ATc. Set language to C. * @@c++: ATcpp. Set language to C++. * @@D: ATD_. Define outer macro. * @@d: ATd. Define outer macro and mark it. * @@E: ATE_. Treat next identifier as ordinary expression. * @@e: ATe. Invisible expression. * @@f: ATf. Format identifier or module name. * @@I: ATI_. Include a WEB file, but don't print it. * @@i: ATi. Include a WEB file. * @@K: ATK_. Expand global RCS-like keyword. * @@k: ATk. Expand local RCS-like keyword. * @@L: ATL_. Set language. * @@l: ATl. Specify limbo text. * @@M: ATM_. Define an @FWEB{} macro. * @@m: ATm. Define a @FWEB{} macro and mark it. * @@N: ATN_. Turn on language-independent mode. * @@n: ATn. Set language to Fortran--77. * @@n9:ATn9. Set language to Fortran--90. * @@O: ATO_. Open new output file (global scope). * @@o: ATo. Open new output file (local scope). * @@q: ATq. Turn off or on module and line information locally. * @@R: ATR_. Treat next identifier as integer-like reserved word. * @@r: ATr. Set language to Ratfor--77. * @@r9: ATr9. Set language to Ratfor--90. * @@u: ATu. Undefine an outer macro. * @@v: ATv. Overload an operator. * @@W: ATW_. Overload an identifier. * @@x: ATx. Terminate ignorable material. * @@y: ATy. End first part of change. * @@z: ATz. Begin ignorable material. Conversion to ASCII: * @@': ATquote. Convert single character to ASCII. * @@": ATdquote. Convert string to ASCII. Forward referencing: * @@[: AT[. Mark next identifier as defined in this section. Comments: * @@/*: AT/*. Begin a long verbatim comment. * @@//: AT//. Begin a short verbatim comment. * @@%: AT%. Ignore everything to next newline. * @@?: AT?. Begin a compiler directive. * @@(: ATlp. Begin a meta-comment. * @@): AT). End a meta-comment. Special brace: * @@@{: ATlb. Insert left brace; suppress newlines in pretty-printing. Index entries: * @@_: AT_. Force an index entry to be underlined (marked as defined). * @@-: AT-. Delete index entry for following identifier. * @@+: ATplus. Force index entry for following identifier. * @@^: AT^. Make index entry in Roman type. * @@.: ATdot. Make index entry in typewriter type. * @@9: AT9. Make index entry in format controlled by `\9'. Control text: * @@t: ATt. Put control text into TeX \hbox. * @@=: AT=. Pass control text verbatim to the output. Spacing: * @@comma: ATcomma. Insert a thin space. * @@/: AT/. Insert a line break, preserving indentation. * @@\: ATbs. Insert a line break and backspace. * @@|: AT|_. Insert optional line break in an expression. * @@#: AT#. Force line break with blank line. * @@~: AT~. Cancel a line break (tie adjacent lines together). * @@&: AT&. Join left and right items. Pseudo (invisible) operators: * @@e: ATe. Invisible expression. * @@;: AT;. Invisible semicolon. * @@colon: ATcolon. Invisible colon. Miscellaneous: * @@!: AT!. Inhibit expansion for next macro. COMMENTING STYLES * Invisible comments:: Skipping input material. * Visible comments:: Comments in code mode. * Temporary comments:: Temporarily commenting out code. MACROS and PREPROCESSING * Outer macros:: Macros copied to beginning of output file (@@d). * FWEB macros:: Macros and built-in functions expanded by @FWEB{} (@@m). * Macros and formatting:: How to format macros for pretty-printing. * Preprocessing:: @FWEB{}'s preprocessing language (@@#if, etc.) @FWEB{} macros * Macro features:: Various points about @FWEB{} macros. * Tokens:: Special tokens used in @FWEB{} macros. * Built-in functions:: Macro-like functions built into @FWEB{}. * Debugging with macros:: Debugging glitches, and their solutions. Various features of @FWEB{} macros * Variable arguments:: @FWEB{} macros with variable arguments. * Recursion:: @FWEB{} macros may be recursive (proceed at your own risk). * Macro protection:: Protecting @FWEB{} macros against redefinition. Built-in functions * Strings and quotes:: Quoted and non-quoted strings. * Protection:: By default, built-in functions may not be redefined. INDIVIDUAL BUILT-IN FUNCTIONS * $A:: Convert to ASCII. * $ABS:: Absolute value. * $ASSERT:: Assert a condition. * $AUTHOR:: RCS global keyword; see $KEYWORD. * $COMMENT:: Generate a comment. * $DATE:: Today's date. * $DATE_TIME:: RCS global keyword; see $KEYWORD. * $DAY:: Today. * $DECR:: Decrement a macro. * $DEFINE:: Define a (deferred) macro. * $DO:: Macro @b{DO} loop. * $DUMPDEF:: Dump macro definitions to the terminal. * $E:: Base of the natural logarithms: 2.71828... * $ERROR:: Send error message to output. * $EVAL:: Evaluate an expression. * $EXP:: Exponential function. * $GETENV:: Get value of environment variable. * $HEADER:: RCS global keyword; see $KEYWORD. * $HOME:: The user's home directory. * $ID:: RCS global keyword; see $KEYWORD. * $IF:: Two-way conditional: ``If expression is true'' * $IFCASE:: n-way conditional. * $IFDEF:: Two-way conditional: ``If macro is defined'' * $IFNDEF:: Two-way conditional: ``If macro is not defined'' * $IFELSE:: Two-way conditional: ``If macro1 equals macro2'' * $INCR:: Increment a macro. * $INPUT_LINE:: Line number that begins current section. * $KEYWORD:: Extract text of global RCS-like keyword. * $L:: Change string to lower case. * $L_KEYWORD:: Extract text of local RCS-like keyword. * $LANGUAGE:: Identifier for current language. * $LANGUAGE_NUM:: Number of current language. * $LEN:: Length of string. * $LOCKER:: RCS global keyword; see $KEYWORD. * $LOG:: Natural logarithm. * $LOG10:: Logarithm to the base 10. * $M:: Define a (deferred) macro. * $MAX:: Maximum of one or more elements. * $MIN:: Minimum of one or more elements. * $MODULE_NAME:: Name of present @code{web} module. * $MODULES:: Total number of independent modules. * $NAME:: RCS global keyword; see $KEYWORD. * $OUTPUT_LINE:: Current line number of tangled output. * $P:: The C preprocessor symbol @code{#} (an unquoted string). * $PI:: 3.14159... * $POW:: Raise to a power. * $PP:: The C preprocessor symbol @code{#} (a character). * $RCSFILE:: RCS global keyword; see $KEYWORD. * $REVISION:: RCS global keyword; see $KEYWORD. * $ROUTINE:: Current Ratfor program, function, or subroutine. * $SECTION_NUM:: Number of current section. * $SECTIONS:: Maximum number of sections. * $SOURCE:: RCS global keyword; see $KEYWORD. * $SQRT:: Square root. * $STATE:: RCS global keyword; see $KEYWORD. * $STRING:: Expand argument, then stringize. * $STUB:: * $TIME:: The local time. * $TRANSLIT:: Transliterate a string. * $U:: Change string to upper case. * $UNDEF:: Undefine an @FWEB{} macro. * $UNQUOTE:: Remove quotes from string (leaving an unquoted string). * $UNSTRING:: Remove quotes and string delimiters from string. * $VERBATIM:: (Obsolete.) * $VERSION:: @FWEB{} version number. LANGUAGES * Setting the language:: Setting the language. Special hints and considerations for each language. * C:: C * C++: Cpp. C++. * Fortran:: Fortran--77 and Fortran--90. * Ratfor: Ratfor_. RATional FORtran. * TeX:: @TeX{}. * Verbatim:: Literal mode. @sc{Ratfor} * Syntax: RSyntax. Ratfor syntax. * Commands:: Ratfor commands. * Caveats:: Nuances about @FWEB{} Ratfor. DOCUMENTATION * Typesetting:: Woven output; TeX vs. LaTeX, etc. * Pretty-printing:: Turning ugly input into beautiful output. Typesetting * Output:: Structure of the TeX output from @FWEAVE{}. * fwebmac.sty:: The macro package used with @FWEAVE{}. * LaTeX:: Specifics of the LaTeX support. The macro package @file{fwebmac.sty} * User macros:: Macros defined for user convenience. * Fonts:: Useful font commands. La@TeX{} support * Document class:: LaTeX's document class, options, etc. * REVTeX:: The REV@TeX{} scientific macro package. * Packages:: Special FWEB-related La@TeX{}2e packages. * Sections:: Section numbering, spacing, etc. * Index:LIndex. Technical details about multi-columns and the Index. * Table of Contents:: The Table of Contents. * Customizing LaTeX:: Conditional flags, etc. * Inserting woven code:: How to insert @FWEAVE{}'s output into a La@TeX{} document. La@TeX{} packages related to @FWEB{} * fwebinsert:Inserting woven code. Enable insertion of woven code into a La@TeX{} document. * fwebnum:Numbering. Number each section in ascending order. * idxmerge:Merging indexes. Merge several stand-alone indexes. Customizing La@TeX{}'s output * Page references:: Indexing by page numbers. * Headers:: The content of page headers. * Numbering:: Various section numbering schemes. Pretty-printing * Alternatives:: Alternatives for various input tokens. * Pseudo-operators:: Invisible parts of speech. * Overloading:: Changing the appearance of various quantities. @FWEB{}'s INDEX. * Internal index:: The self-contained index produced by @FWEB{}. * Using makeindex:: Writing index data for use by @code{makeindex}. * Merging indexes:: Using the @code{idxmerge} utility to merge indexes. CUSTOMIZATION * Environment variables:: Environment or logical variables. * Initialization:: Initialization file. * Memory allocation:: Dynamic memory allocation. * Style:: Style file. Memory allocation * -yb:: Maximum bytes for identifiers, index entries, and module names. * -ybs:: Size of the change buffer. * -ycb:: Size of line buffer for C output. * -ycf:: A Ratfor buffer. * -ycg:: Another Ratfor buffer. * -yd:: Increment for expanding the dots table. * -ydt:: Maximum number of deferred macro tokens. * -ydx:: Maximum number of deferred macro texts. * -yid:: Maximum depth of file inclusion. * -yif:: Maximum number of unique include-file names. * -ykt:: Stack size for @FTANGLE{}. * -ykw:: Stack size for @FWEAVE{}. * -yll:: Line length for @FWEAVE{}'s output. * -yln:: Maximum length of module names or strings. * -ylb:: Maximum number of nested loops in Ratfor. * -ylx:: Maximum length of expressions that can be expanded with the post-increment operators of Fortran or Ratfor. * -ym:: Maximum number of sections. * -yma:: Maximum number of arguments to @FWEB{} macros. * -ymb:: Size of the buffer for expanding @FWEB{} macros. * -yn:: Maximum number of identifiers and module names. * -ynf:: Maximum number of open output files. * -yop:: Maximum number of entries in the table for operator overloading. * -yr:: Maximum number of cross-references. * -ys:: Maximum number of scraps. * -ysb:: Size of style-file input-line buffer. * -ytt:: Maximum number of tokens that @FTANGLE{} can process. * -ytw:: Maximum number of tokens in the current section being processed by @FWEAVE{}. * -yx:: Maximum number of texts. * -yxb:: Size of line buffer for @TeX{} output. The Style file * Index params:: Customizing the Index. * Module params:: Customizing the list of sections. * Contents params:: Customizing the Table of Contents. * Subscript params:: Customizing subscripting for cross-references. * Fwebmac params:: Customizing behavior of @FWEB{}'s macros. * Completion params:: Automatic selection of file extensions, etc. * Control-code mappings:: Remapping @FWEB{}'s control codes (danger)! * Color:: @FWEB{}'s color output. * Miscellaneous params:: Other customizations. Customizing @FWEAVE{}'s index * delim_0: S_delim. Insert after identifier in index entry. * delim_n: S_delim. Insert between section numbers in index entry. * encap.infix: S_encap. Start the section number. * encap.prefix: S_encap. @TeX{} macro to begin a section number. * encap.suffix: S_encap. Ends the section number. * group_skip:: * index.collate: S_index. Collating sequence for the Index. * index.postamble: S_index. @TeX{} material to end the Index. * index.preamble: S_index. @TeX{} material to begin the Index. * index.tex: S_index. Name of file holding the Index. * item_0:: @TeX{} command to begin an index entry. * language.prefix: S_language. Begin a language entry in the Index. * language.suffix: S_language. End a language entry in the Index. * lethead.prefix: S_lethead. Begin a letter group. * lethead.suffix: S_lethead. End a letter group. * lethead.flag: S_lethead. Control beginning of letter group. * name: S_index. Name of index. * underline.prefix: S_underline. Begin an underlined index entry. * underline.suffix: S_underline. End an underlined index entry. Customizing the module list * modules.info: S_modules. * modules.postamble: S_modules. @TeX{} commands to end module list. * modules.preamble: S_modules. @TeX{} commands to begin module list. * modules.tex: S_modules. Name of file containing list of modules. Customizing the Table of Contents * contents.postamble: S_contents. @TeX{} commands to end Table of Contents. * contents.preamble: S_contents. @TeX{} commands to begin Table of Contents. * contents.tex: S_contents. Name of contents file. Customizing cross-reference subscripts * mark_defined.generic_name: S_mark_defined. * mark_defined.fcn_name: S_mark_defined. * mark_defined.WEB_macro: S_mark_defined. * mark_defined.outer_macro: S_mark_defined. * mark_defined.exp_type: S_mark_defined. * mark_defined.typedef_name: S_mark_defined. Customizing the behavior of @file{fwebmac.sty} macros * doc.preamble: S_LaTeX. Preamble for entire document. * doc.postamble: S_LaTeX. Postamble for entire document. * format_IDENTIFIER: S_format. Macro name for typesetting upper-case identifiers. * format.reserved: S_format. Macro for reserved words. * format.short_identifier: S_format. Macro for single-character identifiers. * format_OUTER_MACRO: S_format. Macro for upper-case @samp{@@d} identifiers. * format.outer_macro: S_format. Macro for lower-case @samp{@@d} identifiers. * format_WEB_MACRO: S_format. Macro for upper-case @samp{@@m} identifiers. * format.WEB_macro: S_format. Macro for lower-case @samp{@@m} identifiers. * format.intrinsic: S_format. Macro for intrinsic library functions. * format_KEYWORD: S_format. Macro for upper-case keywords. * format.keyword: S_format. Macro for lower-case keywords. * format.typewriter: S_format. Macro for strings. * format.wildcard: S_format. Macro for user-defined index entries. * indent.TeX: S_indent. Paragraph indentation for @TeX{} part. * indent.code: S_indent. Paragraph indentation for code part. * LaTeX.class: S_LaTeX. Specify the document class. * LaTeX.class.options: S_LaTeX. Specify options for document class. * LaTeX.package: S_LaTeX. Specify user package(s) * LATeX.package.options: S_LaTeX. Specify options for user package(s). Miscellaneous style-file parameters * ASCII_fcn:: Routine for converting strings to ASCII. * cchar:: Continuation character for Fortran. * cdir_start:: @samp{@?} translates to this. * line_char:: Comment char. for @FTANGLE{}'s @code{line} cmds. * line_length: S_line_length. * paren.len: -n). Length of one parenthesized index for @samp{-n)}. * paren.levels: -n). Number of nested parentheses for @samp{-n)}. * paren.num: -n). Number of permitted indices for @samp{-n)}. * meta.top: S_meta_t. Material to precede tangled meta-comment. * meta.prefix: S_meta_t. Begins each line of meta-comment. * meta.bottom: S_meta_t. Material that follows the meta-comment. * meta.top.hdr: S_meta_t. Like meta.top, but for info at start of file. * meta.prefix.hdr: S_meta_t. As above. * meta.bottom.hdr: S_meta_t. As above. * outer.def: S_outer. @FTANGLE{} converts @samp{@@d} to this. * outer.undef: S_outer. @FTANGLE{} converts @samp{@@u} to this. * protect:: Protection character to end a continued line. * suffix:: Suffixes for output files. For @FWEAVE{}: * macros:: Default name of the macro package to be read in by @FWEAVE{}. * limbo.begin: S_limbo. Default material to begin the limbo section. * limbo.end: S_limbo. Default material to end the limbo section. * meta.code.begin: S_meta_w. * meta.code.end: S_meta_w. * meta.TeX.begin: S_meta_w. @TeX{} material to begin @FWEAVE{}'s output of a meta-comment. * meta.TeX.end: S_meta_w. As above, but end the meta-comment. * preamble.named: S_preamble. @TeX{} material to begin named section. * preamble.unnamed: S_preamble. @TeX{} material to begin unnamed section. For both processors: * dot_constant.begin: S_dot_constant. Beginning character for dot constant. * dot_constant.end: S_dot_constant. Ending character for dot constant. * null_file:: Name of the null file. Automatic file name completion * Ext.web: S_Ext. Extensions for the web file. * Ext.ch: S_Ext. Extensions for the change file. * Ext.hweb: S_Ext. Extensions for include files. * Ext.hch: S_Ext. Extensions for change files associated with include files. USAGE TIPS and SUGGESTIONS * Converting:: Converting an existing code to @FWEB{}. * Tips:: Usage tips and suggestions. * Science:: Useful features for scientific programming. NEW FEATURES * V1.61:: * V1.53:: * V1.52:: * V1.50:: * V1.40:: @end menu @node Copying, Intro, Top, Top @comment node-name, next, previous, up @unnumbered @FWEB{} Copying Permissions @FWEB{} is ``free.'' This means that everyone is free to use them and free to redistribute them on a free basis. @FWEB{} operates under the terms of the GNU General Public License; see, for example, @ref{Distrib, , Distribution, emacs, The GNU Emacs Manual}. Although it is hoped that @FWEB{} will be useful, there is @emph{ABSOLUTELY NO WARRANTY}. @node Intro, Concepts, Copying, Top @comment node-name, next, previous, up @chapter INTRODUCTION to @FWEB{} @cindex Literate programming @FWEB{} is a system for @dfn{literate programming}. It enables one to maintain both documentation and source code in a single place (the @code{web} file), and to explain the code in terms of a @dfn{web} of very small fragments. Because @FWEB{} is intimately integrated with @TeX{}, one gains many advantages such as book-quality typesetting and extensive cross-referencing facilities. A simple example program is described in @ref{Structure}. @FWEB{} was originally intended for scientific programming (the 'F' stands for @sc{Fortran}), and is in wide use in that arena; however, it has much broader applicability. It is an extension of Knuth's WEB system that handles the specific languages C, C++, Fortran (both F77 and F90), @sc{Ratfor}, and (in a limited fashion) @TeX{} itself. It also attempts to implement a WYSIWYG language-independent mode as well as a (closely-related but not identical) verbatim `language'. @emph{The language-independent features are highly experimental} and are not recommended. The origins and philosophy of literate programming are described in the very enjoyable book by D. E. Knuth, @cite{Literate Programming} (Center for the Study of Language and Information, Leland Stanford Junior University, 1992). Knuth's original WEB @pindex WEB was written in Pascal, and it formatted Pascal code. Silvio Levy introduced @sc{Cweb}, @pindex CWEB a WEB system written in C for C. @FWEB{} @pindex FWEB is a (by now, substantial) modification of version 0.5 of @sc{Cweb} that was graciously supplied by Levy. It also borrows various ideas from the works of Ramsey and Briggs on language-independent webs. The original WEB's worked with Plain @TeX{}. More recently, many users have turned to Lamport's La@TeX{} because of its ease of use and higher-level features. Excellent and extensive development of La@TeX{} has been accomplished, as described by Goossens, Mittelbach, and Samarin, @cite{The La@TeX{} Companion} (Addison--Wesley, Reading, MA, 1994). The present version of @FWEB{} is intended to be used with La@TeX{} (La@TeX{}2e, in particular); Plain @TeX{} is no longer supported. @menu * History:: History of literate programming. * Features:: Special features of @FWEB{}. @end menu @node History, Features, Intro, Intro @comment node-name, next, previous, up @section History of WEB and literate programming (To be completed; see Knuth's book, cited in @ref{Intro}.) @node Features, , History, Intro @comment node-name, next, previous, up @section Features of @FWEB{} @FWEB{} is distinguished from its relatives in several respects: @quotation @itemize @bullet @item @FWEB{} introduces the concept of a @emph{current language} (@pxref{Languages}), so more than one compiler language can be processed in a single @FWEB{} run. For example, mixtures of C++ and @sc{Fortran} are common in modern scientific programming. @item @FWEB{} understands the syntaxes of several of the more important compiler languages: C, C++, @sc{Fortran} (both F77 and F90), @sc{Ratfor}, and @TeX{}. For other languages, @FWEB{} can work in a language-independent mode that essentially weaves and tangles the source code verbatim, but still provides the user with the powerful @sc{web} features related to @sc{TeX} documentation, module names, macro processing, etc. @item @FWEB{} contains a built-in @sc{Ratfor} (@sc{RATional} @sc{FORtran}) translator. @xref{Ratfor}. @item @FWEB{} has a built-in C-like @emph{macro preprocessor}. This is especially useful for @sc{Fortran} and @sc{Ratfor}, which have no predefined preprocessor. However, certain extensions such as variable numbers of arguments make the @FWEB{} preprocessor sometimes useful even for C and C++. @xref{Macros} and @ref{Preprocessing}. @item Many aspects of @FWEB{}'s behavior, default strings, etc. can be customized by means of setting parameters in a @code{makeindex}-like @emph{style file} (by default, @file{fweb.sty}). @xref{Style}. @end itemize @end quotation @node Concepts, Files, Intro, Top @comment node-name, next, previous, up @chapter WEB CONCEPTS The principle concepts of @sc{WEB} programming are laid out in Knuth's book, the reference to which was given in @ref{Intro}. @FWEB{} follows most conventions introduced by @sc{web} and @sc{Cweb}, except that the names of some commands have been changed for consistency, symmetry, and/or clarity. @menu * Processors:: @FTANGLE{} and @FWEAVE{}. * Phases:: Phases of operation of the @FWEB{} processors. * Structure:: The structure of a web. * Modules:: Use of named and unnamed modules. @end menu @node Processors, Phases, Concepts, Concepts @comment node-name, next, previous, up @section The @FWEB{} processors: @FWEAVE{} and @FTANGLE{} @cindex Processors, @FWEB{} Following Knuth's original design, @FWEB{} consists of two processors, @FTANGLE{} and @FWEAVE{}. Both operate on a single source file, say @file{test.web}. @FTANGLE{} produces compilable code, say @file{test.c}, whereas @FWEAVE{} produces a @TeX{} file, @file{test.tex}, that can (in principle) be processed with either @TeX{} or La@TeX{}. (If a file @file{test.tex} already exists, @FWEAVE{} will ask for confirmation before overwriting it if it does not think that the file was created by a previous run of @FWEAVE{}.) The output file produced by @FTANGLE{} is not intended for human eyes (or for editors!); it is for compiling only. All changes to the code should be made to the @code{web} file, since changes made directly to the output file would be overwritten the next time the @code{web} source is tangled. In an attempt to discourage messing with @FTANGLE{}'s output file, all unnecessary spaces are deliberately removed. @cindex Makefiles, using A common way of integrating @FWEB{} into ones program development is to do all compilations through a @code{make} file, into which one puts an extra dependency line that explains how to produce the compilable output file from the @code{web} source. For example, @example test.c: test.web ftangle test test.o: test.c gcc -c test test.c @end example @noindent With this approach, one is not so tempted to edit @file{test.c}. @FWEB{} development is now based on La@TeX{}; Plain @TeX{} is no longer supported. For detailed descriptions of the La@TeX{} support, see @ref{LaTeX}. @node Structure, Modules, Phases, Concepts @comment node-name, next, previous, up @section The structure of a web @cindex Web, structure An @FWEB{} source file is structured into @dfn{sections}, which correspond to logical subunits of the code (either a function or a fragment of a function). @cindex Sections Each section consists of three @dfn{parts}, each of which is optional: @cindex Parts @cindex Part, @TeX{} @cindex Part, definition @cindex Part, code the @quotation @enumerate @item @TeX{} part; @item definition part; and @item code part. @end enumerate @end quotation @noindent When @FTANGLE{} outputs code, it can combine the code parts of (possibly noncontiguous) sections into larger units called @dfn{modules}, as explained in @ref{Modules}. With the aid of sections, one's possibly huge and logically complex code can be broken down into bite-sized pieces, each one easily comprehensible. Since sections may correspond to only a small part of a function or subroutine, 1000-line main programs (they still exist!) should become a thing of the past. Since sections can be combined into modules, there is no need for sections that must be physically contiguous in the output file to be contiguous in the source file. This allows for great flexibility in structuring the documentation of the code. @subsubsection A simple example @cindex Example, of @FWEB{} file A simple example of an @FWEB{} source file consisting of three sections is as follows: @example @group @@n/ % Set FWEB language to Fortran, and recognize short // comments. \Title@{example.web@} % \Title is an FWEB TeX macro. \author@{J. A. Krommes@} % \author is a LaTeX macro. @@* INTRODUCTION. This code is intended to illustrate the use of the |write| statement. It also provides a simple example of the \FWEB\ macro preprocessor. @@m A_CONSTANT 1.2345 // \FWEB\ preprocessor macro definition. @@a program main call compute end @@ The computational routine is pretty boring. @@a subroutine compute write(*,*) 'Macro value = ', A_CONSTANT end @@* \INDEX. @end group @end example Commands to @FWEB{} are begun by the @samp{@@} symbol (@pxref{AT commands}). In this example, the first command, @samp{@@n}, sets the global language to @sc{Fortran}-77. One should always begin one's code with a language-setting command. In this example, the language command is invoked with an optional argument @samp{/}. That is necessary in @sc{Fortran} in order to tell @FWEB{} to use the short (single-line) comment form beginning with @samp{//}, which otherwise conflicts with the concatenation operator. @xref{-n/}. For more information about languages, see @ref{Languages}. For a fuller discussion of optional arguments, see @ref{Setting the language}. @findex @@* @cindex Sections, named @cindex Sections, unnamed The @samp{@@*} command begins a @dfn{major} or @dfn{named section} (corresponding to La@TeX{}'s @code{\section} command); this command is followed by the section name, terminated by a period. (The period is essential; if it is omitted, weird errors may result.) Major sections are entered in an automatically generated Table of Contents. They are also printed at the top of each output page. If the full section name is too long to so print, one can shorten it with an optional argument, as in @example @@* [INTRO]INTRODUCTION. @end example The command @samp{@@*@i{n}} (not illustrated in the above example) begins a major (sub)section of level @i{n}, where @samp{@@*0} is equivalent to the simple @samp{@@*}, @samp{@@*1} indicates a subsection, and @samp{@@*2} indicates a subsubsection. The highest permissible major level is 2 (a subsubsection). Such subsections are also entered in the Table of Contents. For more information, see @ref{Sections}. @findex \INDEX @cindex Index As the example demonstrates, the name of the very last section, which should be starred, should be @samp{\INDEX}. Note the backslash; @samp{\INDEX} is a @TeX{} macro. This command tells @FWEAVE{} to write out the index in a special two-column format. By default, @samp{\INDEX} expands to @samp{INDEX}, but this name can be overridden by the style-file parameter @samp{index.name} (@pxref{S_index}). For more discussion of @FWEB{}'s indexing facilities, see @ref{Index}. Minor (@dfn{unnamed}) sections are begun by @ASP{} (``at-space''); these have no associated names and are not entered into the Table of Contents. A newline counts as a space. @subsubsection The @TeX{} part @cindex Commentary, optional @cindex Part, @TeX{} All sections begin with (optional) @TeX{} commentary. That can just be straight text; to input that, no knowledge of @TeX{} is required. It can also include mathematical exposition or any of the other advanced features offered by @TeX{}. Whenever @FWEB{} is in @TeX{} mode, one can temporarily shift into @dfn{code mode} @cindex Code mode @cindex Vertical bars @cindex Code, typesetting by enclosing the code within vertical bars. That code is typeset just like code in the code part (see below), except that newlines are replaced by spaces. Thus, one can say things like @example Consider the C code fragment `|@@c for(i=0; i<10; i++)@{@}|', which ... @end example @noindent (If the global language were C instead of @sc{Fortran}, the @samp{@@c} inside the vertical bars would not be necessary.) The ability to switch back and forth between text mode and code mode at will allows for a very convenient and flexible style of exposition. @subsubsection The definition part @cindex Part, definition The @TeX{} part is followed by an optional @dfn{definition part}. The beginning of the definition part is signaled by the appearance of any one of the commands @samp{@@d}, @samp{@@f}, @samp{@@m}, @samp{@@v}, or @samp{@@W} (explained later). In the previous example, the first section has a definition part consisting of one @FWEB{} macro definition (@samp{@@m}); the second section has no definition part. For more information, see @ref{Macros}. (Failure to appreciate how easy it is to shift from part to part can get one into trouble. For example, don't write documentation such as @samp{Consider the @@m command}, because the @samp{@@m} will inadvertently terminate the documentation part and begin the definition part. What one needs to do here is to use the literal @samp{@@}, as in @samp{@@@@m}.) @cindex @@, literal @subsubsection The code part @cindex Part, code An unnamed @dfn{code part} is begun by @samp{@@a}. A named code part is begun by the appearance of a module name, such as @samp{@@}, followed by an equals sign; see @ref{Modules}. Within the code part, one can place any sequence of code or code fragments (they need not be complete subroutines) that are valid for the current language. (Setting the language is described in @ref{Languages}.) The code part is terminated by the next appearance of @samp{@@*} or @ASP{} (which signal the beginning of a new section), or by the end of file. @subsubsection The limbo section @cindex Section, limbo @cindex Limbo section The portion of the source file before the first section (i.e., before the first @samp{@@*} or @ASP{}) is called @dfn{in limbo} or @dfn{the limbo section}. @cindex Limbo section The only @samp{@@} commands that are allowed in limbo (in addition to @samp{@@@@}, which stands for the character @samp{@@} and is allowed anywhere) are the language-changing commands, and one of those, such as @samp{@@c}, should appear. Other text in limbo is ignored by @FTANGLE{} and is copied by @FWEAVE{} to the @code{tex} output file. Thus, one can make or issue @TeX{} macro definitions in limbo that override the defaults in @FWEB{}'s macro package @file{fwebmac.sty}. In the above example, see the @code{\Title} command. This is defined in @file{fwebmac.sty}, and basically issues La@TeX{}'s @code{\title} command. (Another way of getting @TeX{} text into the limbo section is by means of the @samp{@@l} command; see @ref{ATl}.) La@TeX{} users may need to know that @TeX{} commands in limbo are executed @emph{after} the @samp{\begin@{document@}} command (which is issued automatically in @file{fwebmac.sty}). For more information, see @ref{LaTeX}. @node Modules, , Structure, Concepts @comment node-name, next, previous, up @section Modules @cindex Modules The code parts of (possibly noncontiguous) sections can be combined into @dfn{modules}. For @FWEAVE{}, this is a @emph{logical} combination, for purposes of cross-referencing different pieces of the code. But for @FTANGLE{}, the combination is physical; @FTANGLE{}'s output proceeds module by module. Modules can be @dfn{named} or @dfn{unnamed}. There is exactly one unnamed module. The fundamental operation of @FTANGLE{} is that @quotation @emph{@FTANGLE{} outputs the unnamed module}. @end quotation @noindent That output goes to a compilable file with an extension appropriate to the current language. The contents of a module, either unnamed or named, consists of a mixture of code and comments. @FTANGLE{} ignores the comments; @FWEAVE{} treats them as @TeX{} text. Within any @TeX{} text, including comments, constructions delimited by @samp{|...|} signify a temporary shift into code mode. (In the present design, one cannot enclose a comment within the vertical bars.) @subsection The unnamed module The unnamed code module @cindex Unnamed module @cindex Module, unnamed is introduced by the command @samp{@@a}. Subsequent uses of @samp{@@a} accrete code to the unnamed module. To repeat, the fundamental operation of @FTANGLE{} is that @quotation @emph{@FTANGLE{} outputs the unnamed module}. @end quotation @noindent Thus, there must be at least one @samp{@@a} in the source file or @FTANGLE{} will output nothing. (Why is the command called @samp{@@a}? Historically, it was the first letter of the alphabet, as befits its prominent status. However, one can also think of it as ``accrete.'') @subsection Named modules @cindex Named module @cindex Module, named Named modules represent logically-connected fragments of code. A module name is specified by the construction @example @@< @i{Arbitrary @TeX{} text} @@> @end example @noindent Leading and trailing white space around the name text is ignored. The name text can include the @samp{|...|} construction, which tells @FWEAVE{} to typeset a code fragment. Thus, module names can be highly explicit---for example, @example @@< Check that |x >= 0.0|; |abort| if not @@> @end example To define a named module, replace the @samp{@@a} that begins the unnamed code part of a section by @samp{@@< @i{module name} @@>=}. If one uses this construction with the same name in a later section, the effect is to @emph{accrete} to the contents of the module. Thus, a named module might ultimately consist of the code from sections 2, 5, and 9, for example. To use a named module, simply use the name anywhere in a code part; @FTANGLE{} will insert the contents of the module at the point where the name is used. For example, @example @@c @@ Here's how to use a named module. @@a for(i=1; i@@; @@ Here's how to define a named module. Definitions may occur after use. @@< Inner...@@>= @{ a[i] = i; @} @end example @noindent There are several details to notice about the above example. First, @FWEAVE{} considers module names to be simple expressions (such as the single identifier @var{x}). In C, expressions are made into complete statements (as is required in the body of a @b{for} statement) by appending a semicolon. In this case, a @emph{pseudo-semicolon} @samp{@@;} is appropriate; for more discussion of that, see @ref{AT;}. Second, after a name has appeared once in full, it may be abbreviated by a unique prefix followed by three periods, as demonstrated in the above example. By convention, a complete module name cannot be a subset of another. For example, @samp{@@} and @samp{@@} will elicit an error message. Commonly, the first unnamed section in the code indicates its modular structure. For example, a C code might begin with @example @@c @@* DEMO. @@a @@@@; @@@@; @@@@; @@@@; @end example @noindent Subsequently one can accrete to the above named sections, as often as desired and in any order. This way, definitions of global variables can be introduced anywhere in the @code{web} source file as logical and pedagogical exposition dictates, but will be guaranteed to appear at the top of the code. Function prototypes could be handled this way as well; alternatively, they could all be collected into one section, perhaps at the end of the source file. (The above organization still guarantees that they will appear at the beginning of the output.) Functions could be introduced one at a time in subsequent unnamed sections. Very rarely, one might try the following construction: @example @@ @@a @@< @i{Left side} @@> = @@< @i{Right side} @@>@@; @end example @noindent Here the intent is to construct an assignment statement. However, this will be flagged as an error because @FWEB{} thinks one is trying to define the named module @samp{@@<@i{Left side}@@>}, which one shouldn't be doing while in code mode. To make it work, just put the invisible expression @samp{@@e} (@pxref{ATe}) before the equals sign. @node Phases, Structure, Processors, Concepts @comment node-name, next, previous, up @section Phases of processing The @FWEB{} processors perform their work in several distinct phases. (The following is somewhat technical. Scan it, then use it for reference later if necessary.) @subsection The phases of @FTANGLE{} @cindex Phases, of @FTANGLE{} @FTANGLE{} has two phases. In phase 1, the source file is read; in phase 2, compilable code is written out in the order specified by the web. More specifically, phase 1 @quotation @itemize @bullet @item discards @TeX{} documentation; @item tokenizes the source; @item expands @FWEB{} preprocessor commands such as @samp{@@#if} (@pxref{Preprocessing}); @item expands @samp{@@'...'} (@pxref{ATquote}), @samp{@@"..."} (@pxref{ATdquote}), and the binary notation @samp{0b...} (@pxref{C}) [in @sc{Fortran}, also the octal notation @samp{0...} and the hexadecimal notation @samp{0x...}]; @item stores code text in appropriate modules; @item memorizes macro definitions (@samp{@@d} and @samp{@@m}) (@pxref{ATd} and @ref{ATm}). @end itemize @end quotation Phase 2 @quotation @itemize @bullet @item outputs outer macro definitions (@samp{@@d}); @item outputs the unnamed module (@samp{@@a}); @item expands @FWEB{} macros (@samp{@@m}); @item expands built-in macros such as @samp{$IF} or @samp{$PI} (@pxref{Built-in functions}); @item translates @sc{Ratfor} statements (@pxref{Ratfor}). @end itemize @end quotation @subsection The phases of @FWEAVE{} @cindex Phases, of @FWEAVE{} @FWEAVE{} has three phases. In phase 1, the source file is read and cross-reference information is collected. In phase 2, the source file is read again, then pretty-printed with some cross-reference information. (For discussion of pretty-printing, see @ref{Pretty-printing}.) In phase 3, an automatically-generated Index, List of Modules, and Table of Contents are written. More specifically, phase 1 @quotation @itemize @bullet @item tokenizes and stores identifiers and module names; @item collects cross-reference information (including, in C and C++, the scanning of @samp{#include} files for @samp{typedef} and/or @samp{class} declarations (@pxref{-H_}); @item stores limbo text definitions made with @samp{@@l} (@pxref{ATl}); @item collects information about overloaded operators (@samp{@@v}) and identifiers (@samp{@@W}). @xref{ATv} and @ref{ATW_}. @end itemize @end quotation Phase 2 @quotation @itemize @bullet @item outputs limbo text; @item outputs special @TeX{} macros for overloaded operators; @item copies @TeX{} material directly to output; @item treats material between vertical bars (@samp{|...|}) as code to be typeset; @item tokenizes and stores contents of each code section; @item analyzes code syntax and converts it to appropriate @TeX{} macros. @end itemize @end quotation Phase 3 writes out cross-reference information. (To eliminate some of that, see @ref{-x}.) Specifically, it @quotation @itemize @bullet @item writes out the Index (@file{INDEX.tex} by default, but see @ref{Output files} and @ref{Index params}); @item writes out a list of named modules (@file{MODULES.tex} by default, but see @ref{Output files} and @ref{Module params}); @item writes out macros to generate the Table of Contents. (Table of Contents information is actually processed by La@TeX{}, not @FWEAVE{}. The information is written to the @file{aux} file.) @end itemize @end quotation @node Files, Starting, Concepts, Top @comment node-name, next, previous, up @chapter FILES @cindex Files @FWEB{} works with a variety of files. File names have the form @samp{[path]/root[.ext]}, where the brackets denote optional. Here the slash is called the @dfn{prefix end character}. Since this character differs for various operating systems, it can be changed by system installers in @file{custom.h} (@pxref{Customization}). The character that initiates the file-name extension (normally a period) can be changed with the @samp{-E} command-line option (@pxref{-E_}). @menu * Input files:: Input files. * Output files:: Output files. * Change files:: Change files. @end menu @node Input files,Output files,Files,Files @comment node-name, next, previous, up @section Input files @cindex Files, input @FWEB{} reads files with a variety of default extensions. @quotation @file{.fweb} --- Initialization file (optional; for setting up default options used for all runs). This file is always in the user's home directory. @xref{Initialization}. @findex .fweb @file{fweb.sty} --- Style file (optional; for customizing the behavior of a particular @code{web} file or group of files). @xref{Style}. This file is always in the directory of the @code{web} file that is being tangled unless that is changed by environment variable @code{FWEB_STYLE_DIR}. The basic name can be changed by the @samp{-z} option (@pxref{-z}). @findex fweb.sty A sample @file{fweb.sty} file is provided with the @FWEB{} distribution. @file{@i{name}.web} --- Source file. @file{@i{name}.ch} --- Change file (optional; for making incremental changes to a @code{web} source file). @xref{Change files}. @file{@i{name}.hweb} --- Code included into web file with @samp{@@i} (@pxref{ATi}). Include files are searched for in the path set by the environment variable @code{FWEB_INCLUDES} and/or the @samp{-I} option (@pxref{-I_}). If that path is empty, then the current directory is searched. @file{@i{name}.hch} --- Optional change file for include file. @end quotation @menu * Completion:: Automatic file-name completion. @end menu @node Completion,,Input files,Input files @comment node-name, next, previous, up @subsection Automatic file-name completion @cindex File-name completion @cindex Completion, automatic file-name Automatic completion of input file names is turned on by the @samp{-e} command-line option (@pxref{-e}). When this option is in effect, input file names that include no period (have no extension) are completed automatically according to the contents of the following style-file entries: @quotation @multitable { for include file} {Style-file entry} {Default} @item @r{Type of file} @tab @r{Style-file entry} @tab @r{Default} @item @r{WEB file} @tab @code{ext.web} @tab @code{web} @item @r{Change file} @tab @code{ext.ch} @tab @code{ch} @item @r{Include file} @tab @code{ext.hweb} @tab @code{hweb} @item @r{Change file for include file} @tab @code{ext.hch} @tab @code{hch} @end multitable @end quotation @noindent More than one extension may be specified, as a space-delimited list---e.g., @samp{ext.web = "web wb"}; the first one that matches is used. @node Output files,Change files,Input files,Files @comment node-name, next, previous, up @section Output files @cindex Files, output @FWEAVE{} writes a variety of output files. @quotation @file{@i{name}.tex} --- Woven output to be processed with La@TeX{}. @file{CONTENTS.tex} --- Temporary file that accumulates Table-of-Contents information. (For La@TeX{}, the @file{aux} file is used instead.) @findex CONTENTS.tex @file{INDEX.tex} --- Temporary file that stores indexing information. @findex INDEX.tex @file{MODULES.tex} --- Temporary files that stores module list. @findex MODULES.tex @end quotation @noindent @cindex Output files, changing names of The names of the three temporary files can be changed with style-file parameters (@pxref{Style}). Commonly, one may put into the style file @file{fweb.sty} commands such as @example index.tex "#.ndx" modules.tex "#.mds" contents.tex "#.cts" @end example @noindent The @samp{#} is replaced by the root name of the @code{web} file. @FTANGLE{} writes files of the form @quotation @file{@i{name}.@i{ext}} --- Compilable output file. @end quotation @noindent The extensions for the compilable output file(s) have certain defaults, but can be changed by style-file parameters according to the following table: @quotation @multitable {Fortran-77} {style-file entry} {unix default} {non-unix default} @item @r{Language} @tab @r{Style-file entry} @tab @r{@sc{unix} default} @tab @r{non-@sc{unix} default} @item C @tab @code{suffix.C} @tab @code{c} @tab @code{c} @item C++ @tab @code{suffix.Cpp} @tab @code{C} @tab @code{C} @item Fortran--77 @tab @code{suffix.N} @tab @code{f} @tab @code{for} @item Fortran--90 @tab @code{suffix.N90} @tab @code{f90} @tab @code{for90} @item Ratfor--77 @tab @code{suffix.R} @tab @code{r} @tab @code{rat} @item Ratfor--90 @tab @code{suffix.R90} @tab @code{r90} @tab @code{rat90} @item TeX @tab @code{suffix.X} @tab @code{sty} @tab @code{sty} @item VERBATIM @tab @code{suffix.V} @tab @code{mk} @tab @code{mk} @end multitable @end quotation @noindent For example, to change the default extension for a C++ file from @samp{C} to @samp{c++}, put into @file{fweb.sty} the line @example suffix.C = "c++" @end example @node Change files,,Output files,Files @comment node-name, next, previous, up @section Change files @cindex Files, change The primary input to the @FWEB{} processors is the @file{test.web} source file. However, a @dfn{change file} @file{test.ch} can also be specified. A change file consists of instances of the following structure: @example @@x (One or more lines of text, EXACTLY as in the web file. Copy these lines with an editor; don't type them from scratch.) @@y (Replacement text.) @@z @end example @noindent The change-file mechanism allows one to insert local changes or test new code without physically modifying the original web file. To specify a change file, use its name as the second file name on the command line. The extension @samp{.ch} is assumed by default. For example, @example ftangle test test @end example @noindent processes @file{test.web} with the change file @file{test.ch}. @findex @@[ @findex @@] In addition to @samp{@@x}, @samp{@@y}, and @samp{@@z}, the only @samp{@@} commands allowed in a change file are language-changing commands such as @samp{@@c} and the special commands @samp{@@[} and @samp{@@]}. The command @samp{@@[} is used for column-oriented languages such as @sc{Fortran}--77 and means @dfn{switch into code mode}. Similarly, @samp{@@]} means @dfn{switch out of code mode}. All @samp{@@} commands in a change file must begin in column 1. Lines not beginning with @samp{@@} are ignored, so may be used as comments. Comments may also be included on the @samp{@@x}, @samp{@@y}, and/or @samp{@@z} lines. @node Starting, AT commands, Files, Top @comment node-name, next, previous, up @chapter RUNNING @FWEB{} @FWEB{} has a @sc{unix}-style command-line syntax. There are many command-line options, but few or none of these are necessary for standard appplications. Proceed in blissful ignorance until you need to do something tricky, then scan the list of options to see if they can help. Commonly-used command-line options can be placed into the initialization file @file{.fweb} (@pxref{Options}) that resides in one's home directory. A @dfn{style file} (patterned after the utility @code{makeindex}; @pxref{Style}) can be associated with each manuscript or collection of related manuscripts in order to customize their appearance. This file is read @emph{after} the command-line options are processed, except that the @samp{-p} option gets special treatment; see @ref{-p}. @menu * Syntax:: Command-line syntax. * Options:: Command-line options. @end menu @node Syntax, Options, Starting, Starting @comment node-name, next, previous, up @section Command-line syntax The command-line syntax is @cindex Syntax, command-line @example @{ftangle | fweave@} [-option...] webfile[.web] [changefile[.ch]] @end example @noindent A file name is anything that doesn't begin with a @samp{-}, except that a lone hyphen stands for the special file name @file{stdin}, which means `read from the standard input.' (This should not be used except for very special effects.) @findex - Command-line options begin with a @samp{-}. File names and options can be intermixed, or the options may appear after the file names. The first file name encountered is the web source file; the second, if it exists, is the change file (@pxref{Change files}). [When no change file is specified, @FWEB{} attempts to read from the null file (@file{/dev/null} on @sc{unix} systems). This name should be specified when @FWEB{} is installed (@pxref{Customization}), or can be set in the style file @file{fweb.sty}. @xref{null_file}.] The web file is shown as required since one is normally processing a source. However, some of the information options (@pxref{Info options}) will work without specifying any file name. For example, one can obtain a list of all of the style-file parameters and their default values by saying @w{@samp{ftangle -Z}}. @node Options, , Syntax, Starting @comment node-name, next, previous, up @section Command-line options Command-line options may be put, one per line, into the initialization file @file{.fweb} (which is always in the user's home directory). In that file, options beginning with a hyphen are processed @emph{before} the command-line options (so command-line options can override the defaults). To force an option to be processed @emph{after} the command-line options, preface it with an ampersand rather than a hyphen; this is rarely necessary. To make sense of the plethora of options, it helps to know that options beginning with @samp{n} are related to @sc{Fortran}; those beginning with @samp{r} are related to @sc{Ratfor}. Some flags that can be set separately for those two languages also have a global option that sets the flags for both languages simultaneously; cf. @samp{-n/}, @samp{-r/}, and @samp{-/}. Some options take arguments. For example, an @FWEB{} macro can be defined from the command line by saying something like @samp{-mIBMPC=1}. Unlike many @sc{unix} utilities, @emph{no spaces are allowed between any option and its argument.} For example, if one says @samp{-m IBMPC}, @FWEB{} will think that @file{IBMPC} is a file name. @menu * Negating options:: How to invert the meaning of an option. * -1:: Brief debugging mode. * -2:: Verbose debugging mode. * -@@: -AT. Display information about control codes. * -A: -A_. Turn on ASCII translations. * -B: -B_. Turn off audible beeps. * -b:: Number blocks. * -C: -C_. Set the color mode. * -c:: Set global language to C. * -c++: -cpp. Set global language to C++. * -D: -D_. Display information about @FWEB{}'s reserved words. * -d:: Convert unnumbered `do...enddo's to Fortran--77. * -E: -E_. Change the delimiter of a file-name extension. * -e:: Turn on automatic file-name completion. * -F: -F_. Compare output files with old versions. * -f:: Turn off module references for identifiers. * -H: -H_. Scan #include files to format typedef and/or class commands. * -h:: Where to get help. * -I: -I_. Append a directory to search list for include files. * -i:: Don't print contents of @@I include files. * -i!:: Don't even read @@I include files. * -j:: Inhibit multiple includes of the same file. * -k:: Don't recognize lower-case forms of Fortran I/O keywords. * -L: -L_. Select global language. * -l:: Echo the input line. * -M: -M_. Set output message level. * -m:: Define an @FWEB{} macro. * -m4:: Understand the m4 built-in commands. * -m;:: Append pseudo-semicolons to @FWEB{} macro definitions. * -n:: Set global language to Fortran--77. * -n9:: Set global language to Fortran--90. * -n@@;: -nAT;. For Fortran, supply pseudo-semicolons automatically (default). * -n;:: For Fortran, supply actual semicolons automatically. * -ncolon:: In Fortran, place statement labels on separate lines. * -nb:: In Fortran, number the ifs and dos. * -nC:: In Fortran, ignore single-line comments ('C', 'c', or '*'). * -np:: Print semicolons in woven Fortran output. * -n\:: In Fortran--90, free-form syntax continued with '\\'. * -n&:: In Fortran--90, free-form syntax continued with '&'. * -n/:: In Fortran, recognize '//' as the start of a short comment. * -n!:: In Fortran, make '!' denote the start of a short comment. * -n):: In Fortran, reverse array indices. * -o:: Turn off @FWEAVE{}'s mechanisms for overloading operators. * -q:: Don't translate Ratfor. * -P: -P_. Select TeX processor. * -p:: Set style parameter. * -r:: Set the global language to Ratfor--77. * -r9:: Set the global language to Ratfor--90. * -rb:: In Ratfor, number the ifs and dos. * -rg:: Set |goto| parameters. * -rk:: Suppress comments about Ratfor statement translation. * -rK: -rK_. Write out comments about Ratfor statement translation. * -r@@;: -rAT;. Turn on Ratfor's auto-semi mode, using pseudo-semicolons. * -r;:: Turn on Ratfor's auto-semi mode, using actual semicolons. * -r/:: In Ratfor, recognize '//' as the start of a short comment. * -r!:: In Ratfor, make '!' denote the start of a short comment. * -r):: In Ratfor, reverse array indices. * -s:: Print statistics about memory usage. * -T: -T_. Flag-setting commands for @FTANGLE{}. * -t:: Truncate identifiers. * -U: -U_. Convert reserved output tokens to lower case. * -u:: Undefined a predefined or command-line macro. * -V: -V_. Print version number. * -v:: Make all comments verbatim. * -W: -W_. Flag-setting commands for @FWEAVE{}. * -w:: Change name of @FWEB{}'s macro package. * -X: -X_. Print selected cross-reference information. * -x:: Reduce or eliminate cross-reference information. * -y:: Allocate dynamic memory. * -Z: -Z_. Display default values of style-file parameters. * -z:: Change name of style file. * -.:: Don't recognize dot constants. * -\:: Explicitly escape continued strings. * -(: -lp. Continue parenthesized strings with backslashes. * -colon:: Set starting automatic statement number * ->:: Redirect tangled output. * -=:: Redirect tangled output. * -#:: Don't print comments about line numbers and module names in tangled output. * -+: -plus. Don't interpret compound assignment operators. * -/:: Recognize '//' as the start of a short comment. * -!:: Make '!' denoted the start of a short comment. * Info options:: Information options. @end menu @node Negating options,-1,Options,Options @comment node-name, next, previous, up @subsection Negating options @cindex Options, negating To negate a command-line option, use an extra hyphen. For example, @samp{--v} means `Don't make all comments verbatim.' This kind of construction isn't used very often, but it is useful if an option such as @samp{-v} is turned on in the @file{.fweb} initialization file and one wishes to turn it off for just one run. @node -1,-2,Negating options,Options @comment node-name, next, previous, up @subsection @samp{-1}: Turn on brief debugging mode (@FWEAVE{}) @findex -1 @cindex Debugging This option tells @FWEAVE{} to display irreducible scrap sequences. @cindex Scrap, irreducible A @dfn{scrap} is a part of speech. The expression @samp{x + y} consists of three scraps: @samp{x} (an expression), @samp{+} (a binary operator), and @samp{y} (an expression). @FWEAVE{} contains @dfn{production rules} such as ``replace the combination @samp{expr binop expr} with @samp{expr}.'' If all goes well, the result of @FWEAVE{}'s reduction process is ultimately just one scrap, such as @samp{function}. If @FWEAVE{} is left with more than one scrap at the end of a section, this is called an @dfn{irreducible scrap sequence}; @samp{-1} displays them. Irreducible scrap sequences can arise either because the programmer made a mistake or because @FWEAVE{} has not been taught the proper grammar. @cindex Output, changing appearance of While @FWEAVE{} is reducing the scraps, it appends @TeX{} macros that ultimately produce the pretty-printed output. Frequently people ask how to change the appearance of that output. Fundamentally, this is not possible at present; the grammar rules and the associated @TeX{} are hard-coded. A completely general, user-customizable scheme is very complex and daunting; it has not been attempted. This brief debugging mode can be turned on more locally by means of the @samp{@@1} command. @xref{AT1}. @node -2,-AT,-1,Options @comment node-name, next, previous, up @subsection @samp{-2}: Turn on verbose debugging mode (@FWEAVE{}) @findex -2 @cindex Debugging This option tells @FWEAVE{} to display detailed reductions of the scraps as it does the pretty-printing. (For a discussion of scraps, see @ref{-1}.) Sometimes @FWEAVE{} fails spectacularly at pretty-printing a section, either because of a syntax error on the part of the user or because of a bug in @FWEAVE{}'s logic. This option helps one (usually the system developer!) to figure out why. This feature can be turned on more locally by means of the @samp{@@2} command. @xref{AT2}. @node -AT, -A_, -2, Options @comment node-name, next, previous, up @subsection @samp{-@@}: Display the control-code mappings @findex -@@ @cindex Options, information This option supplies information about the @samp{@@} control codes (@pxref{AT commands}). It shows the associated style-file parameters that can be used to remap the codes (but @emph{don't do that!}), and it displays the precedence. (Some codes such as @samp{@@@@} may be used anywhere; others such as @samp{@@*} begin a new section or part of section. Codes that begin the definition part are labelled by @samp{[D]}; codes that begin the code part are labelled by @samp{[C]}; codes that begin a new section are labelled by @samp{[S]}.) The option produces two columns of output: the first is sorted numerically, the second alphabetically. The notation @samp{USED_BY_OTHER} means that this command is ignored by whatever processor (@FTANGLE{} or @FWEAVE{}) is currently being run, but may be used by the other processor. (For technical reasons, a very few commands such as @samp{@@i} do not show up in this output at present.) If one says just @samp{-@@}, information about all control codes is produced. Selected control codes may be queried by listing them after the @samp{-@@}. For example, to learn about the commands @samp{@@~} and @samp{@@a}, say @samp{-@@~a}. Remember to quote certain characters on @sc{unix} systems---e.g., @samp{-@@'*?'}. If a command is used by neither processor, its description will be replaced by a question mark. @node -A_,-B_,-AT,Options @comment node-name, next, previous, up @subsection @samp{-A}: Turn on ASCII translations @findex -A This option is used primarily for debugging. @FWEB{} works internally with the ASCII character set. If @FWEB{} is run on a non-ASCII machine (notably IBM mainframes), translations to and from the internal ASCII are done automatically; on an ASCII machine, these translations are unnecessary and are not performed unless the @samp{-A} option is used. @node -B_, -b, -A_, Options @comment node-name, next, previous, up @subsection @samp{-B}: Turn off audible beeps @findex -B @cindex Marriage @FWEB{} sometimes beeps the terminal when it encounters certain errors. The @samp{-B} option turns off the beeps, replacing them by a printed exclamation point. (This option is sometimes called the ``marriage-saver,'' after the situation that prompted a user's request for this feature.) @node -b,-C_,-B_,Options @comment node-name, next, previous, up @subsection @samp{-b}: Number blocks (@FWEAVE{}) @findex -b @cindex Numbering blocks @cindex Blocks, numbering Number @b{do} and @b{if} blocks in woven @sc{Fortran} and @sc{Ratfor} output. This feature is particularly useful in @sc{Fortran}-77 to help correlate the beginnings and ends of long blocks (but note that appropriate use of literate programming techniques can keep all of one's blocks short!). Output something like the following is produced, where the comments are inserted automatically by the @samp{-b} option: @example do i=1,10 // Block 1 do j=1,10 // Block 2 if(i==j) then // Block 3 call sub1(i) else // Block 3 call sub2(i,j) endif // Block 3 end do // Block 2 end do // Block 1 @end example @noindent The precise form of the block comment that is emitted can be changed by redefining the macro @code{\Wblock} in @file{fwebmac.sty}. @findex \Wblock @node -C_, -c, -b, Options @comment node-name, next, previous, up @findex -C @subsection @samp{-C}: Set the color mode @cindex Color, setting The option @samp{-C@var{n}} sets the color mode to @var{n}, where the color modes are, briefly, @quotation @table @kbd @item 0 No color @item 1 ANSI color @item 2 Bilevel @item 3 Trilevel @item 4 User-defined @end table @end quotation @noindent These modes, and color output in general, are described more thoroughly in @ref{Color}. For obscure technical reasons, this command is processed differently than all other command-line options. In the present incomplete implementation, @emph{the color mode must be set on the command line}, not in @file{.fweb}! To work around this annoyance, @sc{unix} users could alias commands such as @w{@samp{ftangle -C1}}. @node -c, -cpp, -C_, Options @comment node-name, next, previous, up @findex -c @subsection @samp{-c}: Set global language to C @cindex Language, setting Usually the global language (@ref{Languages}) is set to C by means of the command @samp{@@c} in limbo, rather than using @samp{-c} on the command line. However, one may need to use the command-line option @samp{-c} if a subsequent command-line option is language-dependent. See, for example, the discussion of the option @samp{-D} in @ref{-D_}. @node -cpp, -D_, -c, Options @comment node-name, next, previous, up @subsection @samp{-c++}: Set global language to C++ @findex -c++ For more information, see the discussion of @samp{-c} in @ref{-c}. @node -D_, -d, -cpp, Options @comment node-name, next, previous, up @subsection @samp{-D}: Display reserved words @findex -D @cindex Options, information @cindex Reserved words @cindex Words, reserved @cindex Intrinsic functions @cindex Functions, intrinsic @cindex Keywords, I/O @cindex I/O keywords This information option displays the list of reserved words for the language currently in force. (For the purposes of this option, `reserved words' include ``true'' reserved words such as @samp{int}; they also include the names of intrinsic functions such as @samp{sin} and, for @sc{Fortran} and @sc{Ratfor}, I/O keywords such as @samp{IOSTAT}.) Thus, to see the reserved words for @sc{Ratfor}--90, say @example ftangle -Lr9 -D @end example @noindent (For this option one must set the language on the command line, because the @samp{-D} option is processed before the limbo section of the web file is read.) If one says @samp{-Dabc}, one will get just the reserved words that begin with "abc". If one says @samp{-D*}, one will get all reserved words for all languages. The @samp{-D} may be followed by a list of one or more optional letters enclosed in square brackets. (For @sc{unix} systems, don't forget to quote the brackets, as they mean something special to the shell.) The letters represent which kind of reserved word to display; they may be @samp{i} (`intrinsic'), @samp{k} (`keyword'), or @samp{r} (`reserved'). Thus, to see a list of the @sc{Fortran} keywords, say @samp{-D[k]}. To see a list of the intrinsic functions for C++ that begin with @samp{s}, say @samp{-Lc++ -D[i]s}. @node -d,-E_,-D_,Options @comment node-name, next, previous, up @subsection @samp{-d}: Convert do...enddo @findex -d @emph{(This option is obsolete.)} @node -E_,-e,-d,Options @comment node-name, next, previous, up @subsection @samp{-E}: Change the delimiter of a file-name extension @findex -E The standard delimiter for file-name extensions is a period, as in @file{test.web}. To change this character to a comma, for example, say @samp{-E,}. This feature is required by at least one perverse system. @node -e,-F_,-E_,Options @comment node-name, next, previous, up @subsection @samp{-e}: Turn on automatic file-name completion @findex -e When the @samp{-e} option is in effect, @FWEB{} attempts to be helpful in figuring out what file name one intends. For any input file name that has no extension (no embedded period), @FWEB{} completes the name by adding the extension contained in the style-file parameter listed in the following table: @example @r{Type of file} @r{Style-file entry} @r{Default} WEB file @code{ext.web} @code{web} Change file @code{ext.ch} @code{ch} Include file @code{ext.hweb} @code{hweb} Change file for include file @code{ext.hch} @code{hch} @end example @noindent More than one extension may be specified, as a space-delimited list---e.g., @samp{ext.web = "web wb"}; the first one that matches is used. @node -F_,-f,-e,Options @comment node-name, next, previous, up @subsection @samp{-F}: Compare output files with old versions (@FTANGLE{}) @findex -F When the @samp{-F} option is in effect, @FTANGLE{} writes its output to a temporary file (or files) instead of to its ultimate destination such as @file{test.c} and/or @file{test.f}. After all output is written, the temporary files are compared with the old version of the files, if they exist. If the files are identical, the appropriate temporary file is deleted; otherwise, the temporary file is renamed, effectively overwriting the old version. This feature avoids updating the time stamp on the file unnecessarily, so a @code{make} file won't recompile the output unless it really has to. Note that with this option in effect, if one uses the @sc{unix} utility @code{touch} to force processing of a group of files, but the @code{web} sources are never changed, the @code{make} file will continue to tangle the sources no matter how many times it is run, since @FTANGLE{} will never update the time stamp on the files. This is harmless, but annoying. To get things back in sync, do a run without the @samp{-F}. The location of the temporary file as well as details of the renaming procedure are determined by the automatic configuration script @code{./configure} during installation of the processors. The script first looks for the (non-ANSI) function @code{tempnam}. @findex tempnam If it finds it, it uses it to place the temporary file in the directory that @FWEB{} would normally use for output in the absence of the @samp{-F} option. (That is usually the current directory.) If @code{tempnam} is not available, the ANSI routine @code{tmpnam} is used. @findex tmpnam That places the temporary file in a directory determined by the system. To implement the renaming, the @code{rename} function is used. That may fail if @code{tmpnam} placed the temporary file on a different device. If so, an attempt is made to force the rename by using the @code{system} routine to issue a @code{mv} command. Terminal output indicates the progress of the renaming. An asterisk following an output file name indicates that @code{rename} did not succeed, but the @code{mv} command did. Some of the above-mentioned file names and system commands are system-dependent; see @ref{Customization}. @node -f,-H_,-F_,Options @comment node-name, next, previous, up @subsection @samp{-f}: Turn off module references for identifiers (@FWEAVE{}) @findex -f In an attempt to be helpful, @FWEAVE{} appends subscripts to many identifiers indicating in which section they are first defined (@pxref{Subscript params}). Sometimes these result in output that is too cluttered and confusing. The @samp{-f} option turns off the subscripting operations. @node -H_,-h,-f,Options @comment node-name, next, previous, up @subsection @samp{-H}: Scan C/C++ include files (@FWEAVE{}) @findex -H @findex -Hx @findex -HX @findex -Hr @cindex Include files, scanning For C or C++, the @samp{-H} option tells @FWEAVE{} to do a phase-1 scan of @code{#include} files for @samp{typedef} and/or @samp{class} declarations. This removes the necessity of including many redundant @samp{@@f} format statements (@pxref{ATf}), which would otherwise be necessary in order that the code be pretty-printed correctly. For example, if one uses the @samp{-H} option with the code @example @@c++ @@ #include Complex z; @end example @noindent the identifier @b{Complex} will be properly formatted as a reserved word (in boldface), as though one had said @samp{@@f Complex int}. In addition to the basic @samp{-H}, there are several more detailed options: @quotation @table @code @item -Hx Make index entries only for double-quoted include files. @item -HX Make index entries for all include files. @item -Hr Retain temporary files generated by the preprocessor. @end table @end quotation By default, index entries are not made for variables that are read during such scans. If one says @samp{-Hx}, index entries will be made only for include files whose names are enclosed in double quotes rather than angle brackets, such as @samp{#include "myheader.h"} (usually these are defined by the user and reside in the local directory). If one says @samp{-HX}, index entries will be made for all include files. This can generate many entries, since system header files may be complicated and may include other files as well. This command is implemented as follows. When @FWEAVE{} reads an @code{#include} statement, it issues a @code{system} command to run the C preprocessor on the included file. Output from the preprocessor is written to a temporary file, which @FWEAVE{} scans. By default, the C preprocessor will look in certain default paths for the included files. To add to those defaults, use one or more @samp{-I} options @emph{after} the @samp{-H}. These colon-delimited lists are concatenated to the contents of the environment variable @code{FWEB_HDR_INCLUDES}, if that is defined. The entire list is then passed as multiple @samp{-I} options to the preprocessor. This command, new with version 1.53, is @emph{highly experimental} and incomplete. The installation script attempts to determine what command to use to run the preprocessor, but that is not guaranteed to work in general. @samp{-H} has been tested only with @code{gcc}. To send arguments to the C preprocessor, see @ref{-WH_}. The @samp{-H} mechanism uses temporary files to do its work. By default, those are deleted after use. However, for debugging purposes, one can force those to be retained by saying @samp{-Hr}. That option also has the side effect of displaying the actual command line that was sent to the preprocessor. @node -h,-I_,-H_,Options @comment node-name, next, previous, up @subsection @samp{-h}: Get help @findex -h If just @samp{-h} is typed, a message is printed saying where further help is available. It refers one to the various information options (@pxref{Info options}) and the on-line documentation (@pxref{Support}). If the stand-alone @code{info} program (the GNU hypertext browser) is installed, one can enter @samp{info FWEB} at this time by typing @samp{?} or a space-separated list of @FWEB{} menu items such as @samp{Macros FWEB built-in $PI}. In fact, since @samp{$PI} appears in the detailed node listing, one can simply type @samp{$PI}. More generally, one can type anything that @code{info} accepts on its command line (the option @samp{-f FWEB} is implicit). One can bypass the printed message and directly enter @code{info} by specifying the @code{info} arguments as arguments to @samp{-h}. For example, on a @sc{unix} system, one could type @samp{-h'\$PI'}. Here the dollar sign must be escaped because it has special significance to the shell, and the quotes are necessary in order to preserve that escape character as the argument is supplied to @code{info}. To get to the top-level @FWEB{} info directory, type @samp{-h.} or @samp{-h'?'}. @node -I_,-i,-h,Options @comment node-name, next, previous, up @subsection @samp{-I}: Append to search list for include files @findex -I @cindex Include files, finding The fundamental search list for @dfn{include files} (read in via @samp{@@i} or @samp{@@I}) is defined by the environment variable @code{FWEB_INCLUDES}, which is a colon-delimited list such as @example setenv FWEB_INCLUDES .:/usr/fweb:/other/stuff @end example @noindent The @samp{-I} option appends to this list. For information about include files, see @ref{ATi}. @node -i,-i!,-I_,Options @comment node-name, next, previous, up @subsection @samp{-i}: Don't print @samp{@@I} include files (@FWEAVE{}) @findex -i @findex -ix @cindex Include files, skipping @cindex Include files, indexing If a web file is included via @samp{@@I} (@pxref{ATI_}), for example @example @@I formats.hweb @end example @noindent then the @samp{-i} option means to read and process the web file, but don't print its contents. This option is often used for large files of macro definitions, formats, or @b{typedef} statements that must be included at the beginning of even very short web files; it clutters things up to print such header files all of the time. (C and C++ programmers will find that the @samp{-H} option substantially reduces the need to include such header files; see @ref{-H_}.) Note that files included via @samp{@@i} (lower case) do not respond to @samp{-i} or @samp{-i!}. By default, identifiers that are referenced in non-printed include files are not cross-referenced or indexed in any way. To force them to be cross-referenced, say @samp{-ix} instead of @samp{-i}. In the present implementation, the cross-reference information for such non-printed files is presented in the form @samp{#@i{n}}, where @i{n} is the integer section number. (The La@TeX{} section label is undefined for sections in non-printed files.) The option @samp{-i!} means skip the include files completely. This is usually not very useful. @node -i!,-j,-i,Options @comment node-name, next, previous, up @subsection @samp{-i!}: Don't read @samp{@@I} include files If a web file is included via @samp{@@I}, for example @example @@I formats.hweb @end example @noindent then the @samp{-i!} option means to ignore such files completely. This option is seldom useful; the @samp{-i} option (@pxref{-i}) is more often used. @node -j,-k,-i!,Options @comment node-name, next, previous, up @subsection @samp{-j}: Inhibit multiple includes @findex -j @cindex Include files, inhibiting File inclusion via @FWEB{}'s @samp{@@i} command suffers from a design deficiency: they cannot be inhibited by means of @FWEB{}'s preprocessor commands. (The reason is that @samp{@@i} is processed very early in the input stage, before tokenization. This design decision was inherited from @sc{Cweb}, and is very difficult to change.) A particularly annoying situation arises when the same file is included multiple times; various array space may be eaten up unnecessarily. The @samp{-j} option inhibits such multiple includes. @node -k,-L_,-j,Options @comment node-name, next, previous, up @subsection @samp{-k}: Don't recognize lower-case forms of keywords @findex -k By definition, in @sc{Fortran} and @sc{Ratfor}, a keyword is one of the parameters such as @code{IOSTAT} used in the parameter list of an I/O statement. For example, @example open(21, FILE=file_name, STATUS='old', IOSTAT=io_flag) @end example @noindent Such keywords are typeset in @code{typewriter type} to better highlight them. In @sc{Fortran}, these keywords are case-insensitive. However, note that certain of the lower-case forms---in particular, @samp{end}, @samp{read}, and @samp{write}---have other special meanings, and one can in principle use any of these keywords as ordinary variables in other parts of the code; however, @FWEB{} identifiers can have just one meaning throughout the code. By default, the lower-case forms are also recognized as keywords (except for the three special identifiers just mentioned), so one shouldn't use those as regular variables. To cause only the upper-case forms to be recognized, use the @samp{-k} option. @node -L_,-l,-k,Options @comment node-name, next, previous, up @subsection @samp{-L}: Select global language @findex -L To select a global language from the command line, say @samp{-L@i{l}}, where @i{l} is one of @code{@r{@{}c,c++,n,n9,r,r9,v,x@r{@}}}. @xref{Languages}. Usually, the global language is set via an @samp{@@} command in limbo, not on the command line. However, one may need to use a command-line option such as @samp{-L_} if a subsequent command-line option is language-dependent. See, for example, the discussion of the option @samp{-D} in @ref{-D_}. @node -l,-M_,-L_,Options @comment node-name, next, previous, up @subsection @samp{-l}: Echo input line @findex -l The option @samp{-l@i{[mmm[:nnn]]}} echoes the input lines constructed by the input driver between lines @i{mmm} and @i{nnn}. Missing @i{nnn} means echo to the end of file. Missing @i{mmm} means echo from the beginning. This option is useful as a debugging tool (usually by the system developer). It is often used to verify that the input driver is inserting semicolons correctly. For @sc{Fortran}--77, it is also useful to verify that comments are being processed correctly. @node -M_, -m, -l, Options @comment node-name, next, previous, up @subsection @samp{-M}: Set output message level @cindex Message level @cindex Level, message @findex -M By default, @FWEB{} is relatively verbose; as it proceeds, it prints messages about what files it is reading and writing, numbers of the starred sections, line numbers, etc. However, different levels of verbosity can be set by the command @samp{-M@i{level}}, where the level may be 0 (least verbose) through 4 (most verbose; the default), as described in the following table: @quotation @table @kbd @item 0 Like level 1, but the start-up banner is not printed. If @FWEB{} runs to completion with no errors, nothing at all will be printed. @item 1 Print only error messages. @item 2 Print error and warning messages. @item 3 Print errors, warnings, and short information messages (excluding starred section numbers and line numbers). @item 4 Print everything. @end table @end quotation The start-up banner, which includes the version number, is printed for all message levels except 0. For level 0, one can use the @samp{-V} option to request the start-up banner. @xref{-V_}. This option is very recent, and may not be fully debugged for obscure combinations of command-line options. Please report any annoyances. Another way of discriminating message types is via color output. @xref{Color}. @node -m,-m4,-M_,Options @comment node-name, next, previous, up @subsection @samp{-m}: Define @FWEB{} macro (@FTANGLE{}) @findex -m The command-line construction @example -mA(x)=x @end example @noindent defines the @FWEB{} macro @code{A} as though the definition @example @@m A(x) x @end example @noindent had appeared in the first definition part of the web file. One can also say @samp{-m'A(x) x'}, where the quotes are removed by the shell. That is, an @samp{=} appearing @emph{immediately} after the macro name (or argument list, if there is one) plays the role of the space in the conventional definition. Thus, carefully distinguish the forms @example -m'A(x)=x' // @r{A(x) expands to @samp{x}} -m'A(x) =x' // @r{A(x) expands to @samp{=x}} -m'A(x)==x' // @r{Precisely equivalent to the previous example.} @end example The equals sign is permitted only with command-line macro definitions, not with @samp{@@m} commands (@pxref{ATm}) in the definition parts of the web file. @node -m4,-m;,-m,Options @comment node-name, next, previous, up @subsection @samp{-m4}: Understand @code{m4} built-in commands @findex -m4 @cindex Preprocessor, m4 This tells @FWEAVE{} to properly format the reserved words of the @code{m4} preprocessor. The use of that preprocessor is @emph{not recommended} in conjunction with @FWEB{}; use @FWEB{}'s built-in C-like preprocessor instead. @node -m;,-n,-m4,Options @comment node-name, next, previous, up @subsection @samp{-m;}: Append pseudo-semicolons @findex -m; When @samp{-m;} is in effect, the construction @samp{@@;} is appended automatically to all @FWEB{} macro definitions. @emph{This option is not recommended.} Please insert the @samp{@@;} by hand when necessary, as in @example @@m SET(x,y) x=1; y=2@@; @@m TEST(x) if(x) y; else z@@; @end example @node -n,-n9,-m;,Options @comment node-name, next, previous, up @subsection @samp{-n}: Set global language to @sc{Fortran}--77 @findex -n This is @FWEB{}'s default, so it generally does not need to be used explicitly. (See also the discussion of @ref{-L_}.) However, variants of this option, as described below, may be useful. See also @ref{Languages} and @ref{Fortran}. @node -n9,-nAT;,-n,Options @comment node-name, next, previous, up @subsection @samp{-n9}: Set global language to @sc{Fortran}--90 @findex -n9 @xref{Languages} and @ref{Fortran}; see also the discussion of @samp{-L} in @ref{-L_}. @node -nAT;, -n;, -n9, Options @comment node-name, next, previous, up @subsection @samp{-n@@;}: Supply automatic pseudo-semicolons [@sc{Fortran}] @findex -n@@; @cindex Pseudo-semicolons, automatic @cindex Automatic pseudo-semicolons (Don't forget that a semicolon has special meaning to @sc{unix} shells, so you'll probably have to quote this command: @samp{-n'@@;'}.) This is the default mode of operation for free-form @sc{Fortran}-90; the input driver automatically appends a pseudo-semicolon (invisible) to each logical line of source code. Since it is the default, one doesn't have to use it unless one wishes to negate it (@pxref{Negating options}). In that case, it is best to place the @samp{--n@@;} command in the source file, as @samp{@@n9[--n@@;]}. If one places it on the command line, be sure to set the language first: @code{-n9 --n@@;}. For free-format @sc{Fortran}-90, when @samp{-n@@;} is in effect (the default), @samp{-np} is also turned on. @xref{-np}. For further discussion, see the companion command @ref{-n;}. @node -n;,-ncolon,-nAT;,Options @comment node-name, next, previous, up @subsection @samp{-n;}: Supply automatic semicolons [@sc{Fortran}] @findex -n; @cindex Semicolons, automatic @cindex Automatic semicolons (Don't forget that a semicolon has special meaning to @sc{unix} shells, so you'll probably have to quote this command: @samp{-n';'}.) This command functions the same as @samp{-n@@;} (@pxref{-nAT;}, except that actual (visible) semicolons rather than pseudo-semicolons are appended. This is the default mode of operation for @sc{Fortran}-77 (and for that language, it cannot be turned off by negation). The distinction between @samp{-n@@;} and @samp{-n;} has to do with what is visible on output. In @sc{Fortran}-77, semicolons are not printed by default since that seemed to annoy many users. However, that causes trouble with @sc{Fortran}-90 code containing multiple statements per line, as in @example a = b; c = d @end example @noindent If @samp{-np} is not used, then the semicolon in the above example is not printed, hindering legibility. Thus, the default mode of operation for free-format @sc{Fortran}-90 is @samp{-n@@;} and @samp{-np}. This turns the above example into @samp{a = b; c = d@@;} and displays it correctly. When @samp{-n;} is used, semicolons will not be printed by default. To force them to be printed, use the @samp{-np} option (@pxref{-np}). Do not insert semicolons by hand in @sc{Fortran}-77; they are always inserted automatically. If you have terminated @sc{Fortran}-90 statements by hand, turn off auto-semis by @samp{-n;} (and use @samp{-np} at your discretion). The following table summarizes the defaults for auto-semi insertion and semicolon printing in @sc{Fortran}, both fixed and free formats (`N/A' means `not applicable'): @quotation @multitable {F90}{Fixed}{ `-nA; -np' } @item @tab Fixed @tab Free @item F77 @tab @samp{-n;} @tab N/A @item F90 @tab @samp{-n;} @tab @samp{-n@@; -np} @end multitable @end quotation @node -ncolon,-nb,-n;,Options @comment node-name, next, previous, up @subsection @samp{-n:}: Put statement label on separate line [@sc{Fortran}] @findex -n: By default, in @sc{Fortran} statement labels are placed on the same line, and backspaced from, the command that is being labeled, as in @example EXIT: continue @end example @noindent This can look ugly if the label is very long. The command @samp{-n:} places the label on a separate line, as is done automatically for @sc{Ratfor}---e.g., @example EXIT: continue @end example If neither of these options appeals to you, you could try redefining the macro @code{\Wlbl}, found with some discussion in @file{fwebmac.web}. That macro is emitted only when @samp{-n:} is @emph{not} used. @findex \Wlbl @node -nb,-nC,-ncolon,Options @comment node-name, next, previous, up @subsection @samp{-nb}: Number @b{if}s and @b{do}s [@sc{Fortran}] (@FWEAVE{}) @findex -nb @cindex Numbering blocks @cindex Blocks, numbering In the woven output, extra comments are added to help one correlate the block structure of the code. For more discussion, see @ref{-b}. @node -nC, -np, -nb, Options @comment node-name, next, previous, up @subsection @samp{-nC}: Ignore single-line comments [@sc{Fortran}] @findex -nC @cindex Comments, ignore single-line Fortran Ignore, at the input-driver stage, comment lines beginning with @samp{C}, @samp{c}, or @samp{*}. Interpretation: In the usual mode of operation, the @sc{Fortran}-77 input driver makes a heroic attempt to mix the original single-line column-1 commenting style with the @FWEB{} style (@samp{/*...*/} and @samp{//}). It converts single-line comments to the @samp{/*...*/} style and passes them along to the innards of the processors. Problems sometimes arise when converting an existing @sc{Fortran} code to @FWEB{}. Such codes may have very large blocks of code or documentation commented out with a @samp{C} in column 1. Special @TeX{} characters in those comments can cause problems for @FWEAVE{}; sometimes @FTANGLE{} gets confused as well. The @samp{-nC} option short-circuits these problems by simply throwing all such lines away at the input driver stage. This option is not a recommended long-term solution. Instead, consider the following: @quotation @itemize @bullet @item In @FWEB{}, blocks of code should be commented out with the preprocessor commands @code{@@#if 0...@@#endif}; see @ref{Temporary comments}. @item Textual comments for documentation should be converted to the standard @FWEB{} commenting style. @item If one has a block of code prefaced by an extremely long comment, replace that by a named module and put the comment into the @TeX{} part of that section. @end itemize @end quotation @node -np,-n\,-nC,Options @comment node-name, next, previous, up @subsection @samp{-np}: Print semicolons [@sc{Fortran}] (@FWEAVE{}) @findex -np @cindex Semicolons, printing Although the @sc{Fortran} input driver automatically terminates logical lines with semicolons (@sc{Fortran}-77; see @ref{-n;}) or pseudo-semicolons (@sc{Fortran}-90; see @ref{-nAT;}) so that the innards of @FWEAVE{} can process them correctly, the semicolons are not printed by default. To make actual semicolons be printed, use the @samp{-np} option. @samp{-np} is turned on automatically for free-format @sc{Fortran}-90 when @samp{-n@@;} is in effect (the default). For more discussion, see @ref{-n;}. @node -n\,-n&,-np,Options @comment node-name, next, previous, up @subsection @samp{-n\}: Free-form syntax continued by backslash @findex -n\ @cindex Syntax, free-form In @sc{Fortran}--90, this turns on free-form syntax and sets the continuation character to be the backslash (as it would be in C). For example, @example -n9[-n\] @@ @@a program main x = \ y end @end example @noindent In the tangled output the backslash is converted into @sc{Fortran}-90's standard continuation character, the ampersand. See also @ref{-n&}. @node -n&,-n/,-n\,Options @comment node-name, next, previous, up @subsection @samp{-n&}: Free-form syntax continued by ampersand @findex -n& @cindex Syntax, free-form In @sc{Fortran}--90, this turns on free-form syntax and sets the continuation character to be the ampersand. For example, @example -n9[-n&] @@ @@a program main x = & y end @end example For @sc{Fortran}-90, free-form syntax continued by the ampersand is @FWEB{}'s default, so one probably will not need to use @samp{-n&} explicitly. See also @ref{-n\}. @node -n/,-n!,-n&,Options @comment node-name, next, previous, up @subsection @samp{-n/}: Recognize short comments [@sc{Fortran}] @findex -n/ The standard @FWEB{} notation for a short comment (one terminated by the next newline) is @samp{// ...}. However, in @sc{Fortran} the @samp{//} denotes concatenation by default. To make it denote a short comment, use the @samp{-n/} option. One can do this in the @file{.fweb} file (@pxref{Customization}) or with the language-setting command in limbo, as in @samp{@@n/}. @noindent In @FWEB{}, one may always use @samp{\/} for concatenation, so there's no penalty for using @samp{-n/}. @cindex Concatenation @findex \/ @node -n!,-n),-n/,Options @comment node-name, next, previous, up @subsection @samp{-n!}: Make @samp{!} denote short comment [@sc{Fortran}] @findex -n! @cindex Comments, @sc{Fortran} In @sc{Fortran}-90, @samp{!} starts a short comment. However, by default @FWEB{} usurps @samp{!} for the logical not, as in @samp{if(x != y)}. To force it to recognize @samp{!} as a comment, use @samp{-n!}. However, the recommended style is to use @FWEB{}'s standard convention that @samp{//} denotes the start of a short comment (@pxref{-n/}). See also @ref{-!} and @ref{-r!}. In @sc{Fortran}-77, to include the exclamation point inside a string, escape it with a backslash, as in @example s = "A \! inside a string" @end example @noindent This possibly annoying restriction arises because the unduly complicated @sc{Fortran} input driver does some preprocessing of the @sc{Fortran} source before it feeds it to the cores of the processors. @node -n), -o, -n!, Options @comment node-name, next, previous, up @subsection @samp{-n)}: Reverse array indices [@sc{Fortran}] (@FTANGLE{}) @findex -n) This @emph{somewhat experimental} flag permits @sc{Fortran} programmers to use C-style array indices. Conversions such as the following are made (during the output phase of @FTANGLE{}): @example a(k)(i) @r{=>} a(i,k) a(k)(i,j) @r{=>} a(i,j,k) a(k)(j)(i) @r{=>} a(i,j,k) @end example @noindent [No spaces may intervene between @samp{)} and @samp{(}; effectively, @samp{)(} is treated as one token for the purposes of @samp{-n)}.] This feature permits convenient definitions of macros that deal with multi-dimensional vectors. Unfortunately, @FTANGLE{} doesn't fully understand the syntax of the source code---and never will, unless it is fully integrated with a compiler. It will therefore be confused by situations like the following @sc{Fortran} example: @example dimension x(0:4)(1:2) // @r{OK} character*90 ch(4) // @r{OK} write(6,*) ((x(i)(j),i=1,2), j=3,4) // @r{Will reverse incorrectly.} c = ch(4)(3:4) // @r{Shouldn't reverse, but will.} @end example @noindent One solution, due to Charles Karney, is to insert a space to prevent @samp{)(} from being recognized as a single token. However, since ordinary white space is eaten on input, one must resort to something like the following (@samp{$UNQUOTE} is a built-in @FWEB{} function; @pxref{$UNQUOTE}): @example @@m SP $UNQUOTE(' ') @@a dimension x(0:4)(1:2) character*90 ch(4) write(6,*) SP ((x(i)(j),i=1,2), j=3,4) c = ch(4)SP(3:4) @end example This option is controlled by the three style-file parameters @samp{paren.len}, @samp{paren.num}, and @samp{paren.nest}. (@xref{Style}.) @samp{paren.len} is the default number of bytes to be allocated for each index; if an index is longer than this number, the current length is increased by this number and storage is automatically reallocated. @samp{paren.num} is the maximum number of allowed indices; for example, when processing @samp{a(i)(j)(k)}, @samp{paren.num} is 3. @samp{paren.nest} is the maximum parenthesis nesting level. In the example @samp{x(a(i)(j)(k))}, @samp{paren.nest} is 2. If either of the last two parameters is exceeded, a message will be issued asking you to increase the appropriate value. @node -o,-q,-n),Options @comment node-name, next, previous, up @subsection @samp{-o}: Don't overload operators @findex -o @cindex Operators, overloading This option inhibits the operator-overloading feature invoked by the command @samp{@@v} (@pxref{Overloading}). @node -q,-P_,-o,Options @comment node-name, next, previous, up @subsection @samp{-q}: Don't translate @sc{Ratfor} @findex -o @emph{(This option is obsolete.)} @node -P_,-p,-q,Options @comment node-name, next, previous, up @subsection @samp{-P}: Select @TeX{} processor @findex -P @cindex Processor, @TeX{} @cindex Processor, La@TeX{} Say @samp{-PT} or @samp{-PL} to inform @FWEAVE{} that its output will be processed by @TeX{} or La@TeX{}, respectively. Beginning with Version 1.50, the default processor is LaTeX (@samp{-PL}). If you always use @TeX{}, it's easiest to put @samp{-PT} into the @file{.fweb} initialization file. @emph{Please note that @samp{-PT} is no longer supported; @FWEB{} development is now based exclusively on La@TeX{}.} @node -p,-r,-P_,Options @comment node-name, next, previous, up @subsection @samp{-p}: Buffer up a style-file entry @findex -p This option specifies a style-file entry (@pxref{Style}). Its argument is exactly the same as a line that one may put into the local @FWEB{} style file. Thus, if in @file{fweb.sty} one would say @samp{entry="value"}, the form of the @samp{-p} option would be @samp{-pentry='"value"'}. (The single quotes are required on a @sc{unix} system because the double quotes have special significance to the shell.) This option can be used either in the @file{.fweb} initialization file (@pxref{Initialization}), to record style-file entries that are common to all runs, or on the command line, to override a local style-file entry for a single run. This behavior is a consequence of the following order of processing style parameters: @quotation @enumerate @item @samp{-p} options in @file{.fweb}; @item entries in the local style file @file{fweb.sty}; @item @samp{-p} options on the command line. @end enumerate @end quotation @node -r,-r9,-p,Options @comment node-name, next, previous, up @subsection @samp{-r}: Set global language to @sc{Ratfor}--77 @xref{Languages} and @ref{Ratfor}. See also @ref{-L_}. @findex -r @node -r9,-rg,-r,Options @comment node-name, next, previous, up @subsection @samp{-r9}: Set global language to @sc{Ratfor}--90 @xref{Languages} and @ref{Ratfor}. See also @ref{-L_}. @findex -r9 @node -rg,-rk,-r9,Options @comment node-name, next, previous, up @subsection @samp{-rg}: Set @b{goto} parameters @findex -rg This obscure option is used for configuring @sc{Ratfor} (and really should be a style-file parameter). (Discussion not finished.) @node -rk,-rK_,-rg,Options @comment node-name, next, previous, up @subsection @samp{-rk}: Suppress comments about @sc{Ratfor} translation (@FTANGLE{}) @findex -rk By default, the @sc{Ratfor} translator writes comments about what command it is translating. The @samp{-rk} option suppresses those comments. Arguments to this option allows one to suppress comments about only particular commands, according to the following list: @example b @r{---} break c @r{---} case t @r{---} default d @r{---} do f @r{---} for i @r{---} if n @r{---} next p @r{---} repeat, until r @r{---} return s @r{---} switch h @r{---} where w @r{---} while @end example @noindent For example, one can say @samp{-rkrb} to suppress comments about the @b{return} and @b{break} statements. @node -rK_,-rAT;,-rk,Options @comment node-name, next, previous, up @subsection @samp{-rK}: Write comments about @sc{Ratfor} translation (@FTANGLE{}) @findex -rK This is the negative of @samp{-rk} (@pxref{-rk}); it forces comments about particular @sc{Ratfor} commands. @node -rAT;, -r;, -rK_, Options @comment node-name, next, previous, up @subsection @samp{-r@@;}: Turn on auto-semi mode using pseudo-semis [@sc{Ratfor}] @findex -r@@; Please don't use this option (it may not work). Insert semicolons by hand in your @sc{Ratfor} code, just as one does in C. @node -r;, -rb, -rAT;, Options @comment node-name, next, previous, up @subsection @samp{-r;}: Turn on auto-semi mode using actual semis [@sc{Ratfor}] @findex -r; Please don't use this option (it may not work). Insert semicolons by hand in your @sc{Ratfor} code, just as one does in C. @node -rb,-r/,-r;,Options @comment node-name, next, previous, up @subsection @samp{-rb}: Number @b{if}s and @b{do}s [@sc{Ratfor}] @findex -rb @cindex Numbering blocks @cindex Blocks, numbering In the woven output, extra comments are added to help one correlate the block structure of the code. For more discussion, see @ref{-b}. @node -r/,-r!,-rb,Options @comment node-name, next, previous, up @subsection @samp{-r/}: Recognize short comments [@sc{Ratfor}] @findex -r/ The standard @FWEB{} notation for a short comment is @samp{// ...}. However, in @sc{Ratfor} the @samp{//} denotes concatenation by default. To make it denote a short comment, use the @samp{-r/} option. For concatenation, use @samp{\/}. For an example, see @ref{-n/}. @node -r!,-r),-r/,Options @comment node-name, next, previous, up @subsection @samp{-r!}: Make @samp{!} denote short comment [@sc{Ratfor}] @findex -r! See the corresponding discussion of @samp{-!} in @ref{-!} and @ref{-n!}. In @sc{Fortran}-77, to include the exclamation point inside a string, escape it with a backslash, as in @example s = "A \! inside a string" @end example @node -r), -s, -r!, Options @comment node-name, next, previous, up @subsection @samp{-r)}: Reverse array indices [@sc{Ratfor}] (@FTANGLE{}) @findex -r) See the corresponding discussion of @samp{-n)} in @ref{-n)}. @node -s, -T_, -r), Options @comment node-name, next, previous, up @subsection @samp{-s}: Print statistics @findex -s @findex -sm @cindex Statistics, printing @samp{-s} prints statistics about memory usage at the end of the run. @samp{-sm} prints statistics about memory usage at the end of the run, just as does @samp{-s}; it also prints information about dynamic memory allocations as they occur. @samp{-sm@i{nnn}} displays allocations of nnn bytes or more; if @i{nnn} is missing, 10000 is assumed. @node -T_, -t, -s, Options @comment node-name, next, previous, up @subsection @samp{-T}: Flag-setting options for @FTANGLE{} This is a family of options that set miscellaneous flags appropriate only for @FTANGLE{}. @menu * -TD:: Permit processing of deferred macro definitions. * -Tb:: Permit built-functions such as @code{$IF} to be redefined. * -Tm:: Permib user-defined macros to be redefined. * -Tv:: Don't print header info at top of output. * -T%:: Don't retain trailing comments. * -T#:: Don't insert @samp{#line} command after @samp{@@%}. @end menu @node -TD, -Tb, -T_, -T_ @comment node-name, next, previous, up @subsubsection @samp{-TD}: Permit processing of deferred macro definitions @findex -TD @cindex Macros, deferred @dfn{Deferred macro definitions} are @samp{@@m} (or, equivalently, @samp{@@#define}) commands that appear in the code part rather than the usual definition part. These definitions are evaluated during the output (phase 2), and can cause confusion when used with the preprocessor commands, which are evaluated during the input (phase 1). Because of this confusion, deferred macro definitions are prohibited by default. To permit them, use the @samp{-TD} option (then be prepared to make some obscure programming errors). @node -Tb, -Tm, -TD, -T_ @comment node-name, next, previous, up @subsubsection @samp{-Tb}: Permit built-functions to be redefined @findex -Tb @cindex built-in functions, redefining By default, built-in functions such as @code{$IF} (@pxref{Built-in functions}) may not be redefined by an @code{@@m} command. To allow this extremely dangerous operation, use the @samp{-Tb} option. @node -Tm, -Tv, -Tb, -T_ @comment node-name, next, previous, up @subsubsection @samp{-Tm}: Permit user macros to be redefined @findex -Tm @cindex macros, redefining By default, user macros may not be redefined by an @code{@@m} command. To permit this, use the @samp{-Tm} option. Note that many functions described under @ref{Built-in functions}, such as @code{$PI}, are in fact implemented as macros. @node -Tv, -T%, -Tm, -T_ @comment node-name, next, previous, up @subsubsection @samp{-Tv}: Don't print header info @findex -Tv @cindex Header comments, printing By default, @FTANGLE{} attempts to be helpful and writes some information about the command line, input and change files, etc.@ at the beginning of the output file. This information can be deleted by means of the @samp{-Tv} flag. [This is done automatically when the @samp{-F} flag (@pxref{-F_}) is in effect, since the header information includes a time stamp that would defeat a successful file comparison.] @node -T%, -T#, -Tv, -T_ @comment node-name, next, previous, up @subsubsection @samp{-T%}: Don't retain trailing comments (@TeX{}) @findex -T% @cindex Comments, @TeX{} Unless the @samp{-v} option is used, comments are generally deleted by @FTANGLE{} as it writes the output file. However, in the @TeX{} language such deletions can change the behavior of the output (by introducing extra spaces). Therefore, @TeX{} comments that do not begin a line are always retained unless the @samp{-T%} option is used. This option has no effect for languages other than @TeX{}. @node -T#, , -T%, -T_ @comment node-name, next, previous, up @subsubsection @samp{-T#}: Don't insert @samp{#line} command after @samp{@@%} @findex -T# If the @samp{@@%} command (@pxref{AT%}) is used to comment out a line, it eats the trailing newline. An undesirable consequence of this is that, if nothing is done, the subsequent line numbering will be misunderstood by a debugger, at least until @FWEB{} inserts a @samp{#line} command for some reason. To prevent this, @FWEB{} inserts by default an implicit @samp{@@#line} command (@pxref{Preprocessing}) after each @samp{@@%} that begins a line. To prevent this from happening (possibly because the feature doesn't work correctly, in which case you should report it; @pxref{Support}), use the @samp{-T#} option. @node -t, -U_, -T_, Options @comment node-name, next, previous, up @subsection @samp{-t}: Truncate identifiers @findex -t @cindex Identifiers, truncating The truncation option enables one to use a wider character set for identifiers than the language compiler will accept. The standard example is vanilla-flavored @sc{Fortran}-77, which doesn't allow the underscore. If one says @samp{`-tn6@{_@}}', underscores will be removed from all identifiers, then the result will be truncated to length 6. If the truncation procedure results in non-unique identifiers, these are listed. @node -U_, -u, -t, Options @comment node-name, next, previous, up @subsection @samp{-U}: Convert reserved output tokens to lower case (@FTANGLE{}) @findex -U @cindex Tokens, upper-case Particularly during @sc{Ratfor} expansion, certain tokens such as @samp{DO} are output by @FTANGLE{} in upper case. The @samp{-U} option forces such tokens to be produced in lower case. @node -u,-V_,-U_,Options @comment node-name, next, previous, up @subsection @samp{-u}: Undefine @FWEB{} macro (@FTANGLE{}) @findex -u @samp{-uA} undefines the @FWEB{} macro @samp{A} previously defined on the command line (or in @file{.fweb}) via @samp{-m}. @emph{CAUTION}: This option can also undefine built-in functions such as @code{$IF}. Don't do that, since built-ins can use other built-ins behind the scenes; undefining one can cause very strange behavior. @node -V_, -v, -u, Options @comment node-name, next, previous, up @subsection @samp{-V}: Print @FWEB{} version number @cindex Version number @findex -V This flag requests the startup banner, which includes the @FWEB{} version number, to be printed. This is usually done anyway, so it is only relevant when the message level is 0 (@pxref{-M_}). @node -v,-W_,-V_,Options @comment node-name, next, previous, up @subsection @samp{-v}: Make all comments verbatim (@FTANGLE{}) @findex -v @cindex Comments, verbatim By default, comments are not passed to the tangled output. With @samp{-v}, all comments are included verbatim in the tangled output. Since there's generally no harm in this, one might want to put this option into @file{.fweb} (@pxref{Initialization}). @node -W_,-w,-v,Options @comment node-name, next, previous, up @subsection @samp{-W}: Flag-setting options for @FWEAVE{} @findex -W This is a family of options that set miscellaneous flags appropriate only for @FWEAVE{}. Options such as @samp{-W[} and @samp{-Wf} can be combined as @samp{-W[f}. @menu * -W@@: -WAT. Set module warning flag. * -W1:: Completely cross-reference single-character identifiers. * -W[:: Turn on processing of bracketed array indices. * -WH: -WH_. Send extra arguments to the C preprocessor. Commands that inhibit printing: * -Wd: -Wnoprint. Don't print @@d or @@D in woven output. * -Wf: -Wnoprint. Don't print @@f. * -WF: -Wnoprint. Don't print @@F. * -Wl: -Wnoprint. Don't print @@l. * -Wm: -Wnoprint. Don't print @@m or @@M. * -Wv: -Wnoprint. Don't print @@v. * -Ww: -Wnoprint. Don't print @@w or @@W. @end menu @node -WAT, -W1, -W_, -W_ @comment node-name, next, previous, up @subsubsection @samp{-W@@}: Set module warning flag. @findex -W@@ @cindex Modules, warning level for @cindex Warning level for modules @FWEAVE{} can check module names for the possible anomalous conditions of ``never used'' or ``multiple uses.'' These correspond to a module warning level, as in the following numbered list: @enumerate @item Never used. @item Multiple uses. @end enumerate @noindent The module warning flag is the bitwise OR of the desired warning levels; warning messages are printed only when the relevant bits are turned on. By default, it is 1, so only messages about never-used modules are printed. The @samp{-W@@@i{flag}} overrides the default. For example, to get messages only about multiple uses, say @samp{-W@@2}; to get no messages, say @samp{-W@@0}. One can put such an option into the @file{.fweb} initialization file (@pxref{Initialization}). @FWEAVE{} will always complain about module names that are never defined. @node -W1, -W[, -WAT, -W_ @comment node-name, next, previous, up @subsubsection @samp{-W1}: Cross-reference single-character identifiers @findex -W1 @cindex Identifiers, single-character By default, @FWEB{} does not index uses of single-character identifiers (following Knuth's original design). (It does index their definitions.) To get complete cross-reference information for single-character identifiers, use the @samp{-W1} option. @node -W[, -WH_, -W1, -W_ @comment node-name, next, previous, up @subsubsection @samp{-W[}: Process bracketed array indices @findex -W[ @cindex Brackets, active This @emph{experimental} option makes square brackets behave like parentheses in the context of array indices. In @sc{Fortran}, @FTANGLE{} will just replace the brackets by parentheses. In C, the brackets will be left alone. @findex \WARRAY @FWEAVE{}, however, will typeset the indices according to the @file{fwebmac.sty} macro @samp{\WARRAY}. This macro takes one argument, which is just the array index or indices. (In C, indexing like @samp{a[i][j][k]} generates the argument @samp{i,j,k}.) By default, @samp{\WARRAY} just surrounds its argument with brackets. However, the user may change its definition to get special effects such as superscripted or subscripted indices. A simple example macro @samp{\WSUB} is provided in @file{fwebmac.sty}; one can say @samp{\let\WARRAY\WSUB} in the limbo section to have bracketed indices print as subscripts. This feature may not work when the contents of the brackets are too complicated (so that @FWEAVE{} tries to typeset them by going in and out of math mode). For more information, experts can see @file{fwebmac.web}, command @code{\WXA}. @findex \WXA @node -WH_, -Wnoprint, -W[, -W_ @comment node-name, next, previous, up @subsubsection @samp{-WH}: Send additional arguments to the C preprocessor @findex -WH @cindex Preprocessor, sending additional arguments to When the @samp{-H} option (@pxref{-H_}) is used, the C preprocessor is invoked to scan include header files for @b{typedef}'s and @b{class} declarations. That is called with a standard set of options. (Presently, @code{gcc} is actually called to invoke the preprocessor; it is sent the options @samp{-E}, @samp{-P}, and @samp{-I}.) Occasionally it may be necessary to send additional options. Those can be specified as the (string) argument to @samp{-WH}. Thus, to define two macros to the preprocessor, one could say either of @example -WH-Dtest1=1 -WH-Dtest2=2 -WH"-Dtest1=1 -Dtest2=2" @end example @noindent The first form shows that @samp{-WH} accretes to earlier uses. The second form shows how to handle embedded blanks (in a @sc{unix} shell). Then, if one were programming in C, use of @samp{-H} would issue the system command @example gcc -E -P -Dtest1=1 -Dtest2=2 @end example @node -Wnoprint, , -WH_, -W_ @comment node-name, next, previous, up @subsubsection @samp{-WdfFlmvw}: Don't print various things in woven output @findex -W The printing of selected definition-part commands can be suppressed as follows: @example -Wd @r{--- outer definitions (@samp{@@d} or @samp{@@D})} -Wf @r{--- format statements (@samp{@@f})} -WF @r{--- format statements (@samp{@@F})} -Wl @r{--- limbo text definitions (@samp{@@l})} -Wm @r{--- FWEB macro definitions (@samp{@@m} or @samp{@@M})} -Wv @r{--- operator overloads (@samp{@@v})} -Ww @r{--- identifier overloads (@samp{@@w} or @samp{@@W})} @end example @noindent When these options used, associated cross-referencing is suppressed as well. @cindex Cross-references, suppressing @node -w,-x,-W_,Options @comment node-name, next, previous, up @subsection @samp{-w}: Change name of macro package (@FWEAVE{}) @findex -w The option @samp{-w} means ``Don't print @samp{\input fwebmac.sty} as the first line of the @file{.tex} output file.'' The option @samp{-w@i{fname}} means ``Print @samp{\input fname} as the first line.'' For example, when working with REV@TeX{} (@pxref{REVTeX}), one needs to say @samp{-wrwebmac.sty}. This option can be used for special effects when one is trying to obtain behavior different from that defined by @FWEB{}'s macro package @file{fwebmac.sty} (@pxref{fwebmac.sty}). However, try to not do that. Please submit requests for such behavior modifications to the developer; see @ref{Support}. @node -x,-X_,-w,Options @comment node-name, next, previous, up @subsection @samp{-x}: Eliminate or reduce cross-reference information (@FWEAVE{}). @findex -x @cindex Cross-references, eliminating Cross-reference information (for @FWEAVE{}) includes the Table of Contents ('c'), the Index ('i'), and the Module List ('m'). The option @samp{-x} eliminates all of that information. The option @samp{-x@i{letters}} eliminates the piece of information corresponding to each letter in the list. For example, @samp{-xim} eliminates the Index and the Module List. Another possibility is to say @samp{-xu}, which prevents cross-references from unnamed sections (begun with @samp{@@a} or @samp{@@A}) from appearing in the Index. @node -X_,-y,-x,Options @comment node-name, next, previous, up @subsection @samp{-X}: Print selected cross-reference information (@FWEAVE{}) @findex -X When used with any of the arguments @samp{cim}, this option is the opposite of @samp{-x}. @xref{-x}. The option @samp{-XI} tells @FWEAVE{} to write its index cross-references to a file formatted for input by the @code{makeindex} utility. This feature facilitates creation of a master index that spans several individual @code{web} files. For more discussion, see @ref{Using makeindex}. The construction @samp{-XI} stands alone; one may not mix the @samp{I} with the list @samp{cim}. Also, this option is overridden by @samp{-xi}, which suppresses output of all index information. @node -y,-Z_,-X_,Options @comment node-name, next, previous, up @subsection @samp{-y}: Allocate dynamic memory @findex -y @cindex Memory allocation @cindex Allocation, memory This option changes the default size for a dynamically allocated memory buffer. The buffers are indicated by a one- or two-character abbreviation such as @samp{op}. For example, the option @samp{-yop200} allocates 200 units for the @samp{op} buffer. To query the default allocations, just say @samp{-y}. When @FWEB{} runs out of space, it usually (but not always) issues a message telling one which @samp{-y} command to use in order to increase the allocations. (Someday it will reallocate automatically.) One may wish to add some such options to the @file{.fweb} file. For a more detailed discussion of memory allocation and a menu of the various dynamic arrays, see @ref{Memory allocation}. @node -Z_,-z,-y,Options @comment node-name, next, previous, up @subsection @samp{-Z}: Display default style-file parameters @findex -Z @cindex Options, information The information option @samp{-Zabc} prints to the screen the default contents of the style-file parameters beginning with @samp{abc}. Just @samp{-Z} prints everything. After printing the defaults, the @samp{-p} options (@pxref{-p}) and the style file @file{fweb.sty} are processed. If that processing has overridden any of the defaults, the parameters are printed again, preceded by an asterisk. To see only the parameters that have been modified from the defaults, say @samp{--Z}. The @samp{-Z} option behaves slightly differently for color escape sequences than for other parameters; see @ref{Color}. @node -z,-.,-Z_,Options @comment node-name, next, previous, up @subsection @samp{-z}: Change name of style file @findex -z @cindex Style file, changing name of The command @samp{-znew.sty} changes the default style-file name @file{fweb.sty} to @file{new.sty}. The command @samp{-z} (with no argument) means ``Don't read any style file.'' Normally the style file is read from the same directory in which the @code{web} source file resides (or from the path defined by the environment variable @code{FWEB_STYLE_DIR}). To force @code{fweb.sty} to be read from the current directory, say @samp{-z.}. @node -.,-\,-z,Options @comment node-name, next, previous, up @subsection @samp{-.}: Don't recognize dot constants @findex -. @cindex Dot constants, recognizing If this command is used, the processors will not understand that constructions such as @samp{.LT.} are operators in @sc{Fortran} or @sc{Ratfor}. This command is useful if one is trying to modernize the source code to use @FWEB{} conventions such as @samp{<} instead of @samp{.LT.}. @node -\,-lp,-.,Options @comment node-name, next, previous, up @subsection @samp{-\}: Explicitly escape continued strings @findex -\ @cindex Strings, long @cindex Strings, continuing In @FWEB{}, long strings are continued with the backslash. Normally, the continuation of the string must start in the first column of the next line; otherwise, spurious blanks will be introduced. However, when the @samp{-\} option is in effect, @FWEB{} expects that the continuation will also begin with the backslash, and it will ignore leading white space and the backslash. (This feature was inspired by @sc{Fortran}-90.) Thus, in the example @example "This is \ \continued"; @end example @noindent the effective string is @code{"This is continued"} when @samp{-\} is in effect. Note that this option affects all strings in the source file; one cannot mix and match. @node -lp,-colon,-\,Options @comment node-name, next, previous, up @subsection @samp{-(}: Continue parenthesized strings with backslashes @findex -( @cindex Strings, parenthesized This option is like @samp{-\} (@pxref{-\}), but it refers to certain strings that are not normally quoted, such as the arguments of @samp{ifelse} commands in @code{m4}. @node -colon,->,-lp,Options @comment node-name, next, previous, up @subsection @samp{-:}: Set starting automatic statement number @findex -: @cindex Statement numbers, automatic This option is useful for @sc{Fortran} and @sc{Ratfor}. Symbolic statement labels that are defined with the @samp{#:0} macro command (@ref{Tokens}; @ref{Fortran}), as in @samp{@@m EXIT #:0}, are incremented starting with the default of 90000. To change this to, e.g., 789, say @samp{-:789}. @node ->,-=,-colon,Options @comment node-name, next, previous, up @subsection @samp{->}: Redirect output (@FTANGLE{}) @findex -> @cindex Ouput, redirecting This changes the name of @FTANGLE{}'s output file. If no name is given, output is redirected to the terminal. This command has no effect for @FWEAVE{}. Although the appearance of this command is highly intuitive, it may be hard to type quickly. An equivalent command is @samp{-=} (@pxref{-=}). @node -=,-#,->,Options @comment node-name, next, previous, up @subsection @samp{-=}: Redirect output (@FTANGLE{}) @findex -= @cindex Ouput, redirecting Equivalent to @samp{->} (@pxref{->}), and faster to type on many keyboards. @node -#,-plus,-=,Options @comment node-name, next, previous, up @subsection @samp{-#}: Turn off comments about line and section numbers (@FTANGLE{}) @findex -# By default, tangled output includes comments about the line and section numbers corresponding to the current piece of code. To eliminate this clutter, say @samp{-#}. (But note that the line-number information is very useful for debugging in C and C++, as it enables the debugger to display the source line in the web file.) In some cases, bugs in tangled output, particularly from @sc{Fortran}, can be eliminated by using @samp{-#}. (But please report the bug anyway; @ref{Support}.) In some cases, it is useful to turn off the line- and section-number information locally. This can be done with the @samp{@@q} command. @xref{ATq}. @node -plus,-/,-#,Options @comment node-name, next, previous, up @subsection @samp{-+}: Don't interpret compound assignment operators @findex -+ @cindex Assignment operators, compound Both @sc{Ratfor} and @sc{Fortran} attempt to translate the commands @samp{++}, @samp{--}, @samp{+=}, @samp{-=}, @samp{*=}, and @samp{/=} into code that behaves as their C/C++ counterparts. To turn this feature off, use @samp{-+}. @cindex Not equal Notice that in @sc{Fortran}-90 @samp{/=} is a token for ``not equal,'' so if you want to use that you must turn off the compound assignment operators with use @samp{-+}. However, a better solution is to leave them turned on and use @FWEB{}'s standard @samp{!=} token for ``not equal.'' See also @ref{-ylx}. @node -/,-!,-plus,Options @comment node-name, next, previous, up @subsection @samp{-/}: Recognize short comments (@sc{Fortran} & @sc{Ratfor}) @findex -/ @cindex Comments, short If this command is not used with the @sc{Fortran}-like languages, the @samp{//} construction will be interpreted as concatenation rather than as the beginning of a short comment. Concatenation can be signified with @FWEB{}'s token@samp{\/}, so no penalty is incurred for using @samp{-/}. One way of invoking this option is with the global language command, such as @samp{@@n/}. Another is to put the command into the initialization file @file{.fweb}. See also @ref{-n/} and @ref{-r/}. @node -!,Info options,-/,Options @comment node-name, next, previous, up @subsection @samp{-!}: Make @samp{!} denote short comment (@sc{Fortran} & @sc{Ratfor}) @findex -! @cindex Comments, short This option is not recommended; use @FWEB{}'s standard @samp{//} to begin short comments. To include the exclamation point inside a string, escape it with a backslash, as in @example s = "A \! inside a string" @end example @node Info options,,-!,Options @comment node-name, next, previous, up @subsection Information options @cindex Options, information @cindex Information options Several of the command-line options can be used to elicit information about the initial state of @FWEB{}. @quotation @samp{-@@} displays information about the control codes. @xref{-AT}. @samp{-D} displays information about reserved words. @xref{-D_}. @samp{-y} displays default dynamic memory allocations. @xref{-y}. @samp{-Z} displays default values of style-file parameters. @xref{-Z_}. @end quotation @noindent The @samp{-h} option reminds one about these information options; it also provides convenient access to the GNU @code{info} browser. @xref{-h}. @node AT commands,Comments,Starting,Top @comment node-name, next, previous, up @chapter @FWEB{} COMMANDS All @FWEB{} commands begin with the character @samp{@@}. It is recommended that these begin in column 1 if possible. This is required in some cases [e.g., the @samp{@@x}, @samp{@@y}, and @samp{@@z} in change files (@pxref{Change files}), or column-oriented @sc{Fortran}-77 processing]. Some of these control codes may be used anywhere; others begin a new part of the current section. (For a discussion of sections and parts, see @ref{Structure}.) For a quick summary of the control-code mappings and to see which codes begin new parts, say @samp{ftangle -@@}. @xref{-AT}. @menu Debugging commands: * @@0: AT0. Turn off debugging. * @@1: AT1. Display irreducible scraps. * @@2: AT2. Display detailed scrap reductions. Literal control characters: * @@@@: ATAT. Insert an '@@'. * @@|: AT|. Vertical bar/optional line break. Beginning of section: * @@ : ATspace. Begin minor section. * @@*: AT*. Begin major section. Beginning of code part: * @@<: AT<. Begin module name. * @@>: AT>. End module name. * @@A: ATA_. Begin code part. * @@a: ATa. Begin code part and mark next identifier. Control codes b--z: * @@B: ATB_. Insert left brace; suppress default insertion of breakpoint command. * @@b: ATb. Insert breakpoint command. * @@c: ATc. Set language to C. * @@c++: ATcpp. Set language to C++. * @@D: ATD_. Define outer macro. * @@d: ATd. Define outer macro and mark it. * @@E: ATE_. Treat next identifier as ordinary expression. * @@e: ATe. Invisible expression. * @@f: ATf. Format identifier or module name. * @@I: ATI_. Include a WEB file, but don't print it. * @@i: ATi. Include a WEB file. * @@K: ATK_. Expand global RCS-like keyword. * @@k: ATk. Expand local RCS-like keyword. * @@L: ATL_. Set language. * @@l: ATl. Specify limbo text. * @@M: ATM_. Define an @FWEB{} macro. * @@m: ATm. Define a @FWEB{} macro and mark it. * @@N: ATN_. Turn on language-independent mode. * @@n: ATn. Set language to Fortran--77. * @@n9:ATn9. Set language to Fortran--90. * @@O: ATO_. Open new output file (global scope). * @@o: ATo. Open new output file (local scope). * @@q: ATq. Turn off or on module and line information locally. * @@R: ATR_. Treat next identifier as integer-like reserved word. * @@r: ATr. Set language to Ratfor--77. * @@r9: ATr9. Set language to Ratfor--90. * @@u: ATu. Undefine an outer macro. * @@v: ATv. Overload an operator. * @@W: ATW_. Overload an identifier. * @@x: ATx. Terminate ignorable material. * @@y: ATy. End first part of change. * @@z: ATz. Begin ignorable material. Conversion to ASCII: * @@': ATquote. Convert single character to ASCII. * @@": ATdquote. Convert string to ASCII. Forward referencing: * @@[: AT[. Mark next identifier as defined in this section. Comments: * @@/*: AT/*. Begin a long verbatim comment. * @@//: AT//. Begin a short verbatim comment. * @@%: AT%. Ignore everything to next newline. * @@?: AT?. Begin a compiler directive. * @@(: ATlp. Begin a meta-comment. * @@): AT). End a meta-comment. Special brace: * @@@{: ATlb. Insert left brace; suppress newlines in pretty-printing. Index entries: * @@_: AT_. Force an index entry to be underlined (marked as defined). * @@-: AT-. Delete index entry for following identifier. * @@+: ATplus. Force index entry for following identifier. * @@^: AT^. Make index entry in Roman type. * @@.: ATdot. Make index entry in typewriter type. * @@9: AT9. Make index entry in format controlled by `\9'. Control text: * @@t: ATt. Put control text into TeX \hbox. * @@=: AT=. Pass control text verbatim to the output. Spacing: * @@comma: ATcomma. Insert a thin space. * @@/: AT/. Insert a line break, preserving indentation. * @@\: ATbs. Insert a line break and backspace. * @@|: AT|_. Insert optional line break in an expression. * @@#: AT#. Force line break with blank line. * @@~: AT~. Cancel a line break (tie adjacent lines together). * @@&: AT&. Join left and right items. Pseudo (invisible) operators: * @@e: ATe. Invisible expression. * @@;: AT;. Invisible semicolon. * @@colon: ATcolon. Invisible colon. Miscellaneous: * @@!: AT!. Inhibit expansion for next macro. @end menu @node AT0, AT1, AT commands, AT commands @comment node-name, next, previous, up @section Debugging commands Several commands provide localized versions of the @samp{-1} and @samp{-2} options related to debugging of pretty-printing. @subsection @samp{@@0}: Turn off debugging @findex @@0 @cindex Debugging This cancels the effect of a previous @samp{@@1} or @samp{@@2} (see @ref{AT1} and @ref{AT2}). The @samp{@@0} command should appear in a different section from the @samp{@@1} or @samp{@@2} commands. @node AT1, AT2, AT0, AT commands @comment node-name, next, previous, up @subsection @samp{@@1}: Display irreducible scraps @findex @@1 @cindex Debugging This is a local version of the command-line option @samp{-1} (@pxref{-1}); refer to that discussion for more information. @node AT2, ATAT, AT1, AT commands @comment node-name, next, previous, up @subsection @samp{@@2}: Display detailed reductions of the scraps @findex @@2 @cindex Debugging This is a local version of the command-line option @samp{-2} (@pxref{-2}); refer to that discussion for more information. @node ATAT, AT|, AT2, AT commands @comment node-name, next, previous, up @section Literal control characters Several commands insert specific characters. @subsection @samp{@@@@}: The character @samp{@@} @findex @@@@ @samp{@@@@} inserts the single character @samp{@@}. Don't forget to double the @samp{@@} even inside strings. For example, the @FWEB{} source line @example puts("'@@@@' is represented by `@@@@@@@@'"); @end example @noindent will be tangled to @example puts("'@@' is represented by `@@@@'"); @end example @node AT|,ATspace,ATAT,AT commands @comment node-name, next, previous, up @subsection @samp{@@|}: Literal vertical bar, or optional line break @findex @@| @cindex Bar, vertical @cindex Vertical bar In the @TeX{} (documentation) part of a section, @samp{@@|} inserts a vertical bar. This is useful inside La@TeX{} verbatim environments. (A simple bar would signal a shift into code mode, which is probably not what one wants.) For an example, see @ref{AT|_}. @cindex Line break, optional In a code part, @samp{@@|} inserts an optional line break in an expression---e.g., @example @samp{f(a,b,@@|c+d,...)}. @end example @noindent This helps @TeX{} to break the line at an appropriate place. If the line does not need to be broken, the command does nothing. [Compare @samp{@@|} with @samp{@@\} (@pxref{ATbs}) and @samp{@@/} (@pxref{AT/}), which always break the line.] @node ATspace, AT*, AT|, AT commands @comment node-name, next, previous, up @section Beginning of section Sections are begun by either @samp{@@*} or @ASP{}. @subsection @samp{@@ }: Begin minor section @findex @@ @cindex Section, beginning minor @ASP{}@ begins a new minor (unstarred or unnamed) section that is not entered into the Table of Contents. For example, @example @@ This is an example of a minor (unnamed) section. (No entry is made in the Table of Contents.) @@a main() @{@} @end example @node AT*, AT<, ATspace, AT commands @comment node-name, next, previous, up @subsection @samp{@@*}, @samp{@@*@i{n}}: Begin major section @findex @@* @cindex Section, beginning major @cindex Major section, beginning @cindex Table of contents, entries for @samp{@@*} begins a new major (starred) section (of level 0). The command must be followed by the name of the section (entry in the Table of Contents), followed by a period. (If a period appears in the name itself, it must be protected by braces.) @cindex Major section, optional argument for @cindex Section names, long @cindex Section names, short The section name is also used as a running head on the output pages. To deal with the possibility that the full name may be too long, the section name may be preceded by an optional argument enclosed in brackets. If it is present, the optional argument is used as the running head. (If a period appears as part of the optional argument, it must be protected by braces.) @cindex Subsection, beginning major @cindex Major subsection If @samp{@@*} is followed by a digit @i{n}, it begins a new major (sub)section of level @i{n}. This is also entered into the Table of Contents. Thus, the complete syntax to begin a major section is @example @@*@i{n} [Short name]Full name. @end example For example, @example @@* MAIN PROGRAM. This begins a major section (of level 0). @@a main() @{@} @@*1 [Input routines\dots]A very long section name that essentially means ``input routines.'' Now follow some subroutines. @@a get_input() @{@} @end example For La@TeX{}, the highest permissible major level is 2 (a subsubsection). Section names can contain reasonably arbitrary @TeX{} text, including font-changing commands and other macros. However, it is necessary to understand that @emph{fragile} commands (in the sense of La@TeX{}) may not work because the section name is used in various contexts (e.g., as a page header). If a macro in a section name doesn't work properly, try preceding it with @samp{\protect}. @FWEAVE{} converts @samp{@@*} commands to section numbers. For a discussion of section numbering, see @ref{Numbering}. @node AT<, AT>, AT*, AT commands @comment node-name, next, previous, up @section Beginning of code part The code part is begun by the appearance of either @samp{@@a} or @samp{@@< @i{Module name} @@>=}. @subsection @samp{@@<}: Begin module name @findex @@< @cindex Module name, beginning @samp{@@<} begins a module name, which has the form @samp{@@< @i{@TeX{} text} @@>}. (Module names inside @FWEB{} macro definitions begin with @samp{@@#}, not @samp{@@<}.) @node AT>, ATA_, AT<, AT commands @comment node-name, next, previous, up @subsection @samp{@@>}: End module name @findex @@> @cindex Module name, ending @samp{@@>} ends a module name, of the form @samp{@@< @i{@TeX{} text} @@>}. Technically, @samp{@@>} is not a command; rather, it is a delimiter that terminates @samp{@@<}. An unmatched @samp{@@>} is simply ignored (after a warning message is issued). @node ATA_, ATa, AT>, AT commands @comment node-name, next, previous, up @subsection @samp{@@A}: Begin code part of unnamed section @findex @@A @cindex Code part, beginning unnamed @samp{@@A} begins the code part of an unnamed section. For example, @example @@ In an unnamed section, the code part begins with @samp{@@a} or @samp{@@A}. @@A main() @{@} @end example For more discussion of the distinction between @samp{@@A} and @samp{@@a}, see @ref{ATa}. @node ATa, ATB_, ATA_, AT commands @comment node-name, next, previous, up @subsection @samp{@@a}: Begin code part of unnamed section, and mark @findex @@a @cindex Code part, beginning unnamed @samp{@@a} begins the code part of an unnamed section (just as does @samp{@@A}), and in addition marks the next unreserved identifier it finds as defined in this section. Precisely, @example @samp{@@a} == @samp{@@A@@[} @end example Originally, @FWEB{} did not contain the @samp{@@A} command, so when the functionality of automatically marking the next unreserved identifier (@pxref{AT[}) was added, it was natural to add it to @samp{@@a}. A reasonable style of coding is to always use @samp{@@a} if you don't know any better; if you sometime run into trouble, you can then change selected @samp{@@a}s to @samp{@@A}s. For example, it is appropriate to use @samp{@@a} if one codes one function per section. E.g., @example @@c @@ @@a int subrtn() @{@} @end example @noindent Here the @samp{@@a} marks @samp{subrtn} as defined in this section; if that identifier is used elsewhere, it will be subscripted with the section number. (To turn this feature off, use @samp{-f}; see @ref{-f}.) However, if a section contains an arbitrary code fragment, the code part should probably begin with @samp{@@A}. E.g., @example @@c @@ @@A x = y; @end example @noindent If one had used @samp{@@a} here, the @code{x} would have been marked as defined here, which is not what one wants. @node ATB_, ATb, ATa, AT commands @comment node-name, next, previous, up @section Control codes b--z @subsection @samp{@@B}: Suppress insertion of breakpoint command @findex @@B @cindex Breakpoints, suppressing @cindex Left brace, inserting This is for detailed debugging of @FWEB{} codes. It inserts a left brace and suppresses the insertion of a breakpoint command. See the discussion of @samp{@@b} in @ref{ATb}. @node ATb, ATc, ATB_, AT commands @comment node-name, next, previous, up @subsection @samp{@@b}: Insert a breakpoint command @findex @@b @cindex Breakpoints, inserting (Discussion to be finished. Useful only for very intimate debugging of @FWEB{} codes. In these days of safe sex, such intimacy may not be desirable.) See also @ref{ATB_}. @node ATc, ATcpp, ATb, AT commands @comment node-name, next, previous, up @subsection @samp{@@c}: Set language to C @findex @@c The command @samp{@@c} is a shorthand for @samp{@@Lc}. For a discussion of language commands in limbo, see @ref{ATL_}. @xref{Languages} and @ref{C}. @node ATcpp, ATD_, ATc, AT commands @comment node-name, next, previous, up @subsection @samp{@@c++}: Set language to C++ @findex @@c++ The command @samp{@@c++} is a shorthand for @samp{@@Lc++}. For a discussion of language commands in limbo, see @ref{ATL_}. @xref{Languages} and @ref{Cpp}. @node ATD_, ATd, ATcpp, AT commands @comment node-name, next, previous, up @findex @@D @cindex Outer macro, defining @subsection @samp{@@D}: Define outer macro @emph{This command begins the definition part.} @samp{@@D} defines an outer macro. For more discussion, see @ref{Outer macros}. For example, in C @example @@D A 1 @end example @noindent will be tangled to the beginning of the output file as @samp{#define A 1}. @node ATd, ATE_, ATD_, AT commands @comment node-name, next, previous, up @subsection @samp{@@d}: Define outer macro, and mark @findex @@d @emph{This command begins the definition part.} @samp{@@d} defines an outer macro (just as @samp{@@D} does), and also marks the next identifier as defined in the present section. It is equivalent to @quotation @samp{@@d} == @samp{@@D@@[} @end quotation @noindent (@pxref{AT[}). The distinction between @samp{@@d} and @samp{@@D} is analagous to the distinction between @samp{@@a} and @samp{@@A}. @xref{ATa}. @node ATE_, ATf, ATd, AT commands @comment node-name, next, previous, up @subsection @samp{@@E}: Treat next identifier as ordinary expression (@FWEAVE{}) @findex @@E For formatting purposes, treat the next identifier as an ordinary expression. This command is useful in pretty-printing certain kinds of macro constructions. Further discussion is given in @ref{Macros and formatting}. @node ATf, ATi, ATE_, AT commands @comment node-name, next, previous, up @subsection @samp{@@f}: Format identifier or module name @findex @@f @cindex Identifier, formatting @emph{This command begins the definition part.} The construction @example @@f identifier old_identifier @end example @noindent makes @FWEAVE{} treat @i{identifier} like @i{old_identifier}. For example, @example @@f mytype int @end example @noindent says to treat the variable @code{mytype} just as @code{int} is treated (e.g., as a reserved word in C or C++). Traditionally, C programmers needed to use this command to format identifiers that were defined in @code{#include} files. This annoying redundancy has now been eliminated by means of the @samp{-H} command, which tells @FWEAVE{} to scan @code{#include} files automatically. @xref{-H_}. The @i{old_identifier} may be one of the following special names, which insert extra spaces according to the positions of the underscores and behave as the part of speech indicated by the base names: @example $_BINOP_ $_COMMA_ $_EXPR $_EXPR_ $EXPR_ $UNOP_ @end example @noindent These are useful for dealing with certain macro constructions. For example, @example @@f PLUS $_BINOP_ @@m PLUS + @@m ADD(x, y) ((x) PLUS (y)) @end example @noindent Without the format command, the @samp{ADD} macro will pretty-print without spaces before and after the @samp{PLUS}. When the current language is @TeX{}, the format command can be used to change a category code according to the format @example @@f `TeXchar new_cat_code @end example @noindent Difficulties may ensue if one try to change the category code of @samp{@@} in this way; a fully operational @sc{web} for @TeX{} is quite difficult and has been neither accomplished nor attempted. @node ATi, ATI_, ATf, AT commands @comment node-name, next, previous, up @subsection @samp{@@i}: Include file (unconditional) @findex @@i @cindex File, including web If one says @example @@i test.hweb @end example @noindent the file @file{test.hweb} is inserted at the present point of the web file. By default, the current directory is searched. Files can be included from other directories by means of the @code{FWEB_INCLUDES} environment variable and/or the @samp{-I} command-line option. See @ref{Environment variables} and @ref{-I_}. In principle, the included file may contain any fragment of source text. However, it is best to make it a complete section (begun by @samp{@@*} or @ASP{}) if at all possible. Unfortunately, the @samp{@@i} command cannot be commented out or conditionally included by use of an @FWEB{} preprocessor command. That is because @samp{@@i} is processed very early in the parsing process. (Consider: @samp{@@i} could include @TeX{} text, but the preprocessor is only active in the definition and code parts.) Include commands may be nested to a depth set by the option @samp{-yid}. @xref{-yid}. @cindex Include file, printing name of @findex \WIF @cindex Include file, formatting name of @findex \WIFfmt In the woven output, if a section comes from an include file, the name of the include file is printed in square brackets as the first text of the @TeX{} part. To inhibit printing of that name, say @example \def\WIF#1@{@} @end example @noindent in the limbo section. To change the way that name is formatted, redefine the macro @samp{\WIFfmt}, whose single argument is the name of the include file. (It is not called when there is no current include file.) The default definition is @example \def\WIFfmt#1@{[@{\tt#1@}]@} @end example @node ATI_, ATK_, ATi, AT commands @comment node-name, next, previous, up @subsection @samp{@@I}: Include file (conditional) @findex @@I @cindex File, including web This command behaves like @samp{@@i} if the command-line option @samp{-i} is not used. If it is used, then the contents of the included file is not printed in the woven output. @xref{-i} and @ref{-i!}. @node ATK_, ATk, ATI_, AT commands @comment node-name, next, previous, up @subsection @samp{@@K}: Extract global RCS-like keyword The construction @samp{@@K @i{Keyword} @@>} accesses the value of a global RCS-like keyword. (For more discussion of such keywords, see @ref{ATz}.) The command is treated differently by @FTANGLE{} and @FWEAVE{} depending on its location in the source file. @FWEAVE{} will expand the construction in the limbo section and @TeX{} parts only. The value is not surrounded by quotes. For example, @example @@z $Id: test $ @@x @@c \def\ID@{Id = \.@{"@@K Id @@>"@}@} @@ \ID. This is a @@K Id @@>. @end example @noindent will expand into @example @@c @@ \ID. This is a test. @end example @noindent and when La@TeX{} is run the macro @code{\ID} will expand to @samp{Id = \.@{"Test"@}}. The quotes are not necessary in the macro definition; they are included only to emphasize that in this (limbo) context the @samp{@@K} construction can effectively be put inside a string. This is possible because the routine that copies the limbo section simply copies characters; it does not tokenize anything. @FWEAVE{} does not expand @samp{@@K} constructions in the definition or code parts; it merely gives them a symbolic representation. @FTANGLE{}, on the other hand, expands @samp{@@K} constructions in the definition or code parts (during input). The values are surrounded by quotes. (As usual, @FTANGLE{} ignores material in the limbo section and @TeX{} parts.) For @FTANGLE{}, the built-in function @samp{$KEYWORD} (@pxref{$KEYWORD}) behaves essentially as does @samp{@@K}, except that it is expanded during output, not input. @FWEAVE{} does not expand @samp{$KEYWORD}. The command @samp{@@k} behaves as does @samp{@@K} except that it accesses local keywords, not global ones. @xref{ATk}. @node ATk, ATL_, ATK_, AT commands @comment node-name, next, previous, up @subsection @samp{@@k}: Access local RCS-like keyword The construction @samp{@@k keyword} behaves as @samp{@@K} does (@pxref{ATK_}), except it accesses local keywords (defined at the top of include files). @node ATL_, ATl, ATk, AT commands @comment node-name, next, previous, up @subsection @samp{@@L}: Set language @findex @@L @cindex Language, setting @samp{@@Ll} sets the language to @i{l}, where @i{l} is one of @samp{@{c,c++,n,n9,r,r9,v,x@}}. @xref{Languages}. There are shorthand forms of this command for some languages; see @samp{@@c} (@ref{ATc}), @samp{@@c++} (@ref{ATcpp}), @samp{@@n} (@ref{ATn}), @samp{@@n9} (@ref{ATn9}), @samp{@@r} (@ref{ATr}), and @samp{@@r9} (@ref{ATr9}). Generally, the global language should be set in the limbo section by means of @samp{@@L}, @samp{@@c}, etc.@ rather on the command line by options such as @samp{-L} or @samp{-c}. @node ATl, ATM_, ATL_, AT commands @comment node-name, next, previous, up @subsection @samp{@@l}: Specify limbo text @findex @@l @emph{This command begins the definition part.} Limbo text is material that @FWEAVE{} should output before the start of the first section. @cindex Limbo text For example, @example @@l "\\def\\A@{abc@}" @end example @noindent Note that @samp{\\} stands for a backslash. In general, characters must be escaped just as in C [so that one can include things like @samp{\n} (newline) in the definitions]. Limbo text may also be typed directly into the limbo section; in that case, no escapes are necessary since one is typing ordinary @TeX{} text. Sometimes, however, the @samp{@@l} command is useful for pedagogical purposes, as the limbo material can then be defined at the point where the logical discussion is made. @node ATM_, ATm, ATl, AT commands @comment node-name, next, previous, up @subsection @samp{@@M}: Define @FWEB{} macro @findex @@M @emph{This command begins the definition part.} For a detailed discussion of @FWEB{} macros, see @ref{Macros}. @node ATm, ATN_, ATM_, AT commands @comment node-name, next, previous, up @subsection @samp{@@m}: Define @FWEB{} macro, and mark @findex @@m @emph{This command begins the definition part.} @samp{@@m} defines an @FWEB{} macro, and also marks the next identifier as defined here. It is equivalent to @quotation @samp{@@m} == @samp{@@M@@[} @end quotation @noindent (@pxref{AT[}). For a detailed discussion of @FWEB{} macros, see @ref{Macros}. The distinction between @samp{@@m} and @samp{@@M} is analagous to the distinction between @samp{@@a} and @samp{@@A}. @xref{ATa}. @node ATN_, ATn, ATm, AT commands @comment node-name, next, previous, up @subsection @samp{@@N}: Turn on N mode @findex @@N @emph{This command must appear before the code part.} Generally, this means immediately before @samp{@@a}. @emph{Do not use this command in limbo; use @samp{@@Lv} instead.} The N mode invokes language-independent behavior within the scope of a particular language. The scoping rules are the same as for language changes; i.e., using @samp{@@N} within a given section produces language-independent behavior for that section and for any modules first referenced in that section. Fundamentally, @dfn{language-independent} behavior essentially means a literal transcription of the input to the output. For example, it inhibits blank compression by @FTANGLE{} and tells @FWEAVE{} to turn off ``pretty-printing'' (instead, the output is printed in typewriter type within a @samp{\begin@{verbatim@}...\end@{verbatim@}} environment). There are some subtleties with this mode (not to mention the likelihood of bugs): @enumerate @item @FWEB{} macros and built-in functions will normally be expanded even in the N mode. To inhibit expansion of a particular identifier, place @samp{@@!} before the identifier. For example, @example @@ @@m A 1 @@N @@a @@!A = A; @end example @noindent expands to @samp{A = 1}. @item Blank lines are significant. The N mode is ended by the appearance of the @samp{@@*} or @ASP{} denoting the start of the next section. If that were preceded by one or more blank lines, those would show up in both the tangled and woven output. They might or might not be significant in the tangled output, but they almost certainly will look ugly in the woven output. To avoid this, use the command @samp{@@%%}, which deletes the remainder of the current line and all immediately following empty lines. For example, @example @@ @@N @@a x;@@%% @@ Next section. @end example @item If the N mode is invoked from a compiler-like language such as @sc{Fortran}, cross-referencing of variables is done as usual. However, if the language is @sc{verbatim} (which turns on the N mode automatically), no cross-referencing is done. (Identifiers are still recognized according to @FWEB{}'s rules. Those rules as currently implemented may be essentially meaningless for some languages; in the future, provision may be made for generalizing these rules by the user.) To force an identifier to be placed into the Index, precede it by @samp{@@+}. @item A module name must be within the scope of an @samp{@@N} the first time the name is seen, if it is ever to be within such scope. Thus, the following does not work properly: @example @@ Consider the module @@. (Not yet within scope of \.@{@@N@}.) @@N @@a x; @@@@; y; @end example @noindent What happens is that the N mode is not restored after the code-part use of @samp{@@}. This is a bug. There are very tricky design issues to be dealt with here. @end enumerate @node ATn, ATn9, ATN_, AT commands @comment node-name, next, previous, up @subsection @samp{@@n}: Set language to @sc{Fortran}--77 @findex @@n @sc{Fortran}-77 is @FWEB{}'s default language, so this command is usually not strictly necessary. However, it is good practice to include it, so a user looking at the @code{web} file can tell immediately what language it is supposed to process. For more discussion of languages, see @ref{ATL_} and @ref{Languages}. @node ATn9, ATO_, ATn, AT commands @comment node-name, next, previous, up @subsection @samp{@@n9}: Set language to @sc{Fortran}--90 @findex @@n9 For more discussion of languages, see @ref{ATL_} and @ref{Languages}. For hints about @FWEB{} programming in @sc{Fortran}, see @ref{Fortran}. @node ATO_, ATo, ATn9, AT commands @comment node-name, next, previous, up @subsection @samp{@@O}: Open output file (global scope) @findex @@O @cindex File, opening output A statement of the form @example @@O @i{new_output_file_name} @end example @noindent changes the name of @FTANGLE{}'s output file. This change remains in effect for the duration of the file, or until another @samp{@@O} is encountered. (If that occurs, the previously open file is closed.) This command is expanded during output, so it must appear in the code part. For an example of using the @samp{@@O} command to produce both C header files (@samp{.h}) and source files (@samp{.c}), see the discussion in @ref{Outer macros}. To change the name of the output file locally (for just the present section), see @ref{ATo}. @node ATo, ATq, ATO_, AT commands @comment node-name, next, previous, up @subsection @samp{@@o}: Open output file (local scope) @findex @@o @cindex File, opening output This behaves like @samp{@@O}, except that the new file name is in effect only for the current section. A subsequent @samp{@@o} issued in a different section but for the same file name accretes material to the file. An annoying problem arises in C programming when @samp{@@o}s are used to create multiple source files that are subsequently compiled under the control of a @code{Makefile}. Remember that by default line-number information is written into the C files. This means that a change in the @code{web} file code for one source file can affect all of the others, because the line numbering in the @code{web} file changes. Therefore, a trivial change to the code for just one source file can cause all of the others to be recompiled. As long as one desires debugging information relative to the original @code{web} file, there is really no solution to this problem; one needs the proper line information in each file in order to work with the debugger, so if line numbers change the sources must be recompiled. One can, of course, turn off the line numbering with the command-line option @samp{-#} (@pxref{-#}), but then debugger statements will refer to the tangled C code, which is undesirable. A better partial solution is to use @samp{@@q} (@pxref{ATq}) to turn off the line numbering for output code that is currently stable. In the following example, the code for each file is put into a module, then the modules are output in the unnamed section; it is assumed that the programmer is currently making changes to the code for @file{file2.c}: @example @@ @@a @@q0 @@o file1.c @@@@; @@q1 @@o file2.c @@@@; @@q0 @@o file3.c @@@@; @end example For very large projects, another solution is to maintain multiple @code{web} source files. To avoid losing the substantial benefits of the automatic index, refer to the discussion in @ref{Merging indexes} to learn how to create a master index that contains information about several @code{web} files. @node ATq, ATR_, ATo, AT commands @comment node-name, next, previous, up @subsection @samp{@@q}: Turn off module and line info locally @findex @@q @cindex Line numbering, turning off The command-line option @samp{-#} (@pxref{-#}) turns off comments about module and line numbers globally, for the entire code. However, in some cases one wants to turn that off in just a small block of code. One important example arises in @sc{Fortran}. Consider @example @@ @@a x = @@ @@ @@= y + z @end example @noindent This example will tangle to something like @example x = C* 1: * *line 20 "test.web" y + z C* :1 * *line 5 "test.web" @end example @noindent Unfortunately, the information comments have created invalid code that will not compile. The @samp{@@q} command solves this problem by turning off or on the information comments locally. @samp{@@q0} turns them off; @samp{@@q1} turns them on. Thus, if one rewrites the above example as @example @@ @@a @@q0 x = @@ @@q1 @end example @noindent it will tangle to @example x = y + z @end example @noindent as one desires. For another use of the @samp{@@q} command, see @ref{ATo}. @node ATR_, ATr, ATq, AT commands @comment node-name, next, previous, up @subsection @samp{@@R}: Treat next identifier as integer-like reserved word (@FWEAVE{}) @findex @@R For formatting purposes, treat the next identifier as an integer-like reserved word. This command is useful in pretty-printing certain kinds of macro constructions. Further discussion is given in @ref{Macros and formatting}. @node ATr, ATr9, ATR_, AT commands @comment node-name, next, previous, up @subsection @samp{@@r}: Set language to @sc{Ratfor}--77 @findex @@r @xref{ATL_} and @ref{Languages}. @node ATr9, ATu, ATr, AT commands @comment node-name, next, previous, up @subsection @samp{@@r9}: Set language to @sc{Ratfor}--90 @findex @@r9 @xref{ATL_} and @ref{Languages}. @node ATu, ATv, ATr9, AT commands @comment node-name, next, previous, up @subsection @samp{@@u}: Undefine outer macro @findex @@u @cindex Outer macros, undefining @emph{This command begins the definition part.} @samp{@@u} is the inverse of @samp{@@d}. For example, in C the command @samp{@@u A} tangles to @samp{#undef A}. @node ATv, ATW_, ATu, AT commands @comment node-name, next, previous, up @subsection @samp{@@v}: Overload operator @findex @@v @cindex Operators, overloading @emph{This command begins the definition part.} @samp{@@v} is used to change the woven appearance of an operator. If one defines a new operator, for example by a statement such as @example interface operator(.BETA.) @end example @noindent in @sc{Fortran}-90, one should also use an @samp{@@v} in the definition part---for example, @example @@v .BETA. "\\beta" + @end example @noindent For a detailed discussion of overloading (the output appearance of) operators, see @ref{Overloading}. @node ATW_, ATx, ATv, AT commands @comment node-name, next, previous, up @subsection @samp{@@W}: Overload identifier @findex @@W @cindex Identifiers, overloading @emph{This command begins the definition part.} For a detailed discussion of overloading (the output appearance of) identifiers, see @ref{Overloading}. @node ATx, ATy, ATW_, AT commands @comment node-name, next, previous, up @subsection @samp{@@x}: Terminate ignorable material, or begin material to be changed @findex @@x In a change file, this command begins material to be changes; see @ref{Change files}. In @code{web} source files, this command has a different use; see the discussion of the @samp{@@z} command (@pxref{ATz}). @node ATy, ATz, ATx, AT commands @comment node-name, next, previous, up @subsection @samp{@@y}: Begin change material @findex @@y The @samp{@@y} command is permitted only in change files. @xref{Change files}. @node ATz, ATquote, ATy, AT commands @comment node-name, next, previous, up @subsection @samp{@@z}: Begin ignorable material, or terminate change @findex @@z @FWEB{} files may begin with the construction @example @@z . . @@x @end example @noindent where the @samp{@@z} occupies the very first two characters of the file, and where the @samp{@@z} and @samp{@@x} must begin in column 1. Material between the @samp{@@z} and @samp{@@x} is @dfn{pure commentary} and is ignored by both processors, with one exception. @findex @@K @findex @@k @findex $KEYWORD @findex $L_KEYWORD @cindex RCS-like keyword @cindex Keyword, RCS-like The exception is that an RCS-like line (RCS stands for ``revision-control system'') with syntax @example $Keyword: Text of Keyword $ @end example @noindent (at least one blank after the colon, and at least one before the last dollar sign; @sc{unix} users, see @samp{man ident}) is parsed, and the text of the @code{Keyword} is made available to the control codes @samp{@@K} (@pxref{ATK_}) and @samp{@@k} (@pxref{ATk}) as well as to @FTANGLE{}'s built-in function @code{$KEYWORD} (@pxref{$KEYWORD}. A distinction is made between keywords that are found in the ignorable commentary at the beginning of the master web file, which are called @dfn{global keywords}, and ones that are found at the beginning of files included via @samp{@@i}, which are called @dfn{local keywords}. The commands that access RCS-like keywords function as follows: @quotation @itemize @bullet @item @samp{$KEYWORD(Keyword)} accesses a global keyword. It is a built-in function that is expanded by @FTANGLE{} (during output) into the quoted character string @code{"Text of Keyword"}. @item @samp{@@K} and @samp{@@k} are expanded during input. @samp{@@K} accesses a global keyword, whereas @samp{@@k} accesses a local keyword. @item In the limbo section or a @TeX{} part, @FWEAVE{} will expand @samp{@@K Keyword @@>} into @code{Text of Keyword} (without the surrounding quotes), and similarly for @samp{@@k}. (The intention is that the expanded text can be used as bodies of @TeX{} macros.) @FWEAVE{} will also print the values of global keywords at the end of its output, whether or not they are referenced by @samp{@@K}. @item Elsewhere @FWEAVE{} will just print the keyword name itself, surrounded by double angle brackets. If the keyword was local (@samp{@@k}), the brackets will carry the subscript 0. @item @FTANGLE{} treats the global command @samp{@@K Keyword @@>} essentially like it does @samp{$Keyword}, except that the construction is expanded on input rather than output. @item @FTANGLE{} expands the command @samp{@@k keyword @@>} on input, generating a quoted string containing the value of the local keyword. @end itemize @end quotation The command @samp{@@z} is also used in change files to end a change. @xref{Change files}. @node ATquote, ATdquote, ATz, AT commands @comment node-name, next, previous, up @section Conversion to ASCII @cindex ASCII, converting to Several commands are useful for generating machine-independent code. For example, @FWEB{} works internally with the ASCII character set, so uses these commands heavily to convert from the possibly non-ASCII native character set of the machine on which @FWEB{} is running. @subsection @samp{@@'}: Convert character to ASCII @findex @@' The construction @samp{@@'c'} converts @samp{c} to its ASCII value. In C and C++, it is converted to octal; for example, @samp{@@'A'} is output as @samp{0101}. In @sc{Fortran} and @sc{Ratfor}, it is converted to decimal; the previous example would be output as @samp{65}. If the native character set of one's machine is ASCII, the conversion will not be done unless the @samp{-A} command-line option is used. @xref{-A_}. @node ATdquote, AT[, ATquote, AT commands @comment node-name, next, previous, up @subsection @samp{@@"}: Convert string to ASCII @findex @@" The construction @samp{@@"abc"} converts the enclosed string to its ASCII representation. For example, in C and C++ @samp{@@"abc"} will be output as @samp{"\141\142\143"}. @findex ASCIIstr In @sc{Fortran} and @sc{Ratfor}, no such simple mechanism exists in the language, so a function call is issued. For example, the previous example would be output as @samp{ASCIIstr('abc')}. The user is responsible for defining the function @samp{ASCIIstr}. The name of this function can be changed by the style-file entry @samp{ASCII_fcn}. @xref{ASCII_fcn}. If the native character set of one's machine is ASCII, the conversion will not be done unless the @samp{-A} command-line option is used. @xref{-A_}. @node AT[, AT/*, ATdquote, AT commands @comment node-name, next, previous, up @section Forward referencing @cindex References, forward @subsection @samp{@@[}: Mark as defined @findex @@[ This command marks the next (non-reserved) identifier that appears after the @samp{@@[} as being defined in the current section. It is usually issued automatically; for example, @samp{@@a} is equivalent to @samp{@@A@@[}, @samp{@@d} is equivalent to @samp{@@D@@[}, and @samp{@@m} is equivalent to @samp{@@M@@[}. If the appropriate style-file parameter @code{mark_defined.???} is 1, this command causes any appearance of the identifier to be subscripted with a section number. For more information, see @ref{Subscript params}. The utility of this command can be seen from the characteristic construction @example @@ This is section 5. @@a @@% Issues an implicit @@[, which marks |test| as defined in section 5. subroutine test ... end @@ This is section 6. @@a program main call test // This will print as $|test|_5$. end @end example The @samp{@@[} command should be distinguished from @samp{@@_} (@pxref{AT_}). The latter causes the index entry for the identifier to be underlined; the former possibly causes the identifier to be subscripted by a section number. One may wish to turn off the subscripts because they become too cluttered; however, the underlined index entries remain useful and unobtrusive. @node AT/*, AT//, AT[, AT commands @comment node-name, next, previous, up @section Comments @FWEB{} supports a variety of commenting styles borrowed from C, C++, and @TeX{}. For more discussion, see @ref{Comments}. @cindex Comments @subsection @samp{@@/*}: Begin long verbatim comment @findex @@/* The following comment is copied to the tangled output. (By default, comments are not copied.) If you desire all comments to be so copied, use @samp{-v}. @xref{-v}. @node AT//, AT%, AT/*, AT commands @comment node-name, next, previous, up @subsection @samp{@@//}: Begin short verbatim comment @findex @@// See the discussion of @samp{@@/*} in @ref{AT//}. @node AT%, AT?, AT//, AT commands @comment node-name, next, previous, up @subsection @samp{@@%}: Ignorable comment @findex @@% @findex @@%% @cindex Comments, ignorable If any line in a web source code contains the command @samp{@@%}, all remaining material on that line (to and including the newline character) is ignored by the input driver and never processed at all. A stronger form of this command is @samp{@@%%}. This deletes the current line as well any empty lines that immediately follow. This command is particularly useful when the N mode is in effect. @xref{ATN_}. Line-numbering problems can arise when these commands are used. For a discussion, see @ref{-T#}. @node AT?, ATlp, AT%, AT commands @comment node-name, next, previous, up @subsection @samp{@@?}: Begin compiler directive @findex @@? @cindex Compiler directives The remainder of the line is processed as a compiler directive. Optional material may be inserted automatically at the beginning of the tangled output line by means of the style-file option @code{cdir_start}. @xref{Miscellaneous params}. @node ATlp, AT), AT?, AT commands @comment node-name, next, previous, up @subsection @samp{@@(}: Begin meta-comment @findex @@( Material between @samp{@@(} and @samp{@@)} is treated in the N mode. For example, @example @@( Comment 1 Comment 2 @@) @end example Style-file parameters allow optional material to be insert at the beginning and end of the meta-comment, and at the beginning of each line of output. For more information, see the style-file parameters beginning with @samp{meta} (@pxref{Miscellaneous params}). @node AT), ATlb, ATlp, AT commands @comment node-name, next, previous, up @subsection @samp{@@)}: End meta-comment @findex @@) See the discussion of @samp{@@(}, @ref{ATlp}. @node ATlb, AT_, AT), AT commands @comment node-name, next, previous, up @section Special left brace The command @samp{@@@{} is useful in C/C++ programming to beautify some of the pretty-printing. It translates into a left brace, but also suppresses the automatic insertion of newlines into the subsequent function body or block. This is desirable for very short functions, such as simple constructors in C++. For example, @example class C @{ private: int i; public: C(int i0) @@@{i = i0;@} @} @end example @noindent Here the function will be typeset as @example C(int i0) @{ i = i0; @} @end example @noindent rather than the default @example C(int i0) @{ i = i0; @} @end example @node AT_, AT-, ATlb, AT commands @comment node-name, next, previous, up @section Index entries @cindex Indexing commands Although most information for the Index is gathered automatically, in some situations it must be done by hand. @subsection @samp{@@_}: Force index entry to be underlined @findex @@_ @cindex Index entries, underlining This command applies to the next identifier that appears after the @samp{@@_}. The index entry for that identifier will be underlined. (By convention, this means `defined' or `declared'.) This command is usually issued automatically. For example, the index entries for the variables @samp{i} and @samp{j} in the C statement @samp{int i, j;} will be underlined, since @FWEAVE{} understands enough of the syntax to know that variables are being defined. Macro definitions (begun by @samp{@@D} or @samp{@@M}) will also be underlined automatically. @node AT-, ATplus, AT_, AT commands @comment node-name, next, previous, up @subsection @samp{@@-}: Delete index entry @findex @@- @cindex Index entries, deleting This command applies to the next identifier that appears after the @samp{@@-}; it prevents an index entry associated with that identifier from being made. This might be useful when the N mode is in effect. @node ATplus, AT^, AT-, AT commands @comment node-name, next, previous, up @subsection @samp{@@+}: Force index entry @findex @@+ @cindex Index entries, forcing This command applies to the next identifier that appears after the @samp{@@+}; it forces an index entry for that identifier. It is particularly useful when the language is @sc{verbatim}, since cross-referencing is turned off in that case. @node AT^, ATdot, ATplus, AT commands @comment node-name, next, previous, up @subsection @samp{@@^}: Make index entry (Roman type) @findex @@^ @cindex Index entries, Roman type To insert one's own index entry in Roman type, say @samp{@@^@i{My entry}@@>}. @node ATdot, AT9, AT^, AT commands @comment node-name, next, previous, up @subsection @samp{@@.}: Make index entry (typewriter type) @findex @@. @cindex Index entries, typewriter type To insert one's own index entry in typewriter type, say @samp{@@.@i{My entry}@@>}. @node AT9, ATt, ATdot, AT commands @comment node-name, next, previous, up @subsection @samp{@@9}: Make index entry (user-defined format) @findex @@9 @cindex Index entries, user format The construction @samp{@@9@i{Text}@@>} is used to create an index entry in a format defined by the user. It is associated with the macro @code{\9}, which will be called during @TeX{}'s processing of the Index as @code{\9@{@i{Text}@}}. The user must define @code{\9} according to the format @example \def\9#1@{...@} @end example @noindent where argument @samp{#1} is the text between @samp{@@9} and @samp{@@>}. For example, to print that text in a sans serif font, say @example \def\9#1@{@{\sf #1@}@} @end example @noindent (Note the extra level of braces to prevent the font command from propagating.) @node ATt, AT=, AT9, AT commands @comment node-name, next, previous, up @section Control text @cindex Control text @cindex Text, control @dfn{Control text} is material terminated by @samp{@@>}; it must be all on one line and must not contain any @samp{@@}s. @subsection @samp{@@t}: Put control text into a @TeX{} \hbox (@FWEAVE{}) @findex @@t When @FWEAVE{} sees the command @samp{@@t@i{control text}@@>}, it packages the control text into an @code{\hbox} and ships it to the output. This command is ignored by @FTANGLE{}. @node AT=, ATcomma, ATt, AT commands @comment node-name, next, previous, up @subsection @samp{@@=}: Pass control text verbatim to the output @findex @@= For @FTANGLE{}, the command @samp{@@=@i{control text}@@>} sends the control text to the output exactly as input. @FWEAVE{} highlights the control text by drawing a box around it. @node ATcomma, AT/, AT=, AT commands @comment node-name, next, previous, up @section Spacing @cindex Spacing commands The spacing commands are used to refine @FWEAVE{}'s pretty-printed output. Generally it's not necessary to bother with these until one is putting the final touches on a code. @subsection @samp{@@,}: Insert a thin space @findex @@, @cindex Spacing, thin space Extra spacings are sometimes necessary when working with unusual macro constructions. @samp{@@,} inserts a thin space, analogous to @TeX{}'s @code{\,}. An example where explicit spacing would be necessary is as follows: @example @@c @@ @@m OP + @@m A(x,y) x @@, OP @@, y @@a z = A(a, b); @end example @noindent Without the @samp{@@,}'s, the body of the @code{A} macro will weave as the unappealing @samp{xOPy}. This occurs because although @code{OP} is defined to be a binary operator, @FWEAVE{} thinks of it as just a mere expression, and one of its fundamental production rules is to concatenate expressions with no intervening expressions. This demonstrates that situations arise in which one needs to override @FWEAVE{}'s default processing. But for the above example, there is actually a better solution. Instead of using the @samp{@@,}'s, include the format command @samp{@@f OP $_BINOP_}. @xref{ATf}. @node AT/, ATbs, ATcomma, AT commands @comment node-name, next, previous, up @subsection @samp{@@/}: Force a line break, preserving indentation. @findex @@/ @cindex Line break, forcing This command is used to override @FWEAVE{}'s natural inclinations. For example, if one wants each piece of a declaration to appear on a separate line, one can say @example int@@/ i,@@/ j,@@/ k; @end example This command preserves the natural indentation that would have happened if @FWEAVE{} or La@TeX{} had broken a long line spontaneously. Thus, the declared variables are indented in the above example. To remove that indent, use @samp{@@\} instead. @xref{ATbs}. Try to use the line-break commands sparingly---i.e., let @FWEAVE{} do the work. Often, if lines run together in an unexpected or unreadable way, it's because @FWEAVE{} wasn't able to parse the relevant block of code, perhaps because it didn't understand that some variable in an include file has a special meaning. In such cases, trying to fix things with @samp{@@/} is the wrong solution. Either use @samp{@@f} (@pxref{ATf}) or @samp{-H} (@pxref{-H_}). Distinguish the @samp{@@/} command from @samp{@@|} (@pxref{AT|}), which inserts an optional breakpoint into an expression. @node ATbs, AT|_, AT/, AT commands @comment node-name, next, previous, up @subsection @samp{@@\}: Force a line break, then indent @findex @@\ @cindex Line break, forcing with indent The @samp{@@\} command behaves like @samp{@@/} (@pxref{AT/}), except that it backspaces one notch after the line break. This usually has the effect of undoing the natural indentation that would have been inserted had a long line been spontaneously broken. One common case where the @samp{@@\} command might be used would be to put the return type of a C function on a separate line: @example int @@\ main() @{@} @end example It would be nice to have @FWEAVE{} do that automatically. Unfortunately, the syntax of a function isn't recognized until the opening braces are sensed; by that time, the declaration part of the statement has already been processed. This is one example of the fact that the @FWEB{} processors are much less intelligent and sophisticated than language compilers. A clever (and simple) idea for getting around this kind of problem is lacking at this point. @node AT|_, AT#, ATbs, AT commands @comment node-name, next, previous, up @subsection @samp{@@|}: Literal vertical bar, or optional line break @findex @@| @cindex Bar, vertical @cindex Vertical bar In the @TeX{} (documentation) part of a section, @samp{@@|} inserts a vertical bar. Here's a La@TeX{} example: @example \begin@{verbatim@} The constructions @@|x@@| and |x| are very different. \end@{verbatim@} @end example @noindent You might wish to try this out to see what @FWEAVE{} produces. @cindex Line break, optional In a code part, @samp{@@|} inserts an optional line break in an expression. @node AT#, AT~, AT|_, AT commands @comment node-name, next, previous, up @subsection @samp{@@#}: Blank line @findex @@# @samp{@@#} forces a line break with some extra vertical white space. However, note that @emph{blank lines in the source are significant}, so this command should seldom if ever be necessary. if @samp{@@#} is immediately followed by a letter (e.g., @samp{@@#if}), it is assumed that a preprocessor command is beginning. @xref{Preprocessing}. @node AT~, AT&, AT#, AT commands @comment node-name, next, previous, up @subsection @samp{@@~}: Cancel line break @findex @@~ @cindex Line break, canceling @samp{@@~} is analogous to @TeX{}'s @samp{~} (tie); it prevents a line break, which @FWEAVE{} usually inserts after each complete statement it recognizes. For example, @example printf("Working..."); @@~ fflush(stdout); x = y; @@~ break; @end example @node AT&, ATe, AT~, AT commands @comment node-name, next, previous, up @subsection @samp{@@&}: Join items @findex @@& @cindex Joining items @cindex Items, joining During @FWEAVE{}'s output, @samp{@@&} joins the items to either side with no spaces or line breaks inbetween. This command must be distinguished from the preprocessor construction @code{##} (paste tokens together). In a macro definition, @samp{a##bc} creates the single identifier @samp{abc}. If one said @samp{a@@&bc}, two identifiers would be output with no spaces separating them. In simple cases, the results may look identical, but consider how things would differ if @code{abc} were itself an @FWEB{} macro that should itself be expanded. @node ATe, AT;, AT&, AT commands @comment node-name, next, previous, up @section Pseudo (invisible) operators @cindex Pseudo-operators @cindex Operators, pseudo- Pseudo- or invisible operators are ignored by @FTANGLE{} and not printed by @FWEAVE{}; however, they retain grammatical significance that helps out @FWEAVE{} in its attempts to understand the syntax. @subsection @samp{@@e}: Pseudo-expression @cindex Pseudo-expression @cindex Expression, pseudo @findex @@e @samp{@@e} is an invisible expression (`pseudo-expression') (@pxref{Pseudo-operators}). It is sometimes useful in situations where @FWEAVE{}'s pretty-printing has broken down because it didn't properly understand the language syntax. If, for example, @FWEAVE{} failed to properly parse the C statement @example p = (int (*))q; @end example @noindent one might get things to work properly by saying @example p = (int (*@@e))q; @end example In this particular case, one is patching up a deficiency (all right, a bug) in @FWEAVE{}'s ``production rules.'' (This particular bug may no longer exist.) However, there are other situations in which the use of @samp{@@e} might be necessary. Consider, for example, the C macro definition @example #define A(x) = x @end example @noindent Here the replacement text of the macro is @samp{= x}, which by itself is not a valid construction in C. When the @samp{-1} or @samp{-2} options are used, @FWEAVE{} will report an ``irreducible scrap sequence'' in this situation (although it may typeset it correctly anyway). To eliminate the warning message, say instead @example #define A(x) @@e = x @end example @noindent Now the fragment @samp{@@e = x} is interpreted as a valid expression. @node AT;, ATcolon, ATe, AT commands @comment node-name, next, previous, up @subsection @samp{@@;}: Pseudo-semicolon @cindex Pseudo-semicolon @cindex Semicolon, pseudo @findex @@; @samp{@@;} is an invisible semicolon. These are often used in C programming to terminate a module name that expands to a compound statement. Carefully compare the uses of @samp{@@;} and @samp{;} in the following example: @example @@c @@a if(flag) @@@@; else @@; @@ This compound statement ends with a brace, but is used as an expression above. @@= @{ x; y; @} @@ This fragment does not end with a semicolon, so one must be supplied above. @@= z @end example Here is a case for which the pseudo-semicolon is not necessary. Consider @example @@c @@ The code fragment |x = y| ... @end example @noindent If the @samp{-1} is turned on, one might think that @FWEAVE{} would report an ``irreducible scrap sequence'' because @samp{x = y} is an expression but not a complete statement. (Turning on @samp{-2} demonstrates this.) However, it is not necessary to say @samp{|x = y@@;|} because the warning message is not issued if the parsing reduces to just one unresolved scrap. On the other hand, @samp{|goto done|} does not reduce to just one unresolved scrap, so say @samp{|goto done@@;|} in cases such as this. @xref{Pseudo-operators}. In some situations, pseudo-semicolons are inserted automatically. An important case is free-format @sc{Fortran}-90. There the language syntax says that newlines terminate statements (except when there's a trailing ampersand). However, newlines are thrown away before tokenized text is seen by @FWEAVE{}'s parser (and in any event would just be interpreted as white space). Therefore, by default newlines that terminate statements are replaced by pseudo-semicolons, so the parsing proceeds correctly. In the @sc{Fortran}-90 case, one could also insert pseudo-semicolons or actual semicolons by hand, and some users prefer that. The possibilities are controlled by the options @samp{-n@@;} (@pxref{-nAT;}) and @samp{-n;} (@pxref{-n;}). @findex -n@@; @findex -n; @cindex Pseudo-semicolons, automatic @cindex Automatic pseudo-semicolons @node ATcolon, AT!, AT;, AT commands @comment node-name, next, previous, up @subsection @samp{@@:}: Pseudo-colon @cindex Pseudo-colon @cindex Colon, pseudo @findex @@: @samp{@@:} is an invisible colon (@pxref{Pseudo-operators}). It can be helpful in formatting certain C constructions correctly. For example, if one has a named module defined as @example @@= case 1: case 2: case 3@@: @@; @end example @noindent then one can use it as a case construction followed by the usual colon, as in @example switch(c) @{ @@: stuff; break; @} @end example @node AT!, , ATcolon, AT commands @comment node-name, next, previous, up @section Miscellaneous commands @subsection @samp{@@!}: Inhibit macro expansion @findex @@! @cindex Macros, inhibiting expansion of @FWEB{} macros and built-in functions are always expanded by default. This may not be desirable, particularly in the N mode. To inhibit expansion of an individual identifier, preface it by @samp{@@!}. @node Comments,Languages,AT commands,Top @comment node-name, next, previous, up @chapter COMMENTING STYLES @FWEB{} allows a variety of commenting styles. The visible comments are in the font @code{\cmntfont}, which defaults to @code{\mainfont}, a ten-point Roman font. @cindex Commenting styles @cindex Comments @menu * Invisible comments:: Skipping input material. * Visible comments:: Comments in code mode. * Temporary comments:: Temporarily commenting out code. @end menu @node Invisible comments,Visible comments,Comments,Comments @comment node-name, next, previous, up @section Invisible comments @cindex Comments, invisible @table @code @item @@z...@@x If a source or include file begins with @samp{@@z} (in the very first two characters of the file), then all material is skipped until and including a line beginning in column 1 with @samp{@@x} [except that lines of the form @w{@samp{$Keyword: text of keyword $}} are processed; see @ref{$KEYWORD}, @ref{ATK_} (source files), or @ref{ATk} (include files)]. @item @@% All material until and including the next newline is completely ignored. @item @@%% As @samp{@@%}, but also skip blank lines that immediately follow the current line. @end table For example, @example @@z Author: J. A. Krommes @@x @@c @@% This sets the global language to C. @@* EXAMPLE. @end example @node Visible comments, Temporary comments, Invisible comments, Comments @comment node-name, next, previous, up @section Visible comments @cindex Comments, visible @samp{/* ... */} is a long comment (it may extend over several lines). @samp{// ...} is a short comment (terminated by the next newline). @samp{@@(...@@)} is a meta-comment. Meta-comments are a localized form of the N mode (@pxref{Languages}). Tangled meta-comments are begun by the contents of the style-file entry @samp{meta.top} and terminated by @samp{meta.bottom}. Each line of the meta-comment is begun by @samp{meta.prefix}. Woven meta-comments are begun by @samp{meta_code.begin} and ended by @samp{meta_code.end}. @xref{Miscellaneous params}. @example @@n @@a program main /* Get input. */ call get_input // Read the parameter file. /* Process information. Comments like this can be split over several lines. */ @@( Meta-comments provide a poor-person's alignment feature i --- counter x --- data value @@) i = 1 x = 2.0 call exec(i,x) end @end example @emph{The use of meta-comments is not recommended;} they are only marginally supported. Use ordinary long comments instead. Inside of them, use the various powerful features of @TeX{} or La@TeX{} (such as @code{\halign} or @code{\begin@{verbatim@}} @code{...} @code{\end@{verbatim@}}) to format your comment appropriately. @node Temporary comments, , Visible comments, Comments @comment node-name, next, previous, up @section Temporary comments @cindex Comments, temporary @cindex Code, temporarily commenting out During development, one frequently desires to temporarily comment out a section of code. C programmers sometimes try to do this by enclosing the code in @code{/*...*/}, but this is @emph{not} good style for several reasons. First, it is impossible if the code itself includes comments, since comments do not nest in C. Second, @FWEAVE{} will treat the commented code as @TeX{} rather than C code and will (at best) format it very poorly. In fact, La@TeX{} will frequently complain, because the commented code might contain characters such as underscores that @TeX{} expects to be in math mode. (Those are dealt with automatically when @FWEAVE{} is in code mode.) The trivial example @w{@samp{/* a_b; */}} is sufficient to illustrate this point. The proper way of commenting out sections of code is to use preprocessor constructions: @code{#if 0...#endif} in C, or more generally @code{@@#if 0...@@#endif} (usable in all languages). (The @FWEB{} preprocessor is described in @ref{Preprocessing}.) With this method, there is no trouble with nested comments, and @FWEAVE{} will continue to format the code as code, so the documentation will make sense. For @sc{Fortran} programmers converting an existing code to @FWEB{}, the @samp{-nC} option (@pxref{-nC}) may be helpful. @node Macros,Ratfor,Languages,Top @comment node-name, next, previous, up @chapter MACROS and PREPROCESSING @FWEB{} offers a built-in preprocessor facility, especially useful for @sc{Fortran} programmers. It is closely patterned after the C/C++ preprocessor, but with some extensions such as variable numbers of arguments. In addition, there are some built-in functions that provide functionality that cannot be emulated by user-defined macros. When working with a language such as C that has its own preprocessor, the question arises when to use that and when to use @FWEB{}'s facilities. The answer generally comes with experience. Remember that @FWEB{}'s macros have been expanded by the time the tangled output file is produced, whereas language-specific preprocessor commands are just passed through to that file. If you're a @sc{Fortran} programmer, @emph{strongly} consider the use of @FWEB{}'s macro facilities; they will simplify your present and future life by creating more legible codes and reducing programming errors by eliminating redundant pieces of code. C/C++ programmers may also appreciate the preprocessor extensions. In addition to conventional macro processing, @FWEB{} also offers the convenience of certain built-in functions that behave in many ways like macros. As a trivial example, the value of @PI{} is available through the built-in function @samp{$PI}. Built-in functions are described in @ref{Built-in functions}. They can be useful to programmers in all languages. @FWEB{} recognizes two kinds of macros: @dfn{outer macros}, and @dfn{WEB macros} (@dfn{inner macros}). Control codes associated with either of these kinds normally begin the definition part. However, @FWEB{} macros are sometimes allowed in the code part as well; see @ref{FWEB macros}. Macros are expanded by @FTANGLE{} only; @FWEAVE{} merely prints them as they occur in the source file. @cindex Macros @menu * Outer macros:: Macros copied to beginning of output file (@@d). * FWEB macros:: Macros and built-in functions expanded by @FWEB{} (@@m). * Macros and formatting:: How to format macros for pretty-printing. * Preprocessing:: @FWEB{}'s preprocessing language (@@#if, etc.) @end menu @node Outer macros,FWEB macros,Macros,Macros @comment node-name, next, previous, up @section Outer macros @cindex Macros, outer Outer macros provide a shorthand way of invoking macro definitions in the source language; they are not expanded by @FWEB{}. Outer macros are defined by @samp{@@d} (@pxref{ATd}) or @samp{@@D} (@pxref{ATD_}). They may be placed in any definition part. @FTANGLE{} collects them during phase 1; during phase 2, they are simply copied in order of their appearance to the beginning of the output file. This is most useful for C or C++ codes; it's a quick way of typing @samp{#define} when the positioning of the @samp{#define} is unimportant. As an example, @example @@c @@ @@d YES 1 @@d NO 0 @@a main() @{@} @@ @@d BUF_LEN 100 @@a ... @end example The keyword into which the @samp{@@d} is translated is language-dependent; it is controlled by the style-file parameter @samp{outer_def}. @xref{Miscellaneous params}. Outer macros can be undefined by @samp{@@u}. The translation is controlled by the style-file parameter @samp{outer_undef}. @xref{Miscellaneous params}. The default behavior, in which the outer macro definitions are just copied to the top of the output file, is fine for simple applications. However, often C programmers prefer to maintain their macro definitions in a header file such as @file{test.h}. One way of accomplishing this is to redirect @FTANGLE{}'s output from the command line, as in @samp{ftangle test -=test.h}, then use an @samp{@@O} command immediately after the first @samp{@@a} in the @code{web} file to open up @file{test.c}. A more complicated variant of this allows additional information to be placed into the header file, as in the following example: @example @@c @@* INTRO. We assume command-line redirection into \.@{test.h@} (`\.@{-=test.h@}'). @@d A 1 // This will go into \.@{test.h@}. @@a @@
@@; // Also goes into \.@{test.h@}. @@O test.c // Remaining unnamed sections go into \.@{test.c@}. @@ Header material may be defined as needed throughout the code, but with this design it will all go into \.@{test.h@}. @@
= @@@@; @@@@; @@@@; @end example @node FWEB macros,Macros and formatting,Outer macros,Macros @comment node-name, next, previous, up @section @FWEB{} macros @cindex Macros, @FWEB{} @FWEB{} macros (sometimes called @dfn{inner macros}) are defined by @samp{@@m} (@pxref{ATm}) or @samp{@@M} (@pxref{ATM_}). These should normally be placed in the definition part, as in @example @@n @@ Documentation... @@m CUBE(x) (x)**3 @@a z3 = CUBE(x) + CUBE(y) @end example @noindent (the appearance of an @samp{@@m} in the documentation part begins the definition part). They are collected during @FTANGLE{}'s phase 1 and effectively placed at the top of the unnamed section, so they are all known during the output in phase 2. In unusual situations when macros are being conditionally defined and/or undefined, the order of processing a macro definition becomes significant. If the command-line option @samp{-TD} is used, then @FWEB{} macros may be used in the code part as well; they are then called @dfn{deferred macros}. These definitions will be processed during phase 2 in the order that the code sections are processed, which may not be the same as the physical order in the source file. @emph{The use of deferred macros is highly discouraged}, for the following reason. @FWEB{} macros are often used in conjunction with the @FWEB{} preprocessor commands. @emph{Preprocessor commands are always processed during phase 1}, so they do not interact properly with deferred macros. It is for this reason that deferred macros are normally prohibited from appearing in the code part. @menu * Macro features:: Various points about @FWEB{} macros. * Tokens:: Special tokens used in @FWEB{} macros. * Built-in functions:: Macro-like functions built into @FWEB{}. * Debugging with macros:: Debugging glitches, and their solutions. @end menu @node Macro features, Tokens, FWEB macros, FWEB macros @comment node-name, next, previous, up @subsection Various features of @FWEB{} macros @quotation @itemize @bullet @item Fundamentally, @FWEB{} macros follow the syntax for ANSI C. There are also a few extensions, notably the possibility of variable (optional) arguments (@pxref{Variable arguments}) and some additional preprocessing tokens (@pxref{Tokens}). @item Adjacent strings in macro text are automatically concatenated. @end itemize @end quotation @menu EXTENSIONS of ANSI-C MACRO SYNTAX * Variable arguments:: @FWEB{} macros with variable arguments. * Recursion:: @FWEB{} macros may be recursive (proceed at your own risk). * Macro protection:: Protecting @FWEB{} macros against redefinition. @end menu @node Variable arguments, Recursion, Macro features, Macro features @comment node-name, next, previous, up @subsubsection @FWEB{} macros with variable arguments @cindex Macros, with variable arguments @cindex Variable arguments An important extension to the ANSI-C syntax is to allow macros with variable (optional) arguments. @FWEB{} macros with a variable number of arguments are indicated by an ellipsis, as in @example @@m VAR(x,y,z,...) text @end example @noindent The tokens @samp{#0} (number of variable arguments), @samp{#@i{n}} (value of the @i{n}th optional argument), and @samp{#.} (comma-delimited list of the optional arguments) are useful in this context. @node Recursion, Macro protection, Variable arguments, Macro features @comment node-name, next, previous, up @subsubsection Recursion @cindex Recursion ANSI C does not permit recursive macros (for good reason). Thus, in the example @example @@m recurse recurse @end example @noindent the identifier @code{recurse} simply expands as `@code{recurse}', not as an infinite loop. However, in @FWEB{} recursion may be useful in conjunction with some of the built-in functions (@pxref{Built-in functions}). To permit a macro to be recursive, say @samp{@@m*}. @emph{No formal support is provided for recursive macros!} If they don't work, or suddenly stop working in a new release, @emph{you're on your own}! @node Macro protection, , Recursion, Macro features @comment node-name, next, previous, up @subsubsection Protecting macros against redefinition @cindex Macros, redefinition of Normally an @FWEB{} macro can be redefined at will. The example @example @@m PI 3.14159 @@m PI (-3) @end example @noindent is permissible, but probably not a good idea. If you want to ensure that a crucial macro definition is never redefined inadvertently, say @samp{@@m!}, as in @example @@m! PI 3.14159 @end example @noindent That is called @dfn{protecting} the macro. @FWEB{}'s built-in functions and macros (beginning with @samp{$}) are protected by default; see @ref{Protection}. To override that protection, use the command-line options @samp{-Tb} (@ref{-Tb}; for built-in functions) or @samp{-Tm} (@ref{-Tm}; for macros). @node Tokens, Built-in functions, Macro features, FWEB macros @comment node-name, next, previous, up @subsection Special tokens @cindex Macros, special tokens for The following special tokens may be used in the text of @FWEB{} macro definitions: @subsubsection ANSI C-compatible tokens @example ## @r{--- Paste tokens on either side to form a new identifier.} #@i{parameter} @r{--- Convert parameter to string (without expansion).} @end example For example, @example @@m FORTRAN(type, name) type _##name() @@m TRACE(where) puts("At " #where) @@a FORTRAN(int, fcalc); // @r{Expands to @samp{int _fcalc();}} TRACE(predictor); // @r{Expands to @samp{puts("At " "predictor");}} @end example @subsubsection Extensions to ANSI C macro syntax The most frequently used extensions are the following ones associated with variable arguments: @samp{#0}, @samp{#@i{n}}, and @samp{#.}. @sc{Fortran}-77 users should also employ @samp{#:0} to allow symbolic rather than numeric statement labels. Try not to use the other extensions; they are experimental, complicated, and unlikely to work in all situations. In the following list, the forms @samp{#@{n@}} and @samp{#[n]} may not work correctly in complicated situations. This is a design deficiency that may be corrected someday. @quotation @table @code @item #*@i{param} Like @samp{#@i{parameter}}, but pass a quoted string through unchanged. @item #!@i{param} Don't expand argument. @item #'@i{param} Convert parameter to a single-quoted string (no expansion). @item #"@i{param} Convert parameter to a double-quoted string (no expansion). @item #0 Number of variable arguments. @item #@i{n} n-th variable argument, counting from 1. @item #@{0@} Like @samp{#0}, but the argument may be a macro expression known at run time. @item #@{@i{n}@} Like @samp{#@i{n}}, but the argument may be a macro expression. @item #[0] The total number of arguments (fixed + variable). (The argument inside the brackets may be a macro expression.) @item #[@i{n}] The @i{n}th argument (including the fixed ones), counting from 1. (The argument inside the brackets may be a macro expressions. @item #. Comma-separated list of all variable arguments. @item #:0 Unique statement number (expanded in phase 1). @item #:@i{nnn} Unique statement number for each invocation of this macro (expanded in phase 2). @item #< Begin a module name. @item #, Internal comma; doesn't delimit macro argument. @end table @end quotation A few examples of the more important of these tokens are as follows: @example @@c @@m FPRINTF(fmt,...) fprintf(fp,fmt,#.) // Use the whole list of variable args. @@m B(...) printf("There were %i arguments\n", #0) // Use the number of var args. @@n @@ @@m DONE #:0 // Symbolic statement label in @sc{Fortran}. @@a goto DONE ... DONE: call endup @end example @node Built-in functions, Debugging with macros, Tokens, FWEB macros @comment node-name, next, previous, up @subsection Built-in functions @cindex Functions, built-in Built-in functions behave in most ways like macros. In some cases they actually are macros, but other times they implement functions that a user could not define. They all begin with a dollar sign and are in upper case. In using these built-ins, confusion may arise regarding the order of expansion of various arguments. When they are implemented as macros, they are subject to the same ANSI-C preprocessor rules as other @FWEB{} macros, which is that all arguments are fully expanded before generating the replacement text of the macro. When they are directly implemented as a primitive function, however, that rule may not apply. For example, @code{$IF} expands only its first argument during its first pass of processing; depending on the results of that expansion, it then expands @emph{either} its second or third argument, but not both. The built-in function @code{$DUMPDEF} can be used to understand and debug the action of the built-in functions. @xref{$DUMPDEF}. In the original @FWEB{} design, built-in functions began with an underscore. This usage conflicts with the conventions for reserved words in ANSI C, and has been eliminated. @emph{All @FWEB{} built-ins now begin with a dollar sign.} @emph{No user-defined macro should begin with a dollar sign!} It might interfere with the functioning of some internal built-in function. @menu GENERAL INFORMATION ABOUT BUILT-IN FUNCTION DESIGN * Strings and quotes:: Quoted and non-quoted strings. * Protection:: By default, built-in functions may not be redefined. INDIVIDUAL BUILT-IN FUNCTIONS * $A:: Convert to ASCII. * $ABS:: Absolute value. * $ASSERT:: Assert a condition. * $AUTHOR:: RCS global keyword; see $KEYWORD. * $COMMENT:: Generate a comment. * $DATE:: Today's date. * $DATE_TIME:: RCS global keyword; see $KEYWORD. * $DAY:: Today. * $DECR:: Decrement a macro. * $DEFINE:: Define a (deferred) macro. * $DO:: Macro @b{DO} loop. * $DUMPDEF:: Dump macro definitions to the terminal. * $E:: Base of the natural logarithms: 2.71828... * $ERROR:: Send error message to output. * $EVAL:: Evaluate an expression. * $EXP:: Exponential function. * $GETENV:: Get value of environment variable. * $HEADER:: RCS global keyword; see $KEYWORD. * $HOME:: The user's home directory. * $ID:: RCS global keyword; see $KEYWORD. * $IF:: Two-way conditional: ``If expression is true'' * $IFCASE:: n-way conditional. * $IFDEF:: Two-way conditional: ``If macro is defined'' * $IFNDEF:: Two-way conditional: ``If macro is not defined'' * $IFELSE:: Two-way conditional: ``If macro1 equals macro2'' * $INCR:: Increment a macro. * $INPUT_LINE:: Line number that begins current section. * $KEYWORD:: Extract text of global RCS-like keyword. * $L:: Change string to lower case. * $L_KEYWORD:: Extract text of local RCS-like keyword. * $LANGUAGE:: Identifier for current language. * $LANGUAGE_NUM:: Number of current language. * $LEN:: Length of string. * $LOCKER:: RCS global keyword; see $KEYWORD. * $LOG:: Natural logarithm. * $LOG10:: Logarithm to the base 10. * $M:: Define a (deferred) macro. * $MAX:: Maximum of one or more elements. * $MIN:: Minimum of one or more elements. * $MODULE_NAME:: Name of present @code{web} module. * $MODULES:: Total number of independent modules. * $NAME:: RCS global keyword; see $KEYWORD. * $OUTPUT_LINE:: Current line number of tangled output. * $P:: The C preprocessor symbol @code{#} (an unquoted string). * $PI:: 3.14159... * $POW:: Raise to a power. * $PP:: The C preprocessor symbol @code{#} (a character). * $RCSFILE:: RCS global keyword; see $KEYWORD. * $REVISION:: RCS global keyword; see $KEYWORD. * $ROUTINE:: Current Ratfor program, function, or subroutine. * $SECTION_NUM:: Number of current section. * $SECTIONS:: Maximum number of sections. * $SOURCE:: RCS global keyword; see $KEYWORD. * $SQRT:: Square root. * $STATE:: RCS global keyword; see $KEYWORD. * $STRING:: Expand argument, then stringize. * $STUB:: * $TIME:: The local time. * $TRANSLIT:: Transliterate a string. * $U:: Change string to upper case. * $UNDEF:: Undefine an @FWEB{} macro. * $UNQUOTE:: Remove quotes from string (leaving an unquoted string). * $UNSTRING:: Remove quotes and string delimiters from string. * $VERBATIM:: (Obsolete.) * $VERSION:: @FWEB{} version number. @end menu @node Strings and quotes, Protection, Built-in functions, Built-in functions @comment node-name, next, previous, up @subsubsection Strings and quotes @cindex String, definition of @cindex String, quoted @cindex String, unquoted Several of the built-in functions expect or return a string argument. Examples include @code{$STRING} (@pxref{$STRING}), @code{$UNQUOTE} (@pxref{$UNQUOTE}), and @code{$UNSTRING} (@pxref{$UNSTRING}). In understanding the operation of those functions, it is important to understand just what a string means in the @FWEB{} context. As usual, it is a vector of characters. However, @emph{those need not be delimited by quotes}, although they may be. Internally, a string is represented by the construction @i{sqc...cqs}, where @i{s} is a special string delimiter never seen by the user, @i{q} is an optional quote character (either single or double quote depending on the language), and @i{c} is an ordinary character. Whether or not the quotes are present, the string delimiters inhibit macro expansion. The difference between @code{$UNQUOTE} and @code{$UNSTRING} can now be stated as follows. Given a quoted string such as @code{"abc"} (in C), @itemize @bullet @item @samp{$UNQUOTE} removes the quote characters @i{q}, leaving @i{sabcs} (still a string). @item @samp{$UNSTRING} removes both the quote characters @i{q} and the string delimiters @i{s}, leaving @i{abc} (a collection of three characters). This collection is @emph{not} tokenized; it does @emph{not} represent the single identifier name @code{abc} (and therefore is not very useful). @code{$UNSTRING} is primarily used internally. @end itemize The built-ins @code{$P} (@pxref{$P}) and @code{$PP} (@pxref{$PP}), which both generate the preprocessor character @samp{#}, provide a good illustration of the differences between @code{$UNQUOTE} and @code{$UNSTRING}. Consider @sc{Fortran} as an example. Essentially, @code{$P} is defined as @samp{$UNQUOTE('#')}, which is internally @i{s@t{#}s}. When this single-character string is sent to the output, it is treated like any other expression and therefore would appear in column 7 or greater even if the construction appeared at the very beginning of the line. On the other hand, @code{$PP} is (essentially) defined as @samp{$UNSTRING('#')}, which is internally the single character @t{#}. Because this character is not a string, the @sc{Fortran} output driver treats it as a special control character, defined in this case to force the character into the first column. @node Protection, $A, Strings and quotes, Built-in functions @comment node-name, next, previous, up @subsubsection Redefining built-in functions By default, built-in functions are @dfn{protected}---that is, they may not be redefined by an @code{@@m} command. (To do so cavalierly invites many kinds of weird disasters.) If it is absolutely necessary to redefine a built-in function, use the command-line option @samp{-Tb} (@pxref{-Tb}). Many of @FWEB{}'s ``built-in functions'' are in fact ordinary macros that are implemented in terms of lower-level built-ins. An example is @code{$POW} (@pxref{$POW}), which is constructed from the built-in function @code{$EVAL} (@pxref{$EVAL}). By default, such macros are also protected against redefinition; to override, use the option @samp{-Tm} (@pxref{-Tm}). @node $A, $ABS, Protection, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$A}: Convert to ASCII @findex $A @cindex ASCII, converting to @samp{$A(@i{string})} is the built-in equivalent of @samp{@@'...'} or @samp{@@"..."}. (See @ref{ATquote} and @ref{ATdquote}.) Note the extra parentheses required by the built-in. @code{$A} first expands its argument, in case it is a macro defined as a string. @node $ABS,$ASSERT,$A,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$ABS}: Absolute value @findex $ABS @cindex Absolute value @cindex Macros, absolute value of @samp{$ABS(@i{expression})} returns the absolute value of the macro expression. It is a macro implemented in terms of @code{$IF} and @code{$EVAL}. @node $ASSERT,$AUTHOR,$ABS,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$ASSERT}: Assert a condition @findex $ASSERT @cindex Asserting a condition @cindex Condition, asserting @samp{$ASSERT(@i{expression})} evaluates the macro expression. If the expression is false, an error message is printed and the run aborts. This built-in is useful for ensuring that @FWEB{} macros required by the code are properly initialized. Because it is expanded during the output phase, it must appear in the @emph{code part} (not in the definition part). @node $AUTHOR, $COMMENT, $ASSERT, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$AUTHOR}: Value of RCS global keyword @code{Author} @findex $AUTHOR @cindex Author Equivalent to @samp{$KEYWORD(Author)}. @xref{$KEYWORD}. @node $COMMENT,$DATE,$AUTHOR,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$COMMENT}: Generate a comment @findex $COMMENT @cindex Comments, generating @samp{$COMMENT}(@i{string}) generates a comment in the output file. This function is sometimes useful in conjunction with the processing of @FWEB{} macros, since ordinary comments are removed when macros are processed. For example, if one says @example @@c @@ @@m M "abc" $COMMENT("Test") @@a m = M @end example @noindent the tangled output will be @samp{m= "abc"/* Test */} @node $DATE,$DATE_TIME,$COMMENT,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$DATE}: Today's date @findex $DATE @cindex Date, generating the @samp{$DATE} generates a string consisting of the date in the form @code{"August 16, 2001"}. It is implemented as a macro that calls other macros and primitive functions. @node $DATE_TIME, $DAY, $DATE, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$DATE_TIME}: Value of RCS global keyword @code{Date} @findex $DATE_TIME @cindex Date @cindex Time Equivalent to @samp{$KEYWORD(Date)}. @xref{$KEYWORD}. @node $DAY,$DECR,$DATE_TIME,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$DAY}: The day @findex $DAY @cindex Day, generating the @samp{$DAY} generates a string consisting of the day of the week, such as @code{"Monday"}. It is implemented as a macro that calls other macros and primitive functions. @node $DECR,$DEFINE,$DAY,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$DECR}: Decrement a macro @findex $DECR @cindex Macros, decrementing @samp{$DECR(@var{N})} redefines the numeric macro @var{N} to be one less than its previous value. (If @var{N} does not simplify to a number, an error results.) In other words, in the language of C the effect is to say @samp{@i{N}--}. The two-argument form @samp{$DECR(@var{N,m})} executes the equivalent of @samp{@i{N} -= @i{m}}. @node $DEFINE,$DO,$DECR,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$DEFINE}: Deferred macro definition @findex $DEFINE @cindex Macros, defining @samp{$DEFINE} behaves like the @FWEB{} macro command @code{@@m}, but it is intended to appear in the @emph{code} part, not the definition part (so it is processed during @emph{output}, not input). Thus, the code fragment @example a = A; $DEFINE(A 1)@@% a = A; @end example @noindent tangles to @example a= A; a= 1; @end example @noindent (Notice how the @samp{@@%} command was used to kill an unwanted newline, analogous to the @samp{dnl} macro in @code{m4}.) In the above example, one could also say @samp{$DEFINE(A=1)}. To define a macro with arguments, say something like @samp{$DEFINE(A(x)x*x)}. Do @emph{not} say @samp{$DEFINE(A(x)=x*x)}, as in this case the equals sign will be included in the macro expansion. One must use the equals sign as a means of preventing parentheses from being interpreted as an argument in examples like @example $DEFINE(A=(x)) @end example @noindent This expands to @samp{(x)}. A completely equivalent shorthand notation for @code{$DEFINE} is @code{$M}. @node $DO,$DUMPDEF,$DEFINE,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$DO}: Macro do loop @findex $DO @cindex Macros, repetitively defining @samp{$DO(@i{macro,imin,imax[,di]})@{...@}} repetitively defines @i{macro} as would the @sc{Fortran} statement @samp{do macro = imin,imax,di}. For example, @example $DO(I,0,2) @{ a[I] = I; @} @end example @noindent generates the three statements @example a[0] = 0; a[1] = 1; a[2] = 2; @end example In general, the macro name used as loop counter should @emph{not} be explicitly defined as a macro prior to the @code{$DO}. If it is not, it will remain undefined after the end of the iteration. Instead of the delimiting braces, parentheses may be used. These may be useful to help @FWEAVE{} format certain constructions correctly. Nested delimiters are handled correctly. The delimiters are required even if only a single statement is to expanded. @findex $UNROLL @code{$DO} is implemented in terms of a command @code{$UNROLL}. However, if one says something like @samp{$DUMPDEF($UNROLL(0,5,1))}, @FWEB{} will respond that @code{$UNROLL} is not an @FWEB{} macro. Rather, @code{$UNROLL} is processed like expandable commands in @sc{Ratfor} such as @code{while}. This implies that it cannot be redefined as ordinary macros or built-in functions can be. @node $DUMPDEF,$E,$DO,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$DUMPDEF}: Dump macro definitions to the terminal @findex $DUMPDEF @cindex Debugging macros @cindex Macros, debugging In the call @samp{$DUMPDEF(@i{m1, m2, ...})}, @i{m1}, @i{m2}, and so on are macro calls (with arguments if appropriate). Two lines of output are generated for each argument. Line 1 is the macro definition; line 2 is its expansion using the provided arguments. One can use this built-in to debug one's own macros, or to find out the secrets of @FWEB{}'s built-ins. As an example, if one says @example $DUMPDEF($EVAL(2^^4))@@% @end example @noindent it responds with the two lines @example $EVAL($0) = $$EVAL($0) $EVAL(2**4) = 16 @end example @noindent (The @code{$@i{n}} notation indicates the @i{n}-th argument of the macro.) If one replaces @code{$EVAL} with @code{$$EVAL} in the above @code{$DUMPDEF}, it will respond @example $$EVAL($0) = $$EVAL(2**4) = 16 @end example @noindent The purpose of code such as @samp{$EVAL($0) = $$EVAL($0)} is to ensure that the argument of @code{$EVAL} is expanded if it contains macros; the primitive function @code{$$EVAL} does not do that expansion automatically. Names indicated as @samp{} by @code{$DUMPDEF} may be redefined as ordinary macros, but this is in general a @emph{very bad idea}; other parts of @FWEB{} may mysteriously stop working. @node $E, $ERROR, $DUMPDEF, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$E}: Base of the natural logarithms @findex $E @cindex Logarithms, natural The expression @samp{$E} returns @var{e}, the base of the natural logarithms, to the default machine precision. The expression @samp{$E(@i{iprec})} returns @var{e} to the decimal precision @var{iprec} (which must be less than 50). @node $ERROR, $EVAL, $E, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$ERROR}: Send error message to output @findex $ERROR @cindex Error messages, printing @samp{$ERROR(@i{string})} prints an error message in @FWEB{}'s standard form. @node $EVAL, $EXP, $ERROR, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$EVAL}: Evaluate a macro expression @findex $EVAL @cindex Expressions, evaluating @cindex Macros, evaluating @samp{$EVAL(@i{expression})} uses @FWEB{}'s macro-expression evaluator (@pxref{Preprocessing}) to reduce the macro expression to its simplest form. An attempt to perform arithmetic on combinations of non-macro identifiers and numbers generates a warning message. @node $EXP, $GETENV, $EVAL, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$EXP}: Exponential function @findex $EXP @cindex Exponentiation @samp{$EXP(@i{x})} returns @tex $e^x$. @end tex @ifinfo @var{e} to the power @var{x}. @end ifinfo @node $GETENV, $HEADER, $EXP, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$GETENV}: Get value of environment variable @findex $GETENV @cindex Environment, obtaining the @cindex Environment variables @samp{$GETENV(@var{name})} returns a string consisting of the current value of the environment variable @var{name}. (Under VMS, logical names behave like environment variables.) The argument to @code{$GETENV} need not be a string (double-quoted), but it may be if necessary to avoid the expansion of a macro. @node $HEADER, $HOME, $GETENV, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$HEADER}: Value of RCS global keyword @code{Header} @findex $HEADER @cindex Header Equivalent to @samp{$KEYWORD(Header)}. @xref{$KEYWORD}. @node $HOME,$ID,$HEADER,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$HOME}: The user's home directory @findex $HOME @samp{$HOME} is a convenience macro equivalent to @samp{$GETENV(HOME)}. @node $ID, $IF, $HOME, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$ID}: Value of RCS global keyword @code{Id} @findex $ID @cindex Identification Equivalent to @samp{$KEYWORD(Id)}. @xref{$KEYWORD}. @node $IF,$IFCASE,$ID,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$IF}: Two-way conditional @findex $IF @cindex Conditional, two-way @code{$IF} is a primitive function (not a macro) that is the code-part version of @samp{@@#if}. The syntax is @example $IF(@i{expr}, @i{action-if-true}, @i{action-if-false}) @end example @noindent The @i{expr} is an @FWEB{} macro expression that must reduce to 0 (false) or 1 (true). First that argument is expanded. If it is true, @i{action-if-true} is expanded; otherwise @i{action-if-false} is expanded. There may be peculiarities with this and the other built-in @code{$IF} function having to do with the order of expansion when the actions contain macros whose arguments themselves are macros. Therefore, do not use them unless absolutely necessary. @emph{Do not redefine} @code{$IF} or any other built-in conditionals, as they are used internally to @FWEB{}. @node $IFCASE,$IFDEF,$IF,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$IFCASE}: n-way conditional @findex $IFCASE @cindex Conditional, n-way This primitive built-in behaves like @TeX{}'s @samp{\ifcase} command. The syntax is @example $IFCASE(@i{expr}, @i{case-0}, @i{case-1}, ...,@i{case-n-1}, @i{default}) @end example @noindent If @i{expr} reduces to an integer between 0 and @emph{n-1}, inclusively, the appropriate case is selected; otherwise, the default case is selected. As examples, @example $IFCASE(2, zero, one, two, default) @r{=>} `two' $IFCASE(2, zero, one, three) @r{=>} `three' $IFCASE(2, zero, one) @r{=>} `one' @end example @node $IFDEF,$IFNDEF,$IFCASE,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$IFDEF}: Two-way conditional @findex $IFDEF @cindex Conditional, two-way This built-in primitive is the code-part version of @samp{@@#ifdef}. The syntax is @example $IFDEF(@var{macro}, @i{action-if-defined},@i{action-if-not-defined}) @end example @node $IFNDEF,$IFELSE,$IFDEF,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$IFNDEF}: Two-way conditional @findex $IFNDEF @cindex Conditional, two-way This built-in primitive is the code-part version of @samp{@@#ifndef}. The syntax is @samp{$IFNDEF(@var{macro}, @i{action-if-not-defined}, @i{action-if-defined})}. @node $IFELSE,$INCR,$IFNDEF,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$IFELSE}: Two-way conditional @findex $IFELSE @cindex Conditional, two-way The syntax of this built-in primitive is @samp{$IFELSE(@i{expr1}, @i{expr2}, @i{action-if-equal}, @i{action-if-not-equal})}. The expansions of @i{expr1} and @i{expr2} are compared on a byte-by-byte basis. If they are equal, the first action is taken, otherwise the second action is taken. For example, @example $M(S="abc")@@% $IFELSE("abc", S, yes, no) @end example @noindent evaluates to @samp{yes}. @node $INCR,$INPUT_LINE,$IFELSE,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$INCR}: Increment a macro @findex $INCR @cindex Macros, incrementing @samp{$INCR(@var{N})} redefines the numeric macro @var{N} to be one greater than its previous value. (If @var{N} does not simplify to a number, an error results.) In other words, in the language of C the effect is to say @samp{@var{N}++}. The two-argument form @samp{$INCR(@var{N,m})} executes the equivalent of @samp{@var{N} += @var{m}}. @node $INPUT_LINE,$KEYWORD,$INCR,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$INPUT_LINE}: Line number that begins current section @findex $INPUT_LINE @cindex Input line, number of @samp{$INPUT_LINE} is the number of the line in the @code{web} source file that @emph{begins the current section} (not the source line in which the @code{$INPUT_LINE} command appears). Compare @code{$OUTPUT_LINE}, @ref{$OUTPUT_LINE}. @node $KEYWORD, $L, $INPUT_LINE, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$KEYWORD}: Value of global RCS-like keyword @findex $KEYWORD @cindex Keyword, RCS @cindex RCS-like keyword @samp{$KEYWORD} provides a built-in function alternative to the use of @samp{@@K} in a code part. (@pxref{ATK_}). @samp{$KEYWORD(@i{Keyword})} extracts (as a character string) the text of an RCS-like keyword defined in the ignorable commentary between @samp{@@z} and @samp{@@x} at the beginning of the web source file (@pxref{ATz}). (@dfn{RCS} stands for ``revision-control system.'') The general syntax is (@sc{unix} users, see @samp{man ident}) @example $@i{Keyword}: @r{text of keyword} $ @end example @noindent For example, @example @@z $Author: krommes $ @@x @@c @@ @@a char author[] = $KEYWORD(Author); @end example @noindent This tangles to @example char author[] = "krommes"; @end example In this example, @samp{$Author} is one of the standard RCS keywords. However, any keyword that fits the syntax @samp{$@i{keyword}: @i{contents} $} can be accessed by @samp{$KEYWORD}. (At least one blank is necessary before and after @i{contents}.) The argument of @samp{$KEYWORD} need not be quoted, but it may be. In either event, the output is a quoted string. Keywords extracted from ignorable commentary at the beginning of a web file are called @dfn{global} and are known throughout the code. Distinguish these from @dfn{local} keywords extracted from ignorable commentary at the beginning of an include (@samp{@@i}) file. Such keywords are known only during the time that file is being read and are accessible via @samp{@@k} (@pxref{ATk}). For convenience, built-ins are defined for some standard RCS global keywords. These are @example $AUTHOR @r{=>} $KEYWORD(Author) $DATE_TIME @r{=>} $KEYWORD(Date) $HEADER @r{=>} $KEYWORD(Header) $ID @r{=>} $KEYWORD(Id) $LOCKER @r{=>} $KEYWORD(Locker) $NAME @r{=>} $KEYWORD(Name) $RCSFILE @r{=>} $KEYWORD(RCSfile) $REVISION @r{=>} $KEYWORD(Revision) $SOURCE @r{=>} $KEYWORD(Source) $STATE @r{=>} $KEYWORD(State) @end example @noindent There are no such abbreviations for local keywords, because such abbreviations would be expanded during output whereas it is necessary to recognize and expand the local keywords during input. Presumably such local keywords will be used rarely, if at all. @node $L,$L_KEYWORD,$KEYWORD,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$L}: Change to lower case @findex $L @cindex Lower case @cindex Case, changing @samp{$L(@var{string})} changes @var{string} to lower case. The argument is first expanded in case it is a macro. @node $L_KEYWORD, $LANGUAGE, $L, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$L_KEYWORD}: Value of local RCS-like keyword @findex $L_KEYWORD @cindex Keyword, RCS @cindex RCS-like keyword For most purposes, @samp{$L_KEYWORD} behaves as @samp{@@k} (@pxref{ATk}). It is still under development and should not be used yet. @samp{$L_KEYWORD("@i{Keyword}")} extracts (as a character string) the text of an RCS-like keyword defined in the ignorable commentary between @samp{@@z} and @samp{@@x} at the beginning of a file included via @samp{@@i}. @samp{$L_KEYWORD("@i{local keyword}")} is expanded during input, and the results are known only during the time the include file is being read. Note that the argument of @samp{$L_KEYWORD} must be a quoted string. For more discussion of the distinction between local and global keywords, please see @ref{ATz} and @ref{$KEYWORD}. It is expected that local keywords will rarely be used, as fundamental revision-control information should presumably be extracted from the top of the master web file. @node $LANGUAGE,$LANGUAGE_NUM,$L_KEYWORD,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$LANGUAGE}: Identifier for current language @findex $LANGUAGE @cindex Language, determining the This expands to an identifier that denotes the current language, as follows: @quotation @multitable {..VERBATIM..} {LANGUAGE} @item Language @tab @code{$LANGUAGE} @item C @tab @code{$C} @item C++ @tab @code{$CPP} @item Fortran @tab @code{$N} @item Fortran-90 @tab @code{$N90} @item Ratfor @tab @code{$R} @item Ratfor-90 @tab @code{$R90} @item TeX @tab @code{$X} @item VERBATIM @tab @code{$V} @end multitable @end quotation @noindent Note that this outputs identifiers, not @FWEB{} macros. They are intended to be used in @code{$IF} or @code{$IFELSE} statements such as @example $IF($LANGUAGE==$C, @i{C-text}, @i{other-text}) @end example For multiway switches, the @code{$LANGUAGE_NUM} built-in is more useful; see @ref{$LANGUAGE_NUM}. @node $LANGUAGE_NUM,$LEN,$LANGUAGE,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$LANGUAGE_NUM}: Number of current language @findex $LANGUAGE_NUM @cindex Language number @cindex Language, determining @samp{$LANGUAGE_NUM} expands to an integer that uniquely defines the current language, as follows: @quotation @multitable {..VERBATIM..} {LANGUAGE_NUM} @item Language @tab @code{$LANGUAGE_NUM} @item C @tab @code{0} @item C++ @tab @code{1} @item Fortran @tab @code{2} @item Fortran-90 @tab @code{3} @item Ratfor @tab @code{4} @item Ratfor-90 @tab @code{5} @item TeX @tab @code{6} @item VERBATIM @tab @code{7} @end multitable @end quotation @noindent This built-in is useful in conjunction with an @code{$IFCASE} construction; see @ref{$IFCASE}. @node $LEN, $LOCKER, $LANGUAGE_NUM, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$LEN}: Length of string @findex $LEN @cindex String length @cindex Length of string @samp{$LEN(@var{string})} returns the length of @var{string} in bytes. If @var{string} is not surrounded by quotes, it is interpreted as if it were quoted (so it is not expanded if it is a macro). Thus, in the example @example @@m SS string $LEN(SS) @end example @noindent the value returned is 2, not 5. To expand the argument before taking the length, one can say something like @example @@m $XLEN(s) $LEN(s) @end example @node $LOCKER, $LOG, $LEN, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$LOCKER}: Value of RCS global keyword @code{Locker} @findex $LOCKER @cindex Lock Equivalent to @samp{$KEYWORD(Locker)}. @xref{$KEYWORD}. @node $LOG, $LOG10, $LOCKER, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$LOG}: Natural logarithm @findex $LOG @cindex Logarithms, natural @samp{$LOG(@i{x})} returns @tex $\ln x$. @end tex @ifinfo the natural logarithm of @i{x}. @end ifinfo @node $LOG10, $M, $LOG, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$LOG10}: Logarithm to the base 10 @findex $LOG10 @cindex Logarithms, base 10 @samp{$LOG10(@i{x})} returns @tex $\log_{10}x$. @end tex @ifinfo the logarithm to the base 10 of @i{x}. @end ifinfo @node $M, $MAX, $LOG10, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$M}: Define a deferred macro @findex $M @cindex Macros, defining @code{$M} is equivalent to @code{$DEFINE}. @xref{$DEFINE}. @node $MAX,$MIN,$M,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$MAX}: Maximum of a list @findex $MAX @cindex Maximum @samp{$MAX(@i{x1},@i{x2},...)} returns the maximum of the list of arguments. (There must be at least one argument.) @node $MIN,$MODULE_NAME,$MAX,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$MIN}: Minimum @findex $MIN @cindex Mininum @samp{$MIN(@i{x1},@i{x2},...)} returns the minimum of the list of arguments. (There must be at least one argument.) @node $MODULE_NAME,$MODULES,$MIN,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$MODULE_NAME}: Name of present @code{web} module @findex $MODULE_NAME @cindex Module, name of @samp{$MODULE_NAME} returns the name of the present @code{web} module. If the present module is unnamed, it returns the string @code{"unnamed"}. @node $MODULES,$NAME,$MODULE_NAME,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$MODULES}: Total number of independent modules @findex $MODULES @cindex Modules, number of @samp{$MODULES} gives the total number of independent modules---that is, the number of independent module names, plus 1 for the unnamed module. @node $NAME, $OUTPUT_LINE, $MODULES, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$NAME}: Value of RCS global keyword @code{Name} @findex $NAME Equivalent to @samp{$KEYWORD(Name)}. @xref{$KEYWORD}. @node $OUTPUT_LINE,$P,$NAME,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$OUTPUT_LINE}: Current line number of tangled output @findex $OUTPUT_LINE @cindex Output line @cindex Line number This returns the current line number of the tangled output. Contrast this with @code{$INPUT_LINE}, @ref{$INPUT_LINE}. @node $P,$PI,$OUTPUT_LINE,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$P}: The C preprocessor symbol @findex $P @cindex Sharp sign @cindex Pound sign @cindex Preprocessor symbol @code{$P} is (essentially) a synonym for @samp{$UNQUOTE("#")} (@pxref{$UNQUOTE}). It is useful for constructing @FWEB{} macro definitions that expand to C preprocessor statements. For example, @example @@m CHECK(flag) $P if(flag) special code; $P endif @end example Another version of the preprocessor symbol is @code{$PP} (@pxref{$PP}). For most purposes, @code{$P} and @code{$PP} will behave in exactly the same way. The difference between them is that @code{$P} is treated as a string (without surrounding quotes), whereas @code{$PP} is treated as a character. The character nature of @code{$PP} is used by @sc{Fortran} to reset the column number to 1, so C-like preprocessor commands appear there rather than in column 7. For further discussion of strings and the differences between @code{$P} and @code{$PP}, see @ref{Strings and quotes}. @node $PI, $POW, $P, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$PI}: Pi @findex $PI @cindex Pi The expression @samp{$PI} returns @PI{} to the default machine precision. The expression @samp{$PI(@i{iprec})} returns @ifinfo @var{pi} @end ifinfo @tex $\pi$ @end tex to the decimal precision @var{iprec} (which must be less than 50). @node $POW, $PP, $PI, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$POW}: Exponentiation @findex $POW @cindex Exponentiation @samp{$POW(@i{x,y})} generates @tex $x^y$. @end tex @ifinfo @i{x} raised to the power @i{y}. @end ifinfo (It is a macro defined in terms of @code{$EVAL} (@pxref{$EVAL}) and the exponentiation operator.) @node $PP, $RCSFILE, $POW, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$PP}: The C preprocessor symbol @findex $PP @cindex Sharp sign @cindex Pound sign @cindex Preprocessor symbol @code{$PP} is shorthand for @samp{$UNSTRING($P)} (@pxref{$P}), or (essentially) a synonym for @samp{$UNSTRING("#")} (@pxref{$UNSTRING}). It is useful, particularly in @sc{Fortran}, for constructing @FWEB{} macro definitions that expand to C preprocessor statements. For an example, see @ref{$P}. For a detailed discussion of the difference between @samp{$P} and @samp{$PP}, see @ref{Strings and quotes}. @node $RCSFILE, $REVISION, $PP, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$RCSFILE}: Value of RCS global keyword @code{$RCSfile} @findex $RCSfile @cindex RCS file @cindex File, RCS Equivalent to @samp{$KEYWORD(RCSfile)}. @xref{$KEYWORD}. @node $REVISION, $ROUTINE, $RCSFILE, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$REVISION}: Value of RCS global keyword @code{Revision} @findex $REVISION @cindex Revision Equivalent to @samp{$KEYWORD(Revision)}. @xref{$KEYWORD}. @node $ROUTINE,$SECTION_NUM,$REVISION,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$ROUTINE}: Current function (@sc{Ratfor} only) @findex $ROUTINE @cindex Program unit When @sc{Ratfor} is the current language, @code{$ROUTINE} expands to a string built of the name of the current program, function, or subroutine. This function is not useful for other languages, for which it expands to the null string. @node $SECTION_NUM,$SECTIONS,$ROUTINE,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$SECTION_NUM}: Number of current @FWEB{} section @findex $SECTION_NUM @cindex Section number, current @samp{$SECTION_NUM} returns an integer greater than 0 that is the integer number of the current @code{web} section. (This is not the La@TeX{} section number such as 3.4.) @node $SECTIONS,$SOURCE,$SECTION_NUM,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$SECTIONS}: Maximum section number @findex $SECTIONS @cindex Section number, maximum @samp{$SECTIONS} is the maximum section number as understood by @FWEAVE{}. @node $SOURCE, $SQRT, $SECTIONS, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$SOURCE}: Value of RCS global keyword @code{Source} @findex $SOURCE Equivalent to @samp{$KEYWORD(Source)}. @xref{$KEYWORD}. @node $SQRT, $STATE, $SOURCE, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$SQRT}: Square root @findex $SQRT @cindex Square root @cindex Root, square @samp{$SQRT(@i{x})} returns @tex $\sqrt{x}$. @end tex @ifinfo the square root of @i{x}. @end ifinfo It is a convenience macro defined in terms of @code{$POW}. @xref{$POW}. @node $STATE, $STRING, $SQRT, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$STATE}: Value of RCS global keyword @code{State} @findex $STATE @cindex State Equivalent to @samp{$KEYWORD(State)}. @xref{$KEYWORD}. @node $STRING, $STUB,$STATE, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$STRING}: Expand, then stringize @findex $STRING @cindex String, quoting a @samp{$STRING(@i{s})} expands its argument if it is a macro, then makes the expansion into a quoted string. If the argument is already a quoted string, it is returned unchanged. @node $STUB,$TIME,$STRING,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$STUB}: Trap for missing module @findex $STUB @cindex Modules, missing When a missing module is detected, @FTANGLE{} inserts the command @samp{$STUB(@i{module_name})} into the output code. The built-in @code{$STUB} expands to a function call appropriate to the current language. For example, in C it expands to @samp{missing_mod}, in @sc{Fortran} it expands to @samp{call nomod}. @node $TIME,$TRANSLIT,$STUB,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$TIME}: The time @findex $TIME @cindex Time @samp{$TIME} returns a string consisting of the local time in the form @code{"19:59"}. @node $TRANSLIT,$U,$TIME,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$TRANSLIT}: Transliteration @findex $TRANSLIT @cindex Transliteration The macro @samp{$TRANSLIT(@var{s}, @var{from}, @var{to})} interprets each of its arguments as strings (without expanding anything). Then @var{s} is modified by replacing any of the characters found in @var{from} by the corresponding characters in @var{to}. If @var{to} is shorter than @var{from}, then the excess characters in @var{from} are deleted from @var{s}. As a limiting case, if @var{to} is empty, then all the characters in @var{from} are deleted from @var{s}. For example, @samp{$TRANSLIT(s, aeiou, 12345)} replaces the vowels in @var{s} by the corresponding digits, and @samp{$TRANSLIT(s, aeiou, )} deletes all the vowels. The backslash may be used to escape a character, as in ANSI C. For example, @samp{$TRANSLIT("a\\"\\\\d", "d\\\\a\\"", "D,A'")} translates into @samp{A',D}. Here one had to explicitly enclose strings involving @samp{\\"} in double quotes in order to avoid a complaint about an unterminated string. @node $U,$UNDEF,$TRANSLIT,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$U}: Change to upper case @findex $U @cindex Case, changing @cindex Upper case @samp{$U(@i{string})} changes @i{string} to upper case. @node $UNDEF,$UNQUOTE,$U,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$UNDEF}: Undefine a macro @findex $UNDEF @cindex Macros, undefining @samp{$UNDEF(@i{macro})} undefines an @FWEB{} macro. @node $UNQUOTE,$UNSTRING,$UNDEF,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$UNQUOTE}: Remove quotes from string @findex $UNQUOTE @cindex Strings, unquoting @samp{$UNQUOTE(@var{string})} returns @var{string} without its surrounding quotes. (However, the resulting construction is still treated as a string; no macro expansion is done.) For a more detailed discussion and a comparison with @code{$UNSTRING} (@pxref{$UNSTRING}), see @ref{Strings and quotes}. @node $UNSTRING, $VERBATIM, $UNQUOTE, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$UNSTRING}: Convert string into characters @findex $UNSTRING @samp{$UNSTRING(@var{string})} removes quotes from the string, if they are present, and treats the result as a collection of characters. No tokenization is done, so macro expansion does not operate on those characters. For a more detailed discussion and a comparison with @code{$UNQUOTE} (@pxref{$UNQUOTE}), see @ref{Strings and quotes}. @node $VERBATIM, $VERSION, $UNSTRING, Built-in functions @comment node-name, next, previous, up @subsubsection @code{$VERBATIM}: (Obsolete) @findex $VERBATIM This was an old name for @code{$UNQUOTE} (@pxref{$UNQUOTE}). Please remove all references to this macro from existing codes. @node $VERSION,,$VERBATIM,Built-in functions @comment node-name, next, previous, up @subsubsection @code{$VERSION}: Present @FWEB{} version number @findex $VERSION @cindex Version, of FWEB @samp{$VERSION} returns a string built out of the @FWEB{} version number, such as @code{"1.61"}. @node Debugging with macros, , Built-in functions, FWEB macros @comment node-name, next, previous, up @subsection Debugging with macros @cindex Macros, debugging with @findex #line If an @FWEB{} macro expands to more than one output line, debugging can be a bit confusing if the debugger (e.g., @code{gdb}) displays lines in the @code{web} source file instead of the output file (as it normally does for C and C++). While single-stepping through the code, the debugger will incorrectly step the screen display for each output line even if the macro call occupies just one line in the source file. To localize the debugger's confusion, insert a @samp{@@#line} command after the macro call. For example, @example @@c @@ Example of a macro that expands to several output lines. @@m UPDATE(i, delta_i) i += delta_i; store(i)@@; @@a main() @{ UPDATE(j, 5); @@#line // More code. The debugger will be in sync from here on. @} @end example An alternative for highly confusing situations is to use the @samp{-#} option (@pxref{-#}). Another potentially confusing situation occurs when @samp{@@%} is used to comment out a line. @FWEB{} deals with the line-number problem that arises here automatically; see @ref{-T#}. @node Macros and formatting, Preprocessing, FWEB macros, Macros @comment node-name, next, previous, up @cindex Macros, formatting @FWEAVE{} makes a valiant attempt to pretty-print (@pxref{Pretty-printing}) the definitions of both outer macros and @FWEB{} macros in a reasonable way. However, this can be a formidable task, because macro syntax can be essentially arbitrary. Consider, for example, the following definition: @example @@c @@d GET(type) type get_##type() @@a GET(int)@{@}@@; // @r{Expands into @samp{int get_int()@{@}}.} @end example @noindent The problem is that the identifier @samp{type} is used in two different ways: as the type of a reserved word (the second @samp{type}), and as an ordinary expression (the third @samp{type}). The first @samp{type} has both meanings simultaneously. Unfortunately, within any particular language @FWEAVE{} associates one unique type or @dfn{ilk} with each identifier. One solution to this problem is to use the @samp{@@R} command (@pxref{ATR_}), which changes the ilk of the very next identifier to integer-like. Thus, @example @@d GET(type) @@R type get_##type()@@; @end example @noindent will format correctly. An alternative solution uses the related command @samp{@@E}, which changes the ilk of the very next identifier to an ordinary expression. Thus, @example @@f type int @@d GET(type) type get_##@@Etype()@@; @end example Other types of troublesome situations involve spaces. When @FWEB{} understands the syntax, it inserts spaces automatically to make the output pleasing. Consider, however, the (somewhat contrived) example @example @@c @@d A(x, y) x y @@d B s1; @@d C s2; @@a A(B, C)@@; @end example @noindent Here @FWEAVE{} will consider @samp{x} and @samp{y} to be ordinary identifiers (simple expressions), and will abut them with no intervening spaces, which is confusing to read. The solution is to insert a space manually with @samp{@@,}: @example @@d A(x, y) x @@, y @end example @noindent (Whether one should write macros like this at all is a separate issue.) For a related example, see the discussion of @ref{ATcomma}. @node Preprocessing,,Macros and formatting,Macros @comment node-name, next, previous, up @section Preprocessing @cindex Macros, preprocessing @cindex Preprocessing Generally, the @FWEB{} preprocessor commands follow a syntax identical to their C/C++ counterparts. The one exception is the @samp{@@#line} command. Whereas the C command takes a line number and file name as arguments, the @FWEB{} command takes no arguments; its expansion automatically inserts the current line number and file name. This command should be necessary only in rare circumstances. One of those involves situations in which an @FWEB{} macro expands to more than one output line; see @ref{Debugging with macros}. The @FWEB{} preprocessor commands may appear in either the definition or the code parts. But @emph{BEWARE: No matter where they appear, they are expanded during INPUT, not output.} (This is probably a design flaw.) For more discussion, see @ref{FWEB macros}. @findex @@#line @findex @@#define @findex @@#undef @findex @@#ifdef @findex @@#ifndef @findex @@#if @findex @@#elif @findex @@#endif The syntax of each command is as follows: @quotation @table @code @item @@#line --- Insert a @code{#line} command. @item @@#define @var{identifier} --- Define an FWEB macro; equivalent to @samp{@@m}. @item @@#undef @var{identifier} --- Undefine an FWEB macro. @item @@#ifdef @var{identifier} --- Is FWEB macro defined? Equivalent to @w{@samp{@@#if defined identifier}}. @item @@#ifndef @var{identifier} --- Is FWEB macro not defined? Equivalent to @w{@samp{@@#if !defined identifier}}. @item @@#if @i{expression} @item @@#elif @i{expression} @item @@#else @item @@#endif @end table @end quotation In the @samp{@@#if} statement, the @i{expression} may contain @FWEB{} macros, but must ultimately evaluate to a number. If that number is zero, the expression is false; otherwise, it is true. @cindex Expression evaluation The @i{expression} following constructions such as @samp{@@#if} is evaluated by a built-in expression evaluator that can also be used for other purposes, such as in macro expansion. Its behavior is again motivated by expression evaluation in ANSI C; it is not quite as general, but should be more than adequate. (One design flaw that will be fixed someday is that the order of expression evaluation is not necessarily left-to-right, as it is in C.) It supports both integer and floating-point arithmetic (with type promotion from integer to floating-point if necessary), and the ANSI @code{defined} operator. Operators with the highest precedence (see table below) are evaluated first; as usual, parentheses override the natural order of evaluation. The unary operator @code{defined} has the highest precedence; all the other unary operators have the next highest (and equal) precedence; then come the binary operators. When the operator exists in C, the action taken by @FWEB{} is precisely that that the C compiler would take. Arithmetic is done in either @b{long} or @b{double} variables, as implemented by the C compiler that compiled @FTANGLE{}. (This was the easy choice, not necessarily the most desirable one.) The operators, listed from highest precedence to lowest, are as follows @ifinfo (printed documentation only): @end ifinfo @page @tex \gdef\expr{{\it expr}} \gdef\.#1{{\tt #1}} \chardef\TL=`\~% Tilde in a string: '\.\~'. \gdef\^{\ifmmode\raise0.45ex\hbox{$\,\scriptstyle\mathchar"25E\,$}% \else\char`^ \fi}% \global\let\amp\& $$\def\<{{\rm ,$\,$}} \def\mod{\Mathop{mod}} \vtop{\halign{\tt\quad#\quad\hfil&\ ---\ \vtop{\hsize=0.75\hsize\noindent\hang \strut#\strut}\hfil\cr \noalign{\medskip\leftline{@b{Unary operators}:}\smallskip} defined&@code{defined} is a unary operator that acts on identifier tokens. @samp{defined id} or equivalently @samp{defined(id)} evaluates to~1 (true) if the identifier is defined as an @sc{Fweb} macro; to~0 (false) otherwise. The construction @samp{@@\#if defined A} works the same way as @w{@samp{@@\#ifdef A}}, but one can use @samp{defined} in expressions, as in $$ \hbox{@code{@@\#if defined(A) || defined(B)}}. $$ (The parentheses around the macro names are optional.) With the advent of @samp{defined}, the @sc{Fweb} preprocessor statements @samp{@@\#ifdef} and @samp{@@\#ifndef} become redundant, but are often useful shorthands.\cr -&Unary minus.\cr !&Logical \hbox{\.{NOT}}. \.{!\expr} evaluates to~0 if \.{\expr} is nonzero, and evaluates to~1 if \.{\expr} is~0.\cr \TL&One's complement of an integer. For example, $\.{\TL0} = -1$.\cr \noalign{\medskip\leftline{@b{Binary operators}:}\smallskip} \^\^&Exponentiation (all languages). $2\hbox{\.{\^\^}}3 = 8$.\cr \^\<**&Exponentiation (@sc{Fortran} or @sc{Ratfor}).\cr *\>&As above, but right-shift. $7 \gg 2 = 1$.\cr <\<<=\<>\<>=&Evaluates to~1 if the inequality holds, to~0 otherwise. E.g., `\.{(2.0 < 3.0)}' evaluates to~1.\cr ==\@@; @@ @@= int fcn() @{@} @end example @noindent @FTANGLE{} will write two output files for this example---e.g., @file{test.f} and @file{test.c}. Particularly note that one did not need an @samp{@@c} command in the last section because the language was C when @samp{@@} was first encountered. @section Special hints and considerations for each language One important thing to keep in mind is that in @FWEB{} an identifier may have, for each language, precisely one meaning throughout the document. This restriction is not necessarily in accord with the syntaxes of the various source languages. See, for example, the discussions in @ref{Cpp} and @ref{Fortran}. @node C, Cpp, Setting the language, Languages @comment node-name, next, previous, up @subsection Special considerations for C @cindex C hints @cindex Hints, C @itemize @bullet @item @cindex Binary notation @cindex Notation, binary @FTANGLE{} treats the construction @samp{0b...} as a binary notation that it expands to an unsigned decimal number. Thus, @samp{0b101} expands to 5 and @samp{0b1111111111111111} expands to 65535. @item @FWEAVE{} processes @b{typedef} statements during phase one, so they will format properly even if they are used in a documentation part before they are defined in a code part. @item The @samp{-H} option helps one to deal with identifiers defined in header files. @xref{-H_}. @item @cindex Tags, enum @cindex Tags, structure Note that in C structure and enum tags do not define a new type, so the tag name does not get highlighted in boldface, underlined in the index, etc. (That is, if one says @samp{struct S @{...@};}, one can't say @samp{S s;}, one must say @samp{struct S s;}.) This is a good reason for using C++, where such tags do define a new type. @end itemize (To be completed.) @node Cpp,Fortran,C,Languages @comment node-name, next, previous, up @subsection Special considerations for C++ @cindex C++ hints @cindex Hints, C++ @itemize @bullet @item All of the items in the previous section (@pxref{C}) still apply. @item The @samp{@@@{} command is very useful for beautifying very short definitions of member functions such as constructors. @xref{ATlb} @item Essentially, @FWEAVE{} has only one name space, global to the entire code; those names do not obey any concept of scope. In various situations in C and C++, however, multiple namespaces are used, or the interpretation of a name changes according to its scope. Thus, the design of @FWEAVE{} imposes a few restrictions on one's programming style. (Remember, @FWEAVE{} doesn't know nearly as much as a language compiler.) One example in C++ has to do with formal types in templates. Consider the following example: @example template class A @{ private: Type *p; @} @end example @noindent In order that the class definition be typeset correctly, @samp{Type} must be understood to be a reserved word like @b{int}, and that is correctly figured out by the first @b{class} command. However, according to C++, the scope of @samp{Type} is local to the class definition; unfortunately, @FWEAVE{} does not respect that locality and will always treat @samp{Type} as an @b{int} from the point of the @samp{class Type} construction to the end of the source code. Thus, one should use such dummy variables as @samp{Type} only as formal template parameters, never as ordinary variables. @end itemize @node Fortran,Ratfor_,Cpp,Languages @comment node-name, next, previous, up @subsection Special considerations for @sc{Fortran} @cindex Hints, @sc{Fortran} @cindex @sc{Fortran} hints @subsubsection Items for both @sc{Fortran}-77 and @sc{Fortran}-90 @itemize @bullet @item @cindex Binary notation @cindex Notation, binary @cindex Octal notation @cindex Notation, octal @cindex Hexadecimal notation @cindex Notation, hexadecimal @FTANGLE{} will translate into unsigned decimal numbers the binary notation @samp{0b...}, the octal notation @samp{0...}, and the hexadecimal notation @samp{0x...}. Thus, @samp{0b101} expands to 5, @samp{0101} expands to 65, and @samp{0x101} expands to 257. @item Don't use the column 1 @samp{C} commenting convention. Use @samp{/* ... */} or @samp{// ...}. @item For compiler directives, use @samp{@@?} (@pxref{AT?}), not a @samp{C} in column 1. @item If you are going to use the recommended @samp{// ...} convention for short comments, you must say @samp{@@n/} (@pxref{-n/}) or @samp{@@n9[-n/]} as your language command. Otherwise, \FWEB\ will treat the @samp{//} as \@sc{Fortran's} standard token for concatenation. (You may always use @samp{\/} for concatenation.) @item @cindex Code, temporarily commenting out If you want to completely comment out a whole block of code, use the preprocessor construction @samp{@@#if 0...@@#endif} (@pxref{Preprocessing}). Don't put a comment character at the beginning of each line; that prevents @FWEAVE{} from formatting the code sensibly and can be annoying to undo. With the preprocessor form, one can also implement conditional comments by using @FWEB{} preprocessor macros: e.g., @samp{@@#if(DEBUG)...@@#endif}. Pre-@FWEB{} codes may have such blocks commented out with a @samp{C} in column 1. Those should be converted to the preprocessor construction. However, if you're in a real hurry, temporarily use the @samp{-nC} option (@pxref{-nC}) to kill those lines very early in the processing, before they can give you all kinds of trouble. @item @cindex Comments, short An unfortunate byproduct of using @samp{//} for short comments is that, in general, format constructions like @code{format(//)} won't work. (It will work if one uses @samp{-nC}; see @ref{-nC}.) Alternatively, one can say @code{format(/ /)}. @item Consecutive lines commented out with a @samp{C}, @samp{c}, @samp{*}, or @samp{!} in column 1 are converted into a single comment before processing by @FWEB{}. Large blocks of such lines (common in pre-@FWEB{} code) may overflow @FWEB{}'s tables. To avoid that, insert blank lines between some of the comments. Better, however, is to move most such blocks out of the code part to the @TeX{} part of the section. It's most readable to have only a few very short comments interspersed in the code. To help with conversion of existing codes, the command-line option @samp{-nC} can be used to completely ignore comment lines. @item @samp{@@} commands should, by and large, start in column 1. That's not necessary for short module names that fit on one line. However, a long module name that must be broken across lines must begin in column 1, as in @example @@n @@ @@a @@@@; @end example @noindent Failure to do this results in a spurious semicolon being inserted in the middle of the name. This happens because the @sc{Fortran}-77 input driver does various low-level manipulations of the source before it presents it to the innards of @FWEB{}; it's not tokenizing the source at that time and doesn't understand all of the @FWEB{} syntax such as module names. @item Define symbolic statement labels with @samp{#:0} (@pxref{Tokens}). Such names should be followed by a colon. Thus, @example @@n @@ @@m EXIT #:0 @@m ABORT #:0 @@a . . ABORT: continue . . EXIT: continue . . @end example @item By default, statement labels are @code{\llap}'d from the body of the statement. With this convention, long labels can extend too far into the left margin. Instead, try the command-line option @samp{-n:} (@pxref{-ncolon}), which puts them on a separate line. Alternatively, one can redefine the macro @code{\Wlbl}, found with some discussion in @file{fwebmac.sty}. @findex \Wlbl @item @cindex Keywords, I/O @findex -k As a suggestion, use upper case for I/O keywords such as @code{IOSTAT}. However, by default the lower-case forms are also recognized. To permit only upper case, use @samp{-k} (@pxref{-k}). Note that although there is a command @samp{-nk}, it is unfortunately not related to @samp{-k}. @item @cindex Exponentiation One may use @samp{^} as an alternative for the exponentiation operator @samp{**}. @item @findex -+ @cindex Assignment operators, compound @FWEB{} attempts to be helpful and tries to expand the operators @samp{++}, @samp{--}, @samp{+=}, @samp{-=}, @samp{*=}, and @samp{/=} in a way compatible with the usage in C and C++. For example, it expands @w{@samp{x += y}} into @w{@samp{x = x + (y)}}. This feature can be a great time-saver and also makes the code substantially more legible; it is strongly recommended. To turn off this feature, use the option @samp{-+}. @xref{-plus}. @cindex Not equal Notice that in @sc{Fortran}-90 @samp{/=} is a token for ``not equal,'' so if you want to use that you must use the @samp{-+} option. However, a better solution is to use @samp{!=}, @FWEB{}'s preferred operator for ``not equal.'' @item @cindex .true. @cindex .false. By default, the operators @code{.true.} and @code{.false.} will weave as caligraphic T and F. That appearance be changed by redefining the macros @code{\WTRUE} and @code{\WFALSE} in @file{fwebmac.sty} or in the limbo section of your source file. @item @findex -# If @FTANGLE{} messes up and outputs incorrect @sc{Fortran} code, try tangling with the command-line option @samp{-#} (@pxref{-#}) (and then report the problem.) @end itemize @subsubsection Items specific to @sc{Fortran}-77 and fixed-form @sc{Fortran-90} @itemize @bullet @item @cindex Semicolons, automatic @cindex Automatic semicolons By default, when processing the code part the @sc{Fortran} driver inserts semicolons automatically at the end of each logical statement. Thus, the core of @FWEB{} is presented with a uniform syntax. However, when one escapes into code mode by using vertical bars, those semicolons aren't inserted, so something that appears a first glance to be complete statement may not be formatted as one might expect. Thus, the construction @samp{|5: continue|} doesn't format quite properly (the colon disappears); this problem is solved by putting a semicolon after the @samp{continue}. Also, if one is talking about multiple statements (for example, with a shift into code mode during @TeX{} documentation), there's no choice but to insert the semicolon between statements. For example, @w{@samp{|a = b; c = d;|}}. @end itemize @subsubsection Items specific to @sc{Fortran}-90 @itemize @bullet @item @cindex Syntax, free-form If @sc{Fortran}-90 is selected (@pxref{-n9}), the default is @emph{free-form} syntax (lines are continued by a trailing ampersand). However, automatic line breaking is done in a way compatible with fixed-form syntax as well. @item @findex -n! With free-form syntax, comment lines in the tangled output file begin with @samp{!}. But such lines are not recognized on input unless @samp{-n!} is used. @xref{-n!}. @item @cindex Pseudo-semicolons, automatic @cindex Automatic pseudo-semicolons Beginning with Version 1.61, by default (pseudo-)semicolons are automatically inserted in free-form \Fortran-90 code, as one would expect. For more discussion, see @ref{-nAT;} and @ref{-n;}. @end itemize (To be completed.) @node Ratfor_,TeX,Fortran,Languages @comment node-name, next, previous, up @subsection Special considerations for @sc{Ratfor} For some warnings about @sc{Ratfor}, see @ref{Caveats}. @node TeX, Verbatim, Ratfor_, Languages @comment node-name, next, previous, up @subsection Special considerations for TeX @cindex Hints, @TeX{} @cindex @TeX{} hints @samp{@@Lx} is supported only to the extent that @code{fwebmac.sty} can be generated correctly from @code{fwebmac.web}. You are welcome to experiment, but you may encounter difficulties (which you should report; @pxref{Support}). (To be completed.) @node Verbatim, , TeX, Languages @comment node-name, next, previous, up @subsection Special considerations for the @sc{verbatim} language Unfortunately, the @sc{VERBATIM} language is not fully debugged. Therefore, it is not recommended for general use. (To be completed.) @node Ratfor,Documentation,Macros,Top @comment node-name, next, previous, up @chapter @sc{Ratfor} @cindex @sc{Ratfor} @cindex @sc{Fortran}, Rational @cindex Rational @sc{Fortran} ``@sc{Ratfor}'' stands for ``@sc{RATional} @sc{FORtran}.'' It endows @sc{Fortran} with a C-like syntax. Certain loop and other constructions (such as @samp{switch} or @samp{i++}) that are not allowed in @sc{Fortran} are allowed in @sc{Ratfor}; @FWEB{} translates those into proper @sc{Fortran}. Although @sc{Ratfor} is a definite improvement over @sc{Fortran}, it certainly does not have the power of C (e.g., elegant pointer notation) or C++ (e.g., classes). Many advantages accrue by taking the time to learn C. @sc{Ratfor} offers a gentle transition. (It is not supported very actively any more.) @menu * Syntax: RSyntax. Ratfor syntax. * Commands:: Ratfor commands. * Caveats:: Nuances about @FWEB{} Ratfor. @end menu @node RSyntax, Commands, Ratfor, Ratfor @comment node-name, next, previous, up @section @sc{Ratfor} syntax A sample @sc{Ratfor} program is @example @@r @@ @@a program main @{ integer k; real fcn, x; for(k=0; k<10; k++) @{ x = fcn(k); if(x < 0.0) @{ x = 0.0; break; @} @} @} @end example @noindent The concluding brace of a function is translated into an @b{END} statement. Note the use of semicolons to terminate statements, braces to delimit compound statements, @samp{<} instead of @samp{.LT.}, the C-like @b{for} construction, and the @samp{k++} expression. Constructions like @samp{k++} or @samp{k -= l + 1} must be used with great care. They translate to statements involving @samp{=} signs, so they can be used only where simple statements are allowed, not essentially anywhere as in C (for example, they cannot be used as function arguments). @node Commands,Caveats,RSyntax,Ratfor @comment node-name, next, previous, up @section @sc{Ratfor} commands @subsection @sc{Ratfor}--77 commands @cindex @sc{Ratfor} commands @example break; // @r{Used with @code{case} or to break out of loops, as in C.} case i: // @r{Used with @code{switch}.} default: // @r{Used with @code{case}, as in C.} do ...; @{...@} // @r{Note the semicolon (unnecessary if followed by a compound stmt).} else @{...@} // @r{Used after @code{if} as in C.} for(a;b;c) @{...@} // @r{As in C.} if(condition) @{...@} next; // @r{Equivalent to C's |continue| statement; go to bottom of loop.} repeat @{...@} until(condition); // @r{Equivalent to C's @code{do @{...@} while();}} return expression; // @r{As in C.} switch(expression) @{...@} // @r{As in C.} while(condition) @{...@} // @r{Like C's @code{while}.} @end example @subsection Additional @sc{Ratfor}--90 commands @example contains: interface name @{...@} interface operator(op) @{...@} interface assignment(assgnmnt) @{...@} module name @{...@} private: sequence: type name @{...@} where(expression) @{...@} @end example @node Caveats,,Commands,Ratfor @comment node-name, next, previous, up @section Caveats about @sc{Ratfor} @cindex @sc{Ratfor}, caveats about The version of @sc{Ratfor} built into @FWEB{} differs slightly from its @sc{unix} counterpart: @quotation @enumerate @item Numeric statement labels must be followed by a colon; they should be first on their line. (Use symbolic statement labels instead; see the discussion of @samp{#:0} in @ref{Tokens}.) @item The quoting convention for characters and strings follows that of C: Single-quote single characters, double-quote strings. @item In a @b{switch}, cases fall through to the next case unless terminated by @b{break} (just as in C). @item The @b{do} statement must be terminated by a semicolon if followed by a simple statement. (It's unnecessary if followed by a left brace that begins a compound statement.) @item Use @t{&&} and @t{||} for the logical AND and OR. @item Do not use an @b{end} statement at the very end of a @sc{Ratfor} program unit; it is added automatically by @FWEB{} when the closing brace is sensed. @end enumerate @end quotation @node Documentation,Index,Ratfor,Top @comment node-name, next, previous, up @chapter DOCUMENTATION @cindex Formatting @cindex Documentation format @FWEB{} uses La@TeX{} to produce its documentation. Plain @TeX{} is no longer supported. It is not necessary to be very familiar with La@TeX{} in order to use @FWEB{} effectively. @FWEB{} does complicated things behind the scenes, relieving the programmer of many burdens. If you don't need complicated mathematics, one needs to know virtually no La@TeX{} at all in order to document a section of code. And if you do need to typeset math, consider that La@TeX{} makes this daunting task about as simple as one could hope. If you're an @FWEB{} beginner, don't bother diving into the details of this section until you really need to. @menu * Typesetting:: Woven output; TeX vs. LaTeX, etc. * Pretty-printing:: Turning ugly input into beautiful output. @end menu @node Typesetting, Pretty-printing, Documentation, Documentation @comment node-name, next, previous, up @section Typesetting @cindex Typesetting @FWEB{}'s ``new look'' (beginning with version 1.40) is designed to work only with La@TeX{}. The new look is more book-like, following ideas from Briggs' @code{nuweb}. By default, it uses default La@TeX{} section numbers such as 1.5.32; however, sections may be numbered with consecutive integers by specifying the La@TeX{}2e package @code{fwebnum}; see @ref{Numbering}. @menu * Output:: Structure of the TeX output from @FWEAVE{}. * fwebmac.sty:: The macro package used with @FWEAVE{}. * LaTeX:: Specifics of the LaTeX support. @end menu @node Output, fwebmac.sty, Typesetting, Typesetting @comment node-name, next, previous, up @subsection @FWEAVE{}'s OUTPUT When one says @samp{fweave test}, the file @file{test.tex} is created. Some @TeX{} commands contained in this file are created automatically; others are copied from the web source file. They are organized into several sequential groups, as follows. @quotation @enumerate @item @code{\input} command to read in @FWEAVE{}'s macro package. @findex fwebmac.sty By default, the initial input command is @samp{\input fwebmac.sty} (@pxref{fwebmac.sty}). The name of the macro package can be changed with the @samp{-w} command-line option, but that is dangerous and useful only for very special effects. @xref{-w}. @item @code{\Wbegin} command. The @code{\Wbegin} macro sets up certain defaults (which can be overridden in the limbo section). In La@TeX{}, it also issues the @samp{\documentclass@{article@}} and @samp{\begin@{document@}} commands. @item Limbo text from the style-file parameter @code{limbo.begin}. @xref{S_limbo}. @item Limbo text from @samp{@@l} commands. @xref{ATl}. @item User's limbo section. @item Limbo text from the style-file parameter @code{limbo.end}. @xref{S_limbo}. @item @TeX{} commands for individual WEB sections. @item @code{\input} command to read in the index data file. @item @code{\input} command to read in the module-list data file. @item @code{\Winfo} command (summarizes some status information). @item @code{\Wcon} command (generates the Table of Contents, and ends the run). @end enumerate @end quotation @node fwebmac.sty, LaTeX, Output, Typesetting @comment node-name, next, previous, up @subsection The macro package @file{fwebmac.sty} @findex fwebmac.sty @FWEAVE{} works in conjunction with the macro package @file{fwebmac.sty}, which is always read into the @file{.tex} file by default. This file is (overly) complicated, so one should not mess with it unless in dire emergency. Most of its commands are intended for behind-the-scenes processing. However, some features may be of general interest; these are described in the items below. For the most part, macros used internally by @file{fwebmac.sty} begin with an uppercase @samp{W}. If you are worried about macro conflicts, a complete list of the macros appearing in @file{fwebmac.sty} can be found in the Index produced by weaving @file{fwebmac.web}. @menu * User macros:: Macros defined for user convenience. * Fonts:: Useful font commands. @end menu @node User macros, Fonts, fwebmac.sty, fwebmac.sty @comment node-name, next, previous, up @subsubsection User macros For the user's convenience, @file{fwebmac.sty} defines a variety of macros such as @samp{\FWEB}, @samp{\Fortran}, etc. Refer to @file{fwebmac.web} for a complete list. @FWEAVE{} usurps various common single-character macros such as @samp{\.} for its own purposes. So the user can still access their original definitions, those are @samp{\let} equal to alternative commands such as @samp{\period}. For example, commands such as the following are executed in @code{fwebmac.sty}: @example \let\amp\& \let\at\@@@@ \let\bslash\\ \let\caret\^ \let\dollar\$ \let\dstar\* \let\equals\= \let\leftbrace\@{ \let\period\. \let\rightbrace\@} \let\vertbar| \let\PM\# \let\PC\% @end example @noindent (Some of the more inscrutable synonyms are for historical reasons.) For the most up-to-date and detailed information, refer to @file{fwebmac.web}. @node Fonts, , User macros, fwebmac.sty @comment node-name, next, previous, up @subsubsection Fonts @cindex Fonts Several fonts have been declared. Those include @quotation @itemize @bullet @item @samp{\titlefont} (large sans serif), @item @samp{\ttitlefont} (large typewriter), @item @samp{\SC} (small caps), @item @samp{\Csc} (Caps/small caps), and @item @samp{\tentex} (@TeX{}'s extended character set). @end itemize @end quotation @noindent For illustrations and further details, see @file{fwebmac.web}. To typeset a string of characters in typewriter type, one may use the @samp{\.} macro. (More precisely, the name of this macro is the value of the style-file parameter @code{format.typewriter}. For more information, see @ref{S_format}.) When using this, one must escape the special characters @samp{ \#%$^_@{@}~&}, as in @samp{\.@{\\alpha@}}. (@FWEAVE{} does that escaping automatically when typesetting strings in code mode.) You may wish to surround @samp{\.@{...@}} with an @samp{\hbox}; that is not done by default because @FWEAVE{} uses special trickery to break long strings in code mode automatically, and that breaking would be inhibited by an @samp{\hbox}. @node LaTeX, , fwebmac.sty, Typesetting @comment node-name, next, previous, up @subsection La@TeX{} support @cindex La@TeX{} @cindex La@TeX{}2e Original La@TeX{} support (through version 1.30) was substantially incomplete in that La@TeX{}'s @code{\output} routine was usurped by the relatively simple one used for @FWEB{}'s @TeX{} support. However, beginning with version 1.40, full La@TeX{} support is provided (and Plain @TeX{} is @emph{not} supported); version 1.50 supports La@TeX{}2e. La@TeX{}'s @code{\output} routine is used, as are its sectioning commands (with minor changes), Table-of-Contents facilities, etc. The following discussion is based on La@TeX{}2e. If La@TeX{}2e is not installed, @FWEAVE{} recognizes that fact and issues the @samp{\documentstyle} command instead of @samp{\documentclass}. @findex \documentstyle Users are strongly encouraged to upgrade to La@TeX{}2e. A useful book that describes the present state of La@TeX{} is Goossens, Mittelbach, and Samarin, @cite{The La@TeX{} Companion} (Addison--Wesley, Reading, MA, 1994). @menu * Document class:: LaTeX's document class, options, etc. * REVTeX:: The REV@TeX{} scientific macro package. * Packages:: Special FWEB-related La@TeX{}2e packages. * Sections:: Section numbering, spacing, etc. * Index:LIndex. Technical details about multi-columns and the Index. * Table of Contents:: The Table of Contents. * Customizing LaTeX:: Conditional flags, etc. * Inserting woven code:: How to insert @FWEAVE{}'s output into a La@TeX{} document. @end menu @node Document class, REVTeX, LaTeX, LaTeX @comment node-name, next, previous, up @subsubsection La@TeX{}'s document class @findex \documentclass An @FWEB{}/La@TeX{} document is set up with the @samp{\Wbegin} command, issued automatically by @FWEAVE{}. See the summary at the end of this section for the essence of what the @samp{\Wbegin} command accomplishes. @FWEAVE{} uses @code{\documentclass@{article@}} by default. In principle, the document class can be changed by the @FWEB{} style-file option @samp{LaTeX.class}; see @ref{Fwebmac params}. However, @emph{@FWEAVE{} has not been tested with most other document classes}. It will probably not work with most document classes that redefine the sectioning commands from those of @code{\documentclass@{article@}}. However, it @emph{may} work with the @code{revtex} scientific macro package. @xref{REVTeX}. To incorporate class options---i.e., to obtain the effect of @samp{\documentclass[myoptions]@{article@}}---use the style-file parameter @code{LaTeX.class.options}, as in @cindex Class options @cindex Options, class @example LaTeX.class.options "myoptions" @end example @noindent To get two-sided printing, for example, one would say @cindex Printing, two-sided @example LaTeX.class.options "twoside" @end example @findex \usepackage @cindex User packages @cindex Packages, user To specify user packages---i.e., to obtain the effect of @samp{\usepackage[pkgoptions]@{pkgname@}}---use the style-file parameters @code{LaTeX.package} and @code{LaTeX.package.options}, as in @example LaTeX.package "pkgname" LaTeX.package.options "pkgoptions" @end example @noindent For example, to indent the first line of every section and to permit the use of the @code{multicol} package (the latter is a useful way of substantially cutting down on white space), say @example LaTeX.package "indentfirst,multicol" @end example Note that specifying @code{LaTeX.package} and @code{LaTeX.package.options} results in the execution (by the @code{\Wbegin} macro) of precisely @emph{one} line of the form @example \usepackage[myoptions]@{mypackages@} @end example @noindent Sometimes one instead needs to have multiple @code{\usepackage} lines, such as @example \usepackage[option1]@{package1@} \usepackage[option2]@{package2@} @end example @noindent To get this effect, one can put these commands explicitly into the style-file parameter @code{doc.preamble} (see discussion two paragraphs below), as in @example doc.preamble = "\\usepackage[option1]@{package1@}\ \\usepackage[option2]@{package2@}" @end example @TeX{} commands in the user's limbo section of the @code{web} source file will be processed @emph{after} the @code{\begin@{document@}} command. Limbo commands from the style file can be inserted before and/or after those in the limbo section with the aid of the style-file parameters @samp{limbo.begin} and @samp{limbo.end}; see @ref{S_limbo}. If there is a compelling reason to insert one's own La@TeX{} commands between the @samp{\usepackage} and @samp{\begin@{document@}} commands, one may use the style-file parameter @samp{doc.preamble}, whose value is a string consisting of La@TeX{} commands (empty by default). Those commands are processed immediately before @samp{\begin@{document@}}. One use of @samp{doc.preamble} is to inhibit @FWEB{}'s tendency to keep a section together on one page. To make it break more readily in the middle of sections (particularly useful for multicolumn output), say @example doc.preamble "\\secpenalty=0" @end example In summary, the beginning of the file output by @FWEAVE{} looks like the following, where @samp{} means the contents of the style-file string called @samp{parameter}: @example \input fwebmac.sty \Wbegin@{many obscure arguments@} Optional TeX commands copied from user's limbo section @end example @noindent @findex \Wbegin The @samp{\Wbegin} command essentially does the following: @example \documentclass[]@{@} \usepackage[]@{@} \begin@{document@} @end example @noindent For precise information about how @samp{\Wbegin} works, see @code{fwebmac.web}. If you feel that macro absolutely needs to be changed, please inform the developer (@pxref{Support}). @node REVTeX, Packages, Document class, LaTeX @comment node-name, next, previous, up @subsubsection Using REV@TeX{} REV@TeX{} is the standard macro package used for formatting scientific papers submitted to the American Physical Society, the American Institute of Physics, and some European journals. It modifies the sectioning commands of @code{\documentclass@{article@}} and provides various other useful macros. Unfortunately, as of August, 1998, REV@TeX{} is not fully compatible with La@TeX{}2e; it must be invoked with @code{\documentstyle@{revtex@}}, not @code{\documentclass}. This is annoying, because @FWEB{}'s macros in @file{fwebmac.sty} default to @code{\documentclass} if they recognize that La@TeX{}2e is loaded. To use REV@TeX{}, uncomment the line in @file{fwebmac.sty} that says @code{\useREVTeXtrue}. (One cannot say @samp{\useREVTeXtrue} in the limbo section of one's @code{web} source, because the document class has already been selected by that time.) You may wish to rename the resulting file, say to @file{rwebmac.sty}, so it can be loaded in place of the standard @file{fwebmac.sty}. To do that, one would use the command-line option @samp{-wrwebmac.sty} (see @ref{-w}). Saying @code{\useREVTeXtrue} selects @code{\documentstyle} rather than @code{\documentclass}. To implement a standard command such as @code{\documentstyle[aps,my_macros]@{revtex@}}, use the style-file (@file{fweb.sty}) parameters @code{LaTeX.style} and @code{LaTeX.options}, as in @example LaTeX.style "revtex" LaTeX.options "aps,my_macros" @end example @noindent Here @file{my_macros.sty} would be a user's macro package loaded in addition to those of REV@TeX{} and @FWEB{}. REV@TeX{} support is extremely recent. There may be glitches; please report those. In a pinch, if La@TeX{} stops while processing a REV@TeX{} file produced by @FWEAVE{}, try typing `s' (scroll mode) to force it to continue; you might get usable output. @node Packages, Sections, REVTeX, LaTeX @comment node-name, next, previous, up @subsubsection La@TeX{} packages related to @FWEB{} The following packages are supplied with the @FWEB{} distribution and can be used to achieve special effects. Packages are invoked by giving their names as arguments to the @code{LaTeX.package} command; see @ref{S_LaTeX}. @iftex @itemize @bullet @item @code{fwebinsert} --- Enables insertion of woven code into a La@TeX{} document. @xref{Inserting woven code}. @item @code{fwebnum} --- Number each section in ascending integer order. @xref{Numbering}. @item @code{idxmerge} --- Merge several stand-alone indexes. @xref{Merging indexes}. @end itemize @end iftex @menu * fwebinsert:Inserting woven code. Enable insertion of woven code into a La@TeX{} document. * fwebnum:Numbering. Number each section in ascending order. * idxmerge:Merging indexes. Merge several stand-alone indexes. @end menu @node Sections, LIndex, Packages, LaTeX @comment node-name, next, previous, up @subsubsection Sections in La@TeX{} @cindex La@TeX{} section @findex \section @findex \subsection @findex \subsubsection @FWEB{}'s sectioning commands @samp{@@*} and @samp{@@*@i{n}} are converted into La@TeX{}'s section commands such as @code{\section} (@i{n}=0), @code{\subsection} (@i{n}=1), and @code{\subsubsection} (@i{n}=2). During La@TeX{}'s processing of the @code{.tex} file, it keeps track of the maximum depth achieved by @samp{@@*@i{n}}. This number is written as the last item in the @file{aux} file. During the next La@TeX{} run, that number is used to map the untitled @ASP{} commands to the next most insignificant sectioning command. That level of sectioning command is slightly redefined from La@TeX{}'s default, so don't try to redefine it. The previous scheme means that it may be necessary to run La@TeX{} as many as three times in order to resolve all sectioning and cross-reference information correctly. You should be warned in such cases. If not, you will recognize difficulties by noting that the Table of Contents or section numbering is incomplete. The @file{aux} file is also used by both processors to generate appropriate error messages that refer to the La@TeX{} section number instead of the internal one. A discussion of alternative section-numbering schemes is given in @ref{Numbering}. @node LIndex, Table of Contents, Sections, LaTeX @comment node-name, next, previous, up @subsubsection La@TeX{}'s index. @cindex Index @findex \INDEX @findex \beforeindex @findex \startindex @findex \Wfin The Index should be the last section of the code, and should be begun by the command @samp{@@* \INDEX.}. For more information, see @ref{S_index}. The challenge of typesetting the Index is to get it into two-column mode in the best possible way. In the original Plain-@TeX{} @FWEB{}, special code was provided for this. With La@TeX{}, however, one wants to use standard features. @cindex @code{multicol}, using @cindex Package, @code{multicol} @findex multicol.sty @findex \twocolumn The best solution is to use the user package @code{multicol}. If that is loaded by means of the style-file statement @samp{LaTeX.package "multicol"}, then any text typed by the user following the @samp{@@* \INDEX.} command will be typeset in single-column mode, after which two-column mode is entered. If it is not loaded, a @samp{\twocolumn} command is issued @emph{before} the index section is begun (in order to get the Index started on a new page). More precisely, what happens is the following. When the @samp{@@* \INDEX.} command is recognized, essentially the following operations are performed, where the results are bracketed in the form @samp{[multicol : nomulticol]}: @example \beforeindex [\newpage : \twocolumn] [print INDEX section heading] \startindex [\begin@{multicols@}@{2@} : \medskip] \Wfin [\end@{multicols@} : \relax] @end example @noindent (Use of the asymmetrical name @samp{\Wfin} is for historical reasons.) @cindex Columns, multiple The positioning of @samp{\beforeindex} suggests a way of printing the entire document in two-column mode. If one enters multi-column mode in the limbo section, then @samp{\beforeindex} can be used to terminate it. It is best to do this at the @emph{end} of the limbo section; otherwise user macro definitions in the limbo section must be made @code{\global} in order that they remain defined in the Index. The relevant commands can be placed in the style file: @example LaTeX.package "multicol" doc.preamble "\\secpenalty=0" limbo.end "\\def\\beforeindex@{\\end@{multicols@}\\newpage@}\n\ \\begin@{multicols@}@{2@}\n\ \\raggedcolumns" @end example @noindent Just to repeat, use only the first command to get just the Index printed in two-column format; use the second and third ones to make the entire document two-column. @node Table of Contents, Customizing LaTeX, LIndex, LaTeX @comment node-name, next, previous, up @subsubsection La@TeX{}'s Table of Contents @cindex Contents, table of @cindex Table of Contents @findex \FWEBtoc La@TeX{} uses the @file{aux} file to accumulate the information for the Table of Contents. When La@TeX{} is used, the Table of Contents appears at the front of the document by default (beginning with version 1.61). This is accomplished by setting the default value of the style-file parameter @code{limbo.end} to @code{"\\FWEBtoc"}, where @code{\FWEBtoc} is defined in @file{fwebmac.sty}. If you initialize @code{limbo.end} yourself in @file{fweb.sty}, you should include @code{"\\FWEBtoc"} at the end of that initialization if you want the Table of Contents to appear in the beginning. Otherwise, it will appear at the end. In essence, the Table of Contents is produced by the La@TeX{} commands @example \pagenumbering@{roman@} \maketitle \topofcontents \tableofcontents \botofcontents \newpage @end example @noindent @findex \topofcontents @findex \botofcontents @findex \maketitle @findex \Title @findex \title By default, the @FWEB{} hooks @code{\topofcontents} and @code{\botofcontents} are empty, but they may be used in special circumstances to override the usual behavior. One can set the parameters for @code{\maketitle} in the limbo section in the usual La@TeX{} way, except that it is better to use @FWEB{}'s @code{\Title} macro instead of @code{\title}: @example \Title@{MYCODE.WEB@} \author@{My name@} \date@{January 1, 2001@} @end example By default, the argument of the @code{\Title} macro is printed both on the title page and as a running headline in the document. The default font for the title is @code{\ttitlefont}; that for the running headline is @code{\large\tt}. However, @code{\Title} has one optional argument that allows one to override the running headline, perhaps by specifying a shorter form. Say @example \Title[@i{Short title}]@{@i{Long title}@} @end example @noindent to make the running headline be @samp{\large\tt @i{Short title}} and the title-page title be @samp{\ttitlefont @i{Long title}}. The \@FWEB{} @code{\Title} macro calls La@TeX{}'s @code{\title} macro with the long title as its argument. By default, @FWEAVE{} uses (in the @samp{\Wbegin} macro) @example \title@{@}% \author@{@}% \date@{\today\\[3pt]\Time@}% @end example @findex \numberline Section numbers in the Table of Contents are produced by the La@TeX{} macro @code{\numberline}. La@TeX{}'s default definition is inadequate when section numbers are very large; they extend to the right and can overwrite the section name. The macro is redefined more appropriately when the package @code{fwebnum} (@pxref{Numbering}) is used. @node Customizing LaTeX, Inserting woven code, Table of Contents, LaTeX @comment node-name, next, previous, up @subsubsection Customizing La@TeX{}'s output Several (@TeX{}) flags are provided to change the appearance of the final La@TeX{} document. (This appearance is a bit experimental, and it is fair to say that not everything may be fully debugged; please report problems.) These are (@samp{...} means either @samp{true} or @samp{false}) @quotation @itemize @bullet @item @findex \pagerefs @code{\pagerefs...} (index references by pages or section numbers); @item @findex \numberTeX @code{\numberTeX...} (number the beginning of unnamed TeX parts); @item @findex \numberdefs @code{\numberdefs...} (number the beginning of the definition part); @item @findex \numbercode @code{\numbercode...} (number the beginning of the code part). @end itemize @end quotation @noindent The defaults for these flags are @example \pagerefsfalse \numberTeXfalse \numberdefstrue \numbercodetrue @end example @noindent If desired, one may override these in the limbo section. (They are defined using Plain @TeX{}'s @samp{\newif} rather than the equivalent La@TeX{} command because they may also be used when La@TeX{} is not present.) @code{\numberTeX} is on the verge of obsolescence. Try to not use it; never use it in conjunction with the package @code{fwebnum}. @xref{Numbering} @menu * Page references:: Indexing by page numbers. * Headers:: The content of page headers. * Numbering:: Various section numbering schemes. @end menu @node Page references, Headers, Customizing LaTeX, Customizing LaTeX @comment node-name, next, previous, up @subsection Page references @findex \pagerefs @cindex Page numbers @cindex Sections, numbering When one says @samp{\pagerefstrue} (La@TeX{} only), index references are made by page numbers rather than module numbers or La@TeX{} section numbers. If there is more than one section per page, they are identified by @samp{a}, @samp{b}, @samp{c}, etc., such as @samp{section 17b}. (Presently, this will not work correctly when @code{multicol} is used for the body of the document.) The information necessary to process page references in this way is written into the @file{aux} file. As is usual with La@TeX{}, several runs may be required for the references to be fully consistent with the source file. @node Headers, Numbering, Page references, Customizing LaTeX @subsection Page headers @cindex Headers @cindex Page headers The very top (header) line on each page of @FWEAVE{}'s output contains several pieces of information: @itemize @bullet @item the current section name or document title; @item the page number; @item the range of La@TeX{} section numbers on the page (these are preceded by the @ifinfo @samp{\S} @end ifinfo @tex \S\ @end tex symbol); and @item the range of integer section numbers as understood internally by @FWEAVE{} (those are in square brackets and preceded by the @samp{#} sign). @end itemize @node Numbering, , Headers, Customizing LaTeX @comment node-name, next, previous, up @subsection Section numbering schemes @cindex Sections, numbering @cindex Package, @code{fwebnum} @findex fwebnum.sty The @FWEB{} commands @samp{@@*} and @ASP{} are translated by complicated magic into La@TeX{} commands such as @code{\section}, @code{\subsection}, etc. By default, use of @code{\documentclass@{article@}} then produces Dewey-decimal section numbers such as 2.13.4 (subsubsection 4 of subsection 13 of section 2). When the section tree is very deep, these numbers can look somewhat obtrusive. An alternative scheme (that of the original @sc{web}) is to merely number each section in ascending integer order, beginning with 1. This can be done by specifying the package @code{fwebnum}, as in @example LaTeX.package = "fwebnum" @end example @noindent This package is supplied with the @FWEB{} distribution; it is still somewhat experimental. By default, @code{fwebnum} numbers all sections, including unnamed ones. To prohibit numbering of unnamed sections, use the package option @code{dontnumberunnamed}, as in @example LaTeX.package.options = "dontnumberunnamed" @end example @noindent This option will eventually make @code{\numberTeX} obsolete; do not use @code{\numberTeX} in conjunction with @code{fwebnum}. @node Inserting woven code, , Customizing LaTeX, Packages @comment node-name, next, previous, up @subsubsection Package @code{fwebinsert}: Inserting @FWEAVE{}'s output into a La@TeX{} document @cindex FWEB output, inserting into LaTeX document @findex fwebinsert.sty Beginning with version 1.61, it is (barely) possible to insert the @TeX{} output woven by @FWEAVE{} into a La@TeX{} document. For example, a code listing could be an appendix to a dissertation, or a handbook on numerical methods could insert fragments of code formatted by @FWEAVE{}. Suppose one has the file @file{test.web} and used @FWEAVE{} to create @file{test.tex}. Unfortunately, it does @emph{not} work to simply @code{\input test.tex} into a La@TeX{} document, because by default @file{test.tex} operates in a ``stand-alone'' mode and tries to issue a @code{\begin@{document@}} command. Instead, one must use the package @code{fwebinsert} and the special input command @code{\FWEBinput}, as in the following example. There are two important steps. @quotation @enumerate @item Use @FWEAVE{} to create @file{test.tex}. [You may wish to use the @samp{-x} flag (@pxref{-x}) to prevent some of the lists at the end, such as the index or module list, from being printed.] @item Now @samp{latex test} until all of the section numbering is up-to-date. (This step is necessary because information in the @file{aux} file is used in processing the section headings.) @end enumerate @end quotation @noindent Now @file{test.tex} is ready to be inserted in a code like the following: @example \documentclass@{article@} \usepackage@{fwebinsert@} \begin@{document@} \section@{Body@} The body of the document. \appendix \FWEBinput@{test@} \end@{document@} @end example Note that the @samp{@@*} commands in @file{test.web} are converted into La@TeX{} sectioning commands such as @code{\section}. The above example works correctly because the first @samp{@@*} in @file{test.web} is equivalent to a @code{\section} (level 0) command, which should indeed immediately follow an @code{\appendix} command. Suppose, however, that you wanted to input @file{test.web} as part of the body of the above example, and wanted the @samp{@@*}s to be treated as subsections (level 1) rather than sections. To tell @code{fwebinsert} what level number to assign to the @samp{@@*}s, provide that number as an optional argument to @code{\FWEBinput}, as in the following example: @example \documentclass@{article@} \usepackage@{fwebinsert@} \begin@{document@} \section@{Body@} The body of the document. \FWEBinput[1]@{test@} \end@{document@} @end example @noindent Alternatively, say @code{\FWEBlevel@{1@}} before the @code{\FWEBinput}. (The optional argument construction merely calls @code{\FWEBlevel}.) Here are some caveats about @code{fwebinsert}: @itemize @bullet @item Implementing this package was tricky. It may work in simple circumstances, but it is not fully debugged. @item The @code{\FWEBinput} command surrounds the included @TeX{} code with @code{\begingroup}...@code{\endgroup}, in an attempt to prevent various macro conflicts. As it stands, the command @code{\fwebinput} is @code{\let} equal to @code{\FWEBinput}. If necessary, one could redefine @code{\fwebinput} to not include the enclosing @code{\begingroup}...@code{\endgroup}. @item For anything except level-0 inclusions, one should have just one @code{\FWEBinput} command following each sectioning command. (This is a bug.) @item @findex fwebnum.sty One is supposed to be able to use the package @code{fwebnum} (@pxref{Numbering}) in conjunction with @code{fwebinsert}. One can apply that to either the included file (via a @code{LaTeX.package} entry in @file{fweb.sty}), the including file (via a @code{\usepackage} command), or both. Try out these various combinations to see what emerges. @end itemize @node Pretty-printing, , Typesetting, Documentation @comment node-name, next, previous, up @section Pretty-printing @cindex Pretty-printing @dfn{Pretty-printing} refers to @FWEAVE{}'s attempt to typeset and highlight the code in a readable way. This is usually done automatically for all of the compiler-like languages such as C. However, it can be inhibited by turning on the N mode with @samp{@@N} or by using the @sc{verbatim} language (selected with @samp{@@Lv}). Pretty-printing is one of those topics that can arouse strong passions: your idea of what's esthetic may not be mine. Unfortunately, @FWEB{}'s formatting rules are mostly hard-coded, so if, for example, you don't like the way braces are arranged in typeset C code, you're mostly stuck. Most directly, this possibly undesirable choice comes from design decisions made by previous authors. It also makes @FWEAVE{} very fast, and enables certain complicated tricks that seem difficult or impossible to accomplish with a completely customizable approach. The latter seems quite formidable, and has not been attempted---a good thesis project for the 21st century. @menu * Alternatives:: Alternatives for various input tokens. * Pseudo-operators:: Invisible parts of speech. * Overloading:: Changing the appearance of various quantities. @end menu @node Pseudo-operators, Overloading, Alternatives, Pretty-printing @comment node-name, next, previous, up @subsection Pseudo-operators @cindex Pseudo-operators Pseudo-operators behave like a particular part of speech for the purposes of @FWEAVE{}'s formatting, but are invisible on output; they are ignored by @FTANGLE{}. The pseudo-operators are @example @@e @r{--- pseudo-expression. @xref{ATe}.} @@; @r{--- pseudo-semicolon. @xref{AT;}.} @@: @r{--- pseudo-colon. @xref{ATcolon}.} @end example @node Alternatives, Pseudo-operators, Pretty-printing, Pretty-printing @comment node-name, next, previous, up @subsection Alternatives for various input tokens @FWEAVE{} translates various input constructions into allegedly more readable symbols---for example, in @sc{Fortran} it translates @samp{.LT.} into @samp{<}. @ifinfo The printed documentation contains a table of what one can type on input, and what @FWEAVE{} will output. @end ifinfo @tex Here is a table of what one can type on input, and what @sc{Fweave} will typeset. The first entry is standard @sc{Fortran}; the parenthesized material is an allowable input alternative. (In most cases, the pretty input alternatives follow C's~convention.) $$ \def\i(#1,#2){{\tt #1} \def\temp{#2}\ifx\temp\empty\else({\tt #2})\fi} \def\htop#1{\vtop{\halign{##\hfil&$\to \hbox{##}$\hfil\cr#1}}} \let\WL\le \let\WS\equiv \let\WI\neq \let\WG\ge \let\WW\land \let\WV\lor \def\EQV{\mathrel{?{=}}} \def\NEQV{\not\equiv} \let\WR\lnot \let\SlSl\parallel \chardef\BS=`\\ \htop{ \i(.lt.,<) & $<$\cr \i(.le.,<=) & $\WL$\cr \i(.eq.,==) & $\WS$\cr \i(.ne.,!=,<>) & $\WI$\cr \i(.gt.,>) & $>$\cr \i(.ge.,>=) & $\WG$\cr \i(.and.,\amp\amp) & $\WW$\cr} \qquad\qquad \htop{ \i(.or.,||) & $\WV$\cr \i(.neqv.,) & $\NEQV$\cr \i(.xor.,) & $\NEQV$\cr \i(.eqv.,) & $\EQV$\cr \i(.not.,!) & $\WR$\cr \noalign{\smallskip} \i(**,\^) & {\tt (a+b)\^(c+d)} $\to (a+b)^{c+d}$\cr \i(//,\BS/) & $\SlSl$\cr }$$ These same conventions are allowed in @sc{Ratfor} mode. Note that in @sc{Fortran} and @sc{Ratfor} @samp{//} is interpreted by default as the concatenation symbol, not the start of a short comment. To override that default, use one of the command-line options @samp{-n/}, @samp{-r/}, or @samp{-/}, or use a language-changing command of the form @samp{@@n/}. @end tex @node Overloading, , Pseudo-operators, Pretty-printing @comment node-name, next, previous, up @subsection Overloading operators and identifiers @cindex Overloading For special effects in the woven output, there are commands to help one change the appearance of operators and identifiers. @subsubsection Overloading operators @cindex Overloading operators @cindex Operators, overloading A feature common to both C++ and @sc{Fortran}--90 is @dfn{operator overloading}, the ability to extend or redefine the definition of an operator such as @samp{.FALSE.} or @samp{=}. @sc{Fortran--90} even allows one to define new @dfn{dot operators}---for example, one might define the operator @samp{.IN.} to test for inclusion in a set. In a nontrivial extension of the original design, @FWEAVE{} allows one to define how overloaded operators should appear on output. @tex \def\{{\bf #1}}% \gdef\.#1{{\tt #1}}% \def\\#1{\leavevmode\hbox{\it#1\/\kern.05em}}% For example, in the opinion of the author it is much more readable to read `$\&{if}\.(x \in \\{set}\.)$' than `\&{if}\.(x\ \.{.IN.}\ \\{set}\.).' @end tex Indeed, this feature can be used even when the compiler language itself does not permit overloading in order to customize the appearance of the woven output. The @samp{@@v} control code is used to change the appearance of an operator. The format is @example @@v new_operator_symbol_or_name "TeX material" old_operator @end example @noindent This means ``Display the new operator according to the @i{@TeX{} material}, but treat it like the old operator---e.g., unary or binary---for formatting purposes. The quoted @TeX{} material is treated just like a C string, so if one wants to include a backslash one must escape it with another backslash. For example, one can make an equals sign display on output as a large left arrow by saying @example @@v = "\\Leftarrow" = @end example @noindent Two @sc{Fortran} examples are @example @@v .FALSE. "\\.@{.FALSE.@}" .FALSE. @@v .IN. "\\in" + @end example This feature can go a long way toward enhancing readability of the woven output, particularly when operators are actually being overloaded. It can also lead to arbitrarily bizarre output that no-one else will understand. As usual, restraint is advised. @subsubsection Overloading identifiers @cindex Overloading identifiers @cindex Identifiers, overloading Although operator overloading is quite useful, it does not allow one to change the appearance of identifiers. In its most general form, such a facility becomes quite complicated; one must endow @FWEAVE{} with a macro-processing facility analogous to that of @FTANGLE{}. This has not been done yet (maybe it will be someday). In the meantime, one has the command @samp{@@W}, which provides a restricted form of such a facility. @emph{This command is experimental, and not firmly established. Changes in usage and/or syntax may be made in future versions.} The most general form of the @samp{@@W} command is @example @@W identifier "replacement text" @end example @noindent This means: Replace any references to @i{identifier} in the woven output with the @i{replacement text}. A more restrictive form is @example @@W identifier \newmacro @end example @noindent which replaces references to @i{identifier} with a call to @code{\newmacro}. (Note that there are no quotes in this form.) The shortest form is @example @@W identifier . @end example @noindent which replaces references to @i{identifier} with a call to @code{\identifier}. For example, the identifier @i{x} normally appears in woven output as @samp{\.@{\Wshort\@{x\@}@}}. If one says @example @@W x . @end example @noindent one will instead get the macro reference @samp{\x}, which could be defined to give a variety of special effects. (However, one may need some rather intimate understanding of @FWEAVE{}'s output in order to ensure that things always work correctly.) One of the important uses of this facility is to expedite special formatting of array references. This subject is discussed separately below in the section on ``Special array formatting'' (sorry, that isn't here yet), where an example is given. @node Index, Customization, Documentation, Top @comment node-name, next, previous, up @chapter @FWEB{}'s INDEX. @FWEB{} has several powerful indexing facilities: @quotation @enumerate @item It sorts and writes its own self-contained (@dfn{internal}) index, including cross-references to all the variables as well as items inserted by the user. @item It can write its cross-reference information to a file formatted for use by the @code{makeindex} utility. This feature facilitates creation of a master index that contains information about several @code{web} files. @end enumerate @end quotation @menu * Internal index:: The self-contained index produced by @FWEB{}. * Using makeindex:: Writing index data for use by @code{makeindex}. * Merging indexes:: Using the @code{idxmerge} utility to merge indexes. @end menu @node Internal index, Using makeindex, Index, Index @comment node-name, next, previous, up @section @FWEB{}'s self-generated index One of the most useful features of @FWEB{} is that it automatically generates an Index of all variable usage. One can also insert one's own index entries by using the commands @itemize @bullet @item @samp{@@^} (entry in Roman type; see @ref{AT^}), @item @samp{@@.} (entry in typewriter type; see @ref{ATdot}), and @item @samp{@@9} (user-defined format; see @ref{AT9}). @end itemize (More discussion to be completed.) @node Using makeindex, Merging indexes, Internal index, Index @comment node-name, next, previous, up @section Creating a stand-alone index with @code{makeindex} @cindex Index, stand-alone @cindex Makeindex, using In addition to the internal index described in the previous section (@pxref{Internal index}), @FWEAVE{} can write the index data to a file formatted for later, stand-alone processing by the @code{makeindex} utility. (Several such indexes can be merged together; see @ref{Merging indexes}.) The procedure is simple, although the following discussion goes into some rather arcane details. @subsection Creating a stand-alone index: Summary As a quick reference for those who have already read the details in the next subsection, the procedure to print a stand-alone index with @code{makeindex} is as follows. First, create, if necessary, a file @file{index.tex} that @code{\input}s @file{index.ind}. (A skeleton is illustrated in the next subsection.) Then: @example fweave -XI test.web @r{% Creates test.idx and test.sty.} makeindex -s test.sty -o index.ind test.idx @r{% Creates index.ind.} latex index @end example @noindent If you're not happy with the @code{\pg} macro supplied in @file{fwebmac.sty}, define it yourself in @file{index.tex}. In this procedure, note the use of the @samp{-XI} option and the use of a different root name (@file{index} here) for the output file. @subsection Creating a stand-alone index: Details @findex -XI To create an index file in a form suitable for later stand-alone processing by @code{makeindex}, use the @samp{-XI} option to @FWEAVE{}. If the @code{web} file is @file{test.web}, the default name of the @code{makeindex} output file is @file{test.idx}. (This name can be overridden by the style-file parameter @code{makeindex.out}.) Run @code{makeindex} on @file{test.idx} to create the La@TeX{} file @file{index.ind} (see following discussion for details). A stand-alone index can then be produced by saying @samp{latex index}, where a skeleton version of @file{index.tex} would be @example % index.tex --- skeleton for printing a stand-alone index. \documentclass@{article@} \usepackage@{fwebmac@} \begin@{document@} \input@{\jobname.ind@} \end@{document@} @end example @noindent (In practice, a more involved procedure will probably be followed; see below.) @cindex Style file, for makeindex Usually @code{makeindex} works in conjunction with a style file. [In fact, the syntax of @FWEB{}'s style file (@pxref{Style}) was motivated by that of @code{makeindex}.] When the @samp{-XI} option (@pxref{-X_}) is used, @FWEAVE{} will @emph{create} an appropriate style file for @code{makeindex}. (The default name of @file{test.sty} can be overridden by the style-file parameter @code{makeindex.sty}.) To run @code{makeindex} on the index data for @file{test.web} and create the output file @file{index.ind}, one would thus say @example makeindex -s test.sty -o index.ind test[.idx] @end example @noindent It's important to use the @samp{-o} option with a name different than the original file name, because it simplifies the construction of the skeleton file @file{index.tex} that prints the stand-alone index. @FWEAVE{} writes @file{test.sty} because the contents of that file may depend on parameter settings in @FWEB{}'s style file @file{fweb.sty}. @FWEB{}'s style vocabulary includes all parameters understood by @code{makeindex}. If a @code{makeindex} parameter is called @samp{param}, one references it in @file{fweb.sty} by @samp{makeindex.param}. Thus, to change the @samp{headings_flag} of @code{makeindex}, one would put into @file{fweb.sty} a line like @samp{makeindex.headings_flag = 1}. To see a list of all @code{makeindex}-related parameters, say @samp{fweave -Zmakeindex} (@pxref{-Z_}). Remember, @emph{do all @code{makeindex} customizations in @file{fweb.sty}; the actual style file @file{test.sty} that will be read by @code{makeindex} is written automatically by @FWEAVE{}.} The @file{.idx} file will contain a list of entries that begin with @samp{\indexentry} (more precisely, the value of the parameter @samp{makeindex.keyword}). The general form is @example \indexentry@{sort key:identifier expression|macro@}@{page number@} @end example @noindent Typical entries are @example \indexentry@{istream:"\>@{istream@}|pg@{@}@{@}@}@{1@} \indexentry@{main:"\>@{main@}|pg@{@}\underline@}@{1@} \indexentry@{pow:"\@@@{pow@}|pg@{@}@{@}@}@{2@} \indexentry@{z:"\"|z|pg@{@}\underline@}@{2@} @end example @noindent Here the colon is the value of @samp{makeindex.actual}; it separates the sort key (before the colon) from the actual expression to be printed. The macros such as @samp{\>} typeset the identifiers in the appropriate way, depending on their use in the code. Note that the backslashes are quoted with the value of @samp{makeindex.quote}, which is by default the double quote. Although one might guess that the typesetting macros such as @samp{\>} would be defined in @file{fwebmac.sty}, that is not true. Rather, for various technical reasons they are equated to macros in @file{fwebmac.sty} as one of the operations of the @samp{\Wbegin} macro that is executed at the beginning of every @code{tex} file output by @FWEAVE{}. For example, @samp{\Wbegin} does the equivalent of @samp{\let\>\Wid}. Unfortunately, without further action that equating would be forgotten by a La@TeX{} run made on the output @file{index.ind} of @code{makeindex}. For that reason, @FWEAVE{} appends the appropriate @samp{\Wequate} macro to the end of @samp{makeindex.preamble}. This is one specific instance that necessitates that @FWEAVE{} write the @code{makeindex} style file. Each of the @samp{\indexentry}s contains the encapsulation character @samp{|} (the value of @samp{makeindex.encap}). By the conventions of @code{makeindex}, everything between the encapsulation character and the closing right brace defines a macro expression that acts on the page number. E.g., the general form above generates the command @samp{\macro@{@i{page number}@}}. The specific macro construction output by @FWEAVE{} is @example \pg@{@}@{@i{possible action macro}@}@{@i{page number}@} @end example @noindent Here the name @samp{pg} is the value of @samp{makeindex.page}. The @dfn{action macro} is something like @samp{\underline}, which would be used by @FWEAVE{} to underline the page number to indicate where a variable is defined. A default definition of @samp{\pg} is given is @file{fwebmac.sty}. It is a three-argument macro, @samp{\def\pg#1#2#3@{...@}}, where the arguments are as follows: @findex \pg @example #1 @r{--- Integer file identification number} #2 @r{--- Action macro.} #3 @r{--- Page number.} @end example @noindent The definition should contain the construction @samp{#2@{#3@}}---i.e., the page number must be the argument of the action macro. The first argument is left empty in the @file{.idx} file written by @FWEAVE{}. This can be filled in later by the utility @code{idxmerge} (@pxref{Merging indexes}) that merges the indices from several @code{web} files. For example, in a master index one might ultimately print page numbers like @samp{II.5}, where @samp{II} refers to a file such as @file{test2.web}. To aid this merging process, the root name of the @code{web} file is written as a comment at the top of the @file{.idx} file output by @FWEAVE{}. @node Merging indexes, , Using makeindex, Index @comment node-name, next, previous, up @section Using the @code{idxmerge} utility to merge indexes @cindex Indexes, merging @findex idxmerge.sty In a large project, one may maintain and work with several @FWEB{} files. It may be useful to produce a global index that spans all of those files. To this end, the utility @code{idxmerge} and associated La@TeX{} package @code{idxmerge} are supplied with the @FWEB{} distribution. @subsection Using @code{idxmerge}: Summary As quick reference for those who have already plowed through the following details, here is a summary of the procedure. To print a stand-alone index by merging the indexes from several @code{web} sources, do the following. First, create, if necessary, a file @file{index.tex} that @code{\input}s @file{index.ind}. Then: @example fweave -XI test1.web fweave -XI test2.web fweave -XI test3.web idxmerge -oindex test1.idx test2.idx test3.idx % Creates index.ind and index-names.tex. makeindex -s test1.sty index latex index @end example Note the use of the @samp{-XI} option. For further background, see the previous section, @ref{Using makeindex}. @subsection Using @code{idxmerge}: Details Suppose one has three files, @file{test1.web}, @file{test2.web}, and @file{test3.web}. To use @code{idxmerge}, weave each of the files separately, using the @samp{-XI} option to create @file{test*.idx} and @file{test*.sty}. Then say @example idxmerge -oindex test1.idx test2.idx test3.idx @end example @noindent This creates two output files: @file{index.idx}, and @file{index-names.tex}. @code{idxmerge} first sorts the list of file names. It then writes one entry into @file{index-names.tex} for each file, of the form @example \idxname@{@var{n}@}@{file_name@var{n}@} @end example @noindent This file can be @code{\input} by the @code{\topofindex} command (for an example, see the La@TeX{}2e package @code{idxmerge}) (supplied with the @FWEB{} distribution) and used to create a list of the merged files. @findex \topofindex @findex \idxname Then it merges the @code{\indexentry} commands from each of the input files into @file{index.idx}, filling in the integer file identifier @var{n} (the position of the file in the sorted list) into the first argument of the @code{\pg} macro. One can now say @example makeindex -s test1.sty index @end example @noindent This creates @file{index.ind}, which can be processed by, for example, a simple modification of the simple La@TeX{} template given above in @ref{Using makeindex}. The only difference is that the package @code{idxmerge} was used; in that file, the macros @code{\topofindex} and @code{\idxname} are appropriately defined to print out a numbered list of the merged files to cross-reference into the numerical file- and page-number entries in the body of the index. Here is an example (provided in the @FWEB{} distribution): @example % index.tex --- skeleton for printing a stand-alone index. \documentclass@{article@} \usepackage@{fwebmac,idxmerge@} \begin@{document@} \input@{\jobname.ind@} \end@{document@} @end example @noindent @node Customization, Hints, Index, Top @comment node-name, next, previous, up @chapter CUSTOMIZATION @cindex Customization @cindex Customizing @FWEB{} @cindex @FWEB{}, customizing The default behavior of @FWEB{} can be changed in a variety of ways. @quotation @enumerate @item @sc{unix} environment variables (logical variables in VMS) affect path or file names. @item An initialization file resides in the home directory. @item A style file resides in the current directory. @end enumerate @end quotation The initialization file (usually called @file{.fweb}) is intended to contain command-line options (one per line) that are to be used in every run. @xref{Initialization}. The style file (called @file{fweb.sty} by default; see @ref{-z}) is intended to provide more local customization, perhaps differing for each source file and group of source files. The style file does not contain command-line options; rather, it contains parameter settings that override @FWEB{}'s defaults. The @samp{-p} option (@pxref{-p}) may be used to specify a style-file entry in @file{.fweb} (i.e., a global value for all source files) or on the command line (i.e., a value used for a single run). The order of processing is: @quotation @enumerate @item Evaluate environment variables. @xref{Environment variables}. @item Read @file{.fweb} and remember its contents; sort those into three groups: options beginning with @samp{-}, beginning with @samp{&}, and beginning with a letter (file names) . @xref{Initialization}. @item Process @file{.fweb} options beginning with @samp{-} (or @samp{+}, for backward compatibility), except for @samp{-p}. @item Read and process command-line options, except for @samp{-p}. @xref{Options}. @item Process remaining @file{.fweb} options (either file names, or options beginning with @samp{&}). @item Process any @samp{-p} options from @file{.fweb}. @xref{-p}. @item Process the style file. @xref{Style}. @item Process any @samp{-p} options from the command line. @end enumerate @end quotation Unfortunately, because not all options are processed immediately when they are read, errors may not show up when one expects. For example, nothing is actually processed while @file{.fweb} is being read; its contents are just being stored. It could therefore happen that a syntax error in entering a @samp{-p} option in @file{.fweb} may not be reported until after the style file has been read, possibly confusing the user as to the source of the error. @menu * Environment variables:: Environment or logical variables. * Initialization:: Initialization file. * Memory allocation:: Dynamic memory allocation. * Style:: Style file. @end menu @node Environment variables,Initialization,Customization,Customization @comment node-name, next, previous, up @section Environment variables @cindex Environment variables @cindex Variables, environment @code{FWEB_HDR_INCLUDES} --- Colon-delimited list of directories for the C preprocessor (in the form of @code{gcc}) to search for @samp{#include} header files. This is used in conjunction with the @samp{-H} option; see @ref{-H_}. (One can append to this list by means of the @samp{-I} option, provided that option comes @emph{after} the @samp{-H}; see @ref{-I_}.) @findex FWEB_HDR_INCLUDES @code{FWEB_INCLUDES} --- Colon-delimited list of directories to search for @samp{@@i} include files. (One can append to this list by means of the @samp{-I} option, provided that option comes @emph{before} any use of @samp{-H}; see @ref{-I_}.) @findex FWEB_INCLUDES @code{FWEB_INI} --- Name of the initialization file. If not defined, either @file{.fweb} or @file{fweb.ini} is chosen, depending on the machine. The initialization file always resides in @code{$HOME}. @findex FWEB_INI @code{FWEB_STYLE_DIR} --- Directory in which the style file resides. If not defined, the current directory is used. @findex FWEB_STYLE_DIR @node Initialization,Memory allocation,Environment variables,Customization @comment node-name, next, previous, up @section Initialization Although some aspects of @FWEB{}'s behavior are hard-coded, many can be changed and/or initialized by the user. @subsection The initialization file @cindex Initialization file @cindex File, initialization @cindex @FWEB{}, initializing @findex .fweb On startup, @FWEB{} attempts to read an initialization file. This always resides in the user's home directory. It is usually called @file{.fweb} (@file{fweb.ini} on personal computers). The default file name can be overridden by the environment variable @code{FWEB_INI}. One may put into @file{.fweb} any option that might be used as a command-line option. (Presently, there must be just one entry per line.) If the option begins with a @samp{-} (or a @samp{+} for backward compatibility), it is processed @emph{before} the actual command-line options; if it begins with @samp{&} or is a file name, it is processed after. Generally, @file{.fweb} options should begin with @samp{-} so that one may override them from the command line. The @samp{%} sign begins a comment terminated by the end-of-line. @node Memory allocation,Style,Initialization,Customization @comment node-name, next, previous, up @subsection Memory allocation @cindex Memory allocation @cindex Allocation, memory The command-line option @samp{-y} (@pxref{-y}) is used to change the default allocation for a dynamic array. The arrays have a one- or two-character abbreviation denoted by @i{aa}. Some error messages will use this abbreviation when suggesting that one increase a default allocation. To query the present allocations of variable @i{aa}, just say @samp{-y@i{aa}}. To query everything, say @samp{-y}. This whole scheme is somewhat annoying. In most cases, dynamic arrays should be reallocated automatically. That can be done without too much difficulty, but I was reluctant to try it for Version 1.61 in fear of breaking something. Please wait for the year 2000. If one uses @samp{-y} to examine the maximum permitted values of these parameters, one will note the magic number 10239 appearing occasionally. This number is a bit less than 64K/5; it is a signature of an inherently 32-bit design that goes back to Knuth. Unfortunately, this number can't be increased without some radical redesign. Wait for the year 2100. @menu * -yb:: Maximum bytes for identifiers, index entries, and module names. * -ybs:: Size of the change buffer. * -ycb:: Size of line buffer for C output. * -ycf:: A Ratfor buffer. * -ycg:: Another Ratfor buffer. * -yd:: Increment for expanding the dots table. * -ydt:: Maximum number of deferred macro tokens. * -ydx:: Maximum number of deferred macro texts. * -yid:: Maximum depth of file inclusion. * -yif:: Maximum number of unique include-file names. * -ykt:: Stack size for @FTANGLE{}. * -ykw:: Stack size for @FWEAVE{}. * -yll:: Line length for @FWEAVE{}'s output. * -yln:: Maximum length of module names or strings. * -ylb:: Maximum number of nested loops in Ratfor. * -ylx:: Maximum length of expressions that can be expanded with the post-increment operators of Fortran or Ratfor. * -ym:: Maximum number of sections. * -yma:: Maximum number of arguments to @FWEB{} macros. * -ymb:: Size of the buffer for expanding @FWEB{} macros. * -yn:: Maximum number of identifiers and module names. * -ynf:: Maximum number of open output files. * -yop:: Maximum number of entries in the table for operator overloading. * -yr:: Maximum number of cross-references. * -ys:: Maximum number of scraps. * -ysb:: Size of style-file input-line buffer. * -ytt:: Maximum number of tokens that @FTANGLE{} can process. * -ytw:: Maximum number of tokens in the current section being processed by @FWEAVE{}. * -yx:: Maximum number of texts. * -yxb:: Size of line buffer for @TeX{} output. @end menu @node -yb, -ybs, Memory allocation, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-yb}: Maximum bytes for identifiers, index entries, and module names @findex -yb Unique identifiers, index entries, and module names are stored contiguously in a large memory area, the size of which is controlled by @samp{-yb}. The default may need to be increased for very large source files, or decreased to squeeze things into a personal computer. See also @ref{-yn}. @node -ybs, -ycb, -yb, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-ybs}: Size of the change buffer, in bytes @findex -ybs Information from change files is read into the change buffer, whose size is controlled by @samp{-ybs}. It should not be necessary to change this unless an error message specifically tells one to do so. @node -ycb, -ycf, -ybs, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-ycb}: Size of line buffer for C output, in bytes @findex -ycb @FTANGLE{} outputs lines of a fixed maximum length. It attempts to split them in a reasonable way, dependent on the language. When it absolutely can't figure out how to split the line, it will issue a warning message and split it anyway. The @samp{-ycb} option controls the maximum output line length for C and C++. The analogous command @samp{-yxb} controls the output line length for @TeX{} and the verbatim mode. @xref{-yxb}. @node -ycf, -ycg, -ycb, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-ycf}: Size of a Ratfor buffer, in bytes @findex -ycf The sizes of buffers used by @sc{Ratfor} for constructing messages about the commands it is expanding are controlled by @samp{-ycf} and @samp{-ycg}. @node -ycg, -yd, -ycf, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-ycg}: Size of another Ratfor buffer, in bytes @findex -ycg The sizes of buffers used by @sc{Ratfor} for constructing messages about the commands it is expanding are controlled by @samp{-ycf} and @samp{-ycg}. @node -yd, -ydt, -ycg, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-yd}: Increment for expanding the dots table @findex -yd The ``dots'' table is used for @sc{Fortran} to hold information relating to ``dot'' operators such as @samp{.NE.}. In @sc{Fortran--90}, additional such operators can be added by the program, so the table can grow dynamically. The @samp{-yd} option controls how many additional entries are made available each time the table size needs to be reallocated. @node -ydt, -ydx, -yd, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-ydt}: Maximum number of deferred macro tokens @findex -ydt Deferred @FWEB{} macros are ones defined in the code part rather in the definition part. (Their use is normally prohibited; see @ref{-TD}.) @samp{-ydt} controls how many bytes are set aside for the storage of these replacement text of those macros. See also @ref{-ydx}. @node -ydx, -yid, -ydt, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-ydx}: Maximum number of deferred macro texts @findex -ydx @samp{-ydx} controls how many deferred macros are permitted. See also @ref{-ydt}. @node -yid, -yif, -ydx, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-yid}: Maximum depth of file inclusion @findex -yid Files included by @samp{@@i} can themselves contain @samp{@@i} commands, to a nesting level controlled by @samp{-yid}. @node -yif, -ykt, -yid, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-yif}: Maximum number of unique include-file names @findex -yif The number of unique file names appearing in @samp{@@i} commands is controlled by @samp{-yif}. @node -ykt, -ykw, -yif, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-ykt}: Stack size for @FTANGLE{} @findex -ykt @FTANGLE{} uses a stack to deal with the web of module names---i.e., a named section can refer to another module name. The size of this stack is controlled by @samp{-ykt}. @node -ykw, -yll, -ykt, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-ykw}: Stack size for @FWEAVE{} @findex -ykw @FWEAVE{}'s stack handles the possibilities that code mode can be embedded in a module name, or vice versa. The maximum nesting level for such mode changes is controlled by @samp{-ykw}. @node -yll, -yln, -ykw, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-yll}: Line length for @FWEAVE{}'s output, in bytes @findex -yll @samp{-yll} controls the length of each line in the @code{.tex} file output by @FWEAVE{}. @node -yln, -ylb, -yll, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-yln}: Maximum length of module names or strings, in bytes @findex -yln When each module name or string is parsed, it is stored temporarily in a buffer whose length is controlled by @samp{-yln}. @node -ylb, -ylx, -yln, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-ylb}: Maximum number of nested loops in @sc{Ratfor} @findex -ylb In @sc{Ratfor}, various loops such as @samp{while} are translated into their @sc{Fortran} equivalents. @samp{-ylb} controls the maximum nesting level of such expandable constructions. @node -ylx, -ym, -ylb, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-ylx}: Maximum length of expressions that can be expanded with the post-increment operators of @sc{Fortran} or @sc{Ratfor} @findex -ylx @sc{Fortran} and @sc{Ratfor} can expand expressions such as @samp{x(i) += dx} into their @sc{Fortran} counterparts such as @samp{x(i) = x(i) + dx}. It does so in a very straightforward way, by copying the expression to the left of the equals sign. @samp{-ylx} controls the maximum size of that expression. @node -ym, -yma, -ylx, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-ym}: Maximum number of sections @findex -ym @samp{-ym} limits the maximum number of sections, both named and unnamed. (Each unnamed section is counted separately.) The absolute maximum number of sections is 10239, probably one of the most stringent restrictions in @FWEB{}'s design. (This number is a bit less than 1/5 of 64K.) @node -yma, -ymb, -ym, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-yma}: Maximum number of arguments to @FWEB{} macros @findex -yma The maximum number of arguments to @FWEB{} macros (defined by @samp{@@m}) is limited by @samp{-yma}. @node -ymb, -yn, -yma, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-ymb}: Size of the buffer for expanding @FWEB{} macros @findex -ymb The expansion of each @FWEB{} macro is done in a buffer whose size is controlled by @samp{-ymb}. (In some situations, particularly in @sc{Ratfor}, more than one such buffer can be open at once.) @node -yn, -ynf, -ymb, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-yn}: Maximum number of identifiers and module names @findex -yn A structure is associated with each unique identifier and module name. The maximum number of such structures is controlled by @samp{-yn}. See also @ref{-yb}. @node -ynf, -yop, -yn, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-ynf}: Maximum number of open output files @findex -ynf In addition to @FTANGLE{}'s usual output file---e.g., @code{test.c}---additional files may be opened by means of the @samp{@@O} (@pxref{ATO_}) or @samp{@@o} (@pxref{ATo}) commands. Depending on the situation, some of these files may remain open simultaneously. The maximum number of such files is controlled by @samp{-ynf}. @node -yop, -yr, -ynf, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-yop}: Maximum number of entries in the table for operator overloading. @findex -yop In @FWEAVE{}, the appearance of an operator can be changed (@dfn{overloaded}) by means of the @samp{@@v} command (@pxref{ATv}). Each such operator is entered into a table, the maximum size of which is controlled by @samp{-yop}. @node -yr, -ys, -yop, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-yr}: Maximum number of cross-references @findex -yr The Index cross-reference information (in which sections each identifier is used or defined) is maintained in a large array of structures, one structure for each cross-reference. The maximum number of cross-references is controlled by @samp{-yr}. @node -ys, -ysb, -yr, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-ys}: Maximum number of scraps @findex -ys The maximum number of scraps is controlled by @samp{-ys}. For a discussion of scraps, see @ref{-1}. @node -ysb, -ytt, -ys, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-ysb}: Size of style-file input-line buffer @findex -ysb The maximum length of each input line of the style file (@code{fweb.sty} by default) is controlled by @samp{-ysb}. @node -ytt, -ytw, -ysb, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-ytt}: Maximum number of tokens that @FTANGLE{} can process @findex -ytt A @dfn{token} is an identifier, numerical constant, operator, etc. @FTANGLE{} must read in and store all tokens in the entire source file, because they can be output in a different order than they are input. The maximum number of tokens is controlled by @samp{-ytt}. @node -ytw, -yx, -ytt, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-ytw}: Maximum tokens in the current section being processed by @FWEAVE{}. @findex -ytw Unlike @FTANGLE{}, @FWEAVE{} need only read in one section at a time. The maximum number of tokens in any section is controlled by @samp{-ytw}. @node -yx, -yxb, -ytw, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-yx}: Maximum number of texts @findex -yx For @FTANGLE{}, a @dfn{text} is either the replacement text of a macro, or the contents of a named section. The maximum number of such texts is controlled by @samp{-yx}. For @FWEAVE{}, a @dfn{text} is a phrase that arises from combining primitive scraps during the translation stage of phase 2. For both processors, the absolute maximum number of texts is 10239. @node -yxb, , -yx, Memory allocation @comment node-name, next, previous, up @subsubsection @samp{-yxb}: Size of line buffer for @TeX{} and verbatim output @findex -yxb This option is like @samp{-ycb} (@pxref{-ycb}), but controls the size of the output line for the @TeX{} (@samp{@@Lx}) and verbatim (@samp{@@Lv}) languages. @node Style,,Memory allocation,Customization @comment node-name, next, previous, up @section The Style file @cindex Style file @cindex File, style @findex fweb.sty A @dfn{style file} (default name @file{fweb.sty}) may reside in the user's current directory (or the directory specified by the environment variable @code{FWEB_STYLE_DIR}). The default name can be changed by the command-line option @samp{-z} (@pxref{-z}). The style file is processed after all command-line options have been processed, except that the command-line option @samp{-p} (@pxref{-p}) gets special treatment. Note that that option buffers up style-file entries (i.e., one may use more than one @samp{-p} option). @samp{-p} options placed in @file{.fweb} are treated as residing in a temporary file that is read just @emph{before} the local style file; thus, those behave as `global' style-file entries that will be overridden by a matching entry in the local style file. @samp{-p} options on the command line will be processed @emph{after} the local style file, thus override corresponding options in either @file{.fweb} or the local style file. To summarize the previous discussion, the local style file is intended to contain settings that are common to a particular source file. Settings common to all source files can be put into @file{.fweb} by means of the @samp{-p} option. To override a setting for a single run, use a @samp{-p} option on the command line. Style-file entries have the form @example @var{keyword} @i{[}=@i{]} @var{value} @end example @noindent The equals sign is always optional. The @samp{value} is usually a double-quoted string, but may sometimes be an integer or a single-quoted character. For example, @example LaTeX.class.options = "twoside" LaTeX.package "indentfirst,multicol" mark_defined.fcn_name 0 line_char.N 'C' color.error = "red" Color.red = "\e[01;31m" @end example @noindent The syntax is completely free-form. Periods within keywords are precisely equivalent to underscores, but are useful heuristically for associating a structure-like hierarchy to some of the commands. Non-printable characters in strings can be specified as octal constants (e.g., @samp{\033}), hexadecimal constants (e.g., @samp{\x1B}), or one of the ANSI escape sequences @samp{\a}, @samp{\b}, @samp{\f}, @samp{\n}, @samp{\r}, @samp{\t}, and @samp{\v}. The non-ANSI escape sequence @samp{\e} (escape) is also supported; that is particularly useful for color processing (@pxref{Color}). Various of the style-file parameters take a language subscript. Those are @quotation @table @code @item C C @item Cpp C++ @item N @sc{Fortran}-77 @item N90 @sc{Fortran}-90 @item R @sc{RatFor}-77 @item R90 @sc{RatFor}-90 @item V Verbatim @item X @TeX{} @end table @end quotation @noindent Thus, @code{line_char.N} is the comment character for @FTANGLE{}'s @code{line} commands (@pxref{line_char}), for @sc{Fortran}-77 code. Unfortunately, the descriptions of the parameters aren't all completed yet. To query the default values, say @samp{ftangle -Z} (see @ref{-Z_}). @menu * Index params:: Customizing the Index. * Module params:: Customizing the list of sections. * Contents params:: Customizing the Table of Contents. * Subscript params:: Customizing subscripting for cross-references. * Fwebmac params:: Customizing behavior of @FWEB{}'s macros. * Completion params:: Automatic selection of file extensions, etc. * Control-code mappings:: Remapping @FWEB{}'s control codes (danger)! * Color:: @FWEB{}'s color output. * Miscellaneous params:: Other customizations. @end menu @node Index params,Module params,Style,Style @comment node-name, next, previous, up @subsection Customizing @FWEAVE{}'s index In the following, @samp{???} denotes the name of various subparameters. @menu * delim_0: S_delim. Insert after identifier in index entry. * delim_n: S_delim. Insert between section numbers in index entry. * encap.infix: S_encap. Start the section number. * encap.prefix: S_encap. @TeX{} macro to begin a section number. * encap.suffix: S_encap. Ends the section number. * group_skip:: * index.collate: S_index. Collating sequence for the Index. * index.postamble: S_index. @TeX{} material to end the Index. * index.preamble: S_index. @TeX{} material to begin the Index. * index.tex: S_index. Name of file holding the Index. * item_0:: @TeX{} command to begin an index entry. * language.prefix: S_language. Begin a language entry in the Index. * language.suffix: S_language. End a language entry in the Index. * lethead.prefix: S_lethead. Begin a letter group. * lethead.suffix: S_lethead. End a letter group. * lethead.flag: S_lethead. Control beginning of letter group. * name: S_index. Name of index. * underline.prefix: S_underline. Begin an underlined index entry. * underline.suffix: S_underline. End an underlined index entry. @end menu @node S_index, S_delim, Index params, Index params @comment node-name, next, previous, up @subsubsection @code{index.@i{???}} @findex \INDEX @cindex Index, name of @vindex index.name @code{index.name} is the name of the index section. This string is used in @code{\Wbegin} to initialize the @TeX{} macro @code{\INDEX}. The index section is recognized by matching, for a starred section, the actual section name against the contents of @code{\INDEX}. When they match, a new page and two-column mode are begun. These rules imply that the last section of one's source file can be titled @samp{\INDEX}, as in @example @@* \INDEX. @end example @vindex index.tex @code{index.tex} is the name of the file into which the Index is written. The character @samp{#} is translated into the root name of the web file, as for example @samp{#.ndx}. @vindex index.preamble @code{index.preamble} are @TeX{} commands that begin the Index. @vindex index.postamble @code{index.postamble} are @TeX{} commands that end the Index. @vindex index.collate @code{index.collate} specifies the collating sequence for the Index. @node S_delim, S_encap, S_index, Index params @comment node-name, next, previous, up @subsubsection @code{delim_@i{?}} @vindex delim_0 @code{delim_0} is the string to insert after the identifier in an index entry. @vindex delim_n @code{delim_n} is the string to insert between two section numbers in an index entry. @node S_encap, group_skip, S_delim, Index params @comment node-name, next, previous, up @node group_skip, item_0, S_encap, Index params @comment node-name, next, previous, up @subsubsection @code{group_skip} @vindex group_skip @code{group_skip} is a string of @TeX{} commands to insert between letter groups. @node item_0, S_language, group_skip, Index params @comment node-name, next, previous, up @subsubsection @code{item_0} @vindex item_0 @code{item_0} is the @TeX{} command to begin an index entry. @node S_language, S_lethead, item_0, Index params @comment node-name, next, previous, up @subsubsection @code{language.@i{???}} @vindex language.prefix @vindex language.suffix @code{language.prefix} begins a language entry.; @code{language.suffix} ends one. @node S_lethead, S_underline, S_language, Index params @comment node-name, next, previous, up @subsubsection @code{lethead.@i{???}} @vindex lethead.prefix @vindex lethead.suffix @vindex lethead.flag @code{lethead.prefix} begins a letter group; @code{lethead.suffix} ends one. The flag @code{lethead.flag} controls the format of the letter group: if it is zero, nothing is inserted; if it is positive, an upper-case letter is inserted; if it is negative, a lower-case letter is inserted. @node S_underline, , S_lethead, Index params @comment node-name, next, previous, up @subsubsection @code{underline.@i{???}} @vindex underline.prefix @code{underline.prefix} is the @TeX{} command to begin an underlined index entry. @vindex underline.suffix @code{underline.suffix} is the @TeX{} command to end an underlined index entry. @node Module params,Contents params,Index params,Style @comment node-name, next, previous, up @subsection Customizing the module list @menu * modules.info: S_modules. * modules.postamble: S_modules. @TeX{} commands to end module list. * modules.preamble: S_modules. @TeX{} commands to begin module list. * modules.tex: S_modules. Name of file containing list of modules. @end menu @node S_modules, , Module params, Module params @comment node-name, next, previous, up @vindex modules.tex @code{modules.tex} is the name of the file into which the module names are written. @vindex modules.preamble @code{modules.preamble} is a string of @TeX{} commands to begin the list of modules. @vindex modules.postamble @code{modules.postamble} is a string of @TeX{} commands to end the list of modules. @vindex modules.info @code{modules.info} is the name of the @TeX{} macro that formats the command line and related information. @node Contents params,Subscript params,Module params,Style @comment node-name, next, previous, up @subsection Customizing the Table of Contents @menu * contents.postamble: S_contents. @TeX{} commands to end Table of Contents. * contents.preamble: S_contents. @TeX{} commands to begin Table of Contents. * contents.tex: S_contents. Name of contents file. @end menu @node S_contents, , Contents params, Contents params @comment node-name, next, previous, up @vindex contents.tex @code{contents.tex} is the name of the file into which the Table of Contents is written. @vindex contents.preamble @code{contents.preamble} is the @TeX{} string that begins printing the Table of Contents. @vindex contents.postamble @code{contents.postamble} is the @TeX{} string that ends the Table of Contents. @node Subscript params,Fwebmac params,Contents params,Style @comment node-name, next, previous, up @subsection Customizing cross-reference subscripts @cindex Bullet @cindex Subscript, bullet When @FWEAVE{} pretty-prints code, it can attach cross-reference subscripts to various kinds of identifiers such as function or macro names. [A bullet @tex ($\bullet$) @end tex for a subscript indicates that the name was defined in the current section.] The actual marking of the cross reference is done by the command @samp{@@[} (@pxref{AT[}). This is usually done implicitly; for example, the commands @samp{@@a}, @samp{@@d}, and @samp{@@m} issue an implicit @samp{@@[}. (See the discussion of @samp{@@a} in @ref{ATa}.) In C, various declarations of variables also result in such an implicit mark. Various nuances in the type (possibly underlined) used for the subscript give a hint about what kind of identifier @FWEAVE{} thinks it's working with. For more information about the typesetting conventions, see the definition of the primitive macro @samp{\W@@IN} in @file{fwebmac.web}.] @cindex Bullet subscript The following flags select which identifiers are so subscripted. To see the default values of these parameters, say @samp{ftangle -Zmark_defined}. To turn off the subscripting operations completely, use the @samp{-f} option (@pxref{-f}). @menu * mark_defined.generic_name: S_mark_defined. * mark_defined.fcn_name: S_mark_defined. * mark_defined.WEB_macro: S_mark_defined. * mark_defined.outer_macro: S_mark_defined. * mark_defined.exp_type: S_mark_defined. * mark_defined.typedef_name: S_mark_defined. @end menu @node S_mark_defined, , Subscript params, Subscript params @comment node-name, next, previous, up @vindex mark_defined.typedef_name @vindex mark_defined.exp_type @vindex mark_defined.outer_macro @vindex mark_defined.WEB_macro @vindex mark_defined.fcn_name @vindex mark_defined.generic_name (Discussion to be completed.) @node Fwebmac params,Completion params,Subscript params,Style @comment node-name, next, previous, up @subsection Customizing the behavior of @file{fwebmac.sty} macros @findex fwebmac.web To some extent, the behavior of @FWEB{}'s macro package @file{fwebmac.sty} can be changed by means of the following parameters. (Please try not to actually edit @file{fwebmac.sty} itself; it is produced automatically from @file{fwebmac.web}. And please don't edit that file either!) @menu * doc.preamble: S_LaTeX. Preamble for entire document. * doc.postamble: S_LaTeX. Postamble for entire document. * format_IDENTIFIER: S_format. Macro name for typesetting upper-case identifiers. * format.reserved: S_format. Macro for reserved words. * format.short_identifier: S_format. Macro for single-character identifiers. * format_OUTER_MACRO: S_format. Macro for upper-case @samp{@@d} identifiers. * format.outer_macro: S_format. Macro for lower-case @samp{@@d} identifiers. * format_WEB_MACRO: S_format. Macro for upper-case @samp{@@m} identifiers. * format.WEB_macro: S_format. Macro for lower-case @samp{@@m} identifiers. * format.intrinsic: S_format. Macro for intrinsic library functions. * format_KEYWORD: S_format. Macro for upper-case keywords. * format.keyword: S_format. Macro for lower-case keywords. * format.typewriter: S_format. Macro for strings. * format.wildcard: S_format. Macro for user-defined index entries. * indent.TeX: S_indent. Paragraph indentation for @TeX{} part. * indent.code: S_indent. Paragraph indentation for code part. * LaTeX.class: S_LaTeX. Specify the document class. * LaTeX.class.options: S_LaTeX. Specify options for document class. * LaTeX.package: S_LaTeX. Specify user package(s) * LATeX.package.options: S_LaTeX. Specify options for user package(s). @end menu @node S_format, S_indent, Fwebmac params, Fwebmac params @comment node-name, next, previous, up @subsubsection @code{format.@i{???}} The @code{format} parameters are strings that specify the macro to be used to pretty-print various kinds of identifiers. These macro names are usually written automatically by @FWEAVE{}, but they may also be used directly by the user in the @TeX{} documentation. One can see their default values by typing @samp{ftangle -Zformat.}. For example, the default value for @code{format.typewriter} is @code{"\\."}. The macro names defined by the @code{format} fields are @emph{not} defined in @file{fwebmac.sty}. They are @emph{dummy names}, and can be changed to any other name not already in use without affecting the operation of @FWEB{}. This ability is necessary because other packages might usurp macros like @code{\.} for their own purposes. Thus, @FWEAVE{} normally writes out the macro @code{\.} to typeset a string. Suppose, however, that some user package uses @code{\.} for something else. (One might realize this when @sc{LaTeX} crashes when it encounteres a @code{\.} that was written automatically by @FWEAVE{}.) To fix this problem, put into @file{fweb.sty} the lines @example format_KEYWORD = "\\WTT" format_keyword = "\\WTT" format_typewriter = "\\WTT" @end example @noindent Here @code{\WTT} can be any name not already in use; @emph{you need not (and should not)} give a definition for @code{\WTT}. Macros like @code{\.} or @code{\WTT} are given their values during the execution of the @code{\Wbegin} macro that begins the output from @FWEAVE{}. The style-file values are written as arguments to that macro, and essentially a command like @code{\let\.\Wtypewriter} is executed, where the internal macro @code{\Wtypewriter} is defined in @file{fwebmac.sty}. If you want to change the way @FWEB{} typesets a particular kind of identifier, you must redefine the @emph{internal} macro name, not the one used in the @code{format} parameters. Here are the internal macros used by @file{fwebmac.sty} to typeset the various kinds of identifiers. The associated style-file parameters are shown in parentheses. @vindex format.id @vindex format.ID @vindex format.short_id @vindex format.outer_macro @vindex format.WEB_macro @vindex format.reserved @vindex format.RESERVED @vindex format.intrinsic @vindex format.keyword @vindex format.KEYWORD @vindex format.typewriter @quotation @ftable @code @item \Wid ordinary identifiers (@code{format.id}) @item \WID completely upper-case ordinary identifiers (@code{format.ID}) @item \Wshort single-character ordinary identifiers (@code{format.short_id}) @item \WidD outer macros (@code{format.outer_macro}) @item \WIDD completely upper-case outer macros (@code{format.outer_macro}) @item \WidM FWEB macros (@code{format.WEB_macro}) @item \WIDM completely upper-case FWEB macros (@code{format.WEB_macro}) @item \Wreserved reserved words (@code{format.reserved}) @item \WRESERVED completely upper-case reserved words (@code{format.RESERVED}) @item \Wintrinsic library/intrinsic function names (@code{format.intrinsic}) @item \Wkeyword certain Fortran keywords (@code{format.keyword}) @item \WKEYWORD completely upper-case keywords (@code{format.KEYWORD}) @item \Wtypewriter character strings (@code{format.typewriter}) @end ftable @end quotation @node S_indent, S_LaTeX, S_format, Fwebmac params @comment node-name, next, previous, up @subsubsection @code{indent.@i{???}} @vindex indent.TeX @code{indent.TeX} specifies paragraph indentation for the @TeX{} part. @vindex indent.code @code{indent.code} specifies similar indentation for the code part. @node S_LaTeX, , S_indent, Fwebmac params @comment node-name, next, previous, up @subsubsection @code{LaTeX.@i{???}} @vindex LaTeX.class For La@TeX{}2e, the default document class can be overridden by @code{LaTeX.class}. The default class is @code{article}, and @FWEB{} has not been tested with other document classes, except minimally with @code{revtex} (@pxref{REVTeX}). @vindex LaTeX.class.options Options to the document class can be specified by @code{LaTeX.class.options}. User packages can be given by @code{LaTeX.package}. @vindex LaTeX.package @vindex LaTeX.package.options Options to user packages can be specified by @code{LaTeX.package.options}. There may be just one @code{LaTeX.package} command and just one @code{LaTeX.package.options} command. If it is necessary to issue multiple such commands, then put them into @code{doc.preamble}. See the discussion in @ref{Document class}. @vindex LaTeX.style @vindex LaTeX.options When running under La@TeX{} prior to La@TeX{}2e (or with REVTeX; see @ref{REVTeX}), the document is (effectively) begun by the command @code{\documentstyle[options]@{style@}}. The options field can be specified by @code{LaTeX.options}; the style field by @code{LaTeX.style}. @node Control-code mappings, Color, Completion params, Style @comment node-name, next, previous, up @subsection Remapping control codes Control-code remappings are sophisticated and unwise. They are mostly intended for the developer, so are not explained here. @node Color, Miscellaneous params, Control-code mappings, Style @comment node-name, next, previous, up @subsection Color output @cindex Color In the design of @FWEB{}, provision has been made for writing various messages to the terminal in color---e.g., serious error messages might appear in red. This feature was motivated by the color @code{ls} of Linux. It is installed automatically if the @code{termcap} library is present. @cindex Message types @cindex Color, and message types Messages output from @FWEB{} are ranked according to an internal message-type table; each type can be associated with a color that can be changed in the style file. Presently, the message types (hopefully self-explanatory) are @cindex Message types @vindex color.ordinary @vindex color.program_name @vindex color.mod_name @vindex color.info @vindex color.warning @vindex color.error @vindex color.fatal @vindex color.mod_num @vindex color.line_num @vindex color.in_file @vindex color.include_file @vindex color.out_file @vindex color.timing @quotation @example ordinary program_name mod_name info warning error fatal mod_num line_num in_file include_file out_file timing @end example @end quotation @noindent The associated style-file parameters are the above names prefaced by @samp{color.}---e.g., @code{color.warning}. Each of those has a default value, such as @code{color.error = "red"}. Those defaults can be displayed by saying @samp{ftangle -Zcolor}. What the color actually means in practice depends on the @dfn{color mode}, set by the @samp{-C} option (@pxref{-C_}). That selects one of several primitive palettes, as follows: @findex -C @quotation @table @kbd @item 0 @strong{No color}; ordinary black-and-white output. This is the default (and the mode used when the @code{termcap} library is not present). @item 1 @cindex Color, ANSI @cindex Color mode, ANSI @strong{ANSI color}. With a color terminal that supports ANSI color escape sequences, one has available the following colors: @code{"black"}, @code{"red"}, @code{"green"}, @code{"yellow"}, @code{"blue"}, @code{"magenta"}, @code{"cyan"}, @code{"white"}, and @code{"default"}. These are displayed with bold attribute (that is, bright, not dim). @samp{"default"} stands for the usual black on white background, or vice versa. @item 2 @cindex Color mode, bilevel @strong{Bilevel}. This is for terminals that don't support true color, but do support a double-bright mode and reverse video. Colors are mapped onto various combinations of those two display attributes, according to an internally defined scheme. For example, @code{"red"} is mapped onto the pair of escape sequences @samp{md}, @samp{mr} (double-bright mode in reverse video). @item 3 @cindex Color mode, trilevel @strong{Trilevel}. As above, but adds underlining capability. @item 4 @cindex Color mode, user-defined @strong{User-defined colors}. This implements a minimal set of defaults. It is intended that the user add definitions in the style file to override those defaults. @end table @end quotation @findex termcap @cindex Escape sequences, ANSI @vindex Color.black @vindex Color.red @vindex Color.green @vindex Color.yellow @vindex Color.blue @vindex Color.magenta @vindex Color.cyan @vindex Color.white @vindex Color.default The mechanism is intended to work with systems that support the @code{termcap} library. The terminal is controlled by writing appropriate escape sequences to it. The style-file parameters that store the escape sequences are the color name preceded by @samp{Color.} (note the upper case @samp{C})---e.g., @samp{Color.red}. For cases like reverse video (standard termcap abbreviation @samp{mr}), the escape sequences are determined by querying the termcap database (usually @file{/etc/termcap}) through the @code{termcap} library functions. For ANSI color (color mode = 1), ANSI escape sequences are hard-coded into @FWEB{}. One can see the escape sequences @FWEB{} assigns to colors by saying @samp{ftangle -ZColor}. For any non-zero color mode, one can override @FWEB{}'s default choices for color mappings and escape sequences by redefining one or more of the @code{Color} parameters in the style file. The escape sequences can either be specified in raw form---e.g., for color mode = 1, a default is @code{Color.red = "\e[01;31m"}---or in the form of a sequence of two-character abbreviations that are defined in the termcap documentation---e.g., for modes 2 and 3, the default is @code{Color.red = "mdmr"}. (When one displays that with the @samp{-Z} option, @FWEB{} will display the actual escape sequences that it determines from the termcap database, not the abbreviations. For both input and output, note that one may use the non-ANSI escape sequence @samp{\e} to represent the escape character @samp{\033}.) When one says @samp{-ZColor}, for color modes 1--3 all of the parameters are listed as modified, even if the user redefines none. That occurs because the defaults are overwritten internally when the color mode is set. @findex termcap0 @FWEB{}'s configuration script attempts to determine whether the termcap library is present; if not, they link in dummy termcap routines (@file{termcap0.web}). To override this behavior, change the appropriate lines in @file{defaults.mk}, produced by the command @code{./configure}. Color message output is not fully debugged (it's a frill, after all), so some messages that should reasonably be colored may not be so in the present release. @node Miscellaneous params,,Color,Style @comment node-name, next, previous, up @subsection Miscellaneous style-file parameters There are a variety of miscellaneous parameters. @menu For @FTANGLE{}: * ASCII_fcn:: Routine for converting strings to ASCII. * cchar:: Continuation character for Fortran. * cdir_start:: @samp{@?} translates to this. * line_char:: Comment char. for @FTANGLE{}'s @code{line} cmds. * line_length: S_line_length. * paren.len: -n). Length of one parenthesized index for @samp{-n)}. * paren.levels: -n). Number of nested parentheses for @samp{-n)}. * paren.num: -n). Number of permitted indices for @samp{-n)}. * meta.top: S_meta_t. Material to precede tangled meta-comment. * meta.prefix: S_meta_t. Begins each line of meta-comment. * meta.bottom: S_meta_t. Material that follows the meta-comment. * meta.top.hdr: S_meta_t. Like meta.top, but for info at start of file. * meta.prefix.hdr: S_meta_t. As above. * meta.bottom.hdr: S_meta_t. As above. * outer.def: S_outer. @FTANGLE{} converts @samp{@@d} to this. * outer.undef: S_outer. @FTANGLE{} converts @samp{@@u} to this. * protect:: Protection character to end a continued line. * suffix:: Suffixes for output files. For @FWEAVE{}: * macros:: Default name of the macro package to be read in by @FWEAVE{}. * limbo.begin: S_limbo. Default material to begin the limbo section. * limbo.end: S_limbo. Default material to end the limbo section. * meta.code.begin: S_meta_w. * meta.code.end: S_meta_w. * meta.TeX.begin: S_meta_w. @TeX{} material to begin @FWEAVE{}'s output of a meta-comment. * meta.TeX.end: S_meta_w. As above, but end the meta-comment. * preamble.named: S_preamble. @TeX{} material to begin named section. * preamble.unnamed: S_preamble. @TeX{} material to begin unnamed section. For both processors: * dot_constant.begin: S_dot_constant. Beginning character for dot constant. * dot_constant.end: S_dot_constant. Ending character for dot constant. * null_file:: Name of the null file. @end menu @node ASCII_fcn, cchar, Miscellaneous params, Miscellaneous params @comment node-name, next, previous, up @subsubsection @code{ASCII_Fcn} @vindex ASCII_Fcn @xref{ATdquote}. @node cchar, cdir_start, ASCII_fcn, Miscellaneous params @comment node-name, next, previous, up @subsubsection @code{cchar} @vindex cchar Continuation character for @sc{Fortran} code output. @node cdir_start, line_char, cchar, Miscellaneous params @comment node-name, next, previous, up @subsubsection @code{cdir_start} @vindex cdir_start This parameter has the form @code{cdir_start.@i{l}}, where @i{l} is one of @samp{C}, @samp{Cpp}, @samp{N}, @samp{N90}, @samp{R}, @samp{R90}, @samp{X}, or @samp{V}. The contents of this parameter is written immediately after the @samp{@@?} that begins a compiler directive. @node line_char, S_line_length, cdir_start, Miscellaneous params @comment node-name, next, previous, up @subsubsection @code{line_char.@i{l}} (@FTANGLE{}) @vindex line_char By default, @FTANGLE{} outputs comments indicating line numbers in the @code{web} file from which the tangled output comes. (This information can be used by debuggers, especially those for C and C++, to correlate error messages to the @code{web} source.) The @code{line_char} parameter sets the comment character that begins the line comment. @node S_line_length, S_meta_t, line_char, Miscellaneous params @comment node-name, next, previous, up @subsubsection @code{line_length.@i{l}} (@FTANGLE{}) @vindex line_length This parameter is used by the @sc{Fortran}-like languages to control the length of the output line in the @file{.f} file produced by @FTANGLE{}. For @sc{Fortran}-77, its default value is the venerable 72. For @sc{Fortran}-90, its default is 73. Using that value makes it possible to generate code that is compatible with both fixed- and free-form format (by continuing lines with an trailing ampersand in column 73 and another ampersand in column 6 of the next line). @node S_meta_t, S_outer, S_line_length, Miscellaneous params @comment node-name, next, previous, up @subsubsection @code{meta.@i{???.?}}, @code{meta.@i{???}.hdr.@i{?}} (@FTANGLE{}) These parameters customize the treatment of meta-comments. Fundamentally, meta-comments consist of material enclosed by @samp{@@(...@@)}. The header information usually written at the top of the file output by @FTANGLE{} (@pxref{-Tv}) is also treated as a meta-comment. For that header material, a separate set of parameters is provided, such as @code{meta.top.hdr}. @vindex meta.top @vindex meta.top.hdr @code{meta.top.@var{l}} specifies text that precedes material enclosed by @samp{@@(...@@)}. Here @var{l} is one of the standard language subscripts (@pxref{Style}) such as @code{N90}. @vindex meta.prefix @vindex meta.prefix.hdr @code{meta.prefix.@var{l}} begins each line of the meta-comment. @vindex meta.bottom @vindex meta.bottom.hdr @code{meta.bottom.@var{l}} specifies text that follows the meta-comment. @node S_outer, protect, S_meta_t, Miscellaneous params @comment node-name, next, previous, up @subsubsection @code{outer.@i{???}} @vindex outer.def @vindex outer.under @FTANGLE{} converts @samp{@@d} (@pxref{ATd}) to @code{outer.def}, and @samp{@@u} (@pxref{ATu}) to @code{outer.undef}. @node protect, suffix, S_outer, Miscellaneous params @comment node-name, next, previous, up @subsubsection @code{protect.?} @vindex protect The strings @code{protect.@var{l}} specify the protection character(s) to end a continued line. @node suffix, macros, protect, Miscellaneous params @comment node-name, next, previous, up @subsubsection @code{suffix.?} @vindex suffix The extension for the files output by @FTANGLE{} is specified by @code{suffix.@var{l}}. @node macros, S_limbo, suffix, Miscellaneous params @comment node-name, next, previous, up @subsubsection @code{macros} @vindex macros The default name of the macro package to be read in. [This is usually @file{fwebmac.sty} (@pxref{fwebmac.sty}), but can be overridden by the command-line option @samp{-w}; see @ref{-w}.] @node S_limbo, S_meta_w, macros, Miscellaneous params @comment node-name, next, previous, up @subsubsection @code{limbo.begin}, @code{limbo.end} @vindex limbo.begin @samp{limbo.begin} is @TeX{} material to be printed at the beginning of the limbo section, just before the text from @samp{@@l} commands. @xref{ATl}. (This command was previous called just @samp{limbo}, and that still works.) @vindex limbo.end Similarly, @samp{limbo.end} is printed at the end of the limbo section. Thus, the beginning of the file output by @FWEAVE{} looks like this: @example \input fwebmac.sty \Wbegin@{...@} [contains \documentclass, \usepackage, , \begin@{document@}] [contents of any @@l commands] [user's TeX commands from the limbo section] @end example The @samp{limbo.end} command is useful for printing the entire document in two-column format. For more discussion, see @ref{LIndex}. @node S_meta_w, S_preamble, S_limbo, Miscellaneous params @comment node-name, next, previous, up @subsubsection @code{meta.@i{???}} (@FWEAVE{}) @vindex meta (To be finished.) @node S_preamble, S_dot_constant, S_meta_w, Miscellaneous params @comment node-name, next, previous, up @subsubsection @code{preamble.@i{???}} @vindex preamble.named @vindex preamble.unnamed Additional @TeX{} material can be inserted at the beginning of a named section with @code{preamble.named} and at the beginning of an unnamed one with @code{preamble.unnamed}. @node S_dot_constant, null_file, S_preamble, Miscellaneous params @comment node-name, next, previous, up @subsubsection @code{dot_constant.@i{???.?}} @vindex dot_constant.begin @vindex dot_constant.end In @sc{Fortran}, `dot' constants such as @code{.LT.} are begun and ended by periods. In special circumstances, the beginning and ending characters may be modified by @code{dot_constant.begin.@var{l}} and @code{dot_constant.end.@var{l}}. @node null_file, , S_dot_constant, Miscellaneous params @comment node-name, next, previous, up @subsubsection @code{null_file} @vindex null_file The name of the null file or device. For more discussion, see @ref{Change files}. @node Completion params,Control-code mappings,Fwebmac params,Style @comment node-name, next, previous, up @subsection Automatic file name completion @menu * Ext.web: S_Ext. Extensions for the web file. * Ext.ch: S_Ext. Extensions for the change file. * Ext.hweb: S_Ext. Extensions for include files. * Ext.hch: S_Ext. Extensions for change files associated with include files. @end menu @node S_Ext, , Completion params, Completion params @comment node-name, next, previous, up @vindex ext.web @vindex ext.ch @vindex ext.hweb @vindex ext.hch For more information, see @ref{-e}. @node Hints, New features, Customization, Top @comment node-name, next, previous, up @chapter USAGE TIPS and SUGGESTIONS In this section are collected various tips and suggestions to help one make full use of @FWEB{}. Additional hints broken down by each supported source language can be found in @ref{Languages}. @menu * Converting:: Converting an existing code to @FWEB{}. * Tips:: Usage tips and suggestions. * Science:: Useful features for scientific programming. @end menu @node Converting, Tips, Hints, Hints @comment node-name, next, previous, up @section Converting an existing code to @FWEB{} @cindex Converting an existing code to @FWEB{} @cindex Code, converting to @FWEB{} To convert an existing code to @FWEB{}, one should do the following. (The following simple procedure assumes that one puts all the subroutines into the unnamed module. However, other more elaborate schemes are possible.) @enumerate @item Place invisible commentary about the author, version, etc. at the beginning of the source file by bracketing it with @samp{@@z...@@x}. The @samp{@@z} must be the first two characters of the file. @item Next, set the language by including a command such as @samp{@@n} or @samp{@@c++}. @item Place an @samp{@@a} command (switch into unnamed code) before each program unit (e.g., main @b{program}, @b{subroutine}, or @b{function}). @item Before each @samp{@@a}, place an @samp{@@*} or @ASP{} command, followed by @TeX{} documentation about that particular section of code. @item If you have program units longer than about twelve lines, either make them function calls, if you can afford the overhead and can impart sufficient information via the function name, or break them up into shorter fragments by using named modules. Insert the command @samp{@@} in place of the fragment you're replacing, then put that fragment somewhere else, prefaced by @ASP{} and @samp{@@=}. @item Make sure your comments are valid @TeX{}. (One can't have things like raw underscores or dollar signs in comments, since those cause @TeX{} to take special actions.) @item Beautify and clarify your documentation by using code mode (enclosing stuff between vertical bars) liberally within your @TeX{}. @item After you've seen the woven output, you may need to go back and format a few identifiers or section names so that @FWEAVE{} understands them properly, or you may need to insert some pseudo-semicolons (@samp{@@;}), pseudo-expressions (@samp{@@e}), or pseudo-colons (@samp{@@:}) (@pxref{Pseudo-operators}). @item Consider using @FWEB{}'s built-in macro preprocessor (@pxref{Macros}) to make your code more readable---for example, replace raw numerical constants by symbolic names. @item Scientific programmers may benefit from built-in macro-like functions like @code{$PI}; see @ref{Built-in functions}. @item If you are a @sc{Fortran} user, for ultimate readability consider converting to @sc{Ratfor}. The initial annoyance is getting rid of column-6 continuations. With the aid of a good editor, this can be done simply. For example, in @code{emacs} one can replace the regular expression [carriage return, five spaces, something not equal to space, tab, or 0] with [backslash, carriage return, six spaces]: @example M-x replace-regexp RET C-q C-j \.@{\ \ \ \ \ @}[\^\.\ tab 0]RET \\\\ C-q C-j \.@{\ \ \ \ \ \ @}RET @end example @noindent Get rid of the keywords such as @b{then} or @b{end if} in favor of braces. Change singly-quoted character strings to doubly-quoted ones. The @samp{-nC} option (@pxref{-nC}) may be helpful. @end enumerate @node Tips, Science, Converting, Hints @comment node-name, next, previous, up @cindex Suggestions @cindex Programming tips @section Programming tips and other suggestions @enumerate @item Learn how to use the GNU @code{info} browser to access the on-line documentation. @item Read the list of new features and changes for the last several releases. @xref{New features}. @item Periodically check @code{ftp.pppl.gov:/pub/fweb/READ_ME} for bug reports and other news. Make bug reports! @xref{Support}. @item If you have a color terminal, try the option @samp{-C1} (@pxref{-C_}, @pxref{Color}). @item Any option in @file{.fweb} that is intended to be processed @emph{after} the command-line options should begin with @samp{&} rather than @samp{-}. (This is rarely necessary.) @xref{Initialization} @item Put standard command-line options into @file{.fweb}. Also put there standard style parameters---e.g., @example -pindex.tex "#.ndx" -pmodules.tex "#.mds" -pcontents.tex "#.cts" @end example @item Learn how to use the style file. @xref{Style}. @item Use the info options @samp{-@@}, @samp{-D}, @samp{-y}, and @samp{-Z} to find out about various internal @FWEB{} tables (control codes, reserved words, memory allocations, and style-file parameters). @xref{Info options}. @item Begin all @FWEB{} sources with invisible commentary bracketed by @samp{@@z...@@x}. @xref{ATz}. @item Always include an explicit language-setting command in the limbo section. Under normal circumstances, do not set the language from the command line. @xref{Languages}. @item Keep sections quite short. Knuth suggests a dozen lines. That's quite hard to achieve sometimes, but almost never should a section be more than a page long. If a block of code is longer than that, split it up using named modules. @item It's easy to define macros from the command line to expedite conditional preprocessing. @xref{-m}. @item Use the preprocessor construction @samp{@@#if 0...@@#endif} to comment out unwanted code. @xref{Preprocessing}. @item For logical operations with the preprocessor, use @samp{||}, not @samp{|}. @item It's conventional to identify the ends of long preprocessor constructions as follows: @example @@#if A . . @@#endif // |A| @end example @item To debug an errant @FWEB{} macro, use the built-in function @samp{$DUMPDEF}. @xref{$DUMPDEF}. @item Use @samp{@@?} for compiler directives. @xref{AT?}. Use the style-file parameters @samp{cdir_start} to specify information that will be written out at the beginning of the line. @xref{cdir_start}. @item Stick to the standard @FWEB{} commenting style @samp{/*...*/} or @samp{//...}. Don't use alternatives such as @sc{Fortran}'s column 1 convention; these may not work or may not be supported someday. @xref{Comments}. @item The meta-comment feature @samp{@@(...@@)} provides a poor-person's alignment feature. But it doesn't work very well, and it's not in the spirit of @TeX{}; learn to use @samp{\halign} or the La@TeX{} alternatives. @item In @sc{Fortran}, use @samp{#:0} to declare readable alphabetic statement labels. See @ref{Tokens} and @ref{-colon}. @item When mixing languages, define the language of a module at the highest possible level---e.g., in the unamed module, not after @samp{@@<...@@>=}. @item Use La@TeX{}. Plain @TeX{} is no longer supported. Upgrade to La@TeX{}2e. @xref{LaTeX}. @item If you are reading this documentation from printed pages, make sure it's also installed as an Info package on your system so it can be read interactively with @code{emacs}. You can also read it through a World-Wide Web browser such as Netscape. For the address, see @ref{Support}. @end enumerate @node Science, , Tips, Hints @comment node-name, next, previous, up @cindex Scientific programming @section Features for scientific programming @FWEB{} contains a few features particularly intended for scientific programming. @enumerate @item Several built-in functions generate numerical constants. See @samp{$PI} (@ref{$PI}) and @samp{$E} (@ref{$E}). @item Several built-in functions perform mathematical manipulations. See @samp{$EXP} (@ref{$EXP}), @samp{$POW} (@ref{$POW}), @samp{$SQRT} (@ref{$SQRT}), @samp{$LOG} (@ref{$LOG}), @samp{$LOG10} (@ref{$LOG10}), @samp{$MAX} (@ref{$MAX}), and @samp{$MIN} (@ref{$MIN}). @item The do-loop macro @samp{$DO} may be useful. @xref{$DO}. @item C-style array indices can be used by means of the @samp{-n)} option. @xref{-n)}. @item An active bracket feature helps improve the appearance of woven code that uses subscripts and/or superscripts heavily. @xref{-W[}. @end enumerate @node New features, Support, Hints, Top @comment node-name, next, previous, up @chapter NEW FEATURES @cindex Features, new This info documentation is now accessible on the World-Wide Web; see @ref{Support}. Some things that have been added or changed in recent releases are described in the following. @menu * V1.61:: * V1.53:: * V1.52:: * V1.50:: * V1.40:: @end menu @node V1.61, V1.53, New features, New features @comment node-name, next, previous, up @section Version 1.61 @subsection Updates to documentation (v1.61) @quotation @enumerate @item @FWEB{} supports color modes in which messages to the terminal can appear in colors chosen by the user; see @ref{Color}. The color mode is set by the new command-line option @samp{-C} (@pxref{-C_}). @item A previously undocumented feature is that for the C-like and Fortran-like languages, @FTANGLE{} expands the binary notation @samp{0b...} to an unsigned decimal number. @xref{Phases}. @end enumerate @end quotation @subsection Redefined commands (v1.61) @cindex Commands, redefined @cindex Redefined commands, version 1.61 A few obscure commands have been slightly redefined. Sorry about that, but it makes for more symmetry and ease of recall, and/or solves some technical problems. @quotation @enumerate @item Although it was never documented, previous versions permitted either lower or upper case for the @samp{@@} commands that set the language---e.g., both @samp{@@c} and @samp{@@C} worked. Now only the lower-case forms work. (The upper-case forms may have other meanings.) @item The style-file parameter @samp{Ext_delimiter} now begins with an upper-case @samp{E}; formerly it was lower-case. @item The behavior of the optional argument of the @code{\Title} macro has been slightly redefined. The new, more symmetrical form is @example \Title[Short title]@{Long title@} @end example @noindent where @code{Long title} is printed on the title page and @code{Short title} is used for the running header within the document. @xref{Table of Contents}. @item The line-break commands @samp{@@/} and @samp{@@\} (formerly identical) now behave slightly differently. @samp{@@/} breaks the line just as it would if the line had been too long and been spontaneously broken. @xref{AT/}. @samp{@@\} backspaces one unit of indentation after breaking the line. @xref{ATbs}. Usually, one should use @samp{@@/} (sorry; I was previously recommending @samp{@@\}. For an example in which it is natural to use @samp{@@\}, see @ref{ATbs}. @item The names of some of the code-typesetting macros in @code{fwebmac.sty} have been changed to conform to the convention that they should all start with @samp{W}. This change will be invisible to you unless you happen to have user macros of your own that start that way or (perish the thought) you have redefined low-level and obscure code in @file{fwebmac.sty}. @end enumerate @end quotation @subsection New features (v1.61) @cindex Features, version 1.61 This release adds some features for managing large projects, including (i) the @code{idxmerge} utility that merges indexes produced by several @FWEB{} files, (ii) a mechanism for accessing RCS-like information in the ignorable commentary at the beginning of the file, and (iii) the ability to include @FWEAVE{}-formatted code into a standard La@TeX{} document. It also fixes a variety of miscellaneous bugs. @quotation @enumerate @item A stand-alone index file suitable for processing by @code{makeindex} can be produced by the @samp{-XI} option. @xref{Using makeindex}. @item Stand-alone indexes produced by @samp{-XI} can be merged with the @code{idxmerge} utility. @xref{Merging indexes}. @item @FWEAVE{}-formatted code can be included in a standard La@TeX{}2e document by means of the @code{fwebinsert} package. @xref{Inserting woven code}. @item Revision-control-system (RCS) information that appears in the ignorable commentary between the optional @samp{@@z} and @samp{@@x} that begin an @FWEB{} file (@pxref{ATz}) is accessible in the body of the file through the built-in function @code{$KEYWORD} (@pxref{$KEYWORD}) and the new commands @samp{@@K} (@pxref{ATK_}) and @samp{@@k} (@pxref{ATk}). These features can access RCS-like keywords that are not known to RCS itself, as long as they fit the proper syntax (@pxref{ATz}). @item The @samp{-h} option now permits easy access to the GNU @code{info} browser if it is installed. @xref{-h}. @item Underscored versions of built-in functions have been removed!!! E.g., use @code{$IF}, not @code{_IF}. This change was warned about in the last release. @item Single-character identifiers can now be completely cross-referenced via the @samp{-W1} option. @xref{-W1}. @item Some module warning messages can be eliminated with the @samp{-W@@} option. @xref{-WAT}. @item The @samp{@@q} command (still experimental) has been added to locally turn on or off the the line and module comments in the tangled output. @xref{ATq}. @item The level of verbosity of @FWEB{}'s informational messages can be controlled with the @samp{-M} option. @xref{-M_}. @item C/C++ programmers may find the command @samp{@@@{} useful. @xref{ATlb}. @item The @samp{-nC} option has been added for @sc{Fortran} users; it kills commented lines at a very early stage in the processing. This can be useful when converting existing codes to @FWEB{}. @xref{-nC} @item @sc{Fortran}-90 (@pxref{-n9}) now defaults to free-form syntax. @item As of the non-beta Version 1.61, free-form @sc{Fortran}-90 now inserts semicolons automatically in the code part. Thus, textbook @sc{Fortran}-90 examples will weave correctly without the annoyance of explicitly terminating each statement with a semicolon. (If you prefer to put in the semicolons explicitly, use @samp{--n;} to turn off the auto-insertion.) @xref{-n;} @item The default meaning of the @samp{-k} option was changed; now both lower- and upper-case forms of @sc{Fortran} I/O keywords are recognized. @xref{-k}. @item Various changes were made to internal code in @file{fwebmac.sty}. This should not affect anyone @emph{unless} you have redefined @code{fwebmac} macros. If so, you'll have to compare your versions with the present ones. For example, colons as argument delimiters in @code{\def}s have been removed. @item It is now (barely) possible to use @code{\documentstyle@{revtex@}} instead of the default @code{\documentclass@{article@}}. @xref{REVTeX}. @end enumerate @end quotation @subsection Significant bugs (v1.61) @cindex Bugs, version 1.61 @quotation @enumerate @item Perhaps the most significant bug is that some high-order (>= 128) characters in strings may not typeset or be processed correctly. This may be an issue for some users of foreign-language packages. The difficulty arises from a design decision made by a previous author. This has at least partly been fixed, but I eschewed a substantial overhaul for fear of breaking other things. @end enumerate @end quotation @node V1.53, V1.52, V1.61, New features @comment node-name, next, previous, up @section Version 1.53 @cindex Features, version 1.53 This release fixes a relatively small number of obscure bugs in @code{fweb-1.52-beta}. A few minor enhancements were also made. They include @quotation @enumerate @item Sections can be numbered by consecutive integers rather than LaTeX's default Dewey-decimal form by saying @example LaTeX.package = "fwebnum" @end example @noindent @xref{Sections}. @item The @samp{-H} option (experimental and incomplete) was added. For C and C++, this option tells @FWEAVE{} to scan @code{#include} files for @samp{typedef} and/or @samp{class} definitions. @xref{-H_}. @item The @samp{-k} option was added. This tells @sc{Fortran} and @sc{Ratfor} to understand the lower-case forms of I/O keywords such as @samp{iostat} (with the exception of @samp{read}, @samp{write}, and @samp{end}). @xref{-k}. @item The @samp{-n:} option was added. This tells @sc{Fortran} to place statement labels on a separate line, which is useful when the labels are relatively long. (By default, @sc{Fortran} labels are placed on the same line as the thing they are labeling, which looks good for short labels.) @xref{-ncolon} @item The preprocessor command @samp{@@#line} was added. For C code, this adds an explicit @samp{#line} command to the tangled output file. This helps to keep the line numbers between debugger and source file in sync when an @FWEB{} preprocessor statement expands to several lines. @xref{Debugging with macros}. An implicit @samp{@@#line} command is added after each @samp{@@%} (@pxref{AT%}) that begins a line (this keeps line numbering correct). To override this, use the option @samp{-T#}. @xref{-T#}. @item @samp{-p} (style-file) options (@pxref{-p}) on the command line are now processed @emph{after} the local style file. @xref{Style}. @item The functionality of the @samp{-D} command was enhanced to include optional arguments that limit the information that will be listed. @xref{-D_}. @end enumerate @end quotation @node V1.52, V1.50, V1.53, New features @comment node-name, next, previous, up @section Version 1.52 @cindex Features, version 1.52 This release was issued only as a beta version. It consists mostly of bug fixes. However, there are a few other interesting points. @quotation @enumerate @item @code{fwebmac.sty} was enhanced to warn the user to run La@TeX{} again when the section numbering hasn't yet been brought up to date. I'm not sure I've covered all the bases, but before it didn't complain at all. @item C++ classes are now formatted (identified as reserved words) on the first pass, so forward references such as @example @@ The class |C|... @@a class C @{@} @end example @noindent will now work. Note that @b{typedef} has done this for a while, although there are still a few glitches. @item For two years, the documentation has described two control codes as follows: @example @@~ --- inhibit line break. @@+ --- force an index entry. @end example @noindent Apparently the code had these definitions inverted; it has now been brought up to date with the documentation. Fortunately these commands are evidently not heavily used, since no one complained. @item @code{fwebmac.sty} was further reworked to interact properly with the user package @code{multicol}. If in @code{fweb.sty} one says @samp{LaTeX.package "multicol"}, then the two-column index is done with @code{multicol}; this gives various improvements over the @code{\twocolumn} format that was used previously. Furthermore, it's possible to use @samp{multicol} to do one's entire document in two-column format. This turned out to be relatively simple, but one needs to get the commands in the proper order. See @ref{LIndex} for more details. Two-column format substantially cuts down the white space; I saved about 50% on a 200-page code. One known glitch with @FWEB{}/@code{multicol} is that if one selects page-number cross-references instead of La@TeX{} section numbers, page references such as 98c don't get the 'c' correct. This is presumably not a big deal. At this point, assume that the use of @code{multicol} is highly experimental. @item Further bugs in the C and C++ production rules were fixed. @end enumerate @end quotation @node V1.50, V1.40, V1.52, New features @comment node-name, next, previous, up @section Version 1.50 @cindex Features, version 1.50 @quotation @enumerate @item The syntax for entries in the initialization file @file{.fweb} (@pxref{Initialization}) has been modified (in a way that is as backward-compatible as possible). Previously, @samp{+} meant process the option before the command-line options, @samp{-} meant process it after. This convention was somewhat hard to remember, given the statement that any command-line option could be put into @file{.fweb}; furthermore, just about everything in @file{.fweb} should, in fact, be processed before the command-line options. So now both @samp{+} and @samp{-} mean the same thing, namely process before (and the @samp{+} notation should fade away as time goes on). If you explicitly want something to be processed after all command-line options for some tricky reason, begin it with @samp{&}. I.e., scan your @samp{.fweb} file for any line beginning with @samp{-} and replace that with @samp{&}. @item The La@TeX{} processor (@samp{-PL}) is now the default. @item The experimental @file{fwebmacL.sty} macro package supplied with version 1.40 has been substantially reworked and is now the default @file{fwebmac.sty}. Remove any reference to @file{fwebmacL.sty} from your @file{.fweb} file. @item Support for La@TeX{}2e is now provided. @xref{LaTeX}. @item The style-file parameter @code{index.name} was added. This is the section name to be given to the Index (@pxref{Index}), which should be the last major (starred) section. It becomes the contents of the macro @code{\INDEX}. Therefore, one can end one's source file by saying @example @@* \INDEX. @end example @item The @samp{$IF...} class of built-in functions was reworked. They should now be more robust, recursive, and intuitive. Simple uses of these functions should work as before. However, complicated uses that depended on tricky things about the order of expansion of arguments may require revision. Carefully compare the descriptions of these functions in the documentation (e.g., see @ref{$IF}) with your usage of them in any pre-existing code. In some cases, if a previous constructions using @code{$IF} no longer works, it might work if you say @example @@m $IF(a,b,c) $$IF(a,b,c) @end example @noindent and then use @code{$$IF} in your code. (This forces an extra level of macro expansion.) The same remark goes for @code{$DEFINE}. The old forms @samp{_IF} etc. no longer work; convert to @samp{$IF}. @item The option @samp{-j} was added. This inhibits multiple inclusions via @samp{@@i} of the same include file. @xref{-j}. @item One now has the ability to change the comment character that begins @FTANGLE{}'s @samp{line} command. In the style file, say, e.g., @example line_char.N '#' @end example @noindent to change the default @samp{*line} output by @FTANGLE{} in @sc{Fortran} mode to @samp{#line}. This could be useful if one runs the C preprocessor on the tangled @sc{Fortran} output. @item @FWEAVE{}'s processing of @b{typedef} statements in C and C++ was improved. @item @FWEB{} should now be able to process C++ templates and exception handling, at least in simple situations. The typesetting of C++ references (e.g., @samp{int&}) was also improved. Please report any difficulties. @item There were various miscellaneous obscure bug fixes. @end enumerate @end quotation @node V1.40, , V1.50, New features @comment node-name, next, previous, up@section Version 1.40 @section Version 1.40 @cindex Features, version 1.40 @quotation @enumerate @item @emph{The meaning of @samp{@@+} has changed.} (SORRY!) Formerly, this inhibited a line break; that function is now performed by @samp{@@~}. The new meaning of @samp{@@+} is to force an index entry (the opposite of @samp{@@-}, which inhibits an index entry). If you have large codes using the old @samp{@@+} that you do not wish to convert, you can recover the old mappings by placing the following commands into @file{fweb.sty}: @example yes_index = "~" no_line_break = "+" @end example @noindent However, please try to make the conversion; the new codes are intended to be more symmetrical and easier to remember. @item @emph{Built-in functions now begin with @samp{$}, not @samp{_}.} The underscore prefix was a bad design decision; it introduces conflicts with ANSI C in certain circumstances. To ease conversion, the old forms are still understood. Thus, one can use @samp{$EVAL} and @samp{_EVAL} interchangably. However, @emph{do not use} the underscore forms; they will be deleted in future releases. @item @emph{Full La@TeX{} support.} @FWEB{} no longer usurps La@TeX{}'s @code{\output} routine, and La@TeX{}'s sectioning commands, Table-of-Contents commands, etc. are used. The appearance of the woven output is changed to be more book-like. (This is an experiment.) @item @emph{Verbatim language.} @samp{@@Lv} selects a language-independent format. @xref{Verbatim} @item @emph{Language-independent mode.} The N mode inhibits pretty-printing, blank compression, etc.; source code is essentially copied literally from input to output. This mode is turned on automatically by the @sc{verbatim} language, but it can also be used with the other languages. It is turned on by the command-line option @samp{-N} or the local command @samp{@@N}. @xref{ATN_}. @item @emph{Writing of temporary files.} When the @samp{-F} command-line option is in effect, tangled output is written to temporary files instead of the final target files, and the temporary files are compared to the last version of the target files on disk. If there is no change, the target files are not updated. This avoid unnecessary recompilation if only the documentation, not the code, was changed. @xref{-F_}. @item @emph{Converting output tokens to lower case.} @xref{-U_}. @item @emph{The built-in functions @samp{$E} and @samp{$PI}.} @xref{$E}, @ref{$PI}. @item @emph{The built-in functions @samp{$EXP}, @samp{$LOG}, and @samp{$LOG10}.} @xref{$EXP}, @ref{$LOG}, and @ref{$LOG10}. @item @emph{@samp{$MAX} and @samp{$MIN} generalized to take arbitrary list of arguments.} @xref{$MAX}, @ref{$MIN}. @item @emph{The marriage-saver option}. In response to a serious user request, see @ref{-B_}. @end enumerate @end quotation @node Support, Installing, New features, Top @comment node-name, next, previous, up @chapter SUPPORT @cindex Support @cindex Bugs @FWEB{} is supported by John Krommes, @email{krommes@@princeton.edu}. This project is a definitively @emph{spare-time activity}!!! Bug reports submitted with very short test files will be verified, although not necessarily in real time. For very simple fixes, a change file may be provided. Generally, however, bugs are not fixed until the next release. Releases occur intermittently, depending on my many other professional obligations. Suggestions are very welcome. Many of @FWEB{}'s current features were incorporated in response to users' requests. However, the queue for future improvements is long; nothing may happen immediately. The next major release of @FWEB{}, Version 2.00, is planned for approximately the year 2000. (You may be relieved to know that, to the best of my knowledge, @FWEB{} does not suffer from the Y2K bug.) This info documentation is now accessible on the World-Wide Web from @quotation @url{http://w3.pppl.gov/~krommes/fweb_toc.html}. @end quotation You can subscribe to one or both of two @FWEB{} mailing lists, @code{fweb-users} and @code{fweb-installers}. To subscribe, send e-mail to @email{majordomo@@pppl.gov}. In the @emph{body} of the message, say, e.g., @quotation @code{subscribe fweb-users} @end quotation @noindent You will receive introductory information describing how these lists are intended to be used. To unsubscribe at any time, substitute @code{unsubscribe} for @code{subscribe} in the above instructions. Archive files containing the messages sent to the @FWEB{} mailing lists are kept in @quotation @code{ftp.pppl.gov:/pub/fweb/archive/fweb-@{users,installers@}.archive}. @end quotation @noindent In addition to anonymous @code{ftp}, these files may be obtained by sending a message to @code{majordomo@@pppl.gov} of the form @quotation @code{get fweb-users fweb-users.archive}. @end quotation @node Installing, Concept index, Support, Top @comment node-name, next, previous, up @appendix Installing @FWEB{} Here is the bare-bones installation procedure for @sc{unix} users: @cindex Installing @FWEB @enumerate @item Download the @code{zgip}-compressed @code{tar} file from @code{ftp.pppl.gov:/pub/fweb}. The name of the file contains the version number---e.g., @file{fweb-1.61.tar.gz}. @example ftp ftp.pppl.gov bin get fweb-1.61.tar.gz quit @end example @item Uncompress and unpack the tar file: @example gunzip fweb-1.61.tar.gz tar -xf fweb-1.61.tar @end example @noindent If the GNU @code{tar} is installed, these two steps can be combined into @example gtar -xzf fweb-1.61.tar.gz @end example Unpacking creates the directory @file{fweb-1.61}, with at least the two subdirectories @file{Web} and @file{Manual}. @item Change to the new @file{Web} subdirectory and run the configuration script. @example cd fweb-1.61/Web ./configure @end example @file{./configure} is an @code{sh} script. It attempts to figure out various local system features automatically, then generates the three files @file{defaults.mk}, @file{config.h}, and @file{custom.h}; those are used in the @code{make}. For further information about the operation of @file{./configure}, see @file{fweb-1.61/READ_ME.FWEB}. @item Make and install the release: @example make @i{[}CFLAGS='@i{special compiler flags}'@i{]} make install @end example If @code{gcc} is available, it will be used in the @code{make}; in that case, the default @code{CFLAGS} should be sufficient. If another compiler is used, ensure that it is run in ANSI-compatible mode, not the old-style Kernighan and Ritchie. @FWEB{} compiles on my system without any warnings with @w{@samp{gcc -ansi -pedantic}}. Please report any compiler warnings from an allegedly ANSI-C environment. @end enumerate @node Concept index, Option and command index, Installing, Top @comment node-name, next, previous, up @unnumbered Concept index @printindex cp @node Option and command index, Parameter index, Concept index, Top @unnumbered Option and command index @printindex fn @node Parameter index, , Option and command index, Top @comment node-name, next, previous, up @unnumbered Parameter index @printindex vr @shortcontents @contents @bye fweb-1.62/Manual/fweb.cps100644 10061 1115 26221 6602703125 14407 0ustar krommesusers\initial {.} \entry {.false.}{87} \entry {.true.}{87} \initial {@} \entry {@, literal}{7} \initial {A} \entry {Absolute value}{68} \entry {Allocation, memory}{35, 108} \entry {ASCII, converting to}{51, 68} \entry {Asserting a condition}{68} \entry {Assignment operators, compound}{37, 87} \entry {Author}{68} \entry {Automatic pseudo-semicolons}{24, 58, 88} \entry {Automatic semicolons}{24, 87} \initial {B} \entry {Bar, vertical}{39, 56} \entry {Binary notation}{84, 85} \entry {Blocks, numbering}{17, 25, 30} \entry {Brackets, active}{33} \entry {Breakpoints, inserting}{41} \entry {Breakpoints, suppressing}{41} \entry {Bugs}{131} \entry {Bugs, version 1.61}{126} \entry {built-in functions, redefining}{31} \entry {Bullet}{114} \entry {Bullet subscript}{115} \initial {C} \entry {C hints}{84} \entry {C++ hints}{85} \entry {Case, changing}{73, 78} \entry {Class options}{93} \entry {Code mode}{7} \entry {Code part, beginning unnamed}{40} \entry {Code, converting to \sc {Fweb}}{121} \entry {Code, temporarily commenting out}{61, 86} \entry {Code, typesetting}{7} \entry {Colon, pseudo}{59} \entry {Color}{117} \entry {Color mode, ANSI}{117} \entry {Color mode, bilevel}{117} \entry {Color mode, trilevel}{117} \entry {Color mode, user-defined}{117} \entry {Color, and message types}{117} \entry {Color, ANSI}{117} \entry {Color, setting}{18} \entry {Columns, multiple}{96} \entry {Commands, redefined}{124} \entry {Commentary, optional}{7} \entry {Commenting styles}{60} \entry {Comments}{52, 60} \entry {Comments, \sc {Fortran}}{27} \entry {Comments, generating}{68} \entry {Comments, ignorable}{52} \entry {Comments, ignore single-line Fortran}{25} \entry {Comments, invisible}{60} \entry {Comments, short}{37, 86} \entry {Comments, temporary}{61} \entry {Comments, \TeX{}}{31} \entry {Comments, verbatim}{32} \entry {Comments, visible}{60} \entry {Compiler directives}{53} \entry {Completion, automatic file-name}{12} \entry {Concatenation}{27} \entry {Condition, asserting}{68} \entry {Conditional, n-way}{71} \entry {Conditional, two-way}{71, 72} \entry {Contents, table of}{96} \entry {Control text}{55} \entry {Converting an existing code to \sc {Fweb}}{121} \entry {Cross-references, eliminating}{34} \entry {Cross-references, suppressing}{34} \entry {Customization}{107} \entry {Customizing \sc {Fweb}}{107} \initial {D} \entry {Date}{68} \entry {Date, generating the}{68} \entry {Day, generating the}{68} \entry {Debugging}{16, 38} \entry {Debugging macros}{70} \entry {Documentation format}{91} \entry {Dot constants, recognizing}{35} \initial {E} \entry {Environment variables}{71, 107} \entry {Environment, obtaining the}{71} \entry {Error messages, printing}{70} \entry {Escape sequences, ANSI}{118} \entry {Example, of \sc {Fweb} file}{6} \entry {Exponentiation}{71, 76, 87} \entry {Expression evaluation}{81} \entry {Expression, pseudo}{57} \entry {Expressions, evaluating}{70} \initial {F} \entry {Features, new}{124} \entry {Features, version 1.40}{129} \entry {Features, version 1.50}{128} \entry {Features, version 1.52}{127} \entry {Features, version 1.53}{126} \entry {Features, version 1.61}{125} \entry {File, including web}{43, 44} \entry {File, initialization}{108} \entry {File, opening output}{47} \entry {File, RCS}{76} \entry {File, style}{112} \entry {File-name completion}{12} \entry {Files}{12} \entry {Files, change}{13} \entry {Files, input}{12} \entry {Files, output}{13} \entry {Fonts}{92} \entry {Formatting}{91} \entry {\sc {Fortran} hints}{85} \entry {\sc {Fortran}, Rational}{89} \entry {Functions, built-in}{66} \entry {Functions, intrinsic}{18} \entry {FWEB output, inserting into LaTeX document}{99} \entry {\sc {Fweb}, customizing}{107} \entry {\sc {Fweb}, initializing}{108} \initial {H} \entry {Header}{71} \entry {Header comments, printing}{31} \entry {Headers}{98} \entry {Hexadecimal notation}{85} \entry {Hints, C}{84} \entry {Hints, C++}{85} \entry {Hints, \sc {Fortran}}{85} \entry {Hints, \TeX{}}{88} \initial {I} \entry {I/O keywords}{18} \entry {Identification}{71} \entry {Identifier, formatting}{42} \entry {Identifiers, overloading}{50, 102} \entry {Identifiers, single-character}{33} \entry {Identifiers, truncating}{32} \entry {Include file, formatting name of}{43} \entry {Include file, printing name of}{43} \entry {Include files, finding}{21} \entry {Include files, indexing}{21} \entry {Include files, inhibiting}{22} \entry {Include files, scanning}{20} \entry {Include files, skipping}{21} \entry {Index}{7, 96} \entry {Index entries, deleting}{54} \entry {Index entries, forcing}{54} \entry {Index entries, Roman type}{54} \entry {Index entries, typewriter type}{54} \entry {Index entries, underlining}{54} \entry {Index entries, user format}{54} \entry {Index, name of}{113} \entry {Index, stand-alone}{103} \entry {Indexes, merging}{105} \entry {Indexing commands}{54} \entry {Information options}{37} \entry {Initialization file}{108} \entry {Input line, number of}{72} \entry {Installing \sc {Fweb}}{132} \entry {Intrinsic functions}{18} \entry {Items, joining}{57} \initial {J} \entry {Joining items}{57} \initial {K} \entry {Keyword, RCS}{72, 73} \entry {Keyword, RCS-like}{50} \entry {Keywords, I/O}{18, 87} \initial {L} \entry {Language number}{74} \entry {Language, determining}{74} \entry {Language, determining the}{74} \entry {Language, global}{83} \entry {Language, setting}{18, 45, 83} \entry {Languages}{83} \entry {La\TeX{}}{93} \entry {La\TeX{} section}{95} \entry {La\TeX{}2e}{93} \entry {Left brace, inserting}{41} \entry {Length of string}{74} \entry {Level, message}{23} \entry {Limbo section}{8} \entry {Limbo text}{45} \entry {Line break, canceling}{57} \entry {Line break, forcing}{55} \entry {Line break, forcing with indent}{56} \entry {Line break, optional}{39, 56} \entry {Line number}{76} \entry {Line numbering, turning off}{48} \entry {Literate programming}{3} \entry {Lock}{75} \entry {Logarithms, base 10}{75} \entry {Logarithms, natural}{70, 75} \entry {Lower case}{73} \initial {M} \entry {Macros}{62} \entry {Macros, absolute value of}{68} \entry {Macros, debugging}{70} \entry {Macros, debugging with}{79} \entry {Macros, decrementing}{69} \entry {Macros, deferred}{31} \entry {Macros, defining}{69, 75} \entry {Macros, evaluating}{70} \entry {Macros, formatting}{79} \entry {Macros, \sc {Fweb}}{63} \entry {Macros, incrementing}{72} \entry {Macros, inhibiting expansion of}{59} \entry {Macros, outer}{62} \entry {Macros, preprocessing}{80} \entry {macros, redefining}{31} \entry {Macros, redefinition of}{64} \entry {Macros, repetitively defining}{69} \entry {Macros, special tokens for}{65} \entry {Macros, undefining}{78} \entry {Macros, with variable arguments}{64} \entry {Major section, beginning}{39} \entry {Major section, optional argument for}{39} \entry {Major subsection}{39} \entry {Makefiles, using}{5} \entry {Makeindex, using}{103} \entry {Marriage}{17} \entry {Maximum}{75} \entry {Memory allocation}{35, 108} \entry {Message level}{23} \entry {Message types}{117} \entry {Mininum}{75} \entry {Module name, beginning}{40} \entry {Module name, ending}{40} \entry {Module, name of}{75} \entry {Module, named}{9} \entry {Module, unnamed}{8} \entry {Modules}{8} \entry {Modules, missing}{77} \entry {Modules, number of}{75} \entry {Modules, warning level for}{32} \entry {\code {multicol}, using}{96} \initial {N} \entry {Named module}{9} \entry {Not equal}{37, 87} \entry {Notation, binary}{84, 85} \entry {Notation, hexadecimal}{85} \entry {Notation, octal}{85} \entry {Numbering blocks}{17, 25, 30} \initial {O} \entry {Octal notation}{85} \entry {Operators, overloading}{28, 49, 101} \entry {Operators, pseudo-}{57} \entry {Options, class}{93} \entry {Options, information}{16, 18, 35, 37} \entry {Options, negating}{16} \entry {Ouput, redirecting}{36} \entry {Outer macro, defining}{42} \entry {Outer macros, undefining}{49} \entry {Output files, changing names of}{13} \entry {Output line}{76} \entry {Output, changing appearance of}{16} \entry {Overloading}{101} \entry {Overloading identifiers}{102} \entry {Overloading operators}{101} \initial {P} \entry {Package, \code {fwebnum}}{98} \entry {Package, \code {multicol}}{96} \entry {Packages, user}{93} \entry {Page headers}{98} \entry {Page numbers}{98} \entry {Part, code}{5, 7} \entry {Part, definition}{5, 7} \entry {Part, \TeX{}}{5, 7} \entry {Parts}{5} \entry {Phases, of \sc {Ftangle}}{10} \entry {Phases, of \sc {Fweave}}{11} \entry {Pi}{76} \entry {Pound sign}{76} \entry {Preprocessing}{80} \entry {Preprocessor symbol}{76} \entry {Preprocessor, m4}{24} \entry {Preprocessor, sending additional arguments to}{33} \entry {Pretty-printing}{100} \entry {Printing, two-sided}{93} \entry {Processor, La\TeX{}}{28} \entry {Processor, \TeX{}}{28} \entry {Processors, \sc {Fweb}}{5} \entry {Program unit}{77} \entry {Programming tips}{122} \entry {Pseudo-colon}{59} \entry {Pseudo-expression}{57} \entry {Pseudo-operators}{57, 101} \entry {Pseudo-semicolon}{58} \entry {Pseudo-semicolons, automatic}{24, 58, 88} \initial {R} \entry {\sc {Ratfor}}{89} \entry {\sc {Ratfor} commands}{89} \entry {\sc {Ratfor}, caveats about}{90} \entry {Rational \sc {Fortran}}{89} \entry {RCS file}{76} \entry {RCS-like keyword}{50, 72, 73} \entry {Recursion}{64} \entry {Redefined commands, version 1.61}{124} \entry {References, forward}{51} \entry {Reserved words}{18} \entry {Revision}{76} \entry {Root, square}{77} \initial {S} \entry {Scientific programming}{123} \entry {Scrap, irreducible}{16} \entry {Section names, long}{39} \entry {Section names, short}{39} \entry {Section number, current}{77} \entry {Section number, maximum}{77} \entry {Section, beginning major}{39} \entry {Section, beginning minor}{39} \entry {Section, limbo}{8} \entry {Sections}{5} \entry {Sections, named}{6} \entry {Sections, numbering}{98} \entry {Sections, unnamed}{6} \entry {Semicolon, pseudo}{58} \entry {Semicolons, automatic}{24, 87} \entry {Semicolons, printing}{26} \entry {Sharp sign}{76} \entry {Spacing commands}{55} \entry {Spacing, thin space}{55} \entry {Square root}{77} \entry {State}{77} \entry {Statement numbers, automatic}{36} \entry {Statistics, printing}{30} \entry {String length}{74} \entry {String, definition of}{67} \entry {String, quoted}{67} \entry {String, quoting a}{77} \entry {String, unquoted}{67} \entry {Strings, continuing}{35} \entry {Strings, long}{35} \entry {Strings, parenthesized}{36} \entry {Strings, unquoting}{78} \entry {Style file}{112} \entry {Style file, changing name of}{35} \entry {Style file, for makeindex}{104} \entry {Subscript, bullet}{114} \entry {Subsection, beginning major}{39} \entry {Suggestions}{122} \entry {Support}{131} \entry {Syntax, command-line}{15} \entry {Syntax, free-form}{26, 88} \initial {T} \entry {Table of Contents}{96} \entry {Table of contents, entries for}{39} \entry {Tags, enum}{84} \entry {Tags, structure}{84} \entry {\TeX{} hints}{88} \entry {Text, control}{55} \entry {Time}{68, 77} \entry {Tokens, upper-case}{32} \entry {Transliteration}{78} \entry {Typesetting}{91} \initial {U} \entry {Unnamed module}{8} \entry {Upper case}{78} \entry {User packages}{93} \initial {V} \entry {Variable arguments}{64} \entry {Variables, environment}{107} \entry {Version number}{32} \entry {Version, of FWEB}{78} \entry {Vertical bar}{39, 56} \entry {Vertical bars}{7} \initial {W} \entry {Warning level for modules}{32} \entry {Web, structure}{5} \entry {Words, reserved}{18} fweb-1.62/Manual/fweb.fns100644 10061 1115 23754 6602703125 14420 0ustar krommesusers\initial {#} \entry {\code {#line}}{79} \initial {$} \entry {\code {$A}}{68} \entry {\code {$ABS}}{68} \entry {\code {$ASSERT}}{68} \entry {\code {$AUTHOR}}{68} \entry {\code {$COMMENT}}{68} \entry {\code {$DATE}}{68} \entry {\code {$DATE_TIME}}{68} \entry {\code {$DAY}}{68} \entry {\code {$DECR}}{69} \entry {\code {$DEFINE}}{69} \entry {\code {$DO}}{69} \entry {\code {$DUMPDEF}}{70} \entry {\code {$E}}{70} \entry {\code {$ERROR}}{70} \entry {\code {$EVAL}}{70} \entry {\code {$EXP}}{71} \entry {\code {$GETENV}}{71} \entry {\code {$HEADER}}{71} \entry {\code {$HOME}}{71} \entry {\code {$ID}}{71} \entry {\code {$IF}}{71} \entry {\code {$IFCASE}}{71} \entry {\code {$IFDEF}}{72} \entry {\code {$IFELSE}}{72} \entry {\code {$IFNDEF}}{72} \entry {\code {$INCR}}{72} \entry {\code {$INPUT_LINE}}{72} \entry {\code {$KEYWORD}}{50, 72} \entry {\code {$L}}{73} \entry {\code {$L_KEYWORD}}{50, 73} \entry {\code {$LANGUAGE}}{74} \entry {\code {$LANGUAGE_NUM}}{74} \entry {\code {$LEN}}{74} \entry {\code {$LOCKER}}{75} \entry {\code {$LOG}}{75} \entry {\code {$LOG10}}{75} \entry {\code {$M}}{75} \entry {\code {$MAX}}{75} \entry {\code {$MIN}}{75} \entry {\code {$MODULE_NAME}}{75} \entry {\code {$MODULES}}{75} \entry {\code {$NAME}}{75} \entry {\code {$OUTPUT_LINE}}{76} \entry {\code {$P}}{76} \entry {\code {$PI}}{76} \entry {\code {$POW}}{76} \entry {\code {$PP}}{76} \entry {\code {$RCSfile}}{76} \entry {\code {$REVISION}}{76} \entry {\code {$ROUTINE}}{77} \entry {\code {$SECTION_NUM}}{77} \entry {\code {$SECTIONS}}{77} \entry {\code {$SOURCE}}{77} \entry {\code {$SQRT}}{77} \entry {\code {$STATE}}{77} \entry {\code {$STRING}}{77} \entry {\code {$STUB}}{77} \entry {\code {$TIME}}{77} \entry {\code {$TRANSLIT}}{78} \entry {\code {$U}}{78} \entry {\code {$UNDEF}}{78} \entry {\code {$UNQUOTE}}{78} \entry {\code {$UNROLL}}{70} \entry {\code {$UNSTRING}}{78} \entry {\code {$VERBATIM}}{78} \entry {\code {$VERSION}}{78} \initial {-} \entry {\code {-}}{15} \entry {\code {-!}}{37} \entry {\code {-#}}{36, 87} \entry {\code {-(}}{36} \entry {\code {-.}}{35} \entry {\code {-/}}{37} \entry {\code {-:}}{36} \entry {\code {-=}}{36} \entry {\code {-@}}{16} \entry {\code {-+}}{37, 87} \entry {\code {->}}{36} \entry {\code {-{\tt\rawbackslashxx }}}{35} \entry {\code {-1}}{16} \entry {\code {-2}}{16} \entry {\code {-A}}{17} \entry {\code {-b}}{17} \entry {\code {-B}}{17} \entry {\code {-c}}{18} \entry {\code {-C}}{17, 117} \entry {\code {-c++}}{18} \entry {\code {-d}}{19} \entry {\code {-D}}{18} \entry {\code {-e}}{19} \entry {\code {-E}}{19} \entry {\code {-f}}{20} \entry {\code {-F}}{19} \entry {\code {-h}}{21} \entry {\code {-H}}{20} \entry {\code {-Hr}}{20} \entry {\code {-Hx}}{20} \entry {\code {-HX}}{20} \entry {\code {-i}}{21} \entry {\code {-I}}{21} \entry {\code {-ix}}{21} \entry {\code {-j}}{22} \entry {\code {-k}}{22, 87} \entry {\code {-l}}{23} \entry {\code {-L}}{22} \entry {\code {-m}}{23} \entry {\code {-M}}{23} \entry {\code {-m;}}{24} \entry {\code {-m4}}{24} \entry {\code {-n}}{24} \entry {\code {-n!}}{27, 88} \entry {\code {-n&}}{26} \entry {\code {-n)}}{27} \entry {\code {-n/}}{27} \entry {\code {-n:}}{25} \entry {\code {-n;}}{24, 58} \entry {\code {-n@;}}{24, 58} \entry {\code {-n{\tt\rawbackslashxx }}}{26} \entry {\code {-n9}}{24} \entry {\code {-nb}}{25} \entry {\code {-nC}}{25} \entry {\code {-np}}{26} \entry {\code {-o}}{28} \entry {\code {-p}}{28} \entry {\code {-P}}{28} \entry {\code {-r}}{29} \entry {\code {-r!}}{30} \entry {\code {-r)}}{30} \entry {\code {-r/}}{30} \entry {\code {-r;}}{30} \entry {\code {-r@;}}{30} \entry {\code {-r9}}{29} \entry {\code {-rb}}{30} \entry {\code {-rg}}{29} \entry {\code {-rk}}{29} \entry {\code {-rK}}{30} \entry {\code {-s}}{30} \entry {\code {-sm}}{30} \entry {\code {-t}}{32} \entry {\code {-T#}}{31} \entry {\code {-T%}}{31} \entry {\code {-Tb}}{31} \entry {\code {-TD}}{31} \entry {\code {-Tm}}{31} \entry {\code {-Tv}}{31} \entry {\code {-u}}{32} \entry {\code {-U}}{32} \entry {\code {-v}}{32} \entry {\code {-V}}{32} \entry {\code {-w}}{34} \entry {\code {-W}}{32, 34} \entry {\code {-W@}}{32} \entry {\code {-W[}}{33} \entry {\code {-W1}}{33} \entry {\code {-WH}}{33} \entry {\code {-x}}{34} \entry {\code {-X}}{34} \entry {\code {-XI}}{104} \entry {\code {-y}}{35} \entry {\code {-yb}}{108} \entry {\code {-ybs}}{109} \entry {\code {-ycb}}{109} \entry {\code {-ycf}}{109} \entry {\code {-ycg}}{109} \entry {\code {-yd}}{109} \entry {\code {-ydt}}{109} \entry {\code {-ydx}}{109} \entry {\code {-yid}}{109} \entry {\code {-yif}}{110} \entry {\code {-ykt}}{110} \entry {\code {-ykw}}{110} \entry {\code {-ylb}}{110} \entry {\code {-yll}}{110} \entry {\code {-yln}}{110} \entry {\code {-ylx}}{110} \entry {\code {-ym}}{110} \entry {\code {-yma}}{110} \entry {\code {-ymb}}{111} \entry {\code {-yn}}{111} \entry {\code {-ynf}}{111} \entry {\code {-yop}}{111} \entry {\code {-yr}}{111} \entry {\code {-ys}}{111} \entry {\code {-ysb}}{111} \entry {\code {-ytt}}{111} \entry {\code {-ytw}}{112} \entry {\code {-yx}}{112} \entry {\code {-yxb}}{112} \entry {\code {-z}}{35} \entry {\code {-Z}}{35} \initial {.} \entry {\code {.fweb}}{12, 108} \initial {@} \entry {\code {@}}{39} \entry {\code {@!}}{59} \entry {\code {@#}}{56} \entry {\code {@#define}}{80} \entry {\code {@#elif}}{80} \entry {\code {@#endif}}{80} \entry {\code {@#if}}{80} \entry {\code {@#ifdef}}{80} \entry {\code {@#ifndef}}{80} \entry {\code {@#line}}{80} \entry {\code {@#undef}}{80} \entry {\code {@%}}{52} \entry {\code {@%%}}{52} \entry {\code {@&}}{57} \entry {\code {@'}}{51} \entry {\code {@(}}{53} \entry {\code {@)}}{53} \entry {\code {@*}}{6, 39} \entry {\code {@,}}{55} \entry {\code {@-}}{54} \entry {\code {@.}}{54} \entry {\code {@/}}{55} \entry {\code {@/*}}{52} \entry {\code {@//}}{52} \entry {\code {@:}}{59} \entry {\code {@;}}{58} \entry {\code {@=}}{55} \entry {\code {@?}}{53} \entry {\code {@@}}{38} \entry {\code {@[}}{14, 52} \entry {\code {@]}}{14} \entry {\code {@_}}{54} \entry {\code {@"}}{51} \entry {\code {@|}}{39, 56} \entry {\code {@~}}{57} \entry {\code {@+}}{54} \entry {\code {@>}}{40} \entry {\code {@^}}{54} \entry {\code {@{\tt\rawbackslashxx }}}{56} \entry {\code {@<}}{40} \entry {\code {@0}}{38} \entry {\code {@1}}{38} \entry {\code {@2}}{38} \entry {\code {@9}}{54} \entry {\code {@a}}{40} \entry {\code {@A}}{40} \entry {\code {@b}}{41} \entry {\code {@B}}{41} \entry {\code {@c}}{41} \entry {\code {@c++}}{42} \entry {\code {@d}}{42} \entry {\code {@D}}{42} \entry {\code {@e}}{57} \entry {\code {@E}}{42} \entry {\code {@f}}{42} \entry {\code {@i}}{43} \entry {\code {@I}}{44} \entry {\code {@k}}{50} \entry {\code {@K}}{50} \entry {\code {@l}}{45} \entry {\code {@L}}{45} \entry {\code {@m}}{45} \entry {\code {@M}}{45} \entry {\code {@n}}{47} \entry {\code {@N}}{46} \entry {\code {@n9}}{47} \entry {\code {@o}}{47} \entry {\code {@O}}{47} \entry {\code {@q}}{48} \entry {\code {@r}}{49} \entry {\code {@R}}{49} \entry {\code {@r9}}{49} \entry {\code {@t}}{55} \entry {\code {@u}}{49} \entry {\code {@v}}{49} \entry {\code {@W}}{50} \entry {\code {@x}}{50} \entry {\code {@y}}{50} \entry {\code {@z}}{50} \initial {{\tt\indexbackslash }} \entry {\code {{\tt\rawbackslashxx }/}}{27} \entry {\code {{\tt\rawbackslashxx }beforeindex}}{96} \entry {\code {{\tt\rawbackslashxx }botofcontents}}{97} \entry {\code {{\tt\rawbackslashxx }documentclass}}{93} \entry {\code {{\tt\rawbackslashxx }documentstyle}}{93} \entry {\code {{\tt\rawbackslashxx }FWEBtoc}}{96} \entry {\code {{\tt\rawbackslashxx }idxname}}{106} \entry {\code {{\tt\rawbackslashxx }INDEX}}{7, 96, 113} \entry {\code {{\tt\rawbackslashxx }maketitle}}{97} \entry {\code {{\tt\rawbackslashxx }numbercode}}{98} \entry {\code {{\tt\rawbackslashxx }numberdefs}}{98} \entry {\code {{\tt\rawbackslashxx }numberline}}{97} \entry {\code {{\tt\rawbackslashxx }numberTeX}}{97} \entry {\code {{\tt\rawbackslashxx }pagerefs}}{97, 98} \entry {\code {{\tt\rawbackslashxx }pg}}{105} \entry {\code {{\tt\rawbackslashxx }section}}{95} \entry {\code {{\tt\rawbackslashxx }startindex}}{96} \entry {\code {{\tt\rawbackslashxx }subsection}}{95} \entry {\code {{\tt\rawbackslashxx }subsubsection}}{95} \entry {\code {{\tt\rawbackslashxx }title}}{97} \entry {\code {{\tt\rawbackslashxx }Title}}{97} \entry {\code {{\tt\rawbackslashxx }topofcontents}}{97} \entry {\code {{\tt\rawbackslashxx }topofindex}}{106} \entry {\code {{\tt\rawbackslashxx }twocolumn}}{96} \entry {\code {{\tt\rawbackslashxx }usepackage}}{93} \entry {\code {{\tt\rawbackslashxx }WARRAY}}{33} \entry {\code {{\tt\rawbackslashxx }Wbegin}}{94} \entry {\code {{\tt\rawbackslashxx }Wblock}}{17} \entry {\code {{\tt\rawbackslashxx }Wfin}}{96} \entry {\code {{\tt\rawbackslashxx }Wid}}{115} \entry {\code {{\tt\rawbackslashxx }WID}}{115} \entry {\code {{\tt\rawbackslashxx }WidD}}{116} \entry {\code {{\tt\rawbackslashxx }WIDD}}{116} \entry {\code {{\tt\rawbackslashxx }WidM}}{116} \entry {\code {{\tt\rawbackslashxx }WIDM}}{116} \entry {\code {{\tt\rawbackslashxx }WIF}}{43} \entry {\code {{\tt\rawbackslashxx }WIFfmt}}{43} \entry {\code {{\tt\rawbackslashxx }Wintrinsic}}{116} \entry {\code {{\tt\rawbackslashxx }Wkeyword}}{116} \entry {\code {{\tt\rawbackslashxx }WKEYWORD}}{116} \entry {\code {{\tt\rawbackslashxx }Wlbl}}{25, 87} \entry {\code {{\tt\rawbackslashxx }Wreserved}}{116} \entry {\code {{\tt\rawbackslashxx }WRESERVED}}{116} \entry {\code {{\tt\rawbackslashxx }Wshort}}{116} \entry {\code {{\tt\rawbackslashxx }Wtypewriter}}{116} \entry {\code {{\tt\rawbackslashxx }WXA}}{33} \initial {A} \entry {\code {ASCIIstr}}{51} \initial {C} \entry {\code {CONTENTS.tex}}{13} \initial {F} \entry {\code {fweb.sty}}{12, 112} \entry {\code {FWEB_HDR_INCLUDES}}{107} \entry {\code {FWEB_INCLUDES}}{108} \entry {\code {FWEB_INI}}{108} \entry {\code {FWEB_STYLE_DIR}}{108} \entry {\code {fwebinsert.sty}}{99} \entry {\code {fwebmac.sty}}{91, 92} \entry {\code {fwebmac.web}}{115} \entry {\code {fwebnum.sty}}{98, 100} \initial {I} \entry {\code {idxmerge.sty}}{105} \entry {\code {INDEX.tex}}{13} \initial {M} \entry {\code {MODULES.tex}}{13} \entry {\code {multicol.sty}}{96} \initial {T} \entry {\code {tempnam}}{19} \entry {\code {termcap}}{118} \entry {\code {termcap0}}{118} \entry {\code {tmpnam}}{19} fweb-1.62/Manual/fweb.vrs100644 10061 1115 7154 6602703125 14420 0ustar krommesusers\initial {A} \entry {\code {ASCII_Fcn}}{118} \initial {C} \entry {\code {cchar}}{118} \entry {\code {cdir_start}}{118} \entry {\code {Color.black}}{118} \entry {\code {Color.blue}}{118} \entry {\code {Color.cyan}}{118} \entry {\code {Color.default}}{118} \entry {\code {color.error}}{117} \entry {\code {color.fatal}}{117} \entry {\code {Color.green}}{118} \entry {\code {color.in_file}}{117} \entry {\code {color.include_file}}{117} \entry {\code {color.info}}{117} \entry {\code {color.line_num}}{117} \entry {\code {Color.magenta}}{118} \entry {\code {color.mod_name}}{117} \entry {\code {color.mod_num}}{117} \entry {\code {color.ordinary}}{117} \entry {\code {color.out_file}}{117} \entry {\code {color.program_name}}{117} \entry {\code {Color.red}}{118} \entry {\code {color.timing}}{117} \entry {\code {color.warning}}{117} \entry {\code {Color.white}}{118} \entry {\code {Color.yellow}}{118} \entry {\code {contents.postamble}}{114} \entry {\code {contents.preamble}}{114} \entry {\code {contents.tex}}{114} \initial {D} \entry {\code {delim_0}}{113} \entry {\code {delim_n}}{113} \entry {\code {dot_constant.begin}}{120} \entry {\code {dot_constant.end}}{120} \initial {E} \entry {\code {ext.ch}}{120} \entry {\code {ext.hch}}{120} \entry {\code {ext.hweb}}{120} \entry {\code {ext.web}}{120} \initial {F} \entry {\code {format.id}}{115} \entry {\code {format.ID}}{115} \entry {\code {format.intrinsic}}{115} \entry {\code {format.keyword}}{115} \entry {\code {format.KEYWORD}}{115} \entry {\code {format.outer_macro}}{115} \entry {\code {format.reserved}}{115} \entry {\code {format.RESERVED}}{115} \entry {\code {format.short_id}}{115} \entry {\code {format.typewriter}}{115} \entry {\code {format.WEB_macro}}{115} \initial {G} \entry {\code {group_skip}}{114} \initial {I} \entry {\code {indent.code}}{116} \entry {\code {indent.TeX}}{116} \entry {\code {index.collate}}{113} \entry {\code {index.name}}{113} \entry {\code {index.postamble}}{113} \entry {\code {index.preamble}}{113} \entry {\code {index.tex}}{113} \entry {\code {item_0}}{114} \initial {L} \entry {\code {language.prefix}}{114} \entry {\code {language.suffix}}{114} \entry {\code {LaTeX.class}}{116} \entry {\code {LaTeX.class.options}}{116} \entry {\code {LaTeX.options}}{116} \entry {\code {LaTeX.package}}{116} \entry {\code {LaTeX.package.options}}{116} \entry {\code {LaTeX.style}}{116} \entry {\code {lethead.flag}}{114} \entry {\code {lethead.prefix}}{114} \entry {\code {lethead.suffix}}{114} \entry {\code {limbo.begin}}{120} \entry {\code {limbo.end}}{120} \entry {\code {line_char}}{119} \entry {\code {line_length}}{119} \initial {M} \entry {\code {macros}}{119} \entry {\code {mark_defined.exp_type}}{115} \entry {\code {mark_defined.fcn_name}}{115} \entry {\code {mark_defined.generic_name}}{115} \entry {\code {mark_defined.outer_macro}}{115} \entry {\code {mark_defined.typedef_name}}{115} \entry {\code {mark_defined.WEB_macro}}{115} \entry {\code {meta}}{120} \entry {\code {meta.bottom}}{119} \entry {\code {meta.bottom.hdr}}{119} \entry {\code {meta.prefix}}{119} \entry {\code {meta.prefix.hdr}}{119} \entry {\code {meta.top}}{119} \entry {\code {meta.top.hdr}}{119} \entry {\code {modules.info}}{114} \entry {\code {modules.postamble}}{114} \entry {\code {modules.preamble}}{114} \entry {\code {modules.tex}}{114} \initial {N} \entry {\code {null_file}}{120} \initial {O} \entry {\code {outer.def}}{119} \entry {\code {outer.under}}{119} \initial {P} \entry {\code {preamble.named}}{120} \entry {\code {preamble.unnamed}}{120} \entry {\code {protect}}{119} \initial {S} \entry {\code {suffix}}{119} \initial {U} \entry {\code {underline.prefix}}{114} \entry {\code {underline.suffix}}{114} fweb-1.62/Manual/fweb.ps100644 10061 1115 3274204 6602703126 14316 0ustar krommesusers%!PS-Adobe-2.0 %%Creator: dvipsk 5.66a Copyright 1986-97 Radical Eye Software (www.radicaleye.com) %%Title: fweb.dvi %%Pages: 157 %%PageOrder: Ascend %%BoundingBox: 0 0 612 792 %%EndComments %DVIPSCommandLine: dvips -o fweb.ps fweb.dvi %DVIPSParameters: dpi=300, compressed %DVIPSSource: TeX output 1998.09.23:1805 %%BeginProcSet: texc.pro %! /TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N /X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72 mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1} ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if} forall round exch round exch]setmatrix}N /@landscape{/isls true N}B /@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{ /nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{ /sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0] N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{ 128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff .1 sub]/id ch-image N /rw ch-width 7 add 8 idiv string N /rc 0 N /gp 0 N /cp 0 N{rc 0 ne{rc 1 sub /rc X rw}{G}ifelse}imagemask restore}B /G{{id gp get /gp gp 1 add N dup 18 mod S 18 idiv pl S get exec}loop}B /adv{cp add /cp X}B /chg{rw cp id gp 4 index getinterval putinterval dup gp add /gp X adv}B /nd{/cp 0 N rw exit}B /lsh{rw cp 2 copy get dup 0 eq{pop 1}{ dup 255 eq{pop 254}{dup dup add 255 and S 1 and or}ifelse}ifelse put 1 adv}B /rsh{rw cp 2 copy get dup 0 eq{pop 128}{dup 255 eq{pop 127}{dup 2 idiv S 128 and or}ifelse}ifelse put 1 adv}B /clr{rw cp 2 index string putinterval adv}B /set{rw cp fillstr 0 4 index getinterval putinterval adv}B /fillstr 18 string 0 1 17{2 copy 255 put pop}for N /pl[{adv 1 chg} {adv 1 chg nd}{1 add chg}{1 add chg nd}{adv lsh}{adv lsh nd}{adv rsh}{ adv rsh nd}{1 add adv}{/rc X nd}{1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]dup{bind pop}forall N /D{/cc X dup type /stringtype ne{] }if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{ cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin 0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore userdict /eop-hook known{eop-hook}if showpage}N /@start{userdict /start-hook known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X /IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for 65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V {}B /RV statusdict begin /product where{pop false[(Display)(NeXT) (LaserWriter 16/600)]{dup length product length le{dup length product exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false} ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false RMat{BDot} imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M}B /d{ -3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{p 1 w} B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p a}B /bos{/SS save N}B /eos{SS restore}B end %%EndProcSet TeXDict begin 40258431 52099146 1000 300 300 (fweb.dvi) @start %DVIPSBitmapFont: Fa cmr12 12 49 /Fa 49 122 df<127012F812FCA212741204A41208A21210A212201240060F7CA20E>39 D<127012F8A3127005057C840E>46 D48 D<13801203120F12F31203B3A9EA07C0EAFFFE0F217CA018>III<1303A25BA25B1317A213271367134713 87120113071202120612041208A212101220A2124012C0B512F838000700A7EB0F80EB7F F015217FA018>I<00101380381E0700EA1FFF5B13F8EA17E00010C7FCA6EA11F8EA120C EA1C07381803801210380001C0A214E0A4127012F0A200E013C01280EA40031480382007 00EA1006EA0C1CEA03F013227EA018>I<137EEA01C138030080380601C0EA0C03121C38 1801800038C7FCA212781270A2EAF0F8EAF30CEAF4067F00F81380EB01C012F014E0A512 70A3003813C0A238180380001C1300EA0C06EA070CEA01F013227EA018>I<1240126038 7FFFE014C0A23840008038C0010012801302A2485A5BA25B5BA21360134013C0A21201A2 5B1203A41207A76CC7FC13237DA118>III<497EA3497EA3EB05E0A2EB09F01308A2EB1078A3497EA3497EA2EB C01F497EA248B51280EB0007A20002EB03C0A348EB01E0A348EB00F0121C003EEB01F839 FF800FFF20237EA225>65 DI<903807E0109038381830EBE0063901 C0017039038000F048C7FC000E1470121E001C1430123CA2007C14101278A200F81400A8 12781510127C123CA2001C1420121E000E14407E6C6C13803901C001003800E002EB381C EB07E01C247DA223>III< B612C0380F80070007130114001540A215601520A314201500A3146014E013FF13801460 1420A491C7FCA9487EEAFFFE1B227EA120>I<903807F00890383C0C18EBE0023901C001 B839038000F848C71278481438121E15185AA2007C14081278A200F81400A7EC1FFF0078 EB00F81578127C123CA27EA27E7E6C6C13B86C7E3900E0031890383C0C08903807F00020 247DA226>I73 D76 DI<39FF8007FF3907C000F81570D805E01320EA04F0A213 78137C133C7F131F7FEB0780A2EB03C0EB01E0A2EB00F014F81478143C143E141E140FA2 EC07A0EC03E0A21401A21400000E1460121FD8FFE0132020227EA125>III82 D<3803F020380C0C60EA1802383001E0EA70000060136012E0A21420A3 6C1300A21278127FEA3FF0EA1FFE6C7E0003138038003FC0EB07E01301EB00F0A214707E A46C1360A26C13C07E38C8018038C60700EA81FC14247DA21B>I<007FB512F839780780 780060141800401408A300C0140C00801404A400001400B3A3497E3801FFFE1E227EA123 >I<39FFFC07FF390FC000F86C4813701520B3A5000314407FA2000114806C7E90386001 00EB3006EB1C08EB03F020237EA125>I<3BFFF03FFC03FE3B1F8007E000F86C486C4813 7017206E7ED807801540A24A7E2603C0021480A39039E004780100011600A2EC083CD800 F01402A2EC101E01785CA2EC200F013C5CA20260138890391E400790A216D090391F8003 F0010F5CA2EC00016D5CA20106130001025C2F237FA132>87 D<397FF803FF390FE001F8 3907C000E06C6C5B00015CEBF001D800F890C7FCEB7802EB7C04133EEB1E08EB1F10EB0F B0EB07A014C06D7E130180497EEB0278EB047CEB0C3EEB081EEB101F496C7E140701407F 496C7E1401D801007F486D7E5AD81F807F3AFFC003FFC022227FA125>II< 387FFFFE387E003E0078133C007013781260004013F012C0EB01E0388003C0A2EB078012 00EB0F005B131E5BA25BA25B1201EBE001EA03C0A2EA07801403EA0F00001E1302A24813 06140E48131E00F8137EB512FE18227DA11E>I97 D99 D<14E0130F13011300ABEA01F8EA 0704EA0C02EA1C01EA38001278127012F0A7127012781238EA1801EA0C0238070CF03801 F0FE17237EA21B>II<147038 03F198380E1E18EA1C0E38380700A200781380A400381300A2EA1C0EEA1E1CEA33F00020 C7FCA212301238EA3FFE381FFFC06C13E0383000F0481330481318A400601330A2003813 E0380E03803803FE0015217F9518>103 D<121C123EA3121CC7FCA8120E127E121E120E B1EAFFC00A227FA10E>105 D<120E12FE121E120EB3ADEAFFE00B237FA20E>108 D<390E1FC07F3AFE60E183803A1E807201C03A0F003C00E0A2000E1338AF3AFFE3FF8FFE 27157F942A>I<380E1F8038FE60C0381E80E0380F0070A2120EAF38FFE7FF18157F941B> III114 DI<1202A412 06A3120E121E123EEAFFFCEA0E00AB1304A6EA07081203EA01F00E1F7F9E13>I<38FF83 FE381F00F0000E13C06C1380EB8100EA0383EA01C2EA00E41378A21338133C134E138FEA 0187EB0380380201C0000413E0EA0C00383E01F038FF03FE17157F941A>120 D<38FF80FE381E00781430000E1320A26C1340A2EB80C000031380A23801C100A2EA00E2 A31374A21338A31310A25BA35B12F05B12F10043C7FC123C171F7F941A>I E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fb cmbxti10 14.4 1 /Fb 1 47 df<120E123FEA7F80A212FFA21300127E123C0909798815>46 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fc cmcsc10 9 14 /Fc 14 120 df70 D82 D<1360A213F0A3EA0138A3EA021CA2487EA2EA07FEEA0807A2001013801303003813C038 FC0FF014137F9217>97 DI101 DI<3801F840380706C0EA0C01EA3800123000701340126000E01300A3EB1FF0 EB01C01260127012301238120CEA07023801FC4014137E9218>I108 D<38FC07F0381E01C0381F00801217EA1380EA 11C0A2EA10E0137013781338131C130EA21307130313011238EAFE0014137F9217>110 DI114 D116 D<38FF01F0383C00E0001C13C01480121E380E0100A2 EA0702A21386EA0384A2EA01C8A2EA00F0A31360A214137F9217>118 D<39FE1FE1F039380780E01540001C1480A2EB09C0000EEBC100A2EB10E1000713E2A2EB 20723803A074A2EBC03C00011338A2EB8018000013101C137F921F>I E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fd cmtt9 9 85 /Fd 85 127 df<126012F0AD12601200A4126012F0A212600417789614>33 DII<13801201A2EA07E0EA1FF0EA39BCEA619C EAC18EA3EAE184EA7180127FEA1FE0EA0FF0EA01F8139C138EEA418612E1A3EA718CEA39 B8EA1FF0EA0FC0EA0180A212000F1D7E9914>II<1207487EEA18C0EA38E0A35B3839CF80138F381F1C00121E A2EA0E38121EEA37701267EAE3F05B38E1C38013E3EA63F3383F3F00EA1E1E11177F9614 >I<126012F012F812781218A31230A2126012C01280050C789614>II<1280 12C01260123012381218121C120EA31207A9120EA3121C121812381230126012C0128008 1D7C9914>III<127012F8 12FCA2127C120C1218123012E012C0060A798414>II<127012F8 A312700505798414>I<1306130EA2131CA21338A21370A213E0A2EA01C0A2EA0380A3EA 0700A2120EA25AA25AA25AA25AA25A0F1D7E9914>II<1203A2 5A5A123F12F712471207AEEA7FF0A20C177C9614>II<137813F8EA01B8A2EA0338A21206120E120C121C12381230127012E0B512 80A238003800A548B4FCA211177F9614>52 D57 D<127012F8A312701200A6127012F8A312700510798F14>I<1270 12F8A312701200A6126012F012F8A2127812181230127012E012800515798F14>I<1306 131E133E13F8EA01F0EA03C0EA0F80EA1F00123C12F85A7E123C121FEA0F80EA03C0EA01 F0EA00F8133E131E13060F157E9514>II<12C012F07E123E7EEA0780EA03E0EA01F0EA0078133E131E133E1378EA01F0EA03 E0EA0780EA1F00123E12F85A12C00F157E9514>IIIII<3801F180EA07FFEA0E1FEA1C071238EA7003A348C7FCA738700380A338380700121C EA0E0EEA07FCEA01F011177F9614>IIIII<38FE3F80A238380E00A8EA3FFEA2EA380EA938FE3F80A211177F9614>II75 DI<38FC1F80A2007C1300EA7637A4EA7777 A2EA7367A313E7EA71C7A2EA7007A638F80F80A211177F9614>I<38FE3F80A2383E0E00 123BA4138E1239A213CEA31238A213EE136EA4133E12FEA211177F9614>IIIIII<387FFF80B5FCEAE1C3A43801C000AFEA0FF8A211177F9614>I<38FE0FE0 A238380380B0381C0700A2EA0E0EEA07FCEA01F01317809614>I<38FC1F80A238380E00 A3EA3C1EEA1C1CA46C5AA4EA0630EA0770A3EA0360A213E0A26C5A11177F9614>I<38FC 1F80A238700700A7EA31C6EA33E6EA3BEE136EA5EA1B6CA2EA1A2CEA1E3CA311177F9614 >II<38FC1F80A238380E00EA3C1EEA 1C1CEA1E3CEA0E38A26C5AA2EA036013E0A26C5AA8EA07F0A211177F9614>III<12C07EA21270 A27EA27EA27EA27EA2EA0380A3EA01C0A2EA00E0A21370A21338A2131CA2130EA213060F 1D7E9914>II<1204121FEA7FC0EAF1E012E00B 057C9614>II97 D<12FCA2121CA513F8EA 1DFEEA1F07EA1E03001C1380EB01C0A6EB0380001E1300EA1F0EEA1DFCEA0CF812178096 14>II<137EA2130EA5EA07CEEA0FFEEA1C3EEA301EEA700E12E0A61270 EA301EEA383E381FEFC0EA07CF12177F9614>II<13FCEA 01FEEA038EEA07041300A3EA7FFE12FFEA0700ACEAFFF8A20F177F9614>II<12FCA2121CA513 78EA1DFEEA1F86EA1E07121CAA38FF8FE0A21317809614>I<1206120FA21206C7FCA4B4 FCA21207ACEAFFF8A20D187C9714>I<136013F0A213601300A4EA1FF0A2EA0070B2EA40 E0EAE0C0EA7F80EA3F000C207E9714>I<12FCA2121CA5EBFF80A2EB1C005B5B5BEA1DC0 EA1FE0A2EA1E70EA1C38133C131C7F38FF1F80A21117809614>III< EAFC78EAFDFEEA1F86EA1E07121CAA38FF8FE0A21310808F14>IIIIII<1206120EA4EA7FFC12 FFEA0E00A8130EA3131CEA07F8EA01F00F157F9414>II<38FE3F80A2383C1E00EA1C1CA36C5AA3EA0630EA0770A36C5A A311107F8F14>I<38FE3F80A238700700EA380EA3EA39CEA3EA1B6C121AA3EA1E7CA2EA 0E3811107F8F14>II<38FE3F80A2381C0E005BA2120E5BA212071330A2 EA0370A25B1201A25BA3485A12730077C7FC127E123C11187F8F14>I I<12E0B3AB031D789914>124 D126 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fe cmsl9 9 1 /Fe 1 47 df<1270A212F0126004047D830B>46 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Ff cmr9 9 65 /Ff 65 123 df11 D<13FEEA038138060180EA0E03381C010090C7FCA5B51280EA1C 03AE38FF8FF0141A809915>I<126012F0A212701210A31220A21240A2040B7D830B>44 DI<126012F0A2126004047D830B>I<1304130C1318A31330A313 60A313C0A3EA0180A3EA0300A31206A35AA35AA35AA35AA35AA20E257E9B13>II<12035AB4FC1207B3A2EA7FF80D187D9713>III<1318A21338137813F813B8EA01381202A2120412081218 12101220124012C0B5FCEA0038A6EA03FF10187F9713>III<1240EA7FFF13FEA2EA4004EA80081310A2EA00201340A21380120113005AA25A1206 A2120EA5120410197E9813>III<137F380180C03806003000081308487F38203E0213E13841C081384380710083EB70 80EA8700A6EA838012433941C0F1003820E131EB3E1E6CC8FC7E0006EB03803901803E00 38007FE0191A7E991E>64 D<130CA3131EA2132F1327A2EB4380A3EB81C0A200017F1300 A248B47E38020070A2487FA3487FA2003C131EB4EBFFC01A1A7F991D>IIIIII<39 FFE1FFC0390E001C00AB380FFFFC380E001CAC39FFE1FFC01A1A7F991D>72 DII<39FFE01FC0390E000F00140C14085C5C5C495A0102C7FC5B13 0C131C132E1347EB8380EA0F03380E01C06D7EA2147080A280141E141F39FFE07FC01A1A 7F991E>III<00FEEB7FC0000FEB0E001404EA 0B80EA09C0A2EA08E01370A21338131CA2130E1307EB0384A2EB01C4EB00E4A21474143C A2141C140C121C38FF80041A1A7F991D>I<137F3801C1C038070070000E7F487F003C13 1E0038130E0078130F00707F00F01480A80078EB0F00A20038130E003C131E001C131C6C 5B6C5B3801C1C0D8007FC7FC191A7E991E>II82 DI<007FB5FC38701C0700401301A200C0148000801300A300001400B138 03FFE0191A7F991C>I<39FFE07FC0390E000E001404B200065B12076C5B6C6C5A3800E0 C0013FC7FC1A1A7F991D>I<39FF801FC0391C00070014066C1304A36C5BA26C6C5AA36C 6C5AA26C6C5AA3EB7080A213790139C7FCA2131EA3130CA21A1A7F991D>I<3AFF81FF07 F03A3C007801C0001CEC0080A36C90389C0100A33907010E02A33903830F04EB8207A215 0C3901C40388A33900E801D0A390387000E0A301305B01201340241A7F9927>I<39FFC0 FF80390F003C0014106C5BEA03806D5A00015BEA00E101F1C7FC137A133E131C131EA213 17EB27801343EB41C0EB81E0EA010048137000021378481338000C7F001E133EB4EB7FC0 1A1A7F991D>I97 D<12FC121CA913FCEA1D07381E0380381C01C01300 14E0A6EB01C01480381E0300EA1906EA10F8131A809915>II<133F1307A9EA03E7EA0C17EA 180F487E127012E0A6126012706C5AEA1C373807C7E0131A7F9915>I III<12FC121CA9137CEA1D87381E0380A2 121CAB38FF9FF0141A809915>I<1218123CA212181200A612FC121CAE12FF081A80990A> I I<12FC121CA9EB1FC0EB0F00130C5B13205B13E0121DEA1E70EA1C7813387F131E7F1480 38FF9FE0131A809914>I<12FC121CB3A6EAFF80091A80990A>I<38FC7C1F391D8E638039 1E0781C0A2001C1301AB39FF9FE7F81D107F8F20>IIIIIII<12 08A41218A21238EAFFC0EA3800A81320A41218EA1C40EA07800B177F960F>I<38FC1F80 EA1C03AB1307120CEA0E0B3803F3F01410808F15>I<38FF0F80383C0700EA1C061304A2 6C5AA26C5AA3EA03A0A2EA01C0A36C5A11107F8F14>I<39FE7F1F8039381C0700003C13 06381C0C04130E380E16081317A238072310149013A33803C1A014E0380180C0A319107F 8F1C>I<38FE3F80383C1E00EA1C086C5AEA0F306C5A6C5A12017F1203EA0270487E1208 EA181CEA381E38FC3FC012107F8F14>I<38FF0F80383C0700EA1C061304A26C5AA26C5A A3EA03A0A2EA01C0A36C5AA248C7FCA212E112E212E4127811177F8F14>II E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fg cmtt12 14.4 11 /Fg 11 121 df<126012F0A27E1278127C123C123E121E121F7E7F12077F12037F1201A2 7F12007F1378137C133C133E131E131F7F14801307A214C0130314E0130114F0130014F8 1478147C143C143E141E141F140FA21406182F7DA91F>92 D97 D100 D<137F3801FFC0000713E0380F81F0381F0078123E003C133C5A141E127012F0B512FEA3 00F0C7FCA21278A36C131E7E001F133E380FC0FC3803FFF86C13F038003F80171A7D991F >I<90387C0F803901FF3FC00007EBFFE0380F83F1D81F0113C0391E00F000481378A66C 5BEA1F01380F83E048B45A001D90C7FCEA1C7C003CC8FCA37E381FFFE06C13F814FE487F 393C003F8048130FEC07C0481303A40078EB0780A2003EEB1F00381F807E6CB45A000313 F038007F801B287E991F>103 D<137013F8A3137090C7FCA7EA7FF812FF127FEA0078B3 A2B512F8A315267BA51F>105 D107 D<38FE3C0F9038FE3F80B5EA7FC0381FCFF3903887E1E0EB07C1A2001E1381B039FFC7F1 FCEBCFF3EBC7F11E1A80991F>109 D<387F83F038FF8FFC387FBFFE3807FC1FEBF00F90 38E0078013C0A21380AF397FF87FF839FFFCFFFC397FF87FF81E1A80991F>I<387FE07E 39FFE1FF80D87FE313C03801EF87EBFF079038FC038049C7FCA25BA35BAC387FFFE0B5FC 7E1A1A7E991F>114 D<397FF1FFC015E015C03907C07C003803E078000113F83800F1F0 EBF9E0137F6D5A5C131F6DC7FC5B80497EEB79E013F9EBF0F048487E0003137CEBC03C38 07803E397FF0FFE0D8FFF913F0D87FF013E01C1A7F991F>120 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fh cmti10 10.95 7 /Fh 7 121 df<127012F8A212F012E005057B840E>46 D<137CEA01C2EA0701120E121C 123CEA3802EA780CEA7BF0EA7C0012F0A4127013011302EA3804EA1838EA07C010147C93 15>101 D<3801C1E0380262183804741C1378EB701EA2EA08E01200A33801C03CA31438 38038078147014E0EBC1C038072380EB1E0090C7FCA2120EA45AA2B47E171D809317> 112 D114 D<13FCEA0302EA0601EA0C03130713061300EA0F8013F0EA07F8EA03FC EA003E130E1270EAF00CA2EAE008EA4010EA2060EA1F8010147D9313>II<38038380380CC440381068E013711220EB70C03840E0001200A3485AA31440 3863808012F3EB810012E5EA84C6EA787813147D9315>120 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fi cmr7 7 3 /Fi 3 50 df<1360AAB512F0A238006000AA14167E9119>43 D<120FEA30C0EA6060A2EA 4020EAC030A9EA4020EA6060A2EA30C0EA0F000C137E9211>48 D<120C121C12EC120CAF EAFFC00A137D9211>I E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fj cmmi7 7 4 /Fj 4 122 df99 D<133C130C1318A41330EA07B0EA0C701210EA30601260A3EAC0C013 C8A21241EA62D0EA3C700E147E9311>I120 DI E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fk cmmi10 10.95 8 /Fk 8 121 df<380FFFFC4813FE4813FC3860820012C01281EA010613041203A21202EA 060C130E120CA2121CA2EA180FEA3807EA300617147E931A>25 D<127012F8A312700505 7C840D>58 D60 D<12E01278121EEA0780EA01E0EA0078131C1307EB03C0EB00F0143C 140FEC03C0A2EC0F00143C14F0EB03C049C7FC131C1378EA01E0EA0780001EC8FC127812 E01A1A7C9723>62 D97 DI<137CEA0182EA0701120E121C 123CEA3802EA780CEA7BF0EA7C0012F0A4127013011302EA3004EA1838EA0FC010147E93 15>101 D<3803C1C0380C622038103470EB38F012201460384070001200A35BA3142038 61C04012F1148012E238446300EA383C14147E931A>120 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fl cmbxsl10 13.15 4 /Fl 4 111 df<123C127E12FFA312FE127C123808087B8711>46 D63 D108 D<390FF81FE0EC7FF89038F9E07C3801F3809038F600 7E13FCA25BA2484813FCA63907E001F8A6397FFC1FFFA200FF5B20187E9723>110 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fm cmsltt10 10.95 5 /Fm 5 53 df<133E13FF000313803807C3C0EA0F01000E13E0EA1C00123C003813F01470 5AA34813E0A4EB01C0A2130300F01380EA7007EB0F00EA781E6C5AEA1FF85BEA07C0141C 7C9B18>48 D<13181338A2137813F81203120F137012041200A413E0A6EA01C0A6EA7FFE 12FF127F0F1C7B9B18>II<137F3803FFC04813E0380F80F0EB00701438 1206C71270A2EB01E01303EBFF8014001480EB03C0EB01E01300A2147014E0127012F0EB 01C0EAE00338780F80387FFF00EA1FFCEA07F0151C7D9B18>II E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fn cmtt12 13.14 84 /Fn 84 127 df<127012F8B3A212701200A6127012F8A31270052175A01C>33 DII<13301370A4EA01FC3807FF80001F13C0383E73E038 7871F0EA707000E01378A400F013001270127CEA3FF06C7E6CB4FC0003138038007FC0EB 77E0EB71F0EB707014780060133812F0A314701278007C13E0EA3E73381FFF8000071300 EA01FCEA0070A41330152B7DA51C>I<001C1360003E13F0127F130138F781E0A2138314 C0A213871480EA7F07130F003E1300121CC65A131EA2133E133CA2137C1378A213F85BA2 1201EBE07014F83803E1FC13C1EBC3DE12071383A2120F1303A2381F01FC121EEB00F800 0C1370172B7EA51C>I<13F0EA01FC487EEA079E130F120FA3130E131EEB1C7F133CEA07 F8EBF0F013E0A23803C1E01207EA0FE1EBE3C0EA1DF3383CF780EA78FFEA707F38F03F00 A2EB1E0F133F0070138F3878FFCE383FF3FE381FE1FC3807807818217FA01C>I<121C12 3E123F1380121F1203A4EA0700A25A120E123C127C12F01260091177A01C>I<131C133C 137813F0EA01E0EA03C0EA0780EA0F00120E121E121C123C12381278A35AAA1278A31238 123C121C121E120E120FEA0780EA03C0EA01E0EA00F0137C133C131C0E2A77A51C>I<12 6012F012787E7E7EEA0780EA03C0120113E0120013F013701378A3133CAA1378A3137013 F013E0120113C01203EA0780EA0F00121E5A5A5A12600E2A7CA51C>I<1370A500701370 38FC71F8387E73F0EA7FFF001F13C000071300EA01FCEA07FF001F13C0007F13F0EA7E73 38FC71F83870707000001300A515177D9B1C>I<1318133CA9387FFFFCB512FEA26C13FC 38003C00A9131817187E9C1C>I<1218123E127E127F123F121F1207A2120E121E123C12 F812F012C0080E76851C>I<387FFFF0B512F8A26C13F015047D921C>I<1230127812FCA2 12781230060675851C>I<14301478A214F814F0130114E0130314C0A213071480130F14 005B131E133E133CA2137C137813F85B12015BA212035B12075B120F90C7FC5A121EA212 3E123C127C127812F85AA21260152B7DA51C>I<137C48B4FC000713C0380F83E0130138 1E00F0481378A248133CA30070131C00F0131EA90078133CA3007C137C003C1378003E13 F8001E13F0380F01E013833807FFC000011300EA007C17217EA01C>I<13E0A21201A212 031207121F12FF12F912611201B3A2387FFF80B512C06C138012217BA01C>II52 D<13FE3803FF80000F13 C0381F83E0383E00F048137812780070133C12F0A3143EA31278007C137E6C13FEEA1F03 380FFFDE0003139E3800FC1EEB003CA31478A2001813F0383C01E01303383E0FC0381FFF 006C5AEA03F017217EA01C>57 D<1230127812FCA2127812301200AB1230127812FCA212 781230061775961C>I<1218123C127EA2123C12181200AB1218123C127EA2123E121E12 0EA2121CA2123812F812F012C0071F76961C>I<143014F81301EB03F0EB0FE0EB1F80EB 7F0013FEEA03F8485AEA0FC0EA3F80007EC7FC5AA2127E6C7EEA0FC0EA07F06C7EEA00FE 137FEB1F80EB0FE0EB03F0EB01F813001430151C7D9E1C>I<387FFFFCB512FEA26C13FC C8FCA6387FFFFCB512FEA26C13FC170E7E971C>I<126012F87E127E6C7EEA0FC0EA07F0 6C7EEA00FE137FEB1F80EB0FE0EB03F0EB01F8A2EB03F0EB0FE0EB1F80EB7F0013FEEA03 F8485AEA0FC0EA3F80007EC7FC5A5A1260151C7D9E1C>II<131FEB7FC03801FFF0EA03E038078078380F0038381E07BC38 3C1FFC133F3878787EA2EBF03E12F038F1E01EA738F0F03C1278EB7878A2383C3FF0EB1F E0381E07806CC7FC3807800E3803E03E3801FFFE38007FF8EB1FC017217EA01C>I<133E A2137FA21377A3EBF780A213E3A200017FA413C100037FA4380780F013FFA31380380F00 78A448137C387FC1FF00FF1480007F140019217FA01C>IIII<007FB5FC B6FC7E380F000FA591C7FCA3EB03C0A313FFA31303A390C8FCA4EC0780A6007FB5FCB6FC 7E19217FA01C>I<007FB5FCB6FC7E380F000FA51400A4EB01E0A313FFA31301A390C7FC A9EA7FF0487E6C5A18217FA01C>II<39FFC1FF80A3391E003C00AB381FFFFCA3 381E003CAD39FFC1FF80A319217FA01C>II<38FFC3FE805C381E00F8495A5C1303495A495A91C7FC5B133E133C137C13FCEA1F FEA27F13CFEB8F8013076D7E121E6D7EA26D7EA21478A28038FFC0FF1580150019217FA0 1C>75 DI< 397F803FC000FF14E0397FC07FC0001EEB6F00A2EBE0EFA413F1EB71CFA3137BA2EB3B8F A3133FEB1F0FA2130E1300A8397F803FC039FFC07FE0397F803FC01B2180A01C>I<39FF 81FF8013C1A2391EC03C00A213E0A31370A313781338A2133CA2131C131EA2130EA2130F 1307A3EB03BCA31301A238FFC1FCA213C019217FA01C>II<387FFF80B512E06C13F8380F00FC143E141EA2140FA5141EA2143E 14FCEBFFF814E0148090C7FCABEA7FE0487E6C5A18217FA01C>III<3803F870EA0FFE381F FFF0EA3E0FEA78031301EAF000A414001278127CEA3F80EA1FF86CB4FC000313C038007F E01307EB01F013001478A2127012F0A214706C13F0EAFC0138FF03E0EBFFC000E7138038 E1FE0015217DA01C>I<007FB51280B6FCA238F01E07A5000090C7FCB3A43801FFE0487F 6C5B19217FA01C>I<397FE0FFC0D8FFF113E0D87FE013C0390F001E00B3A46C131CEB80 3CA26C6C5A6C6C5A6CB45A6D5A011FC7FC1B2180A01C>I<39FF80FF8013C11380391E00 3C00A36C5BA46C6C5AA413C100035BA43801E3C0A400005BA213F7A20177C7FCA2137FA2 133EA219217FA01C>II<38 7FC3FE13E713C3380F81F000075B13C13803C3C013E33801E78013F7EA00FF91C7FC7F13 7E133E133C133E137E137F5BEBF780EA01E7EBE3C01203EBC1E0A2380781F0138048487E 1478387FC1FF00FF1480007F140019217FA01C>I<39FF80FF8013C11380391F003C006C 137CEB8078000713F85CEA03C15CEA01E113E33800F3C0A25C1377017FC7FC7FA2131EAB EBFFC0A319217FA01C>I<383FFFFE5AA23878003C147C147814F01301000013E0EB03C0 13071480EB0F005B131E5B137C13785B12015B485A12075B380F001E5A121E5A127C1278 B512FEA317217EA01C>II<126012F0A27E 1278127C123C123E121EA2121F7E7F12077F12037F1201A27F12007F1378137C133CA213 3E131E131F7F1480130714C01303A214E0130114F0130014F81478A21430152B7DA51C> I<13C0EA03E0EA0FF8EA3FFE38FE3F80EAFC1FEAF0073840010011087BA01C>94 D<387FFFF0B512F8A26C13F015047D7E1C>I97 DIII<13FCEA03FF000F13C0381F03E0EA3E01383C00F05A1470481378A2B512F8A3 00F0C7FCA2127814787E003E13F8381F81F0380FFFE0000313C03800FE0015177D961C> IIII<13E0487EA36C5A90C7FCA6EA7FF012FF127F1200B1B512E0A313227CA11C> I<1307EB0F80A3EB070090C7FCA63807FF805A7EEA0007B3A714005BEAF01F133EEAFFFC 6C5AEA1FE0112E7DA11C>III<387E78 3C38FEFE7F007FB5FC391FCFE780EB0F87A2001E1307AE397F8FC7E039FFCFE7F0397F8F C7E01C1780961C>I<38FF0F80EB3FE0EBFFF0EA0FF0EBC0781380A21300AD39FFF1FF80 A319177F961C>I<13FE3803FF80000F13E0381F83F0383E00F8003C137848133CA24813 1EA66C133E0078133C007C137C003C1378003E13F8381F83F0380FFFE0000313803800FE 0017177E961C>I<38FF1F80EB7FE0EBFFF0380FE0F8EBC07CEB803CEB001EA2140FA714 1E1380143CEBC07CEBE0F8EBFFF0EB7FC0EB1F0090C7FCA9EAFFF0A318237F961C>II<38FFC1FCEBC7FEEBCFFF38 03DE0FEBFC06EBF8005B5BA25BABB5128014C0148018177E961C>I<3803F9C0EA1FFF5A EA7807EAF00312E0A212F0007EC7FCEA7FF8EA1FFF0007138038007FE01303387000F000 F01370A27E6C13E0EAFE03B512C000EF138038E1FC0014177C961C>I<13E01201A6387F FFF8B5FCA23801E000AB143CA53800F078EBFFF8EB7FE0EB1F80161E7F9D1C>I<38FF07 F8A3380F0078AE14F8A2EA078390B512806C137FEA00FC19177F961C>I<387FE3FF00FF 1480007F1400380F0078A2EB80F800075BA213C100035BA33801E3C0A300005B13F7A301 7FC7FCA3133E19177F961C>I<39FFE3FF80A3393C001E006C5BA5133E137F000E1338A2 380F6778A4000713701363EBC3F0A3380381E019177F961C>I<387FE3FEEBE7FFEBE3FE 3807C1F03803C3E0EBE3C0EA01F76CB45A6DC7FC137E133EA2137E137FEBF780EA01E7EB E3C03803C1E000077F1380387FE3FF00FF1480007F140019177F961C>I<387FE3FF00FF 1480007F1400380F00781380000713F85C13C01203EBC1E0EA01E1A25CEA00E313F35C13 73A21377013FC7FCA3131EA35BA35B1230EA78F01279EA7FE06C5A6CC8FC19237F961C> I<383FFFFC5AA2387800F8EB01F0EB03E0EB07C038000F80EB1F00131E5B5B5B485A1203 485A380F803CEA1F00123E5AB512FCA316177E961C>I<126012F0B3B3A51260042B74A5 1C>124 D<000713C0381FC1E0EA3FF338F9FF8038F07F00EA601C13067CA01C>126 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fo cmcsc10 12 19 /Fo 19 120 df45 D<13FCEA0387380E01C0381C00E000181360 00381370A2481338A300F0133CAE00701338A20078137800381370A26C13E0A2380E01C0 38038700EA00FC16227DA01C>48 D<13FCEA03FF380F0380381C01C0383C00E000381370 5A147800F01338A3143CA40070137C127812386C13BC380C013CEA0706EA01F8C7123814 78A214701238007C13E0EB01C012783830078038380F00EA1FFCEA07F016227DA01C>57 D70 D82 D<1304130EA3131FA2EB2F801327A2EB43C0A2EBC3E01381A248C67EA2487F13FF380200 78487FA3487F1218003C131F00FEEB7FE01B1A7F991F>97 DI101 DII105 D108 D<00FEEB01FE001E14F0A200171302A238138004A33811C008A23810E010A3EB7020A3EB 3840A2EB1C80A3EB0F00A21306123800FEEB07FE1F1A7E9925>I<00FEEB3F80001FEB0E 00EB80041217EA13C0EA11E013F012101378137C133C131E130F14841307EB03C4EB01E4 A2EB00F4147CA2143C141C140C123800FE1304191A7E991F>II114 D<007FB5FC38701E0700601301124000C0148000801300A30000 1400B0133F3803FFF0191A7F991D>116 D<39FFC00FE0393F000380001E14007E140213 8000075BA26C6C5AA2EBE01800011310A26C6C5AA2EB7840A2137CEB3C80A2011FC7FCA3 130EA213041B1A7F991F>118 D<3AFFC1FF81FC3A3E007E0078001E013C13701620001F 013E13606C1540A22607804F1380A33A03C0878100A33901E103C2A33900F201E4A215F4 90387C00F8A301381370A301101320261A7F992A>I E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fp cmb10 10.95 35 /Fp 35 122 df12 D45 D<1307A3497EA2497EA3497E1337A2EB63F0A3EBC1F8A3380180FCA33803007EEBFFFE48 7F3806003FA2000EEB1F80120CA2001CEB0FC039FF80FFF8A21D1F7E9E22>65 DI<90380FF0109038 7FFC703901FC0EF03803E003380FC001381F8000A248C71270A2007E1430A212FE1500A8 007E1430A27E15706C6C136015E06C6C13C03903E003803901FC0F0038007FFCEB0FF01C 1F7E9E21>III73 D<39FFC007FEA2390FE000607FEA0DF8A2EA0CFC137EA27FEB1F80EB0FC0A2EB07E0EB03 F014F81301EB00FC147EA2143FEC1FE0140FA214071403A214011400D8FFC01360A21F1F 7E9E24>78 D<3803F040380FFDC0EA1C0FEA3803EA7001A2EAF000A36C13007EB47EEA7F F8EA3FFEEBFF806C13C01207C613E0130FEB03F01301130012C0A36C13E0130100F813C0 38FE038038EFFF00EA81FC141F7E9E19>83 D<007FB512C0A2387C1F8300701381006013 80A200E014E000C01460A400001400B13807FFFEA21B1E7E9D20>I<39FFFC0FFCA2390F C000C0B3A40007EB018013E00003EB03006C6C5A3800F81EEB3FF8EB0FE01E1F7E9E23> I97 DIII I<137F3801FF803807C7C0EA0F8F130F121FEB078090C7FCA5EAFFF0A2001FC7FCB0EAFF F0A212207F9F0E>I<3803F0E0380FFDF0EA1E1EEA3C0F007C1380A5003C1300EA1E1EEA 1FFCEA33F00030C7FCA21238EA3FFEEBFF806C13C04813E0387803F0EA700012F0A43878 01E0383E07C0381FFF803803FC00141E7F9317>II<121C123E127FA3123E121CC7FCA6B4FCA2121F B0EAFFE0A20B217FA00C>I107 DI<39FE0F80F890383FC3FC391E63E63E9038 C1FC1FEB81F8381F01F0AD3AFFE7FE7FE0A223147E9326>IIII114 DI<1203A4 5AA25AA2123FEAFFF8A2EA1F00AA130CA5EA0F98EA07F0EA03E00E1D7F9C12>I<38FF1F E0A2EA1F03AE1307EA0F0F3807FBFCEA03F316147E9319>I<38FFC3F8A2381F00C0A238 0F8180A33807C300A213E7EA03E6A2EA01FCA36C5AA31370A215147F9318>I<39FFCFF1 FCA2391F03C0701560EB07E0D80F8713C0A2EB8CF03907CCF180A2EBD8793903F87B00A2 147F497E0001133EA2EBE01E0000131CEBC00C1E147F9321>I<38FFCFF0A2381F038038 0F8300EA078613CEEA03FC6C5A5B6C7E137813FC487EEA039E131F38060F80EA0E07000C 13C038FF1FF8A215147F9318>I<38FFC3F8A2381F00C0A2380F8180A33807C300A213E7 EA03E6A2EA01FCA36C5AA31370A21360A2EA78E0EAFCC0A2EAC18012E3007FC7FC123C15 1D7F9318>I E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fq cmbx12 13.14 73 /Fq 73 124 df<903907FC0FE090393FFF3FF89039FC03FC783A03F007F0FC3807E00F15 E0D80FC0147802071300A7B71280A23A0FC007E000B3A239FFFC7FFFA226267FA524>11 DI<903807FFE0133FEBFC073803F00F EA07E0A2380FC007A8B6FCA2380FC007B3A239FFFC7FFEA21F267FA522>I38 D<123C127EB4FCA21380 A2127F123D1201A212031300A21206A25A5A5A122009137CA511>I<130C131813301360 13E0EA01C0EA0380120713005AA2121EA2123E123CA2127CA31278A212F8AC1278A2127C A3123CA2123E121EA27EA27E13801203EA01C0EA00E0136013301318130C0E367AA818> I<12C012607E7E121C7E7E1380120313C0A2EA01E0A213F01200A213F8A31378A2137CAC 1378A213F8A313F0A2120113E0A2EA03C0A2138012071300120E5A12185A5A5A0E367DA8 18>I<123C127EB4FCA21380A2127F123D1201A212031300A21206A25A5A5A122009137C 8711>44 DI<123C127E12FFA4127E123C08087C8711>I<140614 0FA2141F141E143E143CA2147C147814F814F0A2130114E0A2130314C013071480A2130F 14005B131EA2133E133C137C1378A213F85B12015BA212035B12075BA2120F90C7FCA25A 121E123E123CA2127C127812F85AA2126018377DA81F>II<131C133C13FC12FFA21200B3AA387FFF FCA216237CA21F>I<48B4FC000713C0381E07F0383803F8386001FC387C00FE12FE14FF 147FA2127C003813FFC7FC14FEA2EB01FC14F8EB03F0EB07E01480EB0F00131E5B1370EB E003EA01C038038007380700061206380FFFFE5A5A4813FCB5FCA218237DA21F>I<48B4 FC000713E0381E03F0383801F8003C13FC387E00FEA3123EEA1C01000013FCA2EB03F8EB 07F0EB0FC03801FF00A2380007E0EB01F014F8EB00FC14FE14FFA21210127C12FEA214FE A2387C01FC007013F8383E07F0380FFFC00001130018237DA21F>I<14381478A214F813 01130313071306130C131C13381330136013E0EA01C01380EA03005A120E5A12185A1270 5AB612C0A2390001F800A790387FFFC0A21A237EA21F>I<0018130C001F137CEBFFF814 F014E014C01480EBFC000018C7FCA513FF001B13E0381F03F0381C00F8000813FCC7127E A3147FA2127812FCA3147E5A006013FC1270383801F8381E07E03807FFC03801FE001823 7DA21F>II<1230123C003FB512C0A215 804814005C5C38600018A200E05B485B5CC6485AA249C7FC1306130EA25BA2133CA25BA2 13F8A41201A66C5A13601A257DA41F>II<13FF000313C0380F83E0381F00F04813F8007E137CA214 7E12FEA3147FA4127E14FF123EEA3F01001F137FEA0FFEEA03FCC7FC147EA2123C007E13 FCA214F814F0EA7C01383003E0381C0F80380FFF00EA03F818237DA21F>I<123C127E12 FFA4127E123C1200A8123C127E12FFA4127E123C08187C9711>I<141CA2143EA3147FA2 4A7EA39038019FC0A29038031FE0140F01077FEB0607A2010C7F1403011C7FEB1801A249 6C7EA2017FB5FCA29039E0007F8049133FA2484880151F00038190C7120FA2486E7ED8FF F090B51280A229257EA42E>65 DI<9138 FF8008010FEBF01890393FC03C789039FE0006F8D801F813034848130148481300484814 78121F48481438A2007F151890C8FCA2481500A97E16187F123FA26C6C1430120F6C6C14 606C6C14C06C6CEB0180D800FEEB070090383FC01E90380FFFF8010013C025257DA42C> IIII<9138FF8010010FEBE03090393FC078F09038FE000DD801F81307D8 07F0130348481301491300001F1570485AA2007F153090C8FCA2481500A70203B5FCA26C 90380007F0A27F123FA26C7E120F7F6C7EEA01F8D800FE130F90383FC03990390FFFF070 0100EB803028257DA430>I73 D<48B51280A2390003F800B3A71210127C12FEA25CEAFC0700785B38380FC0D81FFFC7FC EA07FC19257EA420>I76 DII<903803 FF80011F13F090387F01FC3901FC007FD803F0EB1F804848EB0FC0000F15E04848EB07F0 491303003F15F8A2007F15FC90C71201A24815FEA96C15FCA26D1303003F15F8A26C6CEB 07F0A26C6CEB0FE06C6CEB1FC06C6CEB3F806C6CEB7F0039007F01FC90381FFFF0010313 8027257DA42E>II 82 D<01FF1380000713E3380F80F7381E001F48130F481307140312F81401A27E91C7FC B4FCEA7FE013FE383FFFE014F86C13FE00077F6C1480C67E010313C0EB003FEC0FE01407 A200C01303A315C07E6C13076C14806CEB0F0038FFC03E38E3FFF838803FE01B257DA422 >I<007FB612F8A2397E00FE010078EC00780070153800601518A200E0151C160C5AA4C7 1400B3A390B512FEA226247EA32B>I III<3A7FFFC07FFEA23A03FC00 078093C7FC6C6C130E6C6C130C5D90387F80386D6C5A90381FE0605DEB0FF1903807FB80 92C8FCEB03FE13011300806E7E81A2ECDFE0903801CFF0EB038FEC07F890380603FC9038 0E01FE131C90381800FF496D7E1370496D7E496D7E4848130F486C80D8FFFC90B51280A2 29257EA42E>I91 D93 D<120212065A5A5AA25AA212E05AA212 DEB4FC1380A2127FA2EA3F00121E09137DA511>96 DIIII<137F3803FFC03807 C1F0380F80F8EA1F0048137C127E147E12FEA2B512FEA248C7FCA3127EA214067E6C130C 380F80183807E0703803FFE038007F8017187E971C>II<3901FF07C000 07EBDFE0380F83F1EA1F01393E00F800007E7FA6003E5B6C485A380F83E0EBFFC0001190 C7FC0030C8FCA21238123C383FFFE06C13FC806C7F481480383C003F48EB0FC000F81307 A4007CEB0F806CEB1F00381F807E3807FFF8C613C01B247E971F>I I<120FEA1F80EA3FC0A4EA1F80EA0F00C7FCA7EA7FC0A2120FB3A2EAFFF8A20D277EA611 >I<131E133FEB7F80A4EB3F00131E90C7FCA73801FF80A2EA001FB3A8127800FC13005B 133EEA787CEA3FF8EA0FE0113283A613>III<26FF80 FE137F903A83FF81FFC03B0F8E0FC707E0019813CC903A9007E803F001A013F0A201C013 E0AF3BFFFC7FFE3FFFA230187E9733>I<38FF80FE903883FF80390F8E0FC01398903890 07E013A0A213C0AF39FFFC7FFEA21F187E9722>II<38FFC1FCEBCFFF390FFC1FC09038F007E001C013F0140315F8 140115FCA8EC03F8A215F0EBE0079038F00FE09038DC1F809038CFFF00EBC3F801C0C7FC A9EAFFFCA21E237F9722>I<017F13C03803FFC13807E0E3381FC033EB801FEA3F004813 0FA212FEA8127E127F7EEB801F001F133F380FE0EF3803FF8F3800FE0F1300A9ECFFFCA2 1E237E9720>I<38FF83E0EB8FF8380F8C7CEB90FC13B013A01478EBE0005BAEEAFFFEA2 16187F9719>I<3807F8C0EA1FFFEA3C07EA7001EAF000A300FC1300B47EEA7FFC7F383F FF80000F13C0120338001FE01303EAC001A212E014C0EAF00338FC078038EFFF00EAC3FC 13187E9718>I<13C0A41201A312031207120F121FB512C0A2380FC000AC1460A63807E0 C013E13801FF8038007E0013237FA218>I<39FFC07FE0A2000F1307B0140FA200071317 EBE0673903FFC7FE38007F071F187E9722>I<39FFF80FF8A2390FC001C015803907E003 00A26D5A00031306EBF80E0001130C13FC00005B13FEEB7E30A26D5AA214E06D5AA26D5A A26DC7FCA21D187F9720>I<3BFFF9FFE0FF80A23B1FC03F001C00000F6D13181580D807 E05CA29039F03FC07000030137136015E02601F8635BA29038FCE3F1000001C15B15F990 267F80FBC7FCA215FF90383F007EA2011E133CA3010C131829187F972C>I<39FFF83FF0 A2390FC00F003807E00E6C6C5A6D5A6C6C5A00001360EB7EC06D5AA2131F6D7E497E80EB 33F81361EBE0FC3801C07E3803807F3907003F8048131F39FFC07FF8A21D187F9720>I< 39FFF80FF8A2390FC001C015803907E00300A26D5A00031306EBF80E0001130C13FC0000 5B13FEEB7E30A26D5AA214E06D5AA26D5AA26DC7FCA21306A25B1230EA781CEAFC185B13 70EA68E0EA7FC0001FC8FC1D237F9720>I<387FFFF8A2387C03F0EA700738600FE000E0 13C0EB1F80EAC03F1400137EEA00FE5B485A0003130C13F0EA07E0120FEBC01C381F8018 003F1338387F0078387E01F8B5FCA216187E971B>II E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fr cmcsc10 14.4 14 /Fr 14 120 df70 D82 D<5B497EA3497EA2EB09E0A3 EB10F0A2EB2078A3497EA2497EA348B5FCA23902000780A348EB03C0A2000CEB01E0A200 3C14F0B4EB0FFEA21F1F7E9E25>97 DI 101 DI<90380FE01090387FFC309038FC0E703803E0033907 8000F048C71270121E003E1430123C007C1410A2127800F81400A6EC3FFE1278007CEB01 F01400123C123E121E7E6C7E3803E0013900FC077090387FFE3090380FF0101F1F7D9E26 >I 108 D110 DI114 D<007FB512F0A2387807800060143000401410A200C0 141800801408A400001400B1497E3801FFFEA21D1F7E9E23>116 D118 D<3BFFE03FF803FCA23B1F0007C000F06C010314E01740018015C0 00076E1380A2D803C0EC0100EC04F0A23A01E00CF802EC0878A26C6C486C5AA390397820 1E08A2017C141890393C400F10A2011E5C91388007A0A2010F14C0EC0003A201066D5AA3 2E1F7F9E32>I E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fs cmsl10 10.95 67 /Fs 67 123 df12 DI33 D<1238127CA2127E123A1204A31208A21210122012401280070E789F0D>39 D<1306130C13101330136013C013801201EA0300A21206120E120CA25AA21238A21230A2 1270A21260A312E0A81260A57EA2121012181208120C12047E0F2E7AA112>I<138013C0 134013201330A21318A3130CAD131CA31318A21338A21330A21370136013E013C0A2EA01 8013005A120612045A12185A12405A0E2E80A112>I<1218123C127CA2123C1204A21208 A21210A2122012401280060E7D840D>44 DI<1230127812F812 78127005057C840D>I<14011403A21406A2140CA214181430A21460A214C0A2EB0180A2 EB0300A21306A25B5BA25BA25BA25BA2485AA248C7FCA212065AA25AA25AA25AA25AA25A 182D7FA117>I<137EEA01C338030180000713C0EA0E0014E05AA2EA3C0112381278A538 F003C0A51480130712E01400A2130E1260EA701CEA3038EA3870EA0FC0131F7C9D17>I< 13181338EA01F8EA0E701200A513E0A6EA01C0A6EA0380A6EA07001380EAFFFC0E1E7B9D 17>II<120E121FA2121E120C1200AA1230127812F81278127008147C 930D>58 D<1207EA0F80A213001206C7FCAA1218123C127CA2123C1204A25AA25AA25A5A 5A091D7D930D>I63 D<1408140C141C143CA2147C147E149EA2EB011EA21302801304A21308A2011013801407 1320A2EB7FFF90384007C0EB8003A2EA0100A21202EC01E01206001F130339FF801FFE1F 207F9F22>65 D<0007B5FC3900F803C090387801E0EC00F04913F8A515F03801E001EC03 E015C0EC0F809038FFFE009038E00F803903C003C0EC01E015F0A21400A2485A1401A215 E01403EC07C0390F000F80EC3E00B512F01D1F7E9E20>II<0007B57E3900F801E0903878007081497F151E150E150FA348481480A6484814 005DA3151E153E4848133C5DA25D4A5A4A5A260F000FC7FC143CB512F0211F7E9E23>I< 0007B512FC3900F8007C0178131C150C5B1504A414043901E00800A31438EBFFF8EBE038 3803C010A4EC00081510485AA21520A2156015C0380F00011407B612801E1F7E9E1F>I< 0007B512F83900F800780178133815185B1508A53901E00800A314181438EBFFF83803C0 301410A491C7FC485AA648C8FC7FEAFFFC1D1F7E9E1E>II<3807FF803800F8001378A25BA6485AA6485AA6485AA648C7 FC7FEAFFF0111F7E9E10>73 D<3A07FF803FE03A00F8001F000178130C5D4913205D5D4A C7FC1402140848485A5C146014F013E1EBE4F83803C878EBD07CEBE03CEBC03E141E141F 48487E81140781140381380F00016D487E39FFF00FFE231F7E9E23>75 D<3807FFE0D800FCC7FC1378A25BA6485AA6485AA41580EC0100EA0780A25C1402140614 0E380F001E147CB512FC191F7E9E1C>IIII<0007B5FC3900F803C090387800F015785B157CA41578484813F815F0EC 01E0EC03C0EC0F00EBFFFCD803C0C7FCA6485AA648C8FC7FEAFFF81E1F7E9E1F>I<3807 FFFE3900F8078090387801E0EC00F05B15F8A415F03801E00115E0EC03C0EC0780EC1E00 EBFFF03803C03880141E140EA2140F48485AA51502D80F001304EB800F39FFF00788C7EA 01F01F207E9E21>82 DI<003FB512F038 3C078000301430126039400F0010A212C01280A3D8001E1300A65BA65BA65B7F383FFFE0 1C1F7A9E21>I<39FFF00FF8391F0003E06CEB01801400001EEB0100A6481302A6485BA6 00705BA25CA200785B1238001813C06C48C7FCEA0706EA01F81D20799E22>I<39FFF001 FE391F8000F86CC712601540A215807F0007EB0100A214021406EBC00400035BA25CA26C 6C5AA25CA26D5A120001F1C7FC13F2A213FC137C1378A21370A213201F207A9E22>I<3B FFF07FF81FF03B1F000FC007C0001E903907800380001FED01006C1502140F5EEC17C002 135B142301805C000713435E14C3913883E0401481D981015B13C1D803C213E193C7FC13 C415F2EBC80015F4EA01F015F85B5D5B15605B000014402C207A9E2F>I<3A03FFC0FFC0 3A007F003E00013C1318013E1310011E5B011F5B6D5B0281C7FCEB078314C2EB03C414E8 EB01F0A2130080A2EB017CEB023CEB043EEB0C1EEB081F497E132001407FEB8007000180 EB0003000780391F8007F039FFC01FFE221F7F9E22>I<39FFF001FF391F8000786CC712 606D134000071480EBC00100031400EBE0025C12016D5A00005B6D5A1378EB7C40EB3C80 013FC7FC7F131EA3131C133CA513381378137C3807FF80201F7A9E22>I<13FFEA01FE13 80A5EA0300A61206A65AA65AA65AA65AA6B4FCA2102D7EA10D>91 D<13FFEA01FEEA0006A5130CA61318A61330A61360A613C0A6EA0180A6EAFF00A2102D82 A10D>93 D<1204120812101220A21240A21280A212B812F8A31270060E799F0D>96 DI<1207123F120F7EA2120EA65A137CEA1D83 381E0180001C13C0EB00E05A14F0A5387001E0A214C013031480EB0700EAE80EEACC38EA 83E014207B9F19>I<13FEEA0383380E0780121C0038130090C7FC12785AA45AA37E5BEA 70026C5AEA1C18EA07E011147D9314>I<1438EB01F8EB00781438A21470A614E013FCEA 0382EA0601121CEA3C00383801C0127812F0A438E00380A412F0EA700738380F00381C37 803807C7E015207D9F19>I<13F8EA070EEA0E07121C383803801278127012F0A2B5FC00 F0C7FC5AA46C5AEA7002EA3004EA1C18EA07E011147D9314>II<140EEB3E11EBE1A33801C1C2380381E0EA07801301120FA3380703C01480EB8700 EA04FC48C7FCA21218121CEA0FFF14C014E0381800F04813305A5AA3006013606C13C038 1C0700EA07FC181F809417>I<13E0120712011200A2485AA6485AEB8F80EB90E013A0EB C0601380000713E01300A5380E01C0A6381C0380001E13C038FF8FF014207E9F19>III<13E0120712011200A2485AA6 485AEB81FCEB80F014C0EB81801400EA07045B13181338137C131C120E7FA2130F7F1480 EA1C03381E07C038FF8FF016207E9F18>I<13E0120712011200A2EA01C0A6EA0380A6EA 0700A6120EA65A121EEAFF800B207F9F0C>I<390387C07C391F9861863907A072073903 C03403EB80380007EB7807EB0070A5000EEBE00EA64848485A001EEBE01E3AFFCFFCFFC0 22147E9326>I<38038F80381F90E0EA07A03803C0601380000713E01300A5380E01C0A6 381C0380001E13C038FF8FF014147E9319>I<13FCEA0387380E0180381C00C04813E0A2 4813F012F0A438E001E0A214C0130300F0138038700700EA380E6C5AEA07E014147D9317 >IIIII<1380EA0100A35A5A5A121EEAFFF8EA0E00A45AA65A1310A4 1320A2EA1840EA0F800D1C7C9B12>I<381C0380EAFC1FEA3C07EA1C03A238380700A6EA 700EA4131EA25BEA305E381F9F8011147B9319>I<38FF83F8381E00E0001C13C0148012 1E380E01005B13025B12075BA25BEA039013A013E05B5B120190C7FC15147C9318>I<39 FF9FE1FC393C078070391C030060148015401580EA0E0790380D81001309EB19C2131138 0F21C4EA0720EB40C814E8EB80F0A26C485A1460000213401E147C9321>I<381FF0FF38 03C0780001137014403800E0C0EBE180EB73001376133CA2131C132E134E1387EA010738 0203801204380C01C0383C03E038FE07FC18147F9318>I<390FF83F803901E00E00EBC0 0C140813E000005B143014205C13705CA20171C7FC1339133A133E133C133813181310A2 5BA25BEA70C0EAF08000F1C8FC12E61278191D809318>I<380FFFE0EA0E01000C13C038 080380EB0700EA100E5BC65A5BA25B485A38038080EA0700120E381C0100A2485AEA700E EAFFFE13147F9314>I E %EndDVIPSBitmapFont %DVIPSBitmapFont: Ft cmbx12 17.28 52 /Ft 52 122 df<121E123FEA7F80EAFFC0A213E0A2127FEA3F60121E1200A313C0A3EA01 80A2EA03001206A25A123812300B187AB116>39 D<121E123FEA7F80EAFFC0A4EA7F80EA 3F00121E0A0A7A8916>46 D48 D III<157015F0140114031407140FA2141F143F147714F714E7EB01C7EB0387EB0707130F 130E131C1338137013F013E0EA01C0EA0380EA07005A120E5A5A5A5AB712E0A3C7380FF0 00A9010FB512E0A3232E7EAD28>I<000C1430390FC007F090B512E015C0158015005C14 F85C1480000EC8FCA8EB1FF0EBFFFE390FE03F809038000FC0000EEB07E0000C14F0C713 F8140315FCA215FEA21218123E127F5AA215FCA25A0078EB07F815F06CEB0FE06CEB1FC0 390FC07F806CB51200000113FC38003FE01F2E7CAD28>I<14FF010713E0011F7F90387F 80F89038FE003CD801F8137C484813FE00071301EA0FE0A2EA1FC0003F6D5A157892C7FC 485AA338FF83FC90388FFF8090389C0FC09038B003F06E7E01E07F01C07F140081A24914 80A4127FA4003F15007F121F5D000F495AEA07E06C6C485A3901FC0FE06CB55A013F90C7 FCEB0FFC212E7DAD28>I<1238123E003FB612C0A316804815005D5D5D0078C712380070 5C5D00F0495A48495A4AC7FCA2C7120E5C5C1478147014F0495AA213035C1307A2130FA2 131F5CA2133FA4137FA86DC8FC131E22307CAF28>III<1578A215FCA34A7EA24A7EA24A7FA34A7FEC0E7F021E7FEC1C3FA2 02387F151F02787FEC700FA202E07F1507010180ECC003A249486C7EA201078191C7FC49 8191B6FCA24981011CC7123F013C810138141FA24981160F01F081491407A2484881486C 1403B549B512FCA336317DB03D>65 DI<913A03FF800180023FEBF00349B5EAFC0701079038003F0FD91FF8EB079F D93FC0EB01FFD9FF807F4848C8127F4848153F0007161F49150F485A001F1607A2485A17 03127FA24992C7FCA212FFA9127FA27FEF0380123FA26C7E1707000F17006C7E6D150E00 03161E6C6C151C6C6C6C1478D93FC05CD91FF8EB03E0D907FFEB3F800101D9FFFEC7FCD9 003F13F80203138031317CB03A>I III< DA03FF1303027FEBF00749B5EAFC0F01079038007E1FD91FF0EB0FBFD97FC0EB03FF4948 7F4848C87E485A0007824848815B001F82A2484881A2127FA24992C7FC12FFAA0307B512 F8127F7FDB00011300123FA26C7EA2120F7F6C7E12036C7E6C6C7E6D6C5BD91FF8497ED9 07FFEB3E3F01019038FFFC1F6D6CEBF00F0203EB800335317CB03F>I73 D76 DIIII82 D<90391FF8018090B51203000314C73907F007EF390F 8000FF48C7127F003E141F150F5A150712FCA215037EA26C91C7FC13C0EA7FF0EBFF806C 13F8ECFF806C14F06C806C806C14FFC6FC013F1480010114C0D9001F13E01401EC003FED 1FF0150F1507126000E01403A316E07EA26CEC07C07EB4EC0F8001C0EB1F00D8FBFC13FE 00F1B512F8D8E03F5BD8C003138024317CB02D>I<007FB8FCA39039C00FF801D87E00EC 003F007C82007882A200708200F01780A3481603A5C792C7FCB3AA017FB6FCA331307DAF 38>II87 D<007FB590387FFFF8A3C601E0903801F000017F5D6D6C5C6D6C13036E495A010F4AC7FC 6D6C130E6E131E6D5C6D6D5A6DEBC070EDE0F091387FE1E091383FF3C0EDFB80EC1FFF6E 90C8FC6E5A81806E7F82804A7F4A7F913807BFF8151F4A6C7E021E7FEC3C0791383803FF DA78017F02F08049487E4A6D7E0103814948133F91C76C7E010E6E7E011E814914070138 6E7E01FC1680B500E0017F13FFA338317EB03D>II<003FB7FCA39039FC00 07FE01E014FC0180130F90C7EA1FF8003E15F0003C143F007CEC7FE0007815C015FF4A13 80007015005C4A5A5DC7120F4A5A5D143F4A5A5D4A5A5B92C7FC495A1307495A4A130713 1F495A5C137F4948130F5C5A4890C7FC49141F0007151E4848143E5B001F157E4848EB01 FE491303007F143FB7FCA328317CB031>I97 DIIIII<90391FF007C09039FFFE3FE03A01F83F79F03907E00FC3000F14E19039C007E0 E0001FECF000A2003F80A5001F5CA2000F5CEBE00F00075C2603F83FC7FC3806FFFE380E 1FF090C9FC121EA2121F7F90B57E6C14F015FC6C806C801680000F15C0003FC7127F007E EC1FE0007C140F00FC1407A4007EEC0FC0003E1580003F141FD80FC0EB7E003907F803FC 0001B512F0D8001F90C7FC242F7E9F28>II< EA03C0487E487E487EA46C5A6C5A6C5AC8FCA9EA01F8127FA31207B3A7B51280A311337D B217>I108 D<2703F007F8EB1FE000FFD93FFEEBFFF8913A783F01E0FC02C090388300FE280FF1801F C6137F2607F30013CC01F602F8148001FC5CA3495CB3B500C3B5380FFFFCA33E207D9F43 >I<3903F007F800FFEB3FFEEC783F02C013803A0FF1801FC03807F30001F614E013FCA3 5BB3B500C3B5FCA328207D9F2D>II<3901F83FE000FFEBFFFC9038FBE07F9039FF003F80D807FEEB1FC049EB0FE04914 F0ED07F8A216FC1503A216FEA816FC1507A216F8A2ED0FF06D14E06DEB1FC06DEB3F8090 39FBC0FE009038F8FFF8EC3FC091C8FCABB512C0A3272E7E9F2D>I<3803F03F00FFEB7F C09038F1C3E01487390FF30FF0EA07F6A29038FC07E0EC03C091C7FCA25BB2B512E0A31C 207E9F21>114 D<3801FF86000713FEEA1F00003C133E48131E140E12F8A36C90C7FCB4 7E13FC387FFFC06C13F0806C7F00077F00017FEA003F01001380143F0060131F00E0130F A27E15007E6C131E6C131C38FF807838F3FFF038C07F8019207D9F20>I<131CA5133CA3 137CA213FC120112031207381FFFFEB5FCA2D803FCC7FCB0EC0380A71201EC0700EA00FE EB7F0EEB3FFCEB07F0192E7FAD1F>I<3A7FFF807FFCA33A03FC000F006C6C131E6C6C5B EC803890387FC078013F5B90381FE1E090380FF3C0ECFF806D90C7FC6D5A13016D7E8181 5B903803DFE09038078FF08190380F07FC90381E03FEEB3C01496C7E4914804848EB7FC0 0003EC3FE026FFFC01B5FCA328207F9F2B>120 DI E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fu cmtt10 10.95 95 /Fu 95 127 df<00C01360AFB512E0A213117E8A18>32 D<127012F8B012701200A51270 12F8A31270051C779B18>III<13C01201A3EA03F0EA0FFCEA3FFEEA7DCFEA71C738E1C38013 C7A338F1C0001279123F6C7EEA0FF8EA01FC13DE13CF13C73861C38012F1A212E1EBC700 1271EA79DEEA3FFEEA1FF8EA07E0EA01C0A3120011247D9F18>III<1238127CA2127E123E120EA3121CA2123812F812F012C0070E789B18>I<137013F0 EA01E0EA03C0EA0780EA0F00121E121C5AA25AA45AA81270A47EA27E121E7EEA0780EA03 C0EA01F0120013700C24799F18>I<126012F012787E7E7EEA07801203EA01C0A2EA00E0 A41370A813E0A4EA01C0A2EA03801207EA0F00121E5A5A5A12600C247C9F18>II<136013F0A7387FFFC0B512E0A26C13C03800F000A713 6013147E9718>I<121C123E127E127F123F121F1207120E121E127C12F81260080C7885 18>I<387FFFC0B512E0A26C13C013047E8F18>I<1230127812FCA2127812300606778518 >I<1303EB0780A2130F14005B131EA2133E133C137C1378A213F85B12015B12035BA212 075B120F90C7FCA25A121E123E123CA2127C127812F85AA2126011247D9F18>IIIII<131F5B13 77A213E7120113C7EA038712071307120E121E123C1238127812F0B512F8A338000700A6 EB7FF0A3151C7F9B18>I<383FFF80A30038C7FCA8EA3BF8EA3FFE7F383C0780383003C0 EA0001EB00E0A2126012F0A238E001C0EA7003387C0F80383FFF00EA1FFCEA03F0131C7E 9B18>I<137E48B4FC00071380380F83C0EA1E03121C3838018090C7FC5AA2EAE1F8EAE7 FEB5FC38FE078038F803C0EAF001EB00E05A7E1270A3383801C0EA3C03381E0780380FFF 006C5AEA01F8131C7E9B18>I<12E0B512E0A214C038E00380EB0700C65A131E131C5BA2 5B13F05BA2485AA3485AA448C7FCA7131D7E9C18>II I<1230127812FCA2127812301200A81230127812FCA2127812300614779318>I<121812 3C127EA2123C12181200A81218123C127EA2123E121E120E121C123C127812F01260071A 789318>I<14C0EB03E01307EB1FC0EB3F80EBFE00485AEA07F0485AEA3F8048C7FC12FC A2127F6C7EEA0FE06C7EEA01FC6C7EEB3F80EB1FC0EB07E01303EB00C013187E9918>I< 387FFFC0B512E0A3C8FCA4B512E0A36C13C0130C7E9318>I<126012F87E127F6C7EEA0F E06C7EEA01FC6C7EEB3F80EB1FC0EB07E0A2EB1FC0EB3F80EBFE00485AEA07F0485AEA3F 8048C7FC12FC5A126013187E9918>II<137CEA 01FEEA07FF380F8780381E03C0EA3C1DEA387F3870FFE0EA71E313C112E1EAE380A638E1 C1C0127113E33870FF8038387F00EA3C1C381E00E0EA0F833807FFC00001138038007E00 131C7E9B18>I<137013F8A213D8A2EA01DCA3138CEA038EA4EA0707A5380FFF80A3EA0E 03381C01C0A3387F07F000FF13F8007F13F0151C7F9B18>IIIIII< 3801F1C0EA03FDEA0FFFEA1F0FEA1C03123813011270A290C7FC5AA5EB0FF0131F130F38 7001C0A213031238A2EA1C07EA1F0FEA0FFFEA03FDEA01F1141C7E9B18>I<387F07F038 FF8FF8387F07F0381C01C0A9EA1FFFA3EA1C01AA387F07F038FF8FF8387F07F0151C7F9B 18>II<3801FFC0 A338000E00B312F0A2133CEA7FFCEA3FF0EA0FC0121C7D9B18>I<387F07F038FF87F838 7F07F0381C03C0EB07801400130E131E5B13385B13F0121DA2EA1FB8A2131C121EEA1C0E A27FA2EB0380A2EB01C0387F03F038FF87F8387F03F0151C7F9B18>II<38FC01F8EAFE03A2383B06E0A4138EA2EA398CA213 DCA3EA38D8A213F81370A21300A638FE03F8A3151C7F9B18>I<387E07F038FF0FF8387F 07F0381D81C0A313C1121CA213E1A313611371A213311339A31319A2131D130DA3EA7F07 EAFF87EA7F03151C7F9B18>IIII< EA7FF8EAFFFE6C7E381C0F80130314C01301A313031480130F381FFF005BA2EA1C0F7FEB 0380A5149CA3387F01F8EAFF81387F00F0161C7F9B18>I<3803F1C0EA1FFF5AEA7C0FEA 7003EAE001A390C7FC12701278123FEA1FF0EA07FEC67EEB0F80EB03C01301EB00E0A212 6012E0130100F013C038F80780B5FCEBFE00EAE7F8131C7E9B18>I<387FFFF8B5FCA238 E07038A400001300B2EA07FFA3151C7F9B18>I<38FF83FEA3381C0070B36C13E0EA0F01 380783C03803FF806C1300EA007C171C809B18>I<38FE03F8EAFF07EAFE03383C01E000 1C13C0A3EA1E03000E1380A438070700A4EA038EA4EA018C13DCA3EA00D813F8A2137015 1C7F9B18>I<38FE03F8A338700070A36C13E0A513F8EA39FC13DCA2001913C0A3138CA2 EA1D8DA31305000D1380EA0F07A2EA0E03151C7F9B18>I<387F0FE0139F130F380E0700 120FEA070E138EEA039C13DCEA01F8A212005B137013F07F487E13DCEA039E138EEA070F 7F000E13801303001E13C0387F07F000FF13F8007F13F0151C7F9B18>I<38FE03F8EAFF 07EAFE03381C01C0EA1E03000E1380EA0F0700071300A2EA038EA2EA01DCA3EA00F8A213 70A9EA01FC487E6C5A151C7F9B18>I<383FFFE05AA2387001C01303EB07801400C65A13 1E131C133C5B137013F0485A5B1203485A90C7FC5A001E13E0121C123C5A1270B5FCA313 1C7E9B18>II<126012F0A27E1278127C12 3CA2123E121E121F7EA27F12077F1203A27F12017F12007F1378A2137C133C133E131EA2 131F7F14801307A2EB030011247D9F18>I II<387FFFC0B512E0A26C13 C013047E7F18>I<1206121E123E12381270A212E0A312F812FC127CA21238070E789E18> II<127E12FE127E120EA5133EEBFF8000 0F13C0EBC1E01380EB0070120E1438A6000F1370A2EB80E013C1EBFFC0000E138038063E 00151C809B18>III II<3801E1F03807FFF85A381E1E30381C0E00487EA5EA1C0EEA1E1EEA1FFC5B EA39E00038C7FC7EEA1FFEEBFFC04813E0387801F038700070481338A4007813F0EA7E03 381FFFC06C13803801FC00151F7F9318>I<127E12FE127E120EA5133EEBFF80000F13C0 13C1EB80E01300120EAB387FC7FC38FFE7FE387FC7FC171C809B18>II<1338137CA313381300A4 EA0FFCA3EA001CB3A4EA6038EAF078EAFFF0EA7FE0EA3F800E277E9C18>I<127E12FE12 7E120EA5EB3FF0A3EB0780EB0F00131E5B5B5BEA0FF87F139C130EEA0E0F7FEB038014C0 387FC7F812FF127F151C7F9B18>II<38F9C1 C038FFF7F013FF383E3E38EA3C3CA2EA3838AB38FE3E3EEB7E7EEB3E3E1714809318>I< EA7E3E38FEFF80007F13C0EA0FC1EB80E01300120EAB387FC7FC38FFE7FE387FC7FC1714 809318>III<3801F380EA07FBEA1FFFEA3E1FEA380FEA70 07A2EAE003A6EA7007A2EA380FEA3C1FEA1FFFEA0FFBEA03E3EA0003A7EB1FF0EB3FF8EB 1FF0151E7E9318>I<38FF0FC0EB3FE0EB7FF0EA07F0EBE060EBC0005BA290C7FCA9EAFF FC7F5B14147E9318>II<487E1203 A4387FFFC0B5FCA238038000A9144014E0A33801C1C013FF6C1380EB3E0013197F9818> I<387E07E0EAFE0FEA7E07EA0E00AC1301EA0F033807FFFC6C13FE3801FCFC1714809318 >I<387F8FF000FF13F8007F13F0381C01C0380E0380A338070700A3138FEA038EA3EA01 DCA3EA00F8A2137015147F9318>I<38FF07F8138F1307383800E0A4381C01C0137113F9 A213D9EA1DDD000D1380A3138DEA0F8FA23807070015147F9318>I<387F8FF0139F138F 380F0700EA078EEA039EEA01DC13F81200137013F07FEA01DCEA039E138EEA0707000E13 80387F8FF000FF13F8007F13F015147F9318>I<387F8FF000FF13F8007F13F0380E01C0 EB0380A21207EB0700A2EA0387A2138EEA01CEA213CC120013DC1378A31370A313F05B12 79EA7BC0EA7F806CC7FC121E151E7F9318>I<383FFFF05AA2387001E0EB03C0EB078038 000F00131E5B13F8485AEA03C0485A380F0070121E5A5AB512F0A314147F9318>II<126012F0B3B012600424769F18>I<127CB4FC13C01203C67EAB7FEB7FC0 EB3FE0A2EB7FC0EBF0005BABEA03C012FF90C7FC127C13247E9F18>II E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fv cmcsc10 17.28 10 /Fv 10 120 df70 D82 D<14301478A314FCA2497E14BEA2EB031FA201077FEB060FA249 6C7EA3496C7EA2496C7EA3496C7EEB7FFF90B57E9038C0007CA248487FA20003143F90C7 7EA248EC0F805A486CEB1FC0D8FFE0EBFFFCA226257EA42C>97 DI 101 DI111 D114 D<007FB612E0A2397C00F8 0300701400A20060156000E01570A2481530A4C71400B3A4497E90387FFFF0A224257EA4 2A>116 D<3CFFFC07FFE007FFA23C0FE0007F0001FC6C48013EEB00F018E0153F6C6C6D 14C0A24B7E6C6CED0180A2ED67C06C6CED0300A29238C3E007017C1506A2903A7E0181F0 0E013E150C020313F8011F01005BA24A13FCD90F86EB7C30A2028C133ED907CC5CA202D8 131FD903F85CA24A130F01015DA24A1307010092C7FC4A7F38257FA43C>119 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fw cmcsc10 10.95 36 /Fw 36 124 df<127012F812FCA212741204A31208A21210A212201240060E7B9F0F>39 D45 D48 D57 D<80497EA3497EA3EB04F0A2497E1478A2497EA2EB303EEB201EA2497E A390B57EEB8007000180EB0003A200026D7EA3486D7E120E001F497E3AFFC00FFF802120 7E9F25>65 DI<90380FE0109038381C309038E002703803C00139078000F048C71270121E15305A15 10127C127800F81400A91278007C1410123CA26C1420A27E6C6C13406C6C13803900E003 00EB380CEB0FF01C217C9F24>I69 DI73 D76 DI79 D82 D<007FB512F839780780780060141800401408A200C0140C00801404A400001400B3497E 0003B5FC1E1F7D9E24>84 D86 D<3BFFF03FFC07FC3B1F0007E0 01F06C903903C00060174081D807801580A2EC04F0D803C0EC0100A2EC0878D801E01402 A2EC103CD800F05CA2EC201E01785CA2EC400F013C5CA29138800790011E14A0A290391F 0003E0A26D5C010E1301A201065CA22E207E9E32>I<397FF807FE390FE001F0D807C013 C06C6C6C5A000149C7FCEBF0023800F806EB78046D5AEB3E18EB1F106D5A14C013071303 6D7E497EEB06F8EB0478EB087CEB183EEB101EEB201F496C7EEBC007496C7ED801007F48 6D7E481300391F8001F83AFFC007FF80211F7E9E25>I<1318A2133CA3134EA213CF1387 A238010380A2000313C0EA0201A23807FFE0EA0400A2481370A2001813380038137838FE 01FF18177F961C>97 DI101 DII105 D108 D<00FCEB07F0001C1480A20016130BA200131313A338118023A23810C043A3EB6083A2EB 3103A3131AA2130C123800FEEB1FF01C177E9622>I<38FC01FC381E007014201217EA13 80A2EA11C0EA10E0A213701338A2131C130E1307A2EB03A0EB01E0A213001460123800FE 132016177E961C>I<13FE38038380380E00E0481370003C1378003813380078133C0070 131C00F0131EA70070131C0078133C00381338003C1378001C13706C13E0380383803800 FE0017177E961D>I114 DI<387FFFFC3870381C0040 1304A200C0130600801302A300001300AE3803FF8017177F961B>I<38FF81FC381C0070 1420B0000C1340120E6C138038018300EA007C16177E961C>II<3AFF07FC0FC03A3C00F007809138E00300001CEBF002A26C5C EB0138A200075CEB021CA2D803825BEB840EA2D801C45BEBC807A2D800E85B9038F003C0 A201705BEB6001A222177F9626>I<38FF80FE381F0070000E13606C1340EB80803803C1 00EA01C3EA00E213F4137813387F133E134E13C7EB8780380103C0EA0201380600E00004 13F0000C1370003C137800FE13FF18177F961C>I123 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fx cmsy10 10.95 19 /Fx 19 121 df0 D<14FF010713E090381F00F80178131E01E0 1307D80180EB018048C812C000061560481530A248151848150CA2481506A4481503A900 601506A46C150CA26C15186C1530A26C15606C15C06C6CEB0180D800E0EB07000178131E 011F13F8903807FFE0010090C7FC282B7EA02D>13 D15 D17 D<15C01403EC0F00141C1470495AEB078001 1EC7FC1378EA01E0EA0380000EC8FC123C12F0A2123C120EEA0380EA01E0EA0078131EEB 0780EB01E0EB0070141C140FEC03C014001500A8007FB51280B612C01A267C9C23>20 D<12C012F0123C120EEA0380EA01E0EA0078131EEB0780EB01E0EB0070141C140FEC03C0 A2EC0F00141C1470495AEB0780011EC7FC1378EA01E0EA0380000EC8FC123C127012C0C9 FCA8007FB51280B612C01A267C9C23>I28 DI<1506A381A216801501ED00C0166016701618B8FCA2 C912181670166016C0ED018015031600A21506A328187E962D>33 D50 D<140CA21418A21430A21460A214C0A2 EB0180A3EB0300A21306A25BA25BA25BA25BA25BA2485AA248C7FCA21206A35AA25AA25A A25AA25A1240162C7AA000>54 D58 D<1308131CA21336A31363A2EBC180A2380180C0A238030060A300067FA2487FA2487FA2 487FA3487FA248EB01801400191C7E9A1E>94 D<00C0148014010060EB0300A26C1306A3 6C5BA26C5BA26C5BA26C5BA36C6C5AA23800C180A20163C7FCA21336A3131CA21308191C 7E9A1E>I<1320136013C0A3EA0180A2EA0300A31206A25AA25AA35AA25AA35AA21260A3 7EA27EA37EA27EA27EA3EA0180A2EA00C0A3136013200B2E7CA112>104 D<12C0A21260A37EA27EA37EA27EA27EA3EA0180A2EA00C0A31360A213C0A3EA0180A2EA 0300A31206A25AA25AA35AA25AA35AA20B2E7EA112>I107 D<160816181630A21660A216C0A2ED0180A2ED0300A21506A25DA25DA2 5DA25DA25D1206001E495A122F004F49C7FCEA878000071306EA03C05CA26C6C5AA26C6C 5AA2EB7860A26D5AA2EB1F80A26DC8FCA21306A2252E7E8126>112 D120 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fy cmbx12 14.4 69 /Fy 69 124 df<49B4FC011F13C090387F81E0EBFC013901F807F01203EA07F0A4EC01C0 91C8FCA3EC3FF8B6FCA33807F003B3A33A7FFF3FFF80A3212A7FA925>12 D<02031306913807800FA2020F5BED001EA34A133E021E133CA2023E137C023C1378A302 7C13F802785BA3007FB712FCB812FEA26C16FC3B0001E003C0000103130702C05BA60107 130F028090C7FC007FB712FCB812FEA26C16FC27001E003CC7FCA3013E137C013C1378A3 017C13F801785BA2EBF80101F05BA30001130301E05BA26C486C5A2F367CA938>35 D<131CA3EB7F803803FFE0000F13F8381F9CFC383E1C1E003C7F007C7F0078EB0F8000F8 131F143FA312FC00FEEB1F0000FF90C7FCEA7FDC13FCEBFFC06C7F6C7F6C13FC7E00017F 6C6C7E131F131CEC3F800038131F127C00FE130FA312FC00F8140012705C0038131E003C 5B381F9CF86CB45A00035BC690C7FC131CA319307CAC22>I<123C127FEAFF80A213C0A3 127F123E1200A2EA0180A3EA0300A21206120E5A5A12100A157BA913>39 D<1306130C13181338137013E01201EA03C0A2EA0780A2120F13005AA2123EA3127EA312 7CA212FCAE127CA2127EA3123EA37EA27E13801207A2EA03C0A2EA01E012001370133813 18130C13060F3C7AAC1A>I<12C012607E12387E7E120FEA0780A2EA03C0A213E0120113 F0A2EA00F8A313FCA3137CA2137EAE137CA213FCA313F8A3EA01F0A213E0120313C0A2EA 0780A2EA0F00120E5A5A12305A5A0F3C7CAC1A>I45 D<121C127FA2EAFF80A3EA7F00A2121C09097B8813>I48 D<130E131E137EEA07FE12 FFA212F81200B3ABB512FEA317277BA622>III<140FA25C5C5C5C5BA2EB03BFEB073F130E131C133C1338137013E0EA01 C0EA038012071300120E5A5A5A12F0B612F8A3C7EA7F00A890381FFFF8A31D277EA622> I<00181303381F801FEBFFFE5C5C5C14C091C7FC001CC8FCA7EB7FC0381DFFF8381F80FC 381E003F1208C7EA1F8015C0A215E0A21218127C12FEA315C05A0078EB3F80A26CEB7F00 381F01FE6CB45A000313F0C613801B277DA622>II<1238123E003FB512F0A34814E015C015 8015003870000EA25C485B5C5CC6485AA2495A130791C7FC5B5B131E133EA2137E137CA2 13FCA41201A76C5A13701C297CA822>III<121C127FA2EA FF80A3EA7F00A2121CC7FCA9121C127FA2EAFF80A3EA7F00A2121C091B7B9A13>I64 DII<91 387FE003903907FFFC07011FEBFF0F90397FF00F9F9039FF0001FFD801FC7F4848147F48 48143F4848141F485A160F485A1607127FA290C9FC5AA97E7F1607123FA26C7E160E6C7E 6C6C141C6C6C143C6C6C14786CB4EB01F090397FF007C0011FB512800107EBFE00903800 7FF028297CA831>IIII<91387FE003903907FFFC07011FEBFF0F90397FF0 0F9F9039FF0001FFD801FC7F484880484880484880485A82485A82127FA290CAFC5AA892 B512F87E7F03001300123FA26C7EA26C7E6C7E6C7E6C7E6CB45B90387FF007011FB5129F 0107EBFE0F9039007FF0032D297CA835>III<90B512F8A301001300B3A91218127EB4FCA35C387E01FC007C5B383E07F0 380FFFE0000390C7FC1D297EA823>IIIIIII82 D<9038FF80600003EBF0E0000F13F8381F80FD383F001F003E13074813 03A200FC1301A214007EA26C140013C0EA7FFCEBFFE06C13F86C13FE80000714806C14C0 C6FC010F13E0EB007FEC1FF0140F140700E01303A46C14E0A26C13076C14C0B4EB0F80EB E03F39E3FFFE0000E15B38C01FF01C297CA825>I<007FB71280A39039807F807FD87C00 140F00781507A20070150300F016C0A2481501A5C791C7FCB3A490B612C0A32A287EA72F >IIII<3B7FFFF01FFFE0 A3000190C7EAF0006C6D485A02C05B017F13036D6C485AD91FF090C7FC5D90380FF81E6D 6C5A1538903803FE786D6C5A5D6D5B147F6E7EA26E7E81143F81EC7BFEECF3FFEB01E102 C07F01036D7EEB078049486C7E010E6D7E131E496D7E01386D7E498001F0130348486D7E B5013F13FCA32E297EA833>II<003FB6FC A39038F001FE90388003FCEB0007003E5C003C495A48131F5D143F00705C4A5A14FF92C7 FCC6485A13035C495A130F5C131F5C495A017FEB03801480EBFF005A5B4848130712075B 000FEC0F005B48485B003F5C4913FF387F8003B7FCA321297CA829>I<3803FF80000F13 F0381F01FC383F80FE147F801580EA1F00C7FCA4EB3FFF3801FC3FEA0FE0EA1F80EA3F00 127E5AA4145F007E13DF393F839FFC381FFE0F3803FC031E1B7E9A21>97 DIIIII<9038FF80F00003EBE3F839 0FC1FE1C391F007C7C48137E003EEB3E10007EEB3F00A6003E133E003F137E6C137C380F C1F8380BFFE00018138090C8FC1238A2123C383FFFF814FF6C14C06C14E06C14F0121F38 3C0007007CEB01F8481300A4007CEB01F0A2003FEB07E0390FC01F806CB5120038007FF0 1E287E9A22>II<1207EA0F80EA1FC0EA3FE0A3EA1FC0EA 0F80EA0700C7FCA7EAFFE0A3120FB3A3EAFFFEA30F2B7EAA12>I108 D<26FFC07FEB1FC0903AC1FFC07FF0903AC307E0C1F8D80FC4 9038F101FC9039C803F20001D801FE7F01D05BA201E05BB03CFFFE3FFF8FFFE0A3331B7D 9A38>I<38FFC07E9038C1FF809038C30FC0D80FC413E0EBC80701D813F013D0A213E0B0 39FFFE3FFFA3201B7D9A25>II<38FFE1FE9038EFFF809038FE0FE0390FF8 03F09038F001F801E013FC140015FEA2157FA8157E15FEA215FC140101F013F89038F807 F09038FC0FE09038EFFF809038E1FC0001E0C7FCA9EAFFFEA320277E9A25>I<38FFC1F0 EBC7FCEBC63E380FCC7F13D813D0A2EBF03EEBE000B0B5FCA3181B7F9A1B>114 D<3803FE30380FFFF0EA3E03EA7800127000F01370A27E00FE1300EAFFE06CB4FC14C06C 13E06C13F0000713F8C6FCEB07FC130000E0137C143C7E14387E6C137038FF01E038E7FF C000C11300161B7E9A1B>I<13E0A41201A31203A21207120F381FFFE0B5FCA2380FE000 AD1470A73807F0E0000313C03801FF8038007F0014267FA51A>I<39FFE07FF0A3000F13 07B2140FA2000713173903F067FF3801FFC738007F87201B7D9A25>I<39FFFC03FFA339 0FF000F0000714E07F0003EB01C0A2EBFC0300011480EBFE070000140013FFEB7F0EA214 9EEB3F9C14FC6D5AA26D5AA36D5AA26D5AA2201B7F9A23>I<3BFFFC7FFC1FFCA33B0FE0 0FE001C02607F007EB0380A201F8EBF00700031600EC0FF801FC5C0001150EEC1FFC2600 FE1C5B15FE9039FF387E3C017F1438EC787F6D486C5A16F0ECE01F011F5CA26D486C5AA2 EC800701075CA22E1B7F9A31>I<39FFFC1FFEA33907F003803803F8079038FC0F003801 FE1E00005BEB7F3814F86D5A6D5A130F806D7E130F497EEB3CFEEB38FFEB787F9038F03F 803901E01FC0D803C013E0EB800F39FFF03FFFA3201B7F9A23>I<39FFFC03FFA3390FF0 00F0000714E07F0003EB01C0A2EBFC0300011480EBFE070000140013FFEB7F0EA2149EEB 3F9C14FC6D5AA26D5AA36D5AA26D5AA25CA21307003890C7FCEA7C0FEAFE0E131E131C5B EA74F0EA3FE0EA0F8020277F9A23>I<003FB5FCA2EB00FEEA3C01383803FC007813F8EB 07F0EA700F14E0EB1FC0EA003F1480EB7F005B5B3801FC07120313F8EA07F0000F130F13 E0381FC00E003F131E387F803EEB00FEB5FCA2181B7E9A1E>II E %EndDVIPSBitmapFont %DVIPSBitmapFont: Fz cmr10 10.95 92 /Fz 92 127 df<90381F83E09038F06E303901C07878380380F8903800F03048EB7000A7 B612803907007000B2383FE3FF1D20809F1B>11 D<133FEBE0C0EA01C0380381E0EA0701 A290C7FCA6B512E0EA0700B2383FC3FC1620809F19>II<90381F81F89038F04F043901C07C063903 80F80FEB00F05A0270C7FCA6B7FC3907007007B23A3FE3FE3FE02320809F26>I22 D<127012F8A71270AA1220A51200A5127012F8A3127005217CA00D>33 DI<9038018030A449485AA501065BA549485A007FB6FCB7128026001803C7FCA2EB30 06A4495AA2B712806C15002600C018C7FC48485AA548485AA500065BA321297E9F26>I< 1340A2EA03F0EA0C4EEA10413820408012600040134038C041C01343A238E04180EB4000 1270127CEA3FC0EA1FF86C7EEA03FEEA007FEB4F801343EB41C0A2EAF040A312801480EA 404100201300EA3042EA0C4CEA03F0EA0040A312257EA117>II<137813841201EA03021207A45BA25BA2EA03909038A00FFC9038C001E0EC00C0 00011480EC0100EA02E000041302EA08703818780438303808EA703CEB1C10EAF00EEB0F 20EB07C09038038004387001C0397802E0083938047018391C183C303907E00FC01E227E A023>I<127012F812FCA212741204A31208A21210A212201240060E7C9F0D>I<13401380 EA01005A12061204120C5AA212381230A212701260A412E0AC1260A412701230A2123812 18A27E120412067E7EEA008013400A2E7BA112>I<7E12407E12307E1208120C7EA21207 7EA213801201A413C0AC1380A412031300A25A1206A25A120812185A12205A5A0A2E7EA1 12>I<1303AFB612FCA2D80003C7FCAF1E207E9A23>43 D<127012F012F8A212781208A3 1210A31220A21240050E7C840D>II<127012F8A3127005057C84 0D>I<144014C0EB0180A3EB0300A31306A25BA35BA35BA25BA35BA3485AA348C7FCA212 06A35AA35AA25AA35AA35AA2122D7EA117>I I<13801203120F12F31203B3A6EA07C0EAFFFE0F1E7C9D17>III<1306A2 130EA2131E132EA2134E138EA2EA010E1202A212041208A212101220A2124012C0B512F0 38000E00A7EBFFE0141E7F9D17>II<137CEA0182EA0701380E0380EA0C0712183838030090C7FC12 781270A2EAF1F0EAF21CEAF406EAF807EB0380A200F013C0A51270A214801238EB070012 18EA0C0E6C5AEA01F0121F7E9D17>I<1240387FFFE014C0A23840008038800100A21302 485AA25B5BA25BA21360A213E05B1201A41203A76C5A131F7E9D17>III<127012F8A312701200AA127012F8A3127005147C930D>I<127012F8A3 12701200AA127012F012F8A212781208A31210A31220A21240051D7C930D>I<007FB512 F8B612FCC9FCA8B612FC6C14F81E0C7E9023>61 D63 D<5B497EA3497EA3EB09E0A3EB10F0A3EB2078A3497EA2EBC03EEB 801EA248B5FCEB000FA20002EB0780A348EB03C0A2120C001E14E039FF801FFE1F207F9F 22>65 DI<90380FE0109038 381C309038E002703803C00139078000F048C71270121E15305A1510127C127800F81400 A91278007C1410123CA26C1420A27E6C6C13406C6C13803900E00300EB380CEB0FF01C21 7E9F21>IIII<90380F E0109038381C309038E002703803C00139078000F048C71270121E15305A1510127C1278 00F81400A7EC3FFEEC01F000781300127C123CA27EA27E6C7E3903C001703900E0023090 38380C1090380FF0001F217E9F24>I<39FFF07FF8390F000780AD90B5FCEB0007AF39FF F07FF81D1F7E9E22>II<3807FFC038003E0013 1EB3A3122012F8A3EAF01CEA403CEA6038EA1070EA0FC012207F9E17>I<39FFF007FC39 0F0003E0EC0180150014025C5C5C5C5C5C49C7FC5B497E130FEB13C0EB21E01341EB80F0 EB0078A28080A280EC0780A2EC03C015E015F039FFF01FFE1F1F7E9E23>IIIIIIII<38 03F040380C0CC0EA1803EA3001EA6000A212E01440A36C13007E127CEA7F80EA3FF86CB4 FC00071380C613C0EB1FE013031301EB00F014707EA46C136014E06C13C038F8018038C6 0300EA81FC14217E9F19>I<007FB512E038780F010060EB006000401420A200C0143000 801410A400001400B3497E3803FFFC1C1F7E9E21>I<39FFF00FF8390F0003E0EC0080B3 A46CEB01001380120314026C6C5A6C6C5AEB3830EB0FC01D207E9E22>I<39FFF003FE39 1F8000F86CC7126015206C6C1340A36C6C1380A2EBE00100011400A23800F002A213F8EB 7804A26D5AA36D5AA2131F6D5AA2EB07C0A36D5AA36DC7FC1F207F9E22>I<3BFFF07FF8 1FF03B1F000FC007C06C903907800180170015C001805C00071502EC09E013C000035DEC 19F01410D801E05CA2EC2078D800F05CA2EC403C01785CA2EC801E017C1460013C144090 383D000F133F6D5CA2011E1307010E91C7FCA2010C7F010413022C207F9E2F>I<397FF8 1FF8390FE007C03907C0030000031302EBE0063801F00400005BEBF818EB78106D5AEB3E 60EB1E406D5AA213076D7E497E1305EB08F0EB18F8EB1078EB207CEB603EEB401EEB801F 3901000F801407000214C000061303001FEB07E039FFC01FFE1F1F7F9E22>I<39FFF001 FF391F800078000F146012076D1340000314807F3901F001001200EBF802EB7C06EB3C04 EB3E08131EEB1F10EB0FB0EB07A014E06D5AACEB3FFC201F7F9E22>I<387FFFFE387E00 3C127800701378006013F814F0384001E0130314C0EB07801200EB0F00131EA25B137C13 785B1201EBE002EA03C0A2EA0780000F13061300001E1304003E130C123C48133C14FCB5 FC171F7E9E1C>I<12FFA212C0B3B3A512FFA2082D7CA10D>II<12FFA21203B3B3A512 FFA2082D80A10D>I<120812101220A21240A21280A312B812FCA2127C1238060E7D9F0D> 96 DI<121C12FC121CAA137CEA1D87381E0180 EB00C0001C13E01470A21478A6147014F014E0001E13C0381A018038198700EA107C1520 7E9F19>IIII<137CEA01C6EA030F1207EA0E061300A7EAFFF0EA0E00B2EA 7FE01020809F0E>I<14E03803E330EA0E3CEA1C1C38380E00EA780FA5EA380E6C5AEA1E 38EA33E00020C7FCA21230A2EA3FFE381FFF8014C0383001E038600070481330A4006013 606C13C0381C03803803FC00141F7F9417>I<121C12FC121CAA137C1386EA1D03001E13 80A2121CAE38FF8FF014207E9F19>I<1238127CA31238C7FCA6121C12FC121CB1EAFF80 091F7F9E0C>I<13E0EA01F0A3EA00E01300A61370EA07F012001370B3A31260EAF06013 C0EA6180EA3F000C28829E0E>I<121C12FC121CAAEB1FE0EB0780EB060013045B5B5B13 6013E0EA1DF0EA1E70EA1C38133C131C7F130F7F148014C038FF9FF014207E9F18>I<12 1C12FC121CB3ABEAFF8009207F9F0C>I<391C3E03E039FCC30C30391D039038391E01E0 1CA2001C13C0AE3AFF8FF8FF8021147E9326>IIII<3801F04038070CC0EA0E02EA1C03EA38011278127012F0 A6127012781238EA1C03EA0C05EA0709EA01F1EA0001A8EB0FF8151D7F9318>III<1202A31206A2120EA2123EEAFFF8EA0E00AB1304A5EA07081203EA01F0 0E1C7F9B12>I<381C0380EAFC1FEA1C03AE1307120CEA061B3803E3F014147E9319>I<38 FF83F8383E00E0001C13C06C1380A338070100A21383EA0382A2EA01C4A213E4EA00E8A2 1370A3132015147F9318>I<39FF9FE1FC393C078070391C030060EC8020000E1440A214 C0D80704138014E0A239038861001471A23801D032143A143E3800E01CA2EB6018EB4008 1E147F9321>I<38FF87F8381E03C0380E0180EB0300EA0702EA0384EA01C813D8EA00F0 1370137813F8139CEA010E1202EA060738040380000C13C0003C13E038FE07FC16147F93 18>I<38FF83F8383E00E0001C13C06C1380A338070100A21383EA0382A2EA01C4A213E4 EA00E8A21370A31320A25BA3EAF080A200F1C7FC1262123C151D7F9318>IIII126 D E %EndDVIPSBitmapFont %DVIPSBitmapFont: FA cmbx12 20.736 4 /FA 4 88 df66 D69 DI87 D E %EndDVIPSBitmapFont end %%EndProlog %%BeginSetup %%Feature: *Resolution 300dpi TeXDict begin %%EndSetup %%Page: 1 1 1 0 bop 75 697 a FA(FWEB)p 75 730 1800 17 v 983 778 a Fz(A)15 b(WEB)g(system)g(of)f(structured)i(do)q(cumen)o(tation)1435 832 y(for)f(m)o(ultiple)i(languages)75 2534 y Fy(By)23 b(John)f(A.)g(Krommes)p 75 2570 1800 9 v eop %%Page: 2 2 2 1 bop 75 2131 a Fz(Cop)o(yrigh)o(t)301 2130 y(c)289 2131 y Fx(\015)15 b Fz(1993{1998)e(John)j(A.)e(Krommes)75 2198 y(P)o(ermission)j(is)f(gran)o(ted)g(to)f(mak)o(e)h(and)g (distribute)i(v)o(erbatim)d(copies)i(of)f(this)h(man)o(ual)f(pro)o (vided)h(the)75 2253 y(cop)o(yrigh)o(t)e(notice)h(and)f(this)h(p)q (ermission)g(notice)g(are)f(preserv)o(ed)h(on)f(all)h(copies.)75 2320 y(P)o(ermission)c(is)h(gran)o(ted)e(to)g(cop)o(y)h(and)g (distribute)h(mo)q(di\014ed)g(v)o(ersions)f(of)f(this)h(man)o(ual)g (under)h(the)f(con-)75 2375 y(ditions)k(for)f(v)o(erbatim)g(cop)o (ying,)g(pro)o(vided)h(also)g(that)e(the)i(section)f(en)o(titled)i (\\Cop)o(ying")e(is)g(included)75 2430 y(exactly)f(as)f(in)i(the)f (original,)g(and)g(pro)o(vided)g(that)f(the)h(en)o(tire)g(resulting)h (deriv)o(ed)g(w)o(ork)d(is)i(distributed)75 2484 y(under)i(the)f(terms) g(of)g(a)f(p)q(ermission)j(notice)f(iden)o(tical)h(to)e(this)g(one.)75 2552 y(P)o(ermission)i(is)g(gran)o(ted)f(to)g(cop)o(y)h(and)f (distribute)i(translations)f(of)f(this)h(man)o(ual)g(in)o(to)f(another) g(lan-)75 2606 y(guage,)e(under)h(the)f(ab)q(o)o(v)o(e)g(conditions)i (for)d(mo)q(di\014ed)j(v)o(ersions,)e(except)h(that)f(this)h(p)q (ermission)g(notice)75 2661 y(ma)o(y)f(b)q(e)i(stated)f(in)h(a)f (translation)g(appro)o(v)o(ed)g(b)o(y)g(the)g(author.)p eop %%Page: 1 3 1 2 bop 75 -58 a Fw(Fweb)1656 b Fz(1)75 183 y Fv(Fweb)137 300 y Fz(This)16 b(T)l(exinfo)g(do)q(cumen)o(tation)g(describ)q(es)g Fw(Fweb)h Fz(V)l(ersion)f(1.61.)232 365 y Fx(\017)30 b Fz(T)l(o)24 b(learn)i(ab)q(out)e(new)h(features)f(of)g(this)i(v)o (ersion,)g(see)f(Section)h(14.1)d([V1.61],)285 417 y(page)15 b(124.)232 481 y Fx(\017)30 b Fz(F)l(or)12 b(a)h(quic)o(k)g(in)o(tro)q (duction)h(to,)e(and)h(review)h(of)e(the)h(structure)g(of)f(an)h Fw(Fweb)h Fz(source)285 533 y(\014le,)i(see)f(Section)h(2.2)f ([Structure],)f(page)h(5.)232 597 y Fx(\017)30 b Fz(If)12 b(y)o(ou)f(used)i(to)e(receiv)o(e)h(e-mail)h(information)f(ab)q(out)g Fw(Fweb)h Fz(but)e(don't)h(an)o(y)f(longer,)285 649 y(it's)i(probably)i (b)q(ecause)f(y)o(ou)g(need)g(to)f(up)q(date)i(y)o(our)e(e-mail)i (address)e(in)i(the)f Fu(fweb-)285 701 y(users)i Fz(mailing)j(list.)26 b(Subscription)18 b(instructions)g(can)f(b)q(e)h(found)f(in)h(Chapter)f (15)285 753 y([Supp)q(ort],)e(page)g(131.)232 817 y Fx(\017)30 b Fz(Bug)17 b(rep)q(orts)g(and)g(suggestions)g(are)g(m)o(uc)o(h)g (appreciated,)h(but)f(are)g(no)g(longer)g(ac-)285 869 y(kno)o(wledged)f(individuall)q(y)l(.)23 b(See)16 b(Chapter)f(15)f ([Supp)q(ort],)h(page)g(131.)232 933 y Fx(\017)30 b Fz(The)15 b(next)g(ma)s(jor)e(release,)i Fw(Fweb)h Fz(V)l(ersion)f(2.00,)e(is)j (planned)g(for)e(no)g(earlier)i(than)285 985 y(Jan)o(uary)f(1,)g(2000.) 137 1065 y(This)h(do)q(cumen)o(tation)g(is)f(no)o(w)g(accessible)i(on)e (the)h(W)l(orld-Wide)g(W)l(eb)g(from)195 1129 y Fu (http://w3.pppl.gov/~kromme)o(s/fweb_)o(toc.html)o Fz(.)137 1197 y(Other)h(sources)f(of)f(information)i(ab)q(out)f Fw(Fweb)h Fz(are)f(the)g(arc)o(hiv)m(al)h(\014les)g(of)f(the)g Fu(fweb-users)f Fz(and)75 1251 y Fu(fweb-installers)h Fz(mailing)j(lists.)30 b(T)l(o)17 b(learn)i(ho)o(w)e(to)h(obtain)g (those,)g(see)g(Chapter)g(15)g([Supp)q(ort],)75 1306 y(page)d(131.)137 1373 y(If)g(y)o(ou)e(are)h(learning)h Fw(Fweb)g Fz(for)f(the)g(\014rst)g(time,)g(y)o(ou)f(will)j(probably)f (\014nd)g(that)e(this)h(\(un\014nished\))75 1428 y(man)o(ual)i(is)g (not)f(su\016cien)o(tly)i(p)q(edagogical.)22 b(F)l(or)15 b(bac)o(kground,)h(please)g(refer)g(to)f(Kn)o(uth's)g(b)q(o)q(ok)h (cited)75 1483 y(in)e(Chapter)g(1)f([In)o(tro],)f(page)h(3.)19 b(Y)l(ou)14 b(should)h(also)e(bro)o(wse)g(through)g(Chapter)g(2)h ([Concepts],)e(page)i(5,)75 1538 y(in)i(particular)g(Section)g(2.2)e ([Structure],)g(page)h(5.)p eop %%Page: 2 4 2 3 bop 75 -58 a Fw(Fweb)16 b Fz(Cop)o(ying)g(P)o(ermissions)1228 b(2)75 183 y Fv(Fweb)27 b Ft(Cop)n(ying)f(P)n(ermissions)137 300 y Fw(Fweb)18 b Fz(is)g(\\free.")25 b(This)17 b(means)g(that)g(ev)o (ery)o(one)g(is)g(free)g(to)g(use)g(them)g(and)g(free)g(to)g (redistribute)75 355 y(them)e(on)g(a)f(free)h(basis.)21 b Fw(Fweb)15 b Fz(op)q(erates)g(under)h(the)f(terms)f(of)h(the)g(GNU)f (General)i(Public)h(License;)75 410 y(see,)e(for)g(example,)g(section)h (\\Distribution")g(in)g Fs(The)f(GNU)g(Emacs)g(Man)o(ual)r Fz(.)137 477 y(Although)23 b(it)f(is)g(hop)q(ed)g(that)f Fw(Fweb)i Fz(will)g(b)q(e)g(useful,)h(there)e(is)g Fs(ABSOLUTEL)l(Y)i (NO)e(W)-5 b(AR-)75 532 y(RANTY)p Fz(.)p eop %%Page: 3 5 3 4 bop 75 -58 a Fz(Chapter)15 b(1:)k(INTR)o(ODUCTION)e(to)d Fw(Fweb)982 b Fz(3)75 183 y Ft(1)41 b(INTR)n(ODUCTION)26 b(to)i Fv(Fweb)137 302 y Fw(Fweb)17 b Fz(is)f(a)f(system)g(for)f Fs(literate)i(programming)p Fz(.)k(It)c(enables)g(one)g(to)e(main)o (tain)i(b)q(oth)g(do)q(cumen-)75 357 y(tation)e(and)g(source)f(co)q(de) i(in)g(a)e(single)i(place)g(\(the)f Fu(web)f Fz(\014le\),)i(and)f(to)f (explain)i(the)f(co)q(de)h(in)g(terms)e(of)g(a)75 412 y Fs(w)o(eb)k Fz(of)f(v)o(ery)g(small)i(fragmen)o(ts.)k(Because)17 b Fw(Fweb)g Fz(is)g(in)o(timately)h(in)o(tegrated)e(with)h(T)1601 422 y(E)1626 412 y(X,)f(one)h(gains)75 467 y(man)o(y)c(adv)m(an)o (tages)f(suc)o(h)h(as)g(b)q(o)q(ok-qualit)o(y)h(t)o(yp)q(esetting)f (and)h(extensiv)o(e)f(cross-referencing)h(facilities.)75 522 y(A)h(simple)i(example)f(program)e(is)i(describ)q(ed)h(in)f (Section)g(2.2)e([Structure],)g(page)h(5.)137 590 y Fw(Fweb)g Fz(w)o(as)f(originally)i(in)o(tended)f(for)f(scien)o(ti\014c)i (programming)d(\(the)h('F')f(stands)h(for)f Fw(F)o(or)m(tran)p Fz(\),)75 644 y(and)22 b(is)g(in)h(wide)f(use)g(in)h(that)e(arena;)j (ho)o(w)o(ev)o(er,)e(it)g(has)g(m)o(uc)o(h)f(broader)h(applicabilit)o (y)l(.)42 b(It)22 b(is)g(an)75 699 y(extension)g(of)f(Kn)o(uth's)g(WEB) g(system)g(that)f(handles)i(the)g(sp)q(eci\014c)h(languages)e(C,)f(C)p Fu(++)p Fz(,)i(F)l(ortran)75 754 y(\(b)q(oth)c(F77)g(and)g(F90\),)g Fw(Ra)m(tf)o(or)p Fz(,)h(and)g(\(in)g(a)f(limited)i(fashion\))e(T)1277 764 y(E)1303 754 y(X)g(itself.)30 b(It)19 b(also)f(attempts)g(to)75 809 y(implemen)o(t)f(a)f(WYSIWYG)g(language-indep)q(endent)i(mo)q(de)e (as)g(w)o(ell)h(as)f(a)f(\(closely-related)j(but)e(not)75 864 y(iden)o(tical\))g(v)o(erbatim)e(`language'.)19 b Fs(The)c(language-indep)q(enden)o(t)i(features)d(are)g(highly)i(exp)q (erimen)o(tal)75 918 y Fz(and)f(are)g(not)g(recommended.)137 986 y(The)21 b(origins)g(and)g(philosoph)o(y)h(of)e(literate)h (programming)f(are)g(describ)q(ed)j(in)e(the)g(v)o(ery)f(enjo)o(y-)75 1041 y(able)d(b)q(o)q(ok)f(b)o(y)g(D.)g(E.)f(Kn)o(uth,)i Fs(Literate)f(Programming)j Fz(\(Cen)o(ter)d(for)f(the)h(Study)h(of)f (Language)g(and)75 1096 y(Information,)f(Leland)h(Stanford)f(Junior)h (Univ)o(ersit)o(y)l(,)g(1992\).)137 1164 y(Kn)o(uth's)f(original)g(WEB) g(w)o(as)f(written)g(in)h(P)o(ascal,)g(and)f(it)h(formatted)e(P)o (ascal)i(co)q(de.)20 b(Silvio)c(Levy)75 1219 y(in)o(tro)q(duced)21 b Fw(Cweb)p Fz(,)g(a)f(WEB)f(system)h(written)g(in)g(C)g(for)f(C.)g Fw(Fweb)i Fz(is)g(a)e(\(b)o(y)h(no)o(w,)g(substan)o(tial\))75 1273 y(mo)q(di\014cation)c(of)f(v)o(ersion)h(0.5)e(of)h Fw(Cweb)h Fz(that)e(w)o(as)h(graciously)h(supplied)h(b)o(y)e(Levy)l(.) 21 b(It)16 b(also)f(b)q(orro)o(ws)75 1328 y(v)m(arious)h(ideas)g(from)e (the)h(w)o(orks)f(of)h(Ramsey)h(and)f(Briggs)g(on)g(language-indep)q (endent)i(w)o(ebs.)137 1396 y(The)f(original)h(WEB's)e(w)o(ork)o(ed)g (with)h(Plain)g(T)956 1406 y(E)982 1396 y(X.)f(More)g(recen)o(tly)l(,)h (man)o(y)g(users)f(ha)o(v)o(e)h(turned)g(to)75 1451 y(Lamp)q(ort's)e (LaT)370 1461 y(E)395 1451 y(X)h(b)q(ecause)h(of)e(its)g(ease)h(of)f (use)h(and)g(higher-lev)o(el)i(features.)i(Excellen)o(t)d(and)f(exten-) 75 1506 y(siv)o(e)h(dev)o(elopmen)o(t)h(of)f(LaT)558 1516 y(E)583 1506 y(X)g(has)g(b)q(een)h(accomplished,)h(as)e(describ)q (ed)h(b)o(y)f(Go)q(ossens,)g(Mittelbac)o(h,)75 1561 y(and)f(Samarin,)g Fs(The)g(LaT)524 1570 y(E)549 1561 y(X)g(Companion)g Fz(\(Addison{W)l(esley)l(,)h(Reading,)g(MA,)e(1994\).)k(The)d(presen)o (t)75 1615 y(v)o(ersion)f(of)g Fw(Fweb)h Fz(is)f(in)o(tended)i(to)d(b)q (e)i(used)f(with)h(LaT)1040 1625 y(E)1065 1615 y(X)f(\(LaT)1207 1625 y(E)1233 1615 y(X2e,)g(in)g(particular\);)h(Plain)g(T)1771 1625 y(E)1796 1615 y(X)f(is)75 1670 y(no)h(longer)h(supp)q(orted.)75 1801 y Fy(1.1)33 b(History)22 b(of)g(WEB)h(and)g(literate)g (programming)137 1898 y Fz(\(T)l(o)15 b(b)q(e)h(completed;)g(see)f(Kn)o (uth's)g(b)q(o)q(ok,)g(cited)h(in)g(Chapter)f(1)g([In)o(tro],)f(page)h (3.\))75 2028 y Fy(1.2)33 b(F)-6 b(eatures)22 b(of)g Fr(Fweb)137 2125 y Fw(Fweb)17 b Fz(is)e(distinguished)j(from)c(its)i (relativ)o(es)f(in)i(sev)o(eral)e(resp)q(ects:)232 2190 y Fx(\017)30 b Fw(Fweb)18 b Fz(in)o(tro)q(duces)g(the)e(concept)i(of)e (a)h Fs(curren)o(t)f(language)k Fz(\(see)d(Chapter)f(8)h([Lan-)285 2242 y(guages],)h(page)g(83\),)f(so)h(more)g(than)g(one)g(compiler)i (language)e(can)g(b)q(e)h(pro)q(cessed)285 2294 y(in)g(a)g(single)g Fw(Fweb)h Fz(run.)30 b(F)l(or)18 b(example,)i(mixtures)f(of)f(C)p Fu(++)g Fz(and)g Fw(F)o(or)m(tran)h Fz(are)285 2346 y(common)c(in)h(mo) q(dern)f(scien)o(ti\014c)i(programming.)232 2411 y Fx(\017)30 b Fw(Fweb)15 b Fz(understands)f(the)g(syn)o(taxes)f(of)h(sev)o(eral)g (of)f(the)h(more)f(imp)q(ortan)o(t)h(compiler)285 2462 y(languages:)19 b(C,)13 b(C)p Fu(++)p Fz(,)f Fw(F)o(or)m(tran)i Fz(\(b)q(oth)f(F77)f(and)h(F90\),)f Fw(Ra)m(tf)o(or)p Fz(,)i(and)f(T)1603 2472 y(E)1629 2462 y(X.)g(F)l(or)285 2514 y(other)21 b(languages,)h Fw(Fweb)h Fz(can)e(w)o(ork)f(in)i(a)f (language-indep)q(endent)i(mo)q(de)f(that)285 2566 y(essen)o(tially)16 b(w)o(ea)o(v)o(es)e(and)h(tangles)g(the)g(source)g(co)q(de)h(v)o (erbatim,)e(but)h(still)h(pro)o(vides)285 2618 y(the)i(user)g(with)g (the)f(p)q(o)o(w)o(erful)h Fw(web)h Fz(features)e(related)h(to)f Fw(TeX)h Fz(do)q(cumen)o(tation,)285 2670 y(mo)q(dule)e(names,)f(macro) g(pro)q(cessing,)g(etc.)p eop %%Page: 4 6 4 5 bop 75 -58 a Fz(Chapter)15 b(1:)k(INTR)o(ODUCTION)e(to)d Fw(Fweb)982 b Fz(4)232 183 y Fx(\017)30 b Fw(Fweb)13 b Fz(con)o(tains)f(a)f(built-in)j Fw(Ra)m(tf)o(or)e Fz(\()p Fw(RA)l(Tional)g(F)o(OR)l(tran)p Fz(\))g(translator.)17 b(See)285 235 y(Chapter)e(9)g([Ratfor],)e(page)i(89.)232 299 y Fx(\017)30 b Fw(Fweb)13 b Fz(has)f(a)f(built-in)j(C-lik)o(e)f Fs(macro)f(prepro)q(cessor)p Fz(.)18 b(This)13 b(is)f(esp)q(ecially)j (useful)e(for)285 351 y Fw(F)o(or)m(tran)i Fz(and)g Fw(Ra)m(tf)o(or)p Fz(,)h(whic)o(h)f(ha)o(v)o(e)g(no)g(prede\014ned)h(prepro)q(cessor.)k (Ho)o(w)o(ev)o(er,)285 403 y(certain)15 b(extensions)h(suc)o(h)f(as)f (v)m(ariable)i(n)o(um)o(b)q(ers)f(of)f(argumen)o(ts)g(mak)o(e)g(the)h Fw(Fweb)285 455 y Fz(prepro)q(cessor)c(sometimes)g(useful)i(ev)o(en)e (for)f(C)h(and)h(C)p Fu(++)p Fz(.)18 b(See)11 b(Chapter)g(7)g ([Macros],)285 507 y(page)k(62)g(and)g(Section)h(7.3)e([Prepro)q (cessing],)h(page)g(80.)232 571 y Fx(\017)30 b Fz(Man)o(y)14 b(asp)q(ects)h(of)g Fw(Fweb)p Fz('s)g(b)q(eha)o(vior,)h(default)f (strings,)g(etc.)k(can)c(b)q(e)h(customized)285 623 y(b)o(y)g(means)h (of)f(setting)g(parameters)g(in)h(a)f Fu(makeindex)p Fz(-lik)o(e)h Fs(st)o(yle)g(\014le)j Fz(\(b)o(y)c(default,)285 675 y(`)p Fu(fweb.sty)p Fz('\).)i(See)d(Section)i(12.3)d([St)o(yle],)g (page)h(112.)p eop %%Page: 5 7 5 6 bop 75 -58 a Fz(Chapter)15 b(2:)k(WEB)c(CONCEPTS)1165 b(5)75 183 y Ft(2)41 b(WEB)27 b(CONCEPTS)137 300 y Fz(The)12 b(principle)j(concepts)d(of)f Fw(WEB)h Fz(programming)f(are)h(laid)g (out)g(in)g(Kn)o(uth's)g(b)q(o)q(ok,)g(the)g(reference)75 355 y(to)g(whic)o(h)i(w)o(as)f(giv)o(en)g(in)h(Chapter)f(1)g([In)o (tro],)e(page)i(3.)19 b Fw(Fweb)14 b Fz(follo)o(ws)f(most)g(con)o(v)o (en)o(tions)g(in)o(tro)q(duced)75 409 y(b)o(y)22 b Fw(web)h Fz(and)f Fw(Cweb)p Fz(,)i(except)f(that)e(the)h(names)h(of)e(some)h (commands)g(ha)o(v)o(e)g(b)q(een)h(c)o(hanged)g(for)75 464 y(consistency)l(,)16 b(symmetry)l(,)e(and/or)h(clarit)o(y)l(.)75 593 y Fy(2.1)33 b(The)22 b Fr(Fweb)g Fy(pro)r(cessors:)32 b Fr(Fwea)-5 b(ve)21 b Fy(and)i Fr(Ft)l(angle)137 689 y Fz(F)l(ollo)o(wing)i(Kn)o(uth's)f(original)i(design,)h Fw(Fweb)e Fz(consists)f(of)g(t)o(w)o(o)f(pro)q(cessors,)j Fw(Ft)m(angle)f Fz(and)75 744 y Fw(Fwea)l(ve)p Fz(.)k(Both)18 b(op)q(erate)g(on)g(a)g(single)h(source)f(\014le,)h(sa)o(y)f(`)p Fu(test.web)p Fz('.)26 b Fw(Ft)m(angle)19 b Fz(pro)q(duces)g(com-)75 798 y(pilable)k(co)q(de,)g(sa)o(y)d(`)p Fu(test.c)p Fz(',)h(whereas)g Fw(Fwea)l(ve)h Fz(pro)q(duces)g(a)e(T)1277 808 y(E)1303 798 y(X)h(\014le,)i(`)p Fu(test.tex)p Fz(',)d(that)h(can)75 853 y(\(in)c(principle\))i(b)q(e)e(pro)q(cessed)g(with)g(either)h(T)882 863 y(E)907 853 y(X)f(or)f(LaT)1091 863 y(E)1116 853 y(X.)g(\(If)h(a)f(\014le)i(`)p Fu(test.tex)p Fz(')c(already)j(exists,) 75 908 y Fw(Fwea)l(ve)e Fz(will)g(ask)e(for)h(con\014rmation)g(b)q (efore)g(o)o(v)o(erwriting)f(it)h(if)h(it)f(do)q(es)g(not)f(think)i (that)e(the)h(\014le)h(w)o(as)75 963 y(created)g(b)o(y)g(a)g(previous)h (run)g(of)e Fw(Fwea)l(ve)p Fz(.\))137 1030 y(The)i(output)g(\014le)h (pro)q(duced)f(b)o(y)g Fw(Ft)m(angle)h Fz(is)f(not)f(in)o(tended)i(for) e(h)o(uman)h(ey)o(es)g(\(or)f(for)g(editors!\);)75 1085 y(it)21 b(is)g(for)f(compiling)j(only)l(.)37 b(All)23 b(c)o(hanges)d(to)g(the)h(co)q(de)h(should)f(b)q(e)h(made)f(to)f(the)h Fu(web)f Fz(\014le,)j(since)75 1140 y(c)o(hanges)14 b(made)g(directly)h (to)e(the)h(output)g(\014le)h(w)o(ould)f(b)q(e)g(o)o(v)o(erwritten)f (the)h(next)g(time)h(the)e Fu(web)h Fz(source)75 1194 y(is)e(tangled.)20 b(In)12 b(an)g(attempt)f(to)g(discourage)h(messing)g (with)h Fw(Ft)m(angle)p Fz('s)f(output)f(\014le,)i(all)g(unnecessary)75 1249 y(spaces)i(are)g(delib)q(erately)j(remo)o(v)o(ed.)137 1316 y(A)g(common)f(w)o(a)o(y)f(of)h(in)o(tegrating)h Fw(Fweb)g Fz(in)o(to)g(ones)f(program)f(dev)o(elopmen)o(t)j(is)e(to)g (do)h(all)g(com-)75 1371 y(pilations)h(through)e(a)f Fu(make)h Fz(\014le,)i(in)o(to)e(whic)o(h)h(one)f(puts)h(an)f(extra)f (dep)q(endency)k(line)f(that)d(explains)75 1426 y(ho)o(w)f(to)f(pro)q (duce)i(the)g(compilable)h(output)e(\014le)h(from)f(the)g Fu(web)g Fz(source.)20 b(F)l(or)14 b(example,)195 1490 y Fu(test.c:)23 b(test.web)386 1542 y(ftangle)g(test)195 1646 y(test.o:)g(test.c)386 1698 y(gcc)g(-c)h(test)f(test.c)75 1765 y Fz(With)15 b(this)h(approac)o(h,)f(one)g(is)h(not)e(so)h (tempted)g(to)g(edit)h(`)p Fu(test.c)p Fz('.)137 1832 y Fw(Fweb)22 b Fz(dev)o(elopmen)o(t)f(is)g(no)o(w)f(based)h(on)g(LaT) 977 1842 y(E)1002 1832 y(X;)g(Plain)g(T)1219 1842 y(E)1245 1832 y(X)f(is)i(no)e(longer)h(supp)q(orted.)37 b(F)l(or)75 1887 y(detailed)17 b(descriptions)f(of)f(the)g(LaT)703 1897 y(E)729 1887 y(X)g(supp)q(ort,)g(see)h(Section)g(10.1.3)d([LaT)l (eX],)i(page)g(93.)75 2015 y Fy(2.2)33 b(The)22 b(structure)h(of)f(a)g (w)n(eb)137 2111 y Fz(An)e Fw(Fweb)g Fz(source)f(\014le)h(is)g (structured)f(in)o(to)g Fs(sections)p Fz(,)h(whic)o(h)g(corresp)q(ond)f (to)g(logical)h(subunits)75 2166 y(of)c(the)h(co)q(de)h(\(either)f(a)f (function)i(or)e(a)h(fragmen)o(t)e(of)i(a)f(function\).)25 b(Eac)o(h)17 b(section)g(consists)g(of)g(three)75 2221 y Fs(parts)p Fz(,)d(eac)o(h)h(of)g(whic)o(h)h(is)g(optional:)k(the)220 2285 y(1.)29 b(T)310 2295 y(E)336 2285 y(X)15 b(part;)220 2349 y(2.)29 b(de\014nition)17 b(part;)d(and)220 2414 y(3.)29 b(co)q(de)16 b(part.)75 2493 y(When)i Fw(Ft)m(angle)g Fz(outputs)f(co)q(de,)h(it)f(can)h(com)o(bine)g(the)f(co)q(de)h(parts)f (of)f(\(p)q(ossibly)j(noncon)o(tiguous\))75 2548 y(sections)d(in)o(to)f (larger)g(units)h(called)h Fs(mo)q(dules)p Fz(,)e(as)g(explained)j(in)e (Section)g(2.3)e([Mo)q(dules],)h(page)g(8.)137 2615 y(With)h(the)g(aid) g(of)g(sections,)g(one's)f(p)q(ossibly)i(h)o(uge)f(and)g(logically)i (complex)e(co)q(de)h(can)f(b)q(e)g(brok)o(en)75 2670 y(do)o(wn)e(in)o(to)g(bite-sized)j(pieces,)e(eac)o(h)g(one)f(easily)h (comprehensible.)22 b(Since)16 b(sections)f(ma)o(y)f(corresp)q(ond)p eop %%Page: 6 8 6 7 bop 75 -58 a Fz(Chapter)15 b(2:)k(WEB)c(CONCEPTS)1165 b(6)75 183 y(to)14 b(only)h(a)f(small)i(part)e(of)g(a)g(function)i(or)e (subroutine,)h(1000-line)g(main)g(programs)f(\(they)g(still)i(exist!\)) 75 238 y(should)g(b)q(ecome)g(a)f(thing)h(of)e(the)i(past.)137 302 y(Since)g(sections)f(can)g(b)q(e)g(com)o(bined)h(in)o(to)e(mo)q (dules,)h(there)g(is)g(no)f(need)i(for)e(sections)h(that)e(m)o(ust)h(b) q(e)75 357 y(ph)o(ysically)k(con)o(tiguous)e(in)g(the)g(output)g (\014le)h(to)e(b)q(e)h(con)o(tiguous)g(in)h(the)f(source)f(\014le.)23 b(This)17 b(allo)o(ws)f(for)75 412 y(great)e(\015exibilit)o(y)k(in)e (structuring)f(the)h(do)q(cumen)o(tation)f(of)g(the)g(co)q(de.)75 515 y Fq(2.2.0.1)30 b(A)20 b(simple)h(example)137 608 y Fz(A)16 b(simple)g(example)g(of)f(an)g Fw(Fweb)h Fz(source)g(\014le)g (consisting)g(of)f(three)g(sections)h(is)f(as)g(follo)o(ws:)195 670 y Fu(@n/)23 b(\045)h(Set)g(FWEB)f(language)g(to)g(Fortran,)g(and)h (recognize)e(short)h(//)h(comments.)195 773 y(\\Title{example.web})d (\045)j(\\Title)f(is)h(an)f(FWEB)h(TeX)f(macro.)195 825 y(\\author{J.)f(A.)i(Krommes})f(\045)h(\\author)e(is)i(a)g(LaTeX)f (macro.)195 929 y(@*)h(INTRODUCTION.)195 981 y(This)f(code)h(is)f (intended)g(to)h(illustrate)e(the)i(use)f(of)h(the)f(|write|)g (statement.)195 1033 y(It)h(also)f(provides)g(a)g(simple)g(example)g (of)h(the)f(\\FWEB\\)g(macro)h(preprocessor.)195 1137 y(@m)g(A_CONSTANT)e(1.2345)h(//)h(\\FWEB\\)f(preprocessor)f(macro)h (definition.)195 1240 y(@a)386 1292 y(program)g(main)386 1344 y(call)g(compute)386 1396 y(end)195 1500 y(@)h(The)f (computational)f(routine)h(is)h(pretty)f(boring.)195 1552 y(@a)386 1604 y(subroutine)f(compute)386 1656 y(write\(*,*\))g ('Macro)h(value)h(=)f(',)h(A_CONSTANT)386 1707 y(end)195 1811 y(@*)g(\\INDEX.)137 1874 y Fz(Commands)f(to)f Fw(Fweb)i Fz(are)f(b)q(egun)h(b)o(y)f(the)h(`)p Fu(@)p Fz(')e(sym)o(b)q(ol)h (\(see)g(Chapter)g(5)g([A)l(T)g(commands],)75 1929 y(page)12 b(38\).)17 b(In)c(this)f(example,)h(the)f(\014rst)f(command,)h(`)p Fu(@n)p Fz(',)f(sets)g(the)h(global)g(language)g(to)f Fw(F)o(or)m(tran)p Fz(-77.)75 1984 y(One)16 b(should)g(alw)o(a)o(ys)f (b)q(egin)h(one's)f(co)q(de)h(with)f(a)g(language-setting)h(command.) 137 2048 y(In)f(this)g(example,)g(the)f(language)h(command)f(is)g(in)o (v)o(ok)o(ed)h(with)f(an)h(optional)f(argumen)o(t)g(`)p Fu(/)p Fz('.)19 b(That)75 2103 y(is)j(necessary)g(in)g Fw(F)o(or)m(tran)g Fz(in)h(order)e(to)g(tell)i Fw(Fweb)g Fz(to)e(use)h(the)f(short)g(\(single-line\))j(commen)o(t)75 2158 y(form)17 b(b)q(eginning)j(with)d(`)p Fu(//)p Fz(',)g(whic)o(h)i (otherwise)e(con\015icts)i(with)f(the)f(concatenation)h(op)q(erator.)26 b(See)75 2213 y(Section)16 b(4.2.40)d([-n/],)i(page)g(27.)137 2277 y(F)l(or)f(more)g(information)h(ab)q(out)f(languages,)g(see)h (Chapter)f(8)g([Languages],)f(page)i(83.)k(F)l(or)14 b(a)g(fuller)75 2332 y(discussion)j(of)e(optional)g(argumen)o(ts,)f (see)i(Section)g(8.1)e([Setting)h(the)h(language],)e(page)h(83.)137 2396 y(The)c(`)p Fu(@*)p Fz(')e(command)i(b)q(egins)g(a)g Fs(ma)s(jor)h Fz(or)e Fs(named)g(section)h Fz(\(corresp)q(onding)h(to)d (LaT)1583 2406 y(E)1609 2396 y(X's)h Fu(\\section)75 2451 y Fz(command\);)17 b(this)h(command)f(is)g(follo)o(w)o(ed)h(b)o(y) f(the)g(section)h(name,)f(terminated)g(b)o(y)g(a)g(p)q(erio)q(d.)27 b(\(The)75 2506 y(p)q(erio)q(d)17 b(is)g(essen)o(tial;)f(if)h(it)f(is)g (omitted,)g(w)o(eird)g(errors)f(ma)o(y)g(result.\))22 b(Ma)s(jor)14 b(sections)i(are)g(en)o(tered)g(in)75 2560 y(an)j(automatically)g(generated)g(T)l(able)h(of)f(Con)o(ten)o(ts.)30 b(They)19 b(are)g(also)g(prin)o(ted)g(at)g(the)g(top)f(of)h(eac)o(h)75 2615 y(output)f(page.)30 b(If)18 b(the)h(full)h(section)f(name)f(is)h (to)q(o)f(long)g(to)g(so)g(prin)o(t,)h(one)g(can)f(shorten)h(it)f(with) h(an)75 2670 y(optional)d(argumen)o(t,)e(as)h(in)p eop %%Page: 7 9 7 8 bop 75 -58 a Fz(Chapter)15 b(2:)k(WEB)c(CONCEPTS)1165 b(7)195 183 y Fu(@*)24 b([INTRO]INTRODUCTION.)137 252 y Fz(The)16 b(command)f(`)p Fu(@*)p Fs(n)p Fz(')f(\(not)h(illustrated)h (in)h(the)e(ab)q(o)o(v)o(e)g(example\))g(b)q(egins)i(a)e(ma)s(jor)f (\(sub\)section)75 307 y(of)19 b(lev)o(el)i Fs(n)p Fz(,)f(where)f(`)p Fu(@*0)p Fz(')f(is)i(equiv)m(alen)o(t)h(to)e(the)g(simple)i(`)p Fu(@*)p Fz(',)e(`)p Fu(@*1)p Fz(')f(indicates)j(a)e(subsection,)i(and) 75 362 y(`)p Fu(@*2)p Fz(')13 b(indicates)j(a)d(subsubsection.)21 b(The)15 b(highest)f(p)q(ermissible)j(ma)s(jor)c(lev)o(el)i(is)g(2)f (\(a)f(subsubsection\).)75 416 y(Suc)o(h)22 b(subsections)g(are)f(also) h(en)o(tered)f(in)h(the)g(T)l(able)g(of)f(Con)o(ten)o(ts.)37 b(F)l(or)21 b(more)g(information,)i(see)75 471 y(Section)16 b(10.1.3.4)d([Sections],)i(page)g(95.)137 540 y(As)d(the)g(example)h (demonstrates,)e(the)h(name)g(of)g(the)g(v)o(ery)f(last)h(section,)h (whic)o(h)g(should)f(b)q(e)h(starred,)75 595 y(should)21 b(b)q(e)f(`)p Fu(\\INDEX)p Fz('.)31 b(Note)19 b(the)h(bac)o(kslash;)i (`)p Fu(\\INDEX)p Fz(')c(is)i(a)f(T)1228 604 y(E)1253 595 y(X)h(macro.)32 b(This)21 b(command)e(tells)75 649 y Fw(Fwea)l(ve)f Fz(to)e(write)h(out)g(the)g(index)h(in)g(a)f(sp)q (ecial)i(t)o(w)o(o-column)d(format.)24 b(By)18 b(default,)f(`)p Fu(\\INDEX)p Fz(')f(ex-)75 704 y(pands)e(to)e(`)p Fu(INDEX)p Fz(',)g(but)i(this)f(name)h(can)f(b)q(e)h(o)o(v)o(erridden)g(b)o(y)f (the)h(st)o(yle-\014le)h(parameter)d(`)p Fu(index.name)p Fz(')75 759 y(\(see)g(Section)i(12.3.1.1)c([S)p 525 759 14 2 v 16 w(index],)k(page)e(113\).)18 b(F)l(or)12 b(more)g(discussion) i(of)e Fw(Fweb)p Fz('s)h(indexing)h(facilities,)75 814 y(see)h(Chapter)g(11)g([Index],)g(page)g(103.)137 883 y(Minor)c(\()p Fs(unnamed)r Fz(\))g(sections)h(are)f(b)q(egun)h(b)o(y)f (`)p Fu(@ )o Fz('\(\\at-space"\);)g(these)g(ha)o(v)o(e)g(no)g(asso)q (ciated)g(names)75 937 y(and)k(are)g(not)g(en)o(tered)h(in)o(to)f(the)g (T)l(able)h(of)f(Con)o(ten)o(ts.)k(A)c(newline)i(coun)o(ts)e(as)g(a)g (space.)75 1052 y Fq(2.2.0.2)30 b(The)20 b(T)438 1065 y(E)470 1052 y(X)h(part)137 1150 y Fz(All)d(sections)f(b)q(egin)g(with) g(\(optional\))f(T)850 1160 y(E)876 1150 y(X)g(commen)o(tary)l(.)22 b(That)16 b(can)g(just)g(b)q(e)h(straigh)o(t)f(text;)g(to)75 1205 y(input)i(that,)e(no)h(kno)o(wledge)g(of)f(T)675 1215 y(E)701 1205 y(X)g(is)i(required.)25 b(It)17 b(can)g(also)g (include)i(mathematical)e(exp)q(osition)75 1260 y(or)e(an)o(y)g(of)f (the)i(other)e(adv)m(anced)j(features)d(o\013ered)h(b)o(y)g(T)1070 1270 y(E)1096 1260 y(X.)137 1329 y(Whenev)o(er)f Fw(Fweb)g Fz(is)g(in)g(T)604 1338 y(E)629 1329 y(X)f(mo)q(de,)h(one)f(can)g(temp) q(orarily)h(shift)g(in)o(to)f Fs(co)q(de)g(mo)q(de)j Fz(b)o(y)d(enclosing)75 1383 y(the)20 b(co)q(de)h(within)g(v)o(ertical) f(bars.)34 b(That)20 b(co)q(de)g(is)h(t)o(yp)q(eset)f(just)f(lik)o(e)j (co)q(de)e(in)h(the)f(co)q(de)h(part)e(\(see)75 1438 y(b)q(elo)o(w\),)c(except)h(that)e(newlines)j(are)e(replaced)i(b)o(y)e (spaces.)20 b(Th)o(us,)15 b(one)g(can)g(sa)o(y)g(things)g(lik)o(e)195 1504 y Fu(Consider)23 b(the)g(C)h(code)f(fragment)g(`|@c)g(for\(i=0;)g (i<10;)g(i++\){}|',)g(which)g(...)75 1573 y Fz(\(If)15 b(the)g(global)h(language)g(w)o(ere)f(C)g(instead)g(of)g Fw(F)o(or)m(tran)p Fz(,)g(the)h(`)p Fu(@c)p Fz(')e(inside)j(the)e(v)o (ertical)h(bars)f(w)o(ould)75 1628 y(not)f(b)q(e)i(necessary)l(.\))k (The)15 b(abilit)o(y)g(to)g(switc)o(h)g(bac)o(k)f(and)h(forth)f(b)q(et) o(w)o(een)h(text)f(mo)q(de)h(and)g(co)q(de)h(mo)q(de)75 1682 y(at)f(will)h(allo)o(ws)g(for)e(a)h(v)o(ery)g(con)o(v)o(enien)o(t) h(and)f(\015exible)j(st)o(yle)d(of)g(exp)q(osition.)75 1797 y Fq(2.2.0.3)30 b(The)20 b(de\014nition)g(part)137 1895 y Fz(The)15 b(T)255 1905 y(E)280 1895 y(X)f(part)g(is)g(follo)o(w) o(ed)h(b)o(y)f(an)g(optional)g Fs(de\014nition)i(part)p Fz(.)j(The)14 b(b)q(eginning)i(of)e(the)g(de\014nition)75 1950 y(part)g(is)h(signaled)i(b)o(y)d(the)h(app)q(earance)h(of)e(an)o (y)g(one)h(of)g(the)f(commands)h(`)p Fu(@d)p Fz(',)e(`)p Fu(@f)p Fz(',)h(`)p Fu(@m)p Fz(',)f(`)p Fu(@v)p Fz(',)h(or)g(`)p Fu(@W)p Fz(')75 2005 y(\(explained)i(later\).)k(In)15 b(the)g(previous)g(example,)g(the)g(\014rst)f(section)h(has)f(a)h (de\014nition)h(part)e(consisting)75 2060 y(of)j(one)g Fw(Fweb)h Fz(macro)f(de\014nition)i(\(`)p Fu(@m)p Fz('\);)d(the)i (second)f(section)h(has)f(no)g(de\014nition)i(part.)26 b(F)l(or)16 b(more)75 2114 y(information,)f(see)g(Chapter)g(7)g ([Macros],)e(page)i(62.)137 2183 y(\(F)l(ailure)h(to)f(appreciate)h(ho) o(w)e(easy)h(it)h(is)f(to)g(shift)g(from)g(part)f(to)h(part)f(can)i (get)e(one)i(in)o(to)f(trouble.)75 2238 y(F)l(or)h(example,)i(don't)f (write)g(do)q(cumen)o(tation)g(suc)o(h)g(as)g(`)p Fu(Consider)d(the)g (@m)h(command)p Fz(',)h(b)q(ecause)i(the)75 2293 y(`)p Fu(@m)p Fz(')i(will)j(inadv)o(erten)o(tly)f(terminate)f(the)g(do)q (cumen)o(tation)h(part)f(and)g(b)q(egin)i(the)e(de\014nition)i(part.)75 2348 y(What)15 b(one)g(needs)h(to)e(do)i(here)f(is)h(to)e(use)i(the)f (literal)i(`)p Fu(@)p Fz(',)d(as)g(in)i(`)p Fu(@@m)p Fz('.\))75 2463 y Fq(2.2.0.4)30 b(The)20 b(co)r(de)g(part)137 2560 y Fz(An)e(unnamed)g Fs(co)q(de)g(part)g Fz(is)g(b)q(egun)g(b)o(y)g (`)p Fu(@a)p Fz('.)25 b(A)18 b(named)g(co)q(de)g(part)e(is)i(b)q(egun)h (b)o(y)e(the)h(app)q(ear-)75 2615 y(ance)g(of)e(a)h(mo)q(dule)i(name,)e (suc)o(h)h(as)e(`)p Fu(@)p Fz(',)i(follo)o(w)o(ed) h(b)o(y)g(an)g(equals)h(sign;)h(see)75 2670 y(Section)f(2.3)f([Mo)q (dules],)g(page)h(8.)26 b(Within)18 b(the)g(co)q(de)g(part,)e(one)i (can)f(place)i(an)o(y)e(sequence)h(of)f(co)q(de)p eop %%Page: 8 10 8 9 bop 75 -58 a Fz(Chapter)15 b(2:)k(WEB)c(CONCEPTS)1165 b(8)75 183 y(or)17 b(co)q(de)h(fragmen)o(ts)f(\(they)g(need)h(not)g(b)q (e)g(complete)g(subroutines\))g(that)f(are)g(v)m(alid)i(for)e(the)h (curren)o(t)75 238 y(language.)i(\(Setting)14 b(the)h(language)f(is)h (describ)q(ed)h(in)f(Chapter)g(8)f([Languages],)f(page)h(83.\))19 b(The)14 b(co)q(de)75 293 y(part)j(is)h(terminated)g(b)o(y)f(the)h (next)f(app)q(earance)h(of)f(`)p Fu(@*)p Fz(')g(or)g(`)p Fu(@ )o Fz('\(whic)o(h)h(signal)g(the)g(b)q(eginning)h(of)e(a)75 348 y(new)e(section\),)h(or)e(b)o(y)h(the)h(end)f(of)g(\014le.)75 450 y Fq(2.2.0.5)30 b(The)20 b(lim)n(b)r(o)g(section)137 543 y Fz(The)e(p)q(ortion)f(of)g(the)h(source)f(\014le)h(b)q(efore)g (the)f(\014rst)g(section)h(\(i.e.,)f(b)q(efore)h(the)f(\014rst)g(`)p Fu(@*)p Fz(')g(or)f(`)p Fu(@ )p Fz('\))75 598 y(is)h(called)i Fs(in)f(lim)o(b)q(o)i Fz(or)d Fs(the)g(lim)o(b)q(o)h(section)p Fz(.)25 b(The)18 b(only)f(`)p Fu(@)p Fz(')f(commands)h(that)f(are)h (allo)o(w)o(ed)g(in)h(lim)o(b)q(o)75 652 y(\(in)h(addition)h(to)f(`)p Fu(@@)p Fz(',)f(whic)o(h)i(stands)e(for)h(the)g(c)o(haracter)f(`)p Fu(@)p Fz(')g(and)h(is)g(allo)o(w)o(ed)h(an)o(ywhere\))e(are)h(the)75 707 y(language-c)o(hanging)g(commands,)g(and)f(one)g(of)g(those,)h(suc) o(h)f(as)g(`)p Fu(@c)p Fz(',)g(should)h(app)q(ear.)29 b(Other)18 b(text)75 762 y(in)h(lim)o(b)q(o)f(is)h(ignored)f(b)o(y)g Fw(Ft)m(angle)g Fz(and)g(is)g(copied)h(b)o(y)f Fw(Fwea)l(ve)g Fz(to)f(the)h Fu(tex)f Fz(output)h(\014le.)28 b(Th)o(us,)75 817 y(one)15 b(can)f(mak)o(e)g(or)g(issue)h(T)546 827 y(E)572 817 y(X)f(macro)g(de\014nitions)i(in)f(lim)o(b)q(o)h(that)d(o)o (v)o(erride)i(the)f(defaults)h(in)g Fw(Fweb)p Fz('s)75 872 y(macro)j(pac)o(k)m(age)g(`)p Fu(fwebmac.sty)p Fz('.)27 b(In)19 b(the)f(ab)q(o)o(v)o(e)g(example,)h(see)g(the)f Fu(\\Title)g Fz(command.)29 b(This)18 b(is)75 926 y(de\014ned)f(in)f(`) p Fu(fwebmac.sty)p Fz(',)c(and)k(basically)g(issues)g(LaT)1077 936 y(E)1103 926 y(X's)f Fu(\\title)f Fz(command.)137 990 y(\(Another)d(w)o(a)o(y)f(of)g(getting)h(T)639 1000 y(E)664 990 y(X)g(text)f(in)o(to)h(the)g(lim)o(b)q(o)h(section)f(is)h (b)o(y)f(means)f(of)h(the)g(`)p Fu(@l)p Fz(')e(command;)75 1045 y(see)15 b(Section)i(5.5.14)c([A)l(Tl],)i(page)g(45.\))137 1109 y(LaT)213 1119 y(E)239 1109 y(X)k(users)g(ma)o(y)f(need)i(to)f (kno)o(w)f(that)g(T)931 1119 y(E)957 1109 y(X)h(commands)g(in)h(lim)o (b)q(o)g(are)e(executed)i Fs(after)i Fz(the)75 1164 y(`)p Fu(\\begin{document})p Fz(')10 b(command)k(\(whic)o(h)g(is)f(issued)i (automatically)f(in)g(`)p Fu(fwebmac.sty)p Fz('\).)j(F)l(or)12 b(more)75 1219 y(information,)j(see)g(Section)i(10.1.3)c([LaT)l(eX],)h (page)h(93.)75 1337 y Fy(2.3)33 b(Mo)r(dules)137 1430 y Fz(The)15 b(co)q(de)g(parts)e(of)h(\(p)q(ossibly)h(noncon)o (tiguous\))g(sections)f(can)h(b)q(e)f(com)o(bined)i(in)o(to)e Fs(mo)q(dules)p Fz(.)21 b(F)l(or)75 1485 y Fw(Fwea)l(ve)p Fz(,)h(this)g(is)f(a)f Fs(logical)k Fz(com)o(bination,)e(for)e(purp)q (oses)i(of)e(cross-referencing)i(di\013eren)o(t)f(pieces)75 1540 y(of)d(the)g(co)q(de.)30 b(But)18 b(for)g Fw(Ft)m(angle)p Fz(,)h(the)f(com)o(bination)h(is)g(ph)o(ysical;)i Fw(Ft)m(angle)p Fz('s)d(output)g(pro)q(ceeds)75 1595 y(mo)q(dule)e(b)o(y)f(mo)q(dule.) 137 1659 y(Mo)q(dules)24 b(can)f(b)q(e)g Fs(named)i Fz(or)d Fs(unnamed)p Fz(.)44 b(There)23 b(is)g(exactly)g(one)g(unnamed)h(mo)q (dule.)44 b(The)75 1713 y(fundamen)o(tal)16 b(op)q(eration)f(of)g Fw(Ft)m(angle)h Fz(is)f(that)195 1775 y Fw(Ft)m(angle)h Fs(outputs)f(the)g(unnamed)h(mo)q(dule)p Fz(.)75 1838 y(That)11 b(output)h(go)q(es)f(to)g(a)h(compilable)i(\014le)e(with)h (an)e(extension)i(appropriate)f(to)f(the)g(curren)o(t)h(language.)137 1902 y(The)k(con)o(ten)o(ts)f(of)g(a)g(mo)q(dule,)h(either)g(unnamed)h (or)e(named,)g(consists)h(of)f(a)g(mixture)h(of)f(co)q(de)h(and)75 1957 y(commen)o(ts.)j Fw(Ft)m(angle)13 b Fz(ignores)h(the)f(commen)o (ts;)g Fw(Fwea)l(ve)g Fz(treats)f(them)h(as)g(T)1467 1967 y(E)1492 1957 y(X)h(text.)k(Within)c(an)o(y)75 2012 y(T)100 2022 y(E)126 2012 y(X)f(text,)f(including)k(commen)o(ts,)c (constructions)i(delimited)h(b)o(y)e(`)p Fu(|...|)p Fz(')f(signify)i(a) e(temp)q(orary)h(shift)75 2067 y(in)o(to)j(co)q(de)h(mo)q(de.)22 b(\(In)17 b(the)f(presen)o(t)g(design,)h(one)f(cannot)g(enclose)h(a)e (commen)o(t)h(within)h(the)f(v)o(ertical)75 2122 y(bars.\))75 2224 y Fq(2.3.1)30 b(The)20 b(unnamed)h(mo)r(dule)137 2317 y Fz(The)15 b(unnamed)h(co)q(de)f(mo)q(dule)h(is)f(in)o(tro)q (duced)h(b)o(y)e(the)h(command)g(`)p Fu(@a)p Fz('.)j(Subsequen)o(t)e (uses)f(of)f(`)p Fu(@a)p Fz(')75 2371 y(accrete)j(co)q(de)h(to)e(the)h (unnamed)h(mo)q(dule.)27 b(T)l(o)16 b(rep)q(eat,)i(the)f(fundamen)o (tal)g(op)q(eration)h(of)e Fw(Ft)m(angle)75 2426 y Fz(is)g(that)195 2487 y Fw(Ft)m(angle)g Fs(outputs)f(the)g(unnamed)h(mo)q(dule)p Fz(.)75 2551 y(Th)o(us,)f(there)g(m)o(ust)g(b)q(e)h(at)e(least)h(one)h (`)p Fu(@a)p Fz(')e(in)i(the)f(source)g(\014le)i(or)d Fw(Ft)m(angle)i Fz(will)h(output)e(nothing.)137 2615 y(\(Wh)o(y)f(is)h(the)f(command)g(called)i(`)p Fu(@a)p Fz('?)j(Historically)l(,)d(it)e(w)o(as)g(the)g(\014rst)g(letter)g(of)g (the)g(alphab)q(et,)h(as)75 2670 y(b)q(e\014ts)h(its)f(prominen)o(t)h (status.)j(Ho)o(w)o(ev)o(er,)14 b(one)h(can)g(also)g(think)h(of)f(it)h (as)e(\\accrete."\))p eop %%Page: 9 11 9 10 bop 75 -58 a Fz(Chapter)15 b(2:)k(WEB)c(CONCEPTS)1165 b(9)75 183 y Fq(2.3.2)30 b(Named)20 b(mo)r(dules)137 285 y Fz(Named)c(mo)q(dules)g(represen)o(t)f(logically-connected)j (fragmen)o(ts)c(of)h(co)q(de.)137 358 y(A)h(mo)q(dule)g(name)f(is)h(sp) q(eci\014ed)h(b)o(y)e(the)h(construction)195 427 y Fu(@<)24 b Fs(Arbitrary)15 b(T)497 437 y(E)522 427 y(X)g(text)25 b Fu(@>)75 500 y Fz(Leading)d(and)e(trailing)i(white)f(space)f(around)h (the)f(name)h(text)f(is)h(ignored.)36 b(The)20 b(name)h(text)f(can)75 555 y(include)g(the)e(`)p Fu(|...|)p Fz(')f(construction,)h(whic)o(h)h (tells)g Fw(Fwea)l(ve)g Fz(to)e(t)o(yp)q(eset)h(a)g(co)q(de)g(fragmen)o (t.)27 b(Th)o(us,)75 610 y(mo)q(dule)16 b(names)f(can)h(b)q(e)g(highly) g(explicit|for)i(example,)195 679 y Fu(@<)24 b(Check)f(that)g(|x)h(>=)f (0.0|;)g(|abort|)g(if)h(not)f(@>)137 752 y Fz(T)l(o)d(de\014ne)h(a)e (named)h(mo)q(dule,)i(replace)e(the)g(`)p Fu(@a)p Fz(')f(that)g(b)q (egins)i(the)f(unnamed)g(co)q(de)h(part)e(of)g(a)75 807 y(section)g(b)o(y)e(`)p Fu(@<)e Fs(mo)q(dule)h(name)i Fu(@>=)p Fz('.)27 b(If)19 b(one)f(uses)g(this)g(construction)h(with)f (the)g(same)g(name)f(in)i(a)75 862 y(later)c(section,)g(the)g(e\013ect) f(is)i(to)e Fs(accrete)j Fz(to)d(the)h(con)o(ten)o(ts)g(of)f(the)h(mo)q (dule.)21 b(Th)o(us,)14 b(a)h(named)g(mo)q(dule)75 916 y(migh)o(t)g(ultimately)h(consist)g(of)f(the)g(co)q(de)h(from)e (sections)i(2,)e(5,)h(and)g(9,)g(for)f(example.)137 989 y(T)l(o)j(use)g(a)g(named)g(mo)q(dule,)h(simply)g(use)f(the)g(name)g (an)o(ywhere)g(in)h(a)e(co)q(de)i(part;)f Fw(Ft)m(angle)g Fz(will)75 1044 y(insert)f(the)f(con)o(ten)o(ts)f(of)h(the)h(mo)q(dule) g(at)e(the)i(p)q(oin)o(t)f(where)h(the)f(name)g(is)h(used.)21 b(F)l(or)14 b(example,)195 1114 y Fu(@c)195 1166 y(@)24 b(Here's)f(how)g(to)h(use)f(a)h(named)f(module.)195 1217 y(@a)195 1269 y(for\(i=1;)g(i@;)195 1425 y(@)h(Here's)f(how)g(to)h(define)f(a)h(named)f(module.) 47 b(Definitions)22 b(may)h(occur)h(after)f(use.)195 1477 y(@<)h(Inner...@>=)195 1529 y({)195 1581 y(a[i])f(=)h(i;)195 1633 y(})75 1705 y Fz(There)d(are)g(sev)o(eral)h(details)g(to)e(notice) i(ab)q(out)f(the)h(ab)q(o)o(v)o(e)e(example.)39 b(First,)22 b Fw(Fwea)l(ve)g Fz(considers)75 1760 y(mo)q(dule)12 b(names)f(to)g(b)q(e)g(simple)i(expressions)e(\(suc)o(h)h(as)e(the)h (single)i(iden)o(ti\014er)f Fs(x)s Fz(\).)18 b(In)12 b(C,)e(expressions)i(are)75 1815 y(made)h(in)o(to)g(complete)g (statemen)o(ts)f(\(as)g(is)h(required)h(in)f(the)g(b)q(o)q(dy)h(of)e(a) g Fp(for)h Fz(statemen)o(t\))f(b)o(y)g(app)q(ending)75 1870 y(a)19 b(semicolon.)32 b(In)20 b(this)g(case,)f(a)g Fs(pseudo-semicolon)i Fz(`)p Fu(@;)p Fz(')d(is)i(appropriate;)g(for)f (more)g(discussion)h(of)75 1924 y(that,)14 b(see)i(Section)g(5.13.2)d ([A)l(T;],)h(page)h(58.)137 1997 y(Second,)23 b(after)e(a)f(name)h(has) g(app)q(eared)h(once)f(in)h(full,)i(it)d(ma)o(y)f(b)q(e)i(abbreviated)g (b)o(y)f(a)f(unique)75 2052 y(pre\014x)d(follo)o(w)o(ed)f(b)o(y)g (three)g(p)q(erio)q(ds,)h(as)f(demonstrated)g(in)h(the)f(ab)q(o)o(v)o (e)g(example.)23 b(By)16 b(con)o(v)o(en)o(tion,)g(a)75 2107 y(complete)c(mo)q(dule)h(name)e(cannot)g(b)q(e)i(a)e(subset)g(of)g (another.)19 b(F)l(or)10 b(example,)j(`)p Fu(@)p Fz(')d(and)h(`)p Fu(@)p Fz(')e(will)k(elicit)g(an)e(error)g(message.)137 2234 y(Commonly)l(,)j(the)f(\014rst)g(unnamed)h(section)f(in)h(the)g(co)q (de)f(indicates)i(its)e(mo)q(dular)h(structure.)26 b(F)l(or)75 2289 y(example,)16 b(a)f(C)g(co)q(de)g(migh)o(t)g(b)q(egin)i(with)195 2359 y Fu(@c)195 2411 y(@*)24 b(DEMO.)195 2462 y(@a)195 2514 y(@@;)195 2566 y(@@;)195 2618 y(@@;)195 2670 y(@@;) p eop %%Page: 10 12 10 11 bop 75 -58 a Fz(Chapter)15 b(2:)k(WEB)c(CONCEPTS)1143 b(10)75 183 y(Subsequen)o(tly)18 b(one)e(can)h(accrete)f(to)g(the)g(ab) q(o)o(v)o(e)g(named)h(sections,)g(as)f(often)g(as)g(desired)i(and)e(in) h(an)o(y)75 238 y(order.)h(This)12 b(w)o(a)o(y)l(,)f(de\014nitions)i (of)e(global)g(v)m(ariables)i(can)e(b)q(e)h(in)o(tro)q(duced)h(an)o (ywhere)e(in)h(the)f Fu(web)g Fz(source)75 293 y(\014le)17 b(as)e(logical)i(and)f(p)q(edagogical)g(exp)q(osition)h(dictates,)f (but)f(will)j(b)q(e)e(guaran)o(teed)f(to)g(app)q(ear)h(at)f(the)75 348 y(top)21 b(of)g(the)h(co)q(de.)39 b(F)l(unction)22 b(protot)o(yp)q(es)e(could)j(b)q(e)f(handled)h(this)f(w)o(a)o(y)e(as)h (w)o(ell;)k(alternativ)o(ely)l(,)75 402 y(they)20 b(could)g(all)g(b)q (e)h(collected)g(in)o(to)e(one)h(section,)h(p)q(erhaps)f(at)e(the)i (end)g(of)f(the)h(source)f(\014le.)34 b(\(The)75 457 y(ab)q(o)o(v)o(e)17 b(organization)f(still)j(guaran)o(tees)d(that)g (they)h(will)i(app)q(ear)e(at)f(the)h(b)q(eginning)i(of)e(the)g (output.\))75 512 y(F)l(unctions)f(could)g(b)q(e)g(in)o(tro)q(duced)g (one)g(at)e(a)h(time)h(in)g(subsequen)o(t)g(unnamed)g(sections.)137 578 y(V)l(ery)g(rarely)l(,)f(one)g(migh)o(t)g(try)g(the)g(follo)o(wing) h(construction:)195 641 y Fu(@)195 693 y(@a)195 745 y(@<)24 b Fs(Left)15 b(side)27 b Fu(@>)d(=)g(@<)f Fs(Righ)o(t)16 b(side)27 b Fu(@>@;)75 811 y Fz(Here)17 b(the)g(in)o(ten)o(t)g(is)h(to) e(construct)h(an)g(assignmen)o(t)g(statemen)o(t.)24 b(Ho)o(w)o(ev)o (er,)16 b(this)h(will)i(b)q(e)f(\015agged)e(as)75 866 y(an)i(error)g(b)q(ecause)h Fw(Fweb)g Fz(thinks)g(one)f(is)h(trying)f (to)f(de\014ne)j(the)e(named)g(mo)q(dule)i(`)p Fu(@<)p Fs(Left)14 b(side)s Fu(@>)p Fz(',)75 921 y(whic)o(h)j(one)f(shouldn't)h (b)q(e)g(doing)f(while)i(in)f(co)q(de)f(mo)q(de.)23 b(T)l(o)16 b(mak)o(e)g(it)g(w)o(ork,)f(just)h(put)g(the)g(in)o(visible)75 975 y(expression)g(`)p Fu(@e)p Fz(')e(\(see)h(Section)h(5.13)e([A)l(T)l (e],)h(page)g(57\))f(b)q(efore)i(the)f(equals)h(sign.)75 1101 y Fy(2.4)33 b(Phases)21 b(of)g(pro)r(cessing)137 1196 y Fz(The)d Fw(Fweb)h Fz(pro)q(cessors)f(p)q(erform)f(their)h(w)o (ork)f(in)i(sev)o(eral)f(distinct)h(phases.)27 b(\(The)18 b(follo)o(wing)g(is)75 1251 y(somewhat)c(tec)o(hnical.)22 b(Scan)15 b(it,)g(then)h(use)f(it)h(for)e(reference)i(later)g(if)f (necessary)l(.\))75 1359 y Fq(2.4.1)30 b(The)20 b(phases)h(of)f Fo(Ft)m(angle)137 1454 y Fw(Ft)m(angle)14 b Fz(has)g(t)o(w)o(o)e (phases.)19 b(In)14 b(phase)g(1,)f(the)g(source)g(\014le)i(is)f(read;)f (in)h(phase)g(2,)f(compilable)i(co)q(de)75 1509 y(is)h(written)f(out)g (in)h(the)f(order)g(sp)q(eci\014ed)i(b)o(y)e(the)h(w)o(eb.)137 1575 y(More)f(sp)q(eci\014cally)l(,)j(phase)d(1)232 1638 y Fx(\017)30 b Fz(discards)16 b(T)485 1648 y(E)510 1638 y(X)g(do)q(cumen)o(tation;)232 1701 y Fx(\017)30 b Fz(tok)o(enizes)16 b(the)f(source;)232 1765 y Fx(\017)30 b Fz(expands)23 b Fw(Fweb)h Fz(prepro)q(cessor)f(commands)f(suc)o(h)h(as)f(`)p Fu(@#if)p Fz(')g(\(see)g(Section)i(7.3)285 1817 y([Prepro)q(cessing],) 15 b(page)g(80\);)232 1880 y Fx(\017)30 b Fz(expands)17 b(`)p Fu(@'...')p Fz(')d(\(see)i(Section)h(5.6)e([A)l(Tquote],)g(page)h (51\),)f(`)p Fu(@"...")p Fz(')f(\(see)i(Sec-)285 1932 y(tion)f(5.6.2)e([A)l(Tdquote],)h(page)h(51\),)f(and)h(the)g(binary)g (notation)g(`)p Fu(0b...)p Fz(')e(\(see)i(Sec-)285 1983 y(tion)j(8.2.1)f([C],)g(page)h(84\))f([in)i Fw(F)o(or)m(tran)p Fz(,)g(also)f(the)h(o)q(ctal)f(notation)g(`)p Fu(0...)p Fz(')f(and)285 2035 y(the)e(hexadecimal)i(notation)e(`)p Fu(0x...)p Fz('];)232 2099 y Fx(\017)30 b Fz(stores)14 b(co)q(de)i(text)f(in)h(appropriate)f(mo)q(dules;)232 2162 y Fx(\017)30 b Fz(memorizes)d(macro)g(de\014nitions)h(\(`)p Fu(@d)p Fz(')e(and)h(`)p Fu(@m)p Fz('\))f(\(see)h(Section)g(5.5.6)f([A) l(Td],)285 2214 y(page)15 b(42)g(and)g(Section)h(5.5.16)d([A)l(Tm],)h (page)i(45\).)137 2291 y(Phase)f(2)232 2354 y Fx(\017)30 b Fz(outputs)15 b(outer)g(macro)f(de\014nitions)j(\(`)p Fu(@d)p Fz('\);)232 2417 y Fx(\017)30 b Fz(outputs)15 b(the)g(unnamed)h(mo)q(dule)h(\(`)p Fu(@a)p Fz('\);)232 2480 y Fx(\017)30 b Fz(expands)16 b Fw(Fweb)g Fz(macros)e(\(`)p Fu(@m)p Fz('\);)232 2544 y Fx(\017)30 b Fz(expands)17 b(built-in)i(macros)d(suc)o(h)h(as)f(`)p Fu($IF)p Fz(')f(or)i(`)p Fu($PI)p Fz(')e(\(see)i(Section)g(7.2.3)e([Built-in)285 2595 y(functions],)g(page)g(66\);)232 2659 y Fx(\017)30 b Fz(translates)15 b Fw(Ra)m(tf)o(or)h Fz(statemen)o(ts)e(\(see)h (Chapter)g(9)g([Ratfor],)e(page)i(89\).)p eop %%Page: 11 13 11 12 bop 75 -58 a Fz(Chapter)15 b(2:)k(WEB)c(CONCEPTS)1143 b(11)75 183 y Fq(2.4.2)30 b(The)20 b(phases)h(of)f Fo(Fwea)l(ve)137 280 y Fw(Fwea)l(ve)d Fz(has)g(three)f(phases.)24 b(In)17 b(phase)g(1,)f(the)h(source)f(\014le)i(is)f(read)f(and)h (cross-reference)g(infor-)75 334 y(mation)d(is)h(collected.)22 b(In)15 b(phase)g(2,)f(the)g(source)h(\014le)g(is)g(read)g(again,)f (then)h(prett)o(y-prin)o(ted)f(with)h(some)75 389 y(cross-reference)21 b(information.)37 b(\(F)l(or)20 b(discussion)j(of)d(prett)o(y-prin)o (ting,)j(see)e(Section)h(10.2)d([Prett)o(y-)75 444 y(prin)o(ting],)f (page)g(100.\))26 b(In)18 b(phase)g(3,)f(an)h(automatically-generated)g (Index,)h(List)f(of)f(Mo)q(dules,)i(and)75 499 y(T)l(able)d(of)f(Con)o (ten)o(ts)f(are)h(written.)137 566 y(More)g(sp)q(eci\014cally)l(,)j (phase)d(1)232 630 y Fx(\017)30 b Fz(tok)o(enizes)16 b(and)f(stores)f(iden)o(ti\014ers)j(and)f(mo)q(dule)g(names;)232 695 y Fx(\017)30 b Fz(collects)22 b(cross-reference)g(information)f (\(including,)k(in)d(C)f(and)h(C)p Fu(++)p Fz(,)f(the)h(scan-)285 747 y(ning)14 b(of)f(`)p Fu(#include)p Fz(')f(\014les)i(for)f(`)p Fu(typedef)p Fz(')e(and/or)i(`)p Fu(class)p Fz(')f(declarations)i (\(see)f(Sec-)285 798 y(tion)i(4.2.17)f([-H)p 575 798 14 2 v 16 w(],)g(page)h(20\);)232 863 y Fx(\017)30 b Fz(stores)24 b(lim)o(b)q(o)h(text)f(de\014nitions)i(made)e(with)h(`)p Fu(@l)p Fz(')e(\(see)i(Section)g(5.5.14)d([A)l(Tl],)285 915 y(page)15 b(45\);)232 979 y Fx(\017)30 b Fz(collects)12 b(information)f(ab)q(out)g(o)o(v)o(erloaded)g(op)q(erators)e(\(`)p Fu(@v)p Fz('\))h(and)h(iden)o(ti\014ers)h(\(`)p Fu(@W)p Fz('\).)285 1031 y(See)k(Section)g(5.5.27)d([A)l(Tv],)h(page)h(49)g (and)g(Section)i(5.5.28)c([A)l(TW)p 1468 1031 V 16 w(],)h(page)h(50.) 137 1111 y(Phase)g(2)232 1175 y Fx(\017)30 b Fz(outputs)15 b(lim)o(b)q(o)h(text;)232 1239 y Fx(\017)30 b Fz(outputs)15 b(sp)q(ecial)i(T)625 1249 y(E)650 1239 y(X)f(macros)e(for)h(o)o(v)o (erloaded)g(op)q(erators;)232 1304 y Fx(\017)30 b Fz(copies)16 b(T)444 1313 y(E)470 1304 y(X)f(material)g(directly)i(to)d(output;)232 1368 y Fx(\017)30 b Fz(treats)14 b(material)i(b)q(et)o(w)o(een)f(v)o (ertical)h(bars)f(\(`)p Fu(|...|)p Fz('\))e(as)i(co)q(de)g(to)g(b)q(e)h (t)o(yp)q(eset;)232 1432 y Fx(\017)30 b Fz(tok)o(enizes)16 b(and)f(stores)f(con)o(ten)o(ts)h(of)g(eac)o(h)g(co)q(de)h(section;)232 1497 y Fx(\017)30 b Fz(analyzes)16 b(co)q(de)g(syn)o(tax)e(and)h(con)o (v)o(erts)g(it)g(to)g(appropriate)g(T)1354 1506 y(E)1380 1497 y(X)g(macros.)137 1576 y(Phase)21 b(3)f(writes)g(out)g (cross-reference)h(information.)35 b(\(T)l(o)20 b(eliminate)i(some)e (of)g(that,)h(see)f(Sec-)75 1631 y(tion)15 b(4.2.67)f([-x],)g(page)h (34.\))k(Sp)q(eci\014cally)l(,)f(it)232 1695 y Fx(\017)30 b Fz(writes)15 b(out)g(the)h(Index)g(\(`)p Fu(INDEX.tex)p Fz(')d(b)o(y)i(default,)g(but)h(see)f(Section)i(3.2)d([Output)285 1747 y(\014les],)h(page)g(13)g(and)g(Section)i(12.3.1)c([Index)j (params],)d(page)j(113\);)232 1812 y Fx(\017)30 b Fz(writes)22 b(out)f(a)h(list)g(of)f(named)i(mo)q(dules)f(\(`)p Fu(MODULES.tex)p Fz(')d(b)o(y)j(default,)i(but)e(see)285 1864 y(Section)f(3.2)f([Output) h(\014les],)h(page)e(13)g(and)h(Section)h(12.3.2)c([Mo)q(dule)j (params],)285 1915 y(page)15 b(114\);)232 1980 y Fx(\017)30 b Fz(writes)17 b(out)g(macros)g(to)f(generate)h(the)h(T)l(able)g(of)e (Con)o(ten)o(ts.)25 b(\(T)l(able)18 b(of)f(Con)o(ten)o(ts)285 2032 y(information)11 b(is)g(actually)h(pro)q(cessed)f(b)o(y)g(LaT)1071 2042 y(E)1097 2032 y(X,)f(not)h Fw(Fwea)l(ve)p Fz(.)19 b(The)11 b(information)285 2084 y(is)16 b(written)f(to)f(the)i(`)p Fu(aux)p Fz(')e(\014le.\))p eop %%Page: 12 14 12 13 bop 75 -58 a Fz(Chapter)15 b(3:)k(FILES)1393 b(12)75 183 y Ft(3)41 b(FILES)137 317 y Fw(Fweb)20 b Fz(w)o(orks)f(with)g(a)g (v)m(ariet)o(y)g(of)g(\014les.)33 b(File)20 b(names)f(ha)o(v)o(e)g(the) g(form)f(`)p Fu([path]/root[.ext])p Fz(',)75 372 y(where)c(the)h(brac)o (k)o(ets)e(denote)i(optional.)20 b(Here)14 b(the)h(slash)f(is)h(called) h(the)e Fs(pre\014x)h(end)g(c)o(haracter)p Fz(.)j(Since)75 427 y(this)e(c)o(haracter)g(di\013ers)g(for)f(v)m(arious)i(op)q (erating)f(systems,)f(it)h(can)g(b)q(e)h(c)o(hanged)f(b)o(y)g(system)g (installers)75 482 y(in)f(`)p Fu(custom.h)p Fz(')e(\(see)i(Chapter)f (12)g([Customization],)g(page)g(107\).)k(The)d(c)o(haracter)f(that)g (initiates)i(the)75 536 y(\014le-name)g(extension)f(\(normally)f(a)g(p) q(erio)q(d\))h(can)g(b)q(e)g(c)o(hanged)f(with)h(the)f(`)p Fu(-E)p Fz(')g(command-line)i(option)75 591 y(\(see)f(Section)h(4.2.13) e([-E)p 519 591 14 2 v 16 w(],)g(page)h(19\).)75 734 y Fy(3.1)33 b(Input)23 b(\014les)137 836 y Fw(Fweb)17 b Fz(reads)e(\014les)h(with)f(a)g(v)m(ariet)o(y)h(of)e(default)i (extensions.)195 906 y(`)p Fu(.fweb)p Fz(')h(|)i(Initialization)i (\014le)e(\(optional;)h(for)d(setting)i(up)f(default)h(options)g(used)g (for)195 958 y(all)i(runs\).)35 b(This)21 b(\014le)g(is)f(alw)o(a)o(ys) g(in)h(the)f(user's)g(home)g(directory)l(.)35 b(See)21 b(Section)g(12.2)195 1010 y([Initialization],)c(page)e(108.)195 1080 y(`)p Fu(fweb.sty)p Fz(')f(|)i(St)o(yle)g(\014le)h(\(optional;)f (for)f(customizing)i(the)e(b)q(eha)o(vior)i(of)e(a)g(particular)195 1132 y Fu(web)f Fz(\014le)h(or)f(group)h(of)f(\014les\).)20 b(See)15 b(Section)g(12.3)e([St)o(yle],)h(page)h(112.)j(This)d(\014le)h (is)f(alw)o(a)o(ys)195 1184 y(in)22 b(the)e(directory)h(of)g(the)g Fu(web)f Fz(\014le)i(that)e(is)h(b)q(eing)h(tangled)f(unless)h(that)e (is)i(c)o(hanged)195 1235 y(b)o(y)15 b(en)o(vironmen)o(t)h(v)m(ariable) g Fu(FWEB_STYLE_DIR)p Fz(.)i(The)e(basic)g(name)f(can)h(b)q(e)f(c)o (hanged)h(b)o(y)195 1287 y(the)i(`)p Fu(-z)p Fz(')f(option)i(\(see)f (Section)h(4.2.71)d([-z],)i(page)g(35\).)27 b(A)18 b(sample)h(`)p Fu(fweb.sty)p Fz(')d(\014le)j(is)195 1339 y(pro)o(vided)d(with)g(the)f Fw(Fweb)h Fz(distribution.)195 1409 y(`)p Fs(name)p Fu(.web)p Fz(')e(|)i(Source)f(\014le.)195 1479 y(`)p Fs(name)p Fu(.ch)p Fz(')h(|)i(Change)g(\014le)h(\(optional;)f(for)f(making)h (incremen)o(tal)h(c)o(hanges)e(to)g(a)g Fu(web)195 1531 y Fz(source)e(\014le\).)21 b(See)16 b(Section)g(3.3)e([Change)h (\014les],)g(page)g(13.)195 1601 y(`)p Fs(name)p Fu(.hweb)p Fz(')g(|)h(Co)q(de)h(included)i(in)o(to)d(w)o(eb)g(\014le)i(with)e(`)p Fu(@i)p Fz(')f(\(see)i(Section)g(5.5.9)d([A)l(Ti],)195 1653 y(page)f(43\).)19 b(Include)c(\014les)g(are)e(searc)o(hed)g(for)g (in)i(the)e(path)g(set)h(b)o(y)f(the)g(en)o(vironmen)o(t)h(v)m(ari-)195 1705 y(able)j Fu(FWEB_INCLUDES)e Fz(and/or)h(the)h(`)p Fu(-I)p Fz(')e(option)i(\(see)f(Section)i(4.2.19)c([-I)p 1516 1705 V 17 w(],)i(page)g(21\).)195 1757 y(If)f(that)g(path)g(is)h (empt)o(y)l(,)e(then)i(the)f(curren)o(t)g(directory)h(is)f(searc)o (hed.)195 1827 y(`)p Fs(name)p Fu(.hch)p Fz(')f(|)i(Optional)g(c)o (hange)f(\014le)h(for)f(include)j(\014le.)75 1950 y Fq(3.1.1)30 b(Automatic)20 b(\014le-name)h(completion)137 2052 y Fz(Automatic)14 b(completion)i(of)e(input)h(\014le)h(names)e(is)h (turned)g(on)f(b)o(y)h(the)f(`)p Fu(-e)p Fz(')g(command-line)i(option) 75 2107 y(\(see)d(Section)g(4.2.14)e([-e],)h(page)g(19\).)18 b(When)13 b(this)g(option)g(is)g(in)h(e\013ect,)e(input)i(\014le)f (names)g(that)f(include)75 2162 y(no)h(p)q(erio)q(d)i(\(ha)o(v)o(e)e (no)h(extension\))g(are)f(completed)h(automatically)g(according)g(to)f (the)h(con)o(ten)o(ts)f(of)g(the)75 2216 y(follo)o(wing)j(st)o (yle-\014le)g(en)o(tries:)195 2286 y(T)o(yp)q(e)f(of)g(\014le)138 b(St)o(yle-\014le)17 b(en)o(try)65 b(Default)195 2338 y(WEB)15 b(\014le)182 b Fu(ext.web)188 b(web)195 2390 y Fz(Change)15 b(\014le)143 b Fu(ext.ch)212 b(ch)195 2442 y Fz(Include)17 b(\014le)147 b Fu(ext.hweb)164 b(hweb)195 2494 y Fz(Change)27 b(\014le)g(for)195 2546 y(include)18 b(\014le)559 2494 y Fu(ext.hch)188 b(hch)75 2615 y Fz(More)14 b(than)g(one)g(extension)h(ma)o(y)e(b)q(e)i(sp)q(eci\014ed,)i(as)c(a)h (space-delimited)j(list|e.g.,)e(`)p Fu(ext.web)f(=)h("web)75 2670 y(wb")p Fz(';)f(the)h(\014rst)g(one)g(that)g(matc)o(hes)g(is)g (used.)p eop %%Page: 13 15 13 14 bop 75 -58 a Fz(Chapter)15 b(3:)k(FILES)1393 b(13)75 183 y Fy(3.2)33 b(Output)23 b(\014les)137 278 y Fw(Fwea)l(ve)16 b Fz(writes)f(a)g(v)m(ariet)o(y)h(of)e(output)h(\014les.)195 341 y(`)p Fs(name)p Fu(.tex)p Fz(')f(|)i(W)l(o)o(v)o(en)e(output)h(to)g (b)q(e)h(pro)q(cessed)g(with)f(LaT)1295 351 y(E)1321 341 y(X.)195 404 y(`)p Fu(CONTENTS.tex)p Fz(')j(|)i(T)l(emp)q(orary)g (\014le)h(that)e(accum)o(ulates)i(T)l(able-of-Con)o(ten)o(ts)f(infor-) 195 455 y(mation.)g(\(F)l(or)14 b(LaT)542 465 y(E)568 455 y(X,)g(the)i(`)p Fu(aux)p Fz(')e(\014le)i(is)g(used)f(instead.\)) 195 518 y(`)p Fu(INDEX.tex)p Fz(')e(|)j(T)l(emp)q(orary)f(\014le)h (that)e(stores)h(indexing)i(information.)195 581 y(`)p Fu(MODULES.tex)p Fz(')c(|)j(T)l(emp)q(orary)e(\014les)j(that)d(stores)g (mo)q(dule)j(list.)75 647 y(The)23 b(names)f(of)g(the)g(three)g(temp)q (orary)g(\014les)h(can)g(b)q(e)g(c)o(hanged)f(with)h(st)o(yle-\014le)h (parameters)d(\(see)75 702 y(Section)h(12.3)f([St)o(yle],)h(page)f (112\).)38 b(Commonly)l(,)23 b(one)e(ma)o(y)g(put)h(in)o(to)f(the)h(st) o(yle)f(\014le)i(`)p Fu(fweb.sty)p Fz(')75 756 y(commands)15 b(suc)o(h)h(as)195 819 y Fu(index.tex)23 b("#.ndx")195 871 y(modules.tex)f("#.mds")195 923 y(contents.tex)g("#.cts")75 989 y Fz(The)15 b(`)p Fu(#)p Fz(')g(is)g(replaced)i(b)o(y)e(the)g(ro)q (ot)g(name)g(of)g(the)g Fu(web)g Fz(\014le.)137 1054 y Fw(Ft)m(angle)h Fz(writes)f(\014les)i(of)d(the)i(form)195 1117 y(`)p Fs(name)p Fu(.)p Fs(ext)q Fz(')e(|)i(Compilable)h(output)e (\014le.)75 1183 y(The)h(extensions)h(for)e(the)h(compilable)i(output)d (\014le\(s\))h(ha)o(v)o(e)g(certain)g(defaults,)g(but)g(can)g(b)q(e)h (c)o(hanged)75 1238 y(b)o(y)e(st)o(yle-\014le)i(parameters)d(according) i(to)e(the)i(follo)o(wing)f(table:)195 1300 y(Language)85 b(St)o(yle-\014le)17 b(en)o(try)58 b Fw(unix)14 b Fz(default)55 b(non-)p Fw(unix)15 b Fz(default)195 1352 y(C)242 b Fu(suffix.C)157 b(c)280 b(c)195 1404 y Fz(C)p Fu(++)194 b(suffix.Cpp)109 b(C)280 b(C)195 1456 y Fz(F)l(ortran{77)55 b Fu(suffix.N)157 b(f)280 b(for)195 1508 y Fz(F)l(ortran{90)55 b Fu(suffix.N90)109 b(f90)232 b(for90)195 1560 y Fz(Ratfor{77)77 b Fu(suffix.R)157 b(r)280 b(rat)195 1612 y Fz(Ratfor{90)77 b Fu(suffix.R90)109 b(r90)232 b(rat90)195 1664 y Fz(T)l(eX)192 b Fu(suffix.X)157 b(sty)232 b(sty)195 1716 y Fz(VERBA)l(TIM)24 b Fu(suffix.V)157 b(mk)256 b(mk)75 1781 y Fz(F)l(or)21 b(example,)i(to)e(c)o(hange)g(the) h(default)f(extension)i(for)d(a)h(C)p Fu(++)g Fz(\014le)i(from)d(`)p Fu(C)p Fz(')h(to)f(`)p Fu(c++)p Fz(',)i(put)f(in)o(to)75 1836 y(`)p Fu(fweb.sty)p Fz(')13 b(the)j(line)195 1899 y Fu(suffix.C)23 b(=)g("c++")75 2023 y Fy(3.3)33 b(Change)21 b(\014les)137 2118 y Fz(The)e(primary)h(input)g(to)e(the)h Fw(Fweb)h Fz(pro)q(cessors)f(is)g(the)g(`)p Fu(test.web)p Fz(')e(source)i(\014le.)33 b(Ho)o(w)o(ev)o(er,)18 b(a)75 2172 y Fs(c)o(hange)11 b(\014le)j Fz(`)p Fu(test.ch)p Fz(')9 b(can)i(also)f(b)q(e)i(sp)q(eci\014ed.)20 b(A)11 b(c)o(hange)g(\014le)h(consists)e(of)h(instances)g(of)f(the)h(follo)o (wing)75 2227 y(structure:)195 2290 y Fu(@x)195 2342 y(\(One)23 b(or)h(more)f(lines)g(of)h(text,)f(EXACTLY)g(as)h(in)f(the)h (web)f(file.)47 b(Copy)24 b(these)195 2394 y(lines)f(with)g(an)h (editor;)f(don't)g(type)g(them)h(from)f(scratch.\))195 2446 y(@y)195 2498 y(\(Replacement)f(text.\))195 2550 y(@z)75 2615 y Fz(The)f(c)o(hange-\014le)i(mec)o(hanism)e(allo)o(ws)h (one)f(to)f(insert)i(lo)q(cal)g(c)o(hanges)f(or)f(test)h(new)g(co)q(de) h(without)75 2670 y(ph)o(ysically)17 b(mo)q(difying)f(the)g(original)g (w)o(eb)f(\014le.)p eop %%Page: 14 16 14 15 bop 75 -58 a Fz(Chapter)15 b(3:)k(FILES)1393 b(14)137 183 y(T)l(o)14 b(sp)q(ecify)h(a)e(c)o(hange)h(\014le,)h(use)f(its)g (name)g(as)f(the)h(second)h(\014le)f(name)g(on)g(the)g(command)g(line.) 21 b(The)75 238 y(extension)16 b(`)p Fu(.ch)p Fz(')e(is)i(assumed)f(b)o (y)g(default.)21 b(F)l(or)14 b(example,)195 302 y Fu(ftangle)23 b(test)g(test)75 370 y Fz(pro)q(cesses)16 b(`)p Fu(test.web)p Fz(')d(with)i(the)h(c)o(hange)f(\014le)h(`)p Fu(test.ch)p Fz('.)137 437 y(In)j(addition)h(to)d(`)p Fu(@x)p Fz(',)h(`)p Fu(@y)p Fz(',)f(and)i(`)p Fu(@z)p Fz(',)e(the)i(only)g(`)p Fu(@)p Fz(')e(commands)h(allo)o(w)o(ed)h(in)g(a)f(c)o(hange)g(\014le)h (are)75 492 y(language-c)o(hanging)g(commands)g(suc)o(h)g(as)f(`)p Fu(@c)p Fz(')g(and)h(the)f(sp)q(ecial)j(commands)d(`)p Fu(@[)p Fz(')g(and)h(`)p Fu(@])p Fz('.)29 b(The)75 546 y(command)11 b(`)p Fu(@[)p Fz(')g(is)h(used)g(for)e(column-orien)o(ted) j(languages)f(suc)o(h)g(as)f Fw(F)o(or)m(tran)p Fz({77)g(and)g(means)h Fs(switc)o(h)75 601 y(in)o(to)j(co)q(de)h(mo)q(de)p Fz(.)k(Similarly)l (,)d(`)p Fu(@])p Fz(')d(means)i Fs(switc)o(h)f(out)g(of)g(co)q(de)g(mo) q(de)p Fz(.)137 669 y(All)h(`)p Fu(@)p Fz(')e(commands)h(in)h(a)e(c)o (hange)h(\014le)h(m)o(ust)f(b)q(egin)h(in)g(column)f(1.)20 b(Lines)c(not)f(b)q(eginning)i(with)e(`)p Fu(@)p Fz(')75 723 y(are)j(ignored,)i(so)e(ma)o(y)f(b)q(e)i(used)h(as)e(commen)o(ts.) 29 b(Commen)o(ts)17 b(ma)o(y)h(also)g(b)q(e)h(included)i(on)e(the)f(`)p Fu(@x)p Fz(',)75 778 y(`)p Fu(@y)p Fz(',)c(and/or)g(`)p Fu(@z)p Fz(')h(lines.)p eop %%Page: 15 17 15 16 bop 75 -58 a Fz(Chapter)15 b(4:)k(R)o(UNNING)d Fw(Fweb)1166 b Fz(15)75 183 y Ft(4)41 b(R)n(UNNING)27 b Fv(Fweb)137 291 y Fw(Fweb)19 b Fz(has)e(a)g Fw(unix)p Fz(-st)o(yle)g(command-line)i(syn)o(tax.)26 b(There)17 b(are)g(man)o(y)g(command-line)i(options,)75 346 y(but)j(few)g(or)g (none)h(of)e(these)i(are)f(necessary)g(for)g(standard)f(appplications.) 43 b(Pro)q(ceed)23 b(in)g(blissful)75 400 y(ignorance)15 b(un)o(til)h(y)o(ou)f(need)g(to)f(do)h(something)g(tric)o(ky)l(,)g (then)g(scan)g(the)g(list)g(of)g(options)f(to)h(see)g(if)g(they)75 455 y(can)g(help.)137 521 y(Commonly-used)i(command-line)h(options)f (can)f(b)q(e)h(placed)g(in)o(to)g(the)f(initialization)j(\014le)e(`)p Fu(.fweb)p Fz(')75 575 y(\(see)e(Section)h(4.2)e([Options],)h(page)g (15\))g(that)f(resides)i(in)g(one's)f(home)g(directory)l(.)137 641 y(A)k Fs(st)o(yle)f(\014le)k Fz(\(patterned)d(after)e(the)i(utilit) o(y)g Fu(makeindex)p Fz(;)g(see)g(Section)g(12.3)e([St)o(yle],)i(page)f (112\))75 695 y(can)j(b)q(e)g(asso)q(ciated)f(with)h(eac)o(h)g(man)o (uscript)f(or)g(collection)j(of)d(related)g(man)o(uscripts)h(in)g (order)g(to)75 750 y(customize)14 b(their)g(app)q(earance.)20 b(This)15 b(\014le)f(is)h(read)e Fs(after)j Fz(the)e(command-line)h (options)f(are)g(pro)q(cessed,)75 805 y(except)i(that)e(the)h(`)p Fu(-p)p Fz(')g(option)g(gets)g(sp)q(ecial)i(treatmen)o(t;)c(see)j (Section)g(4.2.46)d([-p],)i(page)g(28.)75 928 y Fy(4.1)33 b(Command-line)23 b(syn)n(tax)137 1022 y Fz(The)16 b(command-line)h (syn)o(tax)d(is)195 1085 y Fu({ftangle)23 b(|)g(fweave})g([-option...]) g(webfile[.web])f([changefile[.ch]])75 1150 y Fz(A)15 b(\014le)h(name)f(is)g(an)o(ything)g(that)f(do)q(esn't)h(b)q(egin)h (with)f(a)f(`)p Fu(-)p Fz(',)g(except)h(that)f(a)h(lone)g(h)o(yphen)h (stands)f(for)75 1205 y(the)j(sp)q(ecial)i(\014le)g(name)e(`)p Fu(stdin)p Fz(',)f(whic)o(h)i(means)f(`read)g(from)g(the)g(standard)g (input.')29 b(\(This)19 b(should)75 1260 y(not)c(b)q(e)h(used)f(except) h(for)f(v)o(ery)g(sp)q(ecial)i(e\013ects.\))137 1325 y(Command-line)h(options)f(b)q(egin)h(with)f(a)g(`)p Fu(-)p Fz('.)24 b(File)17 b(names)g(and)g(options)g(can)g(b)q(e)g(in)o (termixed,)h(or)75 1380 y(the)h(options)g(ma)o(y)f(app)q(ear)h(after)f (the)h(\014le)h(names.)30 b(The)19 b(\014rst)g(\014le)g(name)g(encoun)o (tered)h(is)f(the)g(w)o(eb)75 1435 y(source)13 b(\014le;)i(the)e (second,)g(if)h(it)f(exists,)h(is)f(the)h(c)o(hange)f(\014le)h(\(see)f (Section)h(3.3)e([Change)h(\014les],)g(page)g(13\).)75 1489 y([When)18 b(no)f(c)o(hange)h(\014le)g(is)g(sp)q(eci\014ed,)i Fw(Fweb)f Fz(attempts)e(to)g(read)g(from)g(the)h(n)o(ull)h(\014le)f (\(`)p Fu(/dev/null)p Fz(')75 1544 y(on)e Fw(unix)f Fz(systems\).)20 b(This)d(name)f(should)g(b)q(e)h(sp)q(eci\014ed)h(when)e Fw(Fweb)h Fz(is)f(installed)h(\(see)f(Chapter)g(12)75 1599 y([Customization],)e(page)g(107\),)g(or)g(can)g(b)q(e)i(set)e(in)i (the)f(st)o(yle)f(\014le)i(`)p Fu(fweb.sty)p Fz('.)i(See)d(Section)h (12.3.8.15)75 1654 y([n)o(ull)p 164 1654 14 2 v 17 w(\014le],)g(page)f (120.])137 1719 y(The)j(w)o(eb)f(\014le)i(is)f(sho)o(wn)f(as)g (required)h(since)h(one)e(is)h(normally)g(pro)q(cessing)h(a)e(source.) 26 b(Ho)o(w)o(ev)o(er,)75 1774 y(some)11 b(of)f(the)h(information)h (options)f(\(see)g(Section)h(4.2.82)d([Info)i(options],)g(page)g(37\))f (will)j(w)o(ork)d(without)75 1829 y(sp)q(ecifying)k(an)o(y)e(\014le)h (name.)19 b(F)l(or)11 b(example,)i(one)f(can)g(obtain)h(a)e(list)i(of)f (all)h(of)e(the)h(st)o(yle-\014le)i(parameters)75 1884 y(and)h(their)h(default)g(v)m(alues)g(b)o(y)f(sa)o(ying)h(`)p Fu(ftangle)d(-Z)p Fz('.)75 2007 y Fy(4.2)33 b(Command-line)23 b(options)137 2101 y Fz(Command-line)13 b(options)f(ma)o(y)f(b)q(e)h (put,)g(one)g(p)q(er)g(line,)h(in)o(to)f(the)f(initialization)k(\014le) d(`)p Fu(.fweb)p Fz(')e(\(whic)o(h)75 2156 y(is)22 b(alw)o(a)o(ys)f(in) i(the)f(user's)f(home)h(directory\).)39 b(In)23 b(that)e(\014le,)j (options)e(b)q(eginning)i(with)e(a)f(h)o(yphen)75 2211 y(are)15 b(pro)q(cessed)i Fs(b)q(efore)h Fz(the)e(command-line)h (options)f(\(so)f(command-line)j(options)d(can)h(o)o(v)o(erride)g(the) 75 2265 y(defaults\).)30 b(T)l(o)18 b(force)h(an)f(option)h(to)f(b)q(e) h(pro)q(cessed)h Fs(after)h Fz(the)d(command-line)j(options,)e(preface) g(it)75 2320 y(with)d(an)f(amp)q(ersand)g(rather)g(than)g(a)g(h)o (yphen;)g(this)h(is)g(rarely)f(necessary)l(.)137 2385 y(T)l(o)h(mak)o(e)f(sense)i(of)e(the)h(plethora)h(of)e(options,)h(it)g (helps)h(to)f(kno)o(w)f(that)g(options)i(b)q(eginning)h(with)75 2440 y(`)p Fu(n)p Fz(')f(are)g(related)h(to)g Fw(F)o(or)m(tran)p Fz(;)g(those)g(b)q(eginning)i(with)e(`)p Fu(r)p Fz(')f(are)g(related)h (to)f Fw(Ra)m(tf)o(or)p Fz(.)29 b(Some)17 b(\015ags)75 2495 y(that)f(can)h(b)q(e)h(set)f(separately)g(for)f(those)h(t)o(w)o(o) e(languages)i(also)g(ha)o(v)o(e)g(a)f(global)i(option)f(that)f(sets)h (the)75 2550 y(\015ags)e(for)f(b)q(oth)i(languages)f(sim)o (ultaneously;)h(cf.)k(`)p Fu(-n/)p Fz(',)14 b(`)p Fu(-r/)p Fz(',)f(and)j(`)p Fu(-/)p Fz('.)137 2615 y(Some)i(options)g(tak)o(e)f (argumen)o(ts.)26 b(F)l(or)17 b(example,)i(an)f Fw(Fweb)h Fz(macro)e(can)g(b)q(e)i(de\014ned)g(from)e(the)75 2670 y(command)d(line)i(b)o(y)e(sa)o(ying)g(something)g(lik)o(e)h(`)p Fu(-mIBMPC=1)p Fz('.)j(Unlik)o(e)d(man)o(y)f Fw(unix)g Fz(utilities,)i Fs(no)e(spaces)p eop %%Page: 16 18 16 17 bop 75 -58 a Fz(Chapter)15 b(4:)k(R)o(UNNING)d Fw(Fweb)1166 b Fz(16)75 183 y Fs(are)20 b(allo)o(w)o(ed)g(b)q(et)o(w)o (een)g(an)o(y)g(option)g(and)g(its)h(argumen)o(t.)33 b Fz(F)l(or)19 b(example,)j(if)f(one)f(sa)o(ys)f(`)p Fu(-m)14 b(IBMPC)p Fz(',)75 238 y Fw(Fweb)i Fz(will)h(think)f(that)f(`) p Fu(IBMPC)p Fz(')e(is)j(a)f(\014le)h(name.)75 357 y Fq(4.2.1)30 b(Negating)19 b(options)137 456 y Fz(T)l(o)12 b(negate)f(a)g(command-line)j(option,)e(use)g(an)f(extra)g(h)o(yphen.) 20 b(F)l(or)11 b(example,)h(`)p Fu(--v)p Fz(')f(means)g(`Don't)75 511 y(mak)o(e)g(all)h(commen)o(ts)e(v)o(erbatim.')18 b(This)12 b(kind)g(of)f(construction)g(isn't)g(used)h(v)o(ery)e(often,) i(but)f(it)g(is)h(useful)75 566 y(if)i(an)f(option)h(suc)o(h)f(as)g(`)p Fu(-v)p Fz(')g(is)h(turned)f(on)h(in)g(the)f(`)p Fu(.fweb)p Fz(')f(initialization)17 b(\014le)d(and)g(one)f(wishes)h(to)f(turn)75 621 y(it)i(o\013)g(for)f(just)h(one)h(run.)75 740 y Fq(4.2.2)30 b(`)p Fn(-1)p Fq(':)h(T)-5 b(urn)20 b(on)g(brief)h(debugging)f(mo)r(de) g(\()p Fo(Fwea)l(ve)p Fq(\))137 839 y Fz(This)c(option)f(tells)i Fw(Fwea)l(ve)f Fz(to)e(displa)o(y)i(irreducible)i(scrap)e(sequences.) 137 910 y(A)21 b Fs(scrap)h Fz(is)f(a)f(part)g(of)g(sp)q(eec)o(h.)37 b(The)21 b(expression)h(`)p Fu(x)14 b(+)h(y)p Fz(')20 b(consists)h(of)f(three)h(scraps:)31 b(`)p Fu(x)p Fz(')19 b(\(an)75 965 y(expression\),)d(`)p Fu(+)p Fz(')e(\(a)h(binary)h(op)q (erator\),)e(and)i(`)p Fu(y)p Fz(')f(\(an)g(expression\).)21 b Fw(Fwea)l(ve)16 b Fz(con)o(tains)g Fs(pro)q(duction)75 1019 y(rules)g Fz(suc)o(h)e(as)f(\\replace)h(the)g(com)o(bination)g(`)p Fu(expr)g(binop)h(expr)p Fz(')d(with)i(`)p Fu(expr)p Fz('.")k(If)c(all)g(go)q(es)f(w)o(ell,)i(the)75 1074 y(result)j(of)f Fw(Fwea)l(ve)p Fz('s)h(reduction)g(pro)q(cess)g(is)g (ultimately)h(just)e(one)h(scrap,)g(suc)o(h)g(as)f(`)p Fu(function)p Fz('.)25 b(If)75 1129 y Fw(Fwea)l(ve)13 b Fz(is)g(left)g(with)g(more)f(than)g(one)h(scrap)f(at)g(the)g(end)h (of)g(a)f(section,)h(this)g(is)g(called)h(an)e Fs(irreducible)75 1184 y(scrap)j(sequence)s Fz(;)h(`)p Fu(-1)p Fz(')e(displa)o(ys)i (them.)137 1254 y(Irreducible)i(scrap)c(sequences)i(can)f(arise)g (either)g(b)q(ecause)h(the)f(programmer)e(made)i(a)f(mistak)o(e)g(or)75 1309 y(b)q(ecause)i Fw(Fwea)l(ve)g Fz(has)f(not)g(b)q(een)h(taugh)o(t)f (the)g(prop)q(er)g(grammar.)137 1380 y(While)i Fw(Fwea)l(ve)g Fz(is)f(reducing)h(the)f(scraps,)f(it)h(app)q(ends)h(T)1169 1390 y(E)1194 1380 y(X)f(macros)f(that)g(ultimately)i(pro)q(duce)75 1435 y(the)i(prett)o(y-prin)o(ted)h(output.)32 b(F)l(requen)o(tly)20 b(p)q(eople)h(ask)e(ho)o(w)g(to)g(c)o(hange)g(the)h(app)q(earance)g(of) f(that)75 1489 y(output.)f(F)l(undamen)o(tally)l(,)13 b(this)e(is)h(not)f(p)q(ossible)h(at)f(presen)o(t;)h(the)f(grammar)f (rules)h(and)h(the)f(asso)q(ciated)75 1544 y(T)100 1554 y(E)126 1544 y(X)k(are)g(hard-co)q(ded.)22 b(A)16 b(completely)h (general,)e(user-customizable)i(sc)o(heme)f(is)g(v)o(ery)f(complex)i (and)75 1599 y(daun)o(ting;)e(it)h(has)f(not)g(b)q(een)h(attempted.)137 1669 y(This)d(brief)g(debugging)g(mo)q(de)f(can)g(b)q(e)h(turned)f(on)g (more)f(lo)q(cally)j(b)o(y)e(means)g(of)f(the)i(`)p Fu(@1)p Fz(')d(command.)75 1724 y(See)16 b(Section)g(5.1.2)d([A)l(T1],)h(page)h (38.)75 1843 y Fq(4.2.3)30 b(`)p Fn(-2)p Fq(':)h(T)-5 b(urn)20 b(on)g(v)n(erb)r(ose)h(debugging)f(mo)r(de)g(\()p Fo(Fwea)l(ve)p Fq(\))137 1943 y Fz(This)h(option)g(tells)g Fw(Fwea)l(ve)g Fz(to)f(displa)o(y)i(detailed)g(reductions)f(of)f(the)g (scraps)g(as)g(it)h(do)q(es)g(the)75 1997 y(prett)o(y-prin)o(ting.)34 b(\(F)l(or)19 b(a)g(discussion)i(of)f(scraps,)g(see)g(Section)h(4.2.2)d ([-1],)h(page)h(16.\))33 b(Sometimes)75 2052 y Fw(Fwea)l(ve)15 b Fz(fails)f(sp)q(ectacularly)h(at)f(prett)o(y-prin)o(ting)g(a)f (section,)i(either)f(b)q(ecause)h(of)e(a)h(syn)o(tax)f(error)g(on)75 2107 y(the)i(part)f(of)h(the)g(user)g(or)g(b)q(ecause)h(of)e(a)h(bug)g (in)h Fw(Fwea)l(ve)p Fz('s)f(logic.)21 b(This)15 b(option)h(helps)g (one)f(\(usually)75 2162 y(the)g(system)g(dev)o(elop)q(er!\))21 b(to)14 b(\014gure)i(out)f(wh)o(y)l(.)137 2232 y(This)20 b(feature)e(can)h(b)q(e)h(turned)f(on)g(more)f(lo)q(cally)j(b)o(y)d (means)h(of)f(the)h(`)p Fu(@2)p Fz(')f(command.)31 b(See)19 b(Sec-)75 2287 y(tion)c(5.1.3)f([A)l(T2],)g(page)h(38.)75 2406 y Fq(4.2.4)30 b(`)p Fn(-@)p Fq(':)h(Displa)n(y)21 b(the)g(con)n(trol-co)r(de)f(mappings)137 2506 y Fz(This)f(option)f (supplies)h(information)f(ab)q(out)g(the)g(`)p Fu(@)p Fz(')e(con)o(trol)i(co)q(des)g(\(see)g(Chapter)f(5)h([A)l(T)f(com-)75 2560 y(mands],)e(page)h(38\).)21 b(It)16 b(sho)o(ws)g(the)g(asso)q (ciated)g(st)o(yle-\014le)h(parameters)e(that)h(can)g(b)q(e)g(used)h (to)e(remap)75 2615 y(the)d(co)q(des)g(\(but)g Fs(don't)f(do)h(that!)s Fz(\),)e(and)i(it)g(displa)o(ys)h(the)f(precedence.)21 b(\(Some)11 b(co)q(des)h(suc)o(h)g(as)g(`)p Fu(@@)p Fz(')f(ma)o(y)75 2670 y(b)q(e)18 b(used)g(an)o(ywhere;)f(others)g(suc)o(h)h(as)e(`)p Fu(@*)p Fz(')g(b)q(egin)j(a)e(new)g(section)h(or)f(part)f(of)h (section.)26 b(Co)q(des)18 b(that)p eop %%Page: 17 19 17 18 bop 75 -58 a Fz(Chapter)15 b(4:)k(R)o(UNNING)d Fw(Fweb)1166 b Fz(17)75 183 y(b)q(egin)17 b(the)f(de\014nition)i(part)e (are)f(lab)q(elled)k(b)o(y)d(`)p Fu([D])p Fz(';)f(co)q(des)i(that)e(b)q (egin)i(the)f(co)q(de)h(part)e(are)h(lab)q(elled)75 238 y(b)o(y)f(`)p Fu([C])p Fz(';)f(co)q(des)h(that)g(b)q(egin)h(a)f(new)h (section)g(are)e(lab)q(elled)k(b)o(y)d(`)p Fu([S])p Fz('.\))137 309 y(The)i(option)f(pro)q(duces)h(t)o(w)o(o)d(columns)j(of)f(output:) 21 b(the)16 b(\014rst)g(is)h(sorted)e(n)o(umerically)l(,)j(the)e (second)75 364 y(alphab)q(etically)l(.)42 b(The)22 b(notation)g(`)p Fu(USED_BY_OTHER)p Fz(')d(means)j(that)f(this)h(command)f(is)i(ignored) f(b)o(y)75 419 y(whatev)o(er)14 b(pro)q(cessor)g(\()p Fw(Ft)m(angle)h Fz(or)f Fw(Fwea)l(ve)p Fz(\))h(is)g(curren)o(tly)g(b)q (eing)g(run,)g(but)g(ma)o(y)e(b)q(e)i(used)g(b)o(y)g(the)75 474 y(other)g(pro)q(cessor.)20 b(\(F)l(or)15 b(tec)o(hnical)i(reasons,) d(a)h(v)o(ery)h(few)f(commands)g(suc)o(h)h(as)f(`)p Fu(@i)p Fz(')f(do)i(not)f(sho)o(w)f(up)75 528 y(in)i(this)g(output)f(at)f (presen)o(t.\))137 600 y(If)21 b(one)g(sa)o(ys)f(just)h(`)p Fu(-@)p Fz(',)f(information)h(ab)q(out)g(all)h(con)o(trol)e(co)q(des)h (is)h(pro)q(duced.)37 b(Selected)23 b(con-)75 654 y(trol)e(co)q(des)h (ma)o(y)f(b)q(e)h(queried)g(b)o(y)g(listing)h(them)e(after)g(the)g(`)p Fu(-@)p Fz('.)37 b(F)l(or)21 b(example,)i(to)e(learn)h(ab)q(out)75 709 y(the)d(commands)f(`)p Fu(@~)p Fz(')f(and)i(`)p Fu(@a)p Fz(',)f(sa)o(y)g(`)p Fu(-@~a)p Fz('.)28 b(Remem)o(b)q(er)19 b(to)f(quote)h(certain)f(c)o(haracters)g(on)h Fw(unix)75 764 y Fz(systems|e.g.,)14 b(`)p Fu(-@'*?')p Fz('.)20 b(If)c(a)f(command)h(is)g(used)g(b)o(y)f(neither)i(pro)q(cessor,)e(its) h(description)h(will)g(b)q(e)75 819 y(replaced)f(b)o(y)g(a)e(question)i (mark.)75 939 y Fq(4.2.5)30 b(`)p Fn(-A)p Fq(':)h(T)-5 b(urn)20 b(on)g(ASCI)r(I)h(translations)137 1039 y Fz(This)f(option)g (is)g(used)g(primarily)h(for)e(debugging.)34 b Fw(Fweb)21 b Fz(w)o(orks)d(in)o(ternally)j(with)f(the)g(ASCI)q(I)75 1094 y(c)o(haracter)13 b(set.)19 b(If)13 b Fw(Fweb)i Fz(is)e(run)h(on)f(a)g(non-ASCI)q(I)i(mac)o(hine)f(\(notably)g(IBM)f (mainframes\),)g(transla-)75 1149 y(tions)j(to)f(and)h(from)e(the)i(in) o(ternal)h(ASCI)q(I)f(are)g(done)g(automatically;)g(on)f(an)h(ASCI)q(I) h(mac)o(hine,)f(these)75 1204 y(translations)f(are)g(unnecessary)h(and) f(are)g(not)g(p)q(erformed)g(unless)i(the)e(`)p Fu(-A)p Fz(')f(option)i(is)f(used.)75 1324 y Fq(4.2.6)30 b(`)p Fn(-B)p Fq(':)h(T)-5 b(urn)20 b(o\013)g(audible)h(b)r(eeps)137 1424 y Fw(Fweb)16 b Fz(sometimes)f(b)q(eeps)h(the)f(terminal)h(when)g (it)f(encoun)o(ters)g(certain)h(errors.)j(The)c(`)p Fu(-B)p Fz(')f(option)75 1479 y(turns)h(o\013)f(the)i(b)q(eeps,)g(replacing)g (them)f(b)o(y)g(a)g(prin)o(ted)h(exclamation)g(p)q(oin)o(t.)137 1550 y(\(This)d(option)g(is)g(sometimes)g(called)h(the)f(\\marriage-sa) o(v)o(er,")e(after)h(the)h(situation)g(that)f(prompted)75 1605 y(a)j(user's)g(request)g(for)g(this)g(feature.\))75 1725 y Fq(4.2.7)30 b(`)p Fn(-b)p Fq(':)h(Num)n(b)r(er)21 b(blo)r(c)n(ks)g(\()p Fo(Fwea)l(ve)p Fq(\))137 1825 y Fz(Num)o(b)q(er)i Fp(do)f Fz(and)h Fp(if)g Fz(blo)q(c)o(ks)g(in)g(w)o (o)o(v)o(en)e Fw(F)o(or)m(tran)i Fz(and)f Fw(Ra)m(tf)o(or)h Fz(output.)41 b(This)23 b(feature)f(is)75 1880 y(particularly)16 b(useful)f(in)g Fw(F)o(or)m(tran)p Fz(-77)g(to)e(help)j(correlate)e (the)h(b)q(eginnings)h(and)f(ends)g(of)f(long)g(blo)q(c)o(ks)75 1935 y(\(but)20 b(note)g(that)f(appropriate)h(use)h(of)e(literate)i (programming)e(tec)o(hniques)j(can)e(k)o(eep)h(all)g(of)e(one's)75 1989 y(blo)q(c)o(ks)f(short!\).)23 b(Output)18 b(something)f(lik)o(e)h (the)f(follo)o(wing)g(is)h(pro)q(duced,)g(where)f(the)g(commen)o(ts)f (are)75 2044 y(inserted)g(automatically)g(b)o(y)f(the)g(`)p Fu(-b)p Fz(')f(option:)195 2112 y Fu(do)24 b(i=1,10)f(//)g(Block)g(1) 219 2164 y(do)g(j=1,10)g(//)h(Block)f(2)243 2216 y(if\(i==j\))f(then)i (//)f(Block)h(3)386 2268 y(call)f(sub1\(i\))243 2320 y(else)g(//)h(Block)f(3)386 2372 y(call)g(sub2\(i,j\))243 2424 y(endif)g(//)g(Block)h(3)219 2476 y(end)f(do)h(//)f(Block)h(2)195 2528 y(end)f(do)h(//)g(Block)f(1)137 2615 y Fz(The)14 b(precise)h(form)d(of)h(the)h(blo)q(c)o(k)g(commen)o(t)f(that)g(is)h (emitted)g(can)g(b)q(e)g(c)o(hanged)f(b)o(y)h(rede\014ning)h(the)75 2670 y(macro)f Fu(\\Wblock)h Fz(in)h(`)p Fu(fwebmac.sty)p Fz('.)p eop %%Page: 18 20 18 19 bop 75 -58 a Fz(Chapter)15 b(4:)k(R)o(UNNING)d Fw(Fweb)1166 b Fz(18)75 183 y Fq(4.2.8)30 b(`)p Fn(-C)p Fq(':)h(Set)20 b(the)h(color)f(mo)r(de)137 277 y Fz(The)c(option)f(`)p Fu(-C)p Fs(n)p Fz(')f(sets)h(the)h(color)f(mo)q(de)g(to)g Fs(n)p Fz(,)g(where)g(the)h(color)f(mo)q(des)g(are,)g(brie\015y)l(,)195 348 y Fm(0)216 b Fz(No)15 b(color)195 419 y Fm(1)216 b Fz(ANSI)16 b(color)195 491 y Fm(2)216 b Fz(Bilev)o(el)195 562 y Fm(3)g Fz(T)l(rilev)o(el)195 633 y Fm(4)g Fz(User-de\014ned)75 707 y(These)15 b(mo)q(des,)g(and)g(color)f(output)h(in)h(general,)f (are)f(describ)q(ed)j(more)d(thoroughly)h(in)g(Section)h(12.3.7)75 762 y([Color],)e(page)h(117.)137 827 y(F)l(or)23 b(obscure)h(tec)o (hnical)h(reasons,)g(this)f(command)g(is)g(pro)q(cessed)g(di\013eren)o (tly)g(than)g(all)g(other)75 882 y(command-line)e(options.)35 b(In)20 b(the)h(presen)o(t)f(incomplete)h(implemen)o(tation,)i Fs(the)d(color)g(mo)q(de)h(m)o(ust)75 936 y(b)q(e)d(set)g(on)f(the)h (command)g(line)p Fz(,)h(not)e(in)i(`)p Fu(.fweb)p Fz('!)26 b(T)l(o)17 b(w)o(ork)g(around)g(this)h(anno)o(y)o(ance,)g Fw(unix)f Fz(users)75 991 y(could)f(alias)g(commands)f(suc)o(h)h(as)e (`)p Fu(ftangle)g(-C1)p Fz(')o(.)75 1095 y Fq(4.2.9)30 b(`)p Fn(-c)p Fq(':)h(Set)20 b(global)g(language)g(to)g(C)137 1189 y Fz(Usually)f(the)f(global)g(language)f(\(Chapter)g(8)g ([Languages],)g(page)h(83\))e(is)i(set)f(to)g(C)h(b)o(y)f(means)g(of)75 1243 y(the)i(command)h(`)p Fu(@c)p Fz(')e(in)i(lim)o(b)q(o,)h(rather)e (than)g(using)h(`)p Fu(-c)p Fz(')f(on)g(the)g(command)h(line.)34 b(Ho)o(w)o(ev)o(er,)19 b(one)75 1298 y(ma)o(y)i(need)h(to)f(use)h(the)g (command-line)h(option)f(`)p Fu(-c)p Fz(')f(if)h(a)f(subsequen)o(t)h (command-line)i(option)d(is)75 1353 y(language-dep)q(enden)o(t.)30 b(See,)19 b(for)e(example,)j(the)e(discussion)h(of)f(the)g(option)g(`)p Fu(-D)p Fz(')f(in)i(Section)g(4.2.11)75 1408 y([-D)p 141 1408 14 2 v 16 w(],)14 b(page)h(18.)75 1512 y Fq(4.2.10)29 b(`)p Fn(-c++)p Fq(':)j(Set)20 b(global)g(language)g(to)g(C)p Fn(++)137 1605 y Fz(F)l(or)15 b(more)g(information,)g(see)g(the)g (discussion)i(of)e(`)p Fu(-c)p Fz(')f(in)i(Section)g(4.2.9)e([-c],)g (page)h(18.)75 1709 y Fq(4.2.11)29 b(`)p Fn(-D)p Fq(':)i(Displa)n(y)22 b(reserv)n(ed)f(w)n(ords)137 1802 y Fz(This)f(information)f(option)g (displa)o(ys)h(the)e(list)i(of)e(reserv)o(ed)h(w)o(ords)f(for)h(the)f (language)h(curren)o(tly)75 1857 y(in)f(force.)27 b(\(F)l(or)16 b(the)i(purp)q(oses)g(of)f(this)h(option,)g(`reserv)o(ed)f(w)o(ords')f (include)k(\\true")d(reserv)o(ed)h(w)o(ords)75 1912 y(suc)o(h)k(as)f(`) p Fu(int)p Fz(';)i(they)f(also)f(include)j(the)e(names)f(of)h(in)o (trinsic)h(functions)f(suc)o(h)g(as)f(`)p Fu(sin)p Fz(')g(and,)i(for)75 1967 y Fw(F)o(or)m(tran)16 b Fz(and)h Fw(Ra)m(tf)o(or)p Fz(,)f(I/O)h(k)o(eyw)o(ords)e(suc)o(h)i(as)f(`)p Fu(IOSTAT)p Fz('.\))k(Th)o(us,)c(to)g(see)g(the)g(reserv)o(ed)h(w)o(ords)75 2022 y(for)e Fw(Ra)m(tf)o(or)p Fz({90,)f(sa)o(y)195 2083 y Fu(ftangle)23 b(-Lr9)g(-D)75 2148 y Fz(\(F)l(or)13 b(this)i(option)f(one)g(m)o(ust)g(set)g(the)g(language)g(on)g(the)g (command)g(line,)i(b)q(ecause)f(the)f(`)p Fu(-D)p Fz(')f(option)h(is)75 2203 y(pro)q(cessed)i(b)q(efore)f(the)h(lim)o(b)q(o)g(section)g(of)e (the)i(w)o(eb)f(\014le)h(is)g(read.\))137 2267 y(If)g(one)f(sa)o(ys)g (`)p Fu(-Dabc)p Fz(',)e(one)i(will)i(get)e(just)g(the)g(reserv)o(ed)g (w)o(ords)g(that)f(b)q(egin)j(with)e Fu(")p Fz(ab)q(c)p Fu(")p Fz(.)137 2332 y(If)h(one)f(sa)o(ys)g(`)p Fu(-D*)p Fz(',)e(one)i(will)i(get)e(all)h(reserv)o(ed)f(w)o(ords)g(for)f(all)j (languages.)137 2396 y(The)j(`)p Fu(-D)p Fz(')e(ma)o(y)g(b)q(e)i(follo) o(w)o(ed)f(b)o(y)g(a)g(list)h(of)e(one)i(or)e(more)h(optional)h (letters)f(enclosed)h(in)g(square)75 2451 y(brac)o(k)o(ets.)25 b(\(F)l(or)16 b Fw(unix)h Fz(systems,)f(don't)h(forget)f(to)h(quote)g (the)g(brac)o(k)o(ets,)g(as)f(they)i(mean)f(something)75 2506 y(sp)q(ecial)e(to)d(the)h(shell.\))20 b(The)14 b(letters)f (represen)o(t)f(whic)o(h)i(kind)g(of)f(reserv)o(ed)g(w)o(ord)f(to)g (displa)o(y;)j(they)e(ma)o(y)75 2560 y(b)q(e)18 b(`)p Fu(i)p Fz(')e(\(`in)o(trinsic'\),)i(`)p Fu(k)p Fz(')e(\(`k)o(eyw)o (ord'\),)g(or)h(`)p Fu(r)p Fz(')f(\(`reserv)o(ed'\).)25 b(Th)o(us,)17 b(to)g(see)g(a)g(list)h(of)f(the)h Fw(F)o(or)m(tran)75 2615 y Fz(k)o(eyw)o(ords,)e(sa)o(y)g(`)p Fu(-D[k])p Fz('.)22 b(T)l(o)17 b(see)g(a)f(list)i(of)e(the)h(in)o(trinsic)h(functions)f (for)f(C)p Fu(++)g Fz(that)g(b)q(egin)i(with)f(`)p Fu(s)p Fz(',)75 2670 y(sa)o(y)e(`)p Fu(-Lc++)f(-D[i]s)p Fz('.)p eop %%Page: 19 21 19 20 bop 75 -58 a Fz(Chapter)15 b(4:)k(R)o(UNNING)d Fw(Fweb)1166 b Fz(19)75 183 y Fq(4.2.12)29 b(`)p Fn(-d)p Fq(':)i(Con)n(v)n(ert)22 b(do...enddo)137 282 y Fs(\(This)16 b(option)f(is)h(obsolete.\))75 399 y Fq(4.2.13)29 b(`)p Fn(-E)p Fq(':)i(Change)21 b(the)f(delimiter)h(of)f(a)g(\014le-name)h (extension)137 498 y Fz(The)14 b(standard)f(delimiter)j(for)d (\014le-name)i(extensions)g(is)f(a)f(p)q(erio)q(d,)i(as)e(in)i(`)p Fu(test.web)p Fz('.)i(T)l(o)d(c)o(hange)75 553 y(this)i(c)o(haracter)f (to)g(a)g(comma,)g(for)g(example,)h(sa)o(y)f(`)p Fu(-E,)p Fz('.)20 b(This)c(feature)g(is)g(required)h(b)o(y)e(at)g(least)h(one)75 607 y(p)q(erv)o(erse)g(system.)75 724 y Fq(4.2.14)29 b(`)p Fn(-e)p Fq(':)i(T)-5 b(urn)21 b(on)f(automatic)g(\014le-name)h (completion)137 823 y Fz(When)16 b(the)f(`)p Fu(-e)p Fz(')f(option)h(is)g(in)h(e\013ect,)f Fw(Fweb)h Fz(attempts)d(to)i(b)q (e)g(helpful)j(in)d(\014guring)h(out)e(what)h(\014le)75 878 y(name)j(one)g(in)o(tends.)28 b(F)l(or)17 b(an)o(y)h(input)g (\014le)h(name)f(that)f(has)h(no)f(extension)i(\(no)e(em)o(b)q(edded)i (p)q(erio)q(d\),)75 933 y Fw(Fweb)h Fz(completes)f(the)g(name)g(b)o(y)g (adding)g(the)g(extension)h(con)o(tained)f(in)h(the)f(st)o(yle-\014le)h (parameter)75 987 y(listed)c(in)g(the)g(follo)o(wing)g(table:)386 1054 y(T)o(yp)q(e)f(of)g(\014le)144 b(St)o(yle-\014le)17 b(en)o(try)191 b(Default)386 1106 y Fu(WEB)23 b(file)286 b(ext.web)190 b(web)386 1158 y(Change)23 b(file)214 b(ext.ch)g(ch)386 1210 y(Include)23 b(file)190 b(ext.hweb)166 b(hweb)386 1262 y(Change)23 b(file)410 1314 y(for)g(include)g(file)71 b(ext.hch)190 b(hch)75 1383 y Fz(More)14 b(than)g(one)g(extension)h(ma) o(y)e(b)q(e)i(sp)q(eci\014ed,)i(as)c(a)h(space-delimited)j(list|e.g.,)e (`)p Fu(ext.web)f(=)h("web)75 1438 y(wb")p Fz(';)f(the)h(\014rst)g(one) g(that)g(matc)o(hes)g(is)g(used.)75 1555 y Fq(4.2.15)29 b(`)p Fn(-F)p Fq(':)i(Compare)21 b(output)f(\014les)h(with)g(old)f(v)n (ersions)h(\()p Fo(Ft)m(angle)p Fq(\))137 1654 y Fz(When)13 b(the)g(`)p Fu(-F)p Fz(')e(option)i(is)g(in)h(e\013ect,)e Fw(Ft)m(angle)h Fz(writes)g(its)g(output)f(to)g(a)g(temp)q(orary)g (\014le)i(\(or)d(\014les\))75 1709 y(instead)16 b(of)e(to)h(its)g (ultimate)h(destination)g(suc)o(h)g(as)e(`)p Fu(test.c)p Fz(')g(and/or)g(`)p Fu(test.f)p Fz('.)19 b(After)14 b(all)j(output)d (is)75 1763 y(written,)h(the)h(temp)q(orary)f(\014les)i(are)e(compared) g(with)h(the)g(old)g(v)o(ersion)g(of)f(the)h(\014les,)g(if)g(they)g (exist.)22 b(If)75 1818 y(the)17 b(\014les)h(are)f(iden)o(tical,)i(the) e(appropriate)g(temp)q(orary)g(\014le)h(is)f(deleted;)i(otherwise,)f (the)f(temp)q(orary)75 1873 y(\014le)j(is)g(renamed,)g(e\013ectiv)o (ely)g(o)o(v)o(erwriting)f(the)g(old)h(v)o(ersion.)31 b(This)20 b(feature)f(a)o(v)o(oids)g(up)q(dating)h(the)75 1928 y(time)f(stamp)g(on)g(the)g(\014le)i(unnecessarily)l(,)g(so)e(a)g Fu(make)g Fz(\014le)h(w)o(on't)e(recompile)i(the)f(output)g(unless)i (it)75 1983 y(really)16 b(has)f(to.)137 2052 y(Note)d(that)g(with)h (this)g(option)g(in)g(e\013ect,)g(if)g(one)f(uses)h(the)g Fw(unix)e Fz(utilit)o(y)j Fu(touch)e Fz(to)g(force)g(pro)q(cessing)75 2107 y(of)18 b(a)h(group)g(of)f(\014les,)j(but)e(the)g Fu(web)f Fz(sources)h(are)f(nev)o(er)i(c)o(hanged,)f(the)g Fu(make)g Fz(\014le)h(will)g(con)o(tin)o(ue)g(to)75 2162 y(tangle)d(the)g(sources)g(no)g(matter)f(ho)o(w)h(man)o(y)f(times)h(it) h(is)f(run,)h(since)g Fw(Ft)m(angle)g Fz(will)g(nev)o(er)f(up)q(date)75 2217 y(the)d(time)h(stamp)e(on)i(the)f(\014les.)20 b(This)15 b(is)g(harmless,)f(but)h(anno)o(ying.)k(T)l(o)14 b(get)g(things)h(bac)o (k)f(in)h(sync,)f(do)75 2272 y(a)h(run)g(without)h(the)f(`)p Fu(-F)p Fz('.)137 2341 y(The)23 b(lo)q(cation)f(of)g(the)g(temp)q (orary)g(\014le)h(as)e(w)o(ell)i(as)f(details)h(of)f(the)g(renaming)g (pro)q(cedure)h(are)75 2396 y(determined)d(b)o(y)e(the)g(automatic)g (con\014guration)g(script)h Fu(./configure)d Fz(during)j(installation)h (of)e(the)75 2451 y(pro)q(cessors.)h(The)14 b(script)g(\014rst)f(lo)q (oks)g(for)g(the)g(\(non-ANSI\))h(function)h Fu(tempnam)p Fz(.)j(If)c(it)f(\014nds)h(it,)g(it)g(uses)75 2506 y(it)h(to)f(place)h (the)g(temp)q(orary)f(\014le)h(in)h(the)e(directory)h(that)f Fw(Fweb)i Fz(w)o(ould)f(normally)g(use)g(for)f(output)g(in)75 2560 y(the)k(absence)g(of)f(the)h(`)p Fu(-F)p Fz(')e(option.)27 b(\(That)17 b(is)h(usually)h(the)e(curren)o(t)h(directory)l(.\))27 b(If)18 b Fu(tempnam)e Fz(is)i(not)75 2615 y(a)o(v)m(ailable,)g(the)f (ANSI)h(routine)f Fu(tmpnam)f Fz(is)h(used.)25 b(That)16 b(places)h(the)g(temp)q(orary)f(\014le)i(in)f(a)g(directory)75 2670 y(determined)g(b)o(y)e(the)g(system.)p eop %%Page: 20 22 20 21 bop 75 -58 a Fz(Chapter)15 b(4:)k(R)o(UNNING)d Fw(Fweb)1166 b Fz(20)137 183 y(T)l(o)12 b(implemen)o(t)i(the)e (renaming,)h(the)f Fu(rename)f Fz(function)i(is)g(used.)19 b(That)12 b(ma)o(y)f(fail)i(if)f Fu(tmpnam)g Fz(placed)75 238 y(the)k(temp)q(orary)g(\014le)h(on)g(a)e(di\013eren)o(t)i(device.) 25 b(If)16 b(so,)g(an)g(attempt)f(is)i(made)g(to)e(force)h(the)h (rename)f(b)o(y)75 293 y(using)i(the)f Fu(system)f Fz(routine)h(to)f (issue)i(a)e Fu(mv)h Fz(command.)25 b(T)l(erminal)18 b(output)e(indicates)j(the)e(progress)75 348 y(of)f(the)h(renaming.)25 b(An)17 b(asterisk)f(follo)o(wing)h(an)g(output)f(\014le)i(name)f (indicates)h(that)e Fu(rename)g Fz(did)h(not)75 402 y(succeed,)f(but)f (the)h Fu(mv)f Fz(command)g(did.)137 473 y(Some)i(of)g(the)f(ab)q(o)o (v)o(e-men)o(tioned)i(\014le)g(names)e(and)i(system)e(commands)h(are)f (system-dep)q(enden)o(t;)75 528 y(see)f(Chapter)g(12)g ([Customization],)f(page)h(107.)75 646 y Fq(4.2.16)29 b(`)p Fn(-f)p Fq(':)i(T)-5 b(urn)21 b(o\013)f(mo)r(dule)g(references)h (for)f(iden)n(ti\014ers)h(\()p Fo(Fwea)l(ve)p Fq(\))137 745 y Fz(In)16 b(an)f(attempt)f(to)h(b)q(e)g(helpful,)i Fw(Fwea)l(ve)f Fz(app)q(ends)g(subscripts)g(to)f(man)o(y)f(iden)o (ti\014ers)j(indicating)75 800 y(in)j(whic)o(h)g(section)f(they)g(are)g (\014rst)g(de\014ned)h(\(see)f(Section)h(12.3.4)d([Subscript)j (params],)f(page)g(114\).)75 855 y(Sometimes)14 b(these)g(result)g(in)g (output)f(that)g(is)h(to)q(o)f(cluttered)h(and)g(confusing.)20 b(The)14 b(`)p Fu(-f)p Fz(')e(option)i(turns)75 910 y(o\013)g(the)i (subscripting)g(op)q(erations.)75 1028 y Fq(4.2.17)29 b(`)p Fn(-H)p Fq(':)i(Scan)21 b(C/C)p Fn(++)g Fq(include)g(\014les)g (\()p Fo(Fwea)l(ve)p Fq(\))137 1127 y Fz(F)l(or)g(C)g(or)f(C)p Fu(++)p Fz(,)i(the)f(`)p Fu(-H)p Fz(')f(option)i(tells)g Fw(Fwea)l(ve)g Fz(to)e(do)h(a)g(phase-1)g(scan)g(of)g Fu(#include)f Fz(\014les)75 1182 y(for)e(`)p Fu(typedef)p Fz(')e(and/or)i(`)p Fu(class)p Fz(')e(declarations.)30 b(This)18 b(remo)o(v)o(es)g(the)g(necessit)o(y)h(of)e(includin)q(g)j (man)o(y)75 1237 y(redundan)o(t)14 b(`)p Fu(@f)p Fz(')e(format)g (statemen)o(ts)g(\(see)h(Section)h(5.5.8)e([A)l(Tf)t(],)g(page)h(42\),) f(whic)o(h)i(w)o(ould)g(otherwise)75 1292 y(b)q(e)19 b(necessary)f(in)h(order)f(that)f(the)h(co)q(de)h(b)q(e)f(prett)o (y-prin)o(ted)h(correctly)l(.)28 b(F)l(or)18 b(example,)h(if)g(one)f (uses)75 1347 y(the)d(`)p Fu(-H)p Fz(')f(option)i(with)f(the)h(co)q(de) 195 1414 y Fu(@c++)195 1466 y(@)195 1518 y(#include)23 b()195 1570 y(Complex)g(z;)75 1640 y Fz(the)11 b(iden)o(ti\014er)h Fp(Complex)g Fz(will)g(b)q(e)g(prop)q(erly)f (formatted)f(as)h(a)f(reserv)o(ed)h(w)o(ord)f(\(in)i(b)q(oldface\),)g (as)e(though)75 1695 y(one)15 b(had)h(said)f(`)p Fu(@f)g(Complex)f(int) p Fz('.)137 1765 y(In)i(addition)g(to)f(the)g(basic)h(`)p Fu(-H)p Fz(',)e(there)h(are)g(sev)o(eral)g(more)g(detailed)i(options:) 195 1847 y Fu(-Hx)168 b Fz(Mak)o(e)14 b(index)j(en)o(tries)f(only)f (for)g(double-quoted)i(include)g(\014les.)195 1927 y Fu(-HX)168 b Fz(Mak)o(e)14 b(index)j(en)o(tries)f(for)e(all)i(include)i (\014les.)195 2007 y Fu(-Hr)168 b Fz(Retain)16 b(temp)q(orary)f (\014les)h(generated)f(b)o(y)g(the)g(prepro)q(cessor.)137 2091 y(By)h(default,)g(index)h(en)o(tries)f(are)f(not)h(made)f(for)g(v) m(ariables)i(that)e(are)g(read)h(during)h(suc)o(h)e(scans.)22 b(If)75 2146 y(one)14 b(sa)o(ys)f(`)p Fu(-Hx)p Fz(',)f(index)j(en)o (tries)f(will)h(b)q(e)f(made)g(only)g(for)f(include)j(\014les)f(whose)e (names)h(are)f(enclosed)i(in)75 2201 y(double)h(quotes)e(rather)g(than) g(angle)h(brac)o(k)o(ets,)e(suc)o(h)i(as)f(`)p Fu(#include)g ("myheader.h")p Fz(')e(\(usually)k(these)75 2255 y(are)h(de\014ned)i(b) o(y)e(the)h(user)g(and)f(reside)i(in)f(the)g(lo)q(cal)g(directory\).)27 b(If)18 b(one)g(sa)o(ys)e(`)p Fu(-HX)p Fz(',)h(index)i(en)o(tries)75 2310 y(will)e(b)q(e)e(made)g(for)g(all)h(include)h(\014les.)k(This)15 b(can)h(generate)e(man)o(y)h(en)o(tries,)g(since)h(system)f(header)g (\014les)75 2365 y(ma)o(y)f(b)q(e)i(complicated)h(and)e(ma)o(y)g (include)i(other)e(\014les)h(as)f(w)o(ell.)137 2435 y(This)e(command)g (is)g(implemen)o(ted)h(as)e(follo)o(ws.)19 b(When)13 b Fw(Fwea)l(ve)g Fz(reads)g(an)f Fu(#include)f Fz(statemen)o(t,)75 2490 y(it)17 b(issues)h(a)e Fu(system)g Fz(command)h(to)f(run)i(the)f (C)f(prepro)q(cessor)h(on)g(the)g(included)i(\014le.)26 b(Output)18 b(from)75 2545 y(the)d(prepro)q(cessor)h(is)f(written)g(to) g(a)g(temp)q(orary)f(\014le,)i(whic)o(h)g Fw(Fwea)l(ve)g Fz(scans.)137 2615 y(By)i(default,)f(the)h(C)f(prepro)q(cessor)g(will)i (lo)q(ok)e(in)h(certain)g(default)g(paths)f(for)f(the)i(included)h (\014les.)75 2670 y(T)l(o)13 b(add)h(to)f(those)h(defaults,)g(use)g (one)g(or)f(more)g(`)p Fu(-I)p Fz(')g(options)h Fs(after)i Fz(the)e(`)p Fu(-H)p Fz('.)k(These)c(colon-delimited)p eop %%Page: 21 23 21 22 bop 75 -58 a Fz(Chapter)15 b(4:)k(R)o(UNNING)d Fw(Fweb)1166 b Fz(21)75 183 y(lists)18 b(are)e(concatenated)h(to)g(the) g(con)o(ten)o(ts)f(of)g(the)h(en)o(vironmen)o(t)h(v)m(ariable)g Fu(FWEB_HDR_INCLUDES)p Fz(,)c(if)75 238 y(that)g(is)i(de\014ned.)21 b(The)16 b(en)o(tire)g(list)g(is)f(then)h(passed)f(as)g(m)o(ultiple)i (`)p Fu(-I)p Fz(')d(options)i(to)e(the)h(prepro)q(cessor.)137 305 y(This)22 b(command,)h(new)e(with)h(v)o(ersion)g(1.53,)f(is)h Fs(highly)h(exp)q(erimen)o(tal)h Fz(and)e(incomplete.)40 b(The)75 360 y(installation)20 b(script)g(attempts)d(to)i(determine)h (what)e(command)h(to)f(use)h(to)f(run)h(the)g(prepro)q(cessor,)75 415 y(but)c(that)g(is)h(not)e(guaran)o(teed)h(to)g(w)o(ork)f(in)i (general.)k(`)p Fu(-H)p Fz(')14 b(has)h(b)q(een)i(tested)e(only)h(with) f Fu(gcc)p Fz(.)137 482 y(T)l(o)g(send)h(argumen)o(ts)e(to)h(the)g(C)g (prepro)q(cessor,)g(see)g(Section)i(4.2.65.4)12 b([-WH)p 1497 482 14 2 v 16 w(],)j(page)g(33.)137 550 y(The)i(`)p Fu(-H)p Fz(')f(mec)o(hanism)i(uses)f(temp)q(orary)f(\014les)i(to)f(do)f (its)h(w)o(ork.)25 b(By)17 b(default,)g(those)g(are)g(deleted)75 604 y(after)g(use.)26 b(Ho)o(w)o(ev)o(er,)17 b(for)f(debugging)j(purp)q (oses,)f(one)f(can)h(force)f(those)g(to)g(b)q(e)h(retained)g(b)o(y)f (sa)o(ying)75 659 y(`)p Fu(-Hr)p Fz('.)j(That)15 b(option)h(also)g(has) g(the)f(side)i(e\013ect)e(of)h(displa)o(ying)h(the)f(actual)g(command)f (line)j(that)d(w)o(as)75 714 y(sen)o(t)g(to)g(the)g(prepro)q(cessor.)75 826 y Fq(4.2.18)29 b(`)p Fn(-h)p Fq(':)i(Get)21 b(help)137 923 y Fz(If)h(just)f(`)p Fu(-h)p Fz(')f(is)i(t)o(yp)q(ed,)h(a)e (message)g(is)g(prin)o(ted)i(sa)o(ying)e(where)g(further)h(help)g(is)g (a)o(v)m(ailable.)40 b(It)75 978 y(refers)13 b(one)g(to)f(the)h(v)m (arious)g(information)h(options)f(\(see)g(Section)g(4.2.82)e([Info)i (options],)g(page)g(37\))f(and)75 1032 y(the)18 b(on-line)h(do)q(cumen) o(tation)f(\(see)f(Chapter)h(15)f([Supp)q(ort],)g(page)g(131\).)26 b(If)18 b(the)g(stand-alone)g Fu(info)75 1087 y Fz(program)d(\(the)g (GNU)h(h)o(yp)q(ertext)g(bro)o(wser\))f(is)h(installed,)h(one)f(can)g (en)o(ter)g(`)p Fu(info)e(FWEB)p Fz(')h(at)g(this)i(time)75 1142 y(b)o(y)c(t)o(yping)g(`)p Fu(?)p Fz(')f(or)h(a)f(space-separated)i (list)f(of)g Fw(Fweb)h Fz(men)o(u)f(items)h(suc)o(h)f(as)g(`)p Fu(Macros)g(FWEB)i(built-in)75 1197 y($PI)p Fz('.)27 b(In)18 b(fact,)g(since)h(`)p Fu($PI)p Fz(')e(app)q(ears)h(in)g(the)g (detailed)i(no)q(de)e(listing,)i(one)e(can)g(simply)h(t)o(yp)q(e)f(`)p Fu($PI)p Fz('.)75 1252 y(More)d(generally)l(,)j(one)e(can)g(t)o(yp)q(e) g(an)o(ything)g(that)g Fu(info)f Fz(accepts)h(on)g(its)g(command)g (line)i(\(the)e(option)75 1306 y(`)p Fu(-f)f(FWEB)p Fz(')f(is)h (implicit\).)137 1374 y(One)22 b(can)f(b)o(ypass)f(the)h(prin)o(ted)h (message)e(and)h(directly)h(en)o(ter)f Fu(info)f Fz(b)o(y)h(sp)q (ecifying)i(the)e Fu(info)75 1428 y Fz(argumen)o(ts)11 b(as)g(argumen)o(ts)g(to)g(`)p Fu(-h)p Fz('.)18 b(F)l(or)11 b(example,)i(on)f(a)f Fw(unix)g Fz(system,)h(one)g(could)g(t)o(yp)q(e)g (`)p Fu(-h'\\$PI')p Fz('.)75 1483 y(Here)h(the)g(dollar)h(sign)f(m)o (ust)g(b)q(e)g(escap)q(ed)h(b)q(ecause)g(it)f(has)g(sp)q(ecial)i (signi\014cance)g(to)d(the)h(shell,)i(and)e(the)75 1538 y(quotes)h(are)g(necessary)h(in)g(order)f(to)f(preserv)o(e)i(that)e (escap)q(e)i(c)o(haracter)f(as)g(the)g(argumen)o(t)g(is)h(supplied)75 1593 y(to)g Fu(info)p Fz(.)k(T)l(o)c(get)g(to)f(the)h(top-lev)o(el)i Fw(Fweb)f Fz(info)g(directory)l(,)f(t)o(yp)q(e)g(`)p Fu(-h.)p Fz(')f(or)h(`)p Fu(-h'?')p Fz('.)75 1705 y Fq(4.2.19)29 b(`)p Fn(-I)p Fq(':)i(App)r(end)21 b(to)f(searc)n(h)i(list)e(for)g (include)h(\014les)137 1802 y Fz(The)c(fundamen)o(tal)g(searc)o(h)g (list)g(for)f Fs(include)j(\014les)h Fz(\(read)c(in)i(via)f(`)p Fu(@i)p Fz(')e(or)i(`)p Fu(@I)p Fz('\))e(is)i(de\014ned)h(b)o(y)f(the) 75 1856 y(en)o(vironmen)o(t)e(v)m(ariable)i Fu(FWEB_INCLUDES)p Fz(,)c(whic)o(h)j(is)g(a)f(colon-delimited)j(list)e(suc)o(h)f(as)195 1921 y Fu(setenv)23 b(FWEB_INCLUDES)f(.:/usr/fweb:/other/stuff)75 1988 y Fz(The)15 b(`)p Fu(-I)p Fz(')g(option)g(app)q(ends)h(to)f(this)g (list.)137 2056 y(F)l(or)g(information)g(ab)q(out)g(include)j(\014les,) e(see)f(Section)h(5.5.9)e([A)l(Ti],)h(page)g(43.)75 2168 y Fq(4.2.20)29 b(`)p Fn(-i)p Fq(':)i(Don't)21 b(prin)n(t)g(`)p Fn(@I)p Fq(')f(include)h(\014les)g(\()p Fo(Fwea)l(ve)p Fq(\))137 2264 y Fz(If)16 b(a)f(w)o(eb)g(\014le)h(is)g(included)i(via)d (`)p Fu(@I)p Fz(')f(\(see)h(Section)h(5.5.10)e([A)l(TI)p 1253 2264 V 16 w(],)h(page)g(44\),)f(for)g(example)195 2329 y Fu(@I)24 b(formats.hweb)75 2396 y Fz(then)18 b(the)f(`)p Fu(-i)p Fz(')f(option)i(means)f(to)g(read)g(and)h(pro)q(cess)f(the)h(w) o(eb)f(\014le,)i(but)e(don't)g(prin)o(t)g(its)h(con)o(ten)o(ts.)75 2451 y(This)d(option)f(is)h(often)f(used)g(for)g(large)g(\014les)h(of)f (macro)f(de\014nitions,)j(formats,)d(or)g Fp(t)o(yp)q(edef)i Fz(statemen)o(ts)75 2506 y(that)i(m)o(ust)g(b)q(e)h(included)i(at)d (the)h(b)q(eginning)h(of)e(ev)o(en)h(v)o(ery)f(short)g(w)o(eb)h (\014les;)h(it)f(clutters)g(things)f(up)75 2560 y(to)f(prin)o(t)h(suc)o (h)g(header)f(\014les)i(all)f(of)f(the)h(time.)24 b(\(C)16 b(and)h(C)p Fu(++)f Fz(programmers)f(will)j(\014nd)g(that)d(the)i(`)p Fu(-H)p Fz(')75 2615 y(option)f(substan)o(tially)h(reduces)g(the)f (need)h(to)f(include)i(suc)o(h)e(header)h(\014les;)g(see)f(Section)h (4.2.17)e([-H)p 1837 2615 V 16 w(],)75 2670 y(page)g(20.\))p eop %%Page: 22 24 22 23 bop 75 -58 a Fz(Chapter)15 b(4:)k(R)o(UNNING)d Fw(Fweb)1166 b Fz(22)137 183 y(Note)15 b(that)g(\014les)h(included)i (via)d(`)p Fu(@i)p Fz(')f(\(lo)o(w)o(er)h(case\))g(do)g(not)g(resp)q (ond)g(to)g(`)p Fu(-i)p Fz(')f(or)h(`)p Fu(-i!)p Fz('.)137 250 y(By)23 b(default,)h(iden)o(ti\014ers)g(that)d(are)h(referenced)h (in)g(non-prin)o(ted)h(include)g(\014les)f(are)f(not)g(cross-)75 305 y(referenced)15 b(or)e(indexed)j(in)e(an)o(y)g(w)o(a)o(y)l(.)k(T)l (o)c(force)f(them)h(to)f(b)q(e)i(cross-referenced,)f(sa)o(y)f(`)p Fu(-ix)p Fz(')g(instead)h(of)75 359 y(`)p Fu(-i)p Fz('.)27 b(In)18 b(the)g(presen)o(t)g(implemen)o(tation,)i(the)e (cross-reference)g(information)g(for)g(suc)o(h)g(non-prin)o(ted)75 414 y(\014les)j(is)g(presen)o(ted)g(in)h(the)e(form)g(`)p Fu(#)p Fs(n)p Fz(',)g(where)h Fs(n)g Fz(is)g(the)f(in)o(teger)h (section)g(n)o(um)o(b)q(er.)36 b(\(The)20 b(LaT)1815 424 y(E)1841 414 y(X)75 469 y(section)c(lab)q(el)h(is)e(unde\014ned)i (for)e(sections)h(in)g(non-prin)o(ted)g(\014les.\))137 535 y(The)e(option)f(`)p Fu(-i!)p Fz(')f(means)i(skip)g(the)f(include)j (\014les)e(completely)l(.)21 b(This)14 b(is)g(usually)g(not)f(v)o(ery)g (useful.)75 645 y Fq(4.2.21)29 b(`)p Fn(-i!)p Fq(':)j(Don't)20 b(read)g(`)p Fn(@I)p Fq(')h(include)g(\014les)137 741 y Fz(If)16 b(a)f(w)o(eb)g(\014le)h(is)g(included)i(via)d(`)p Fu(@I)p Fz(',)f(for)g(example)195 804 y Fu(@I)24 b(formats.hweb)75 871 y Fz(then)17 b(the)g(`)p Fu(-i!)p Fz(')f(option)h(means)g(to)f (ignore)h(suc)o(h)g(\014les)h(completely)l(.)27 b(This)17 b(option)g(is)h(seldom)f(useful;)75 926 y(the)e(`)p Fu(-i)p Fz(')f(option)i(\(see)f(Section)h(4.2.20)d([-i],)i(page)g(21\))g(is)g (more)g(often)g(used.)75 1036 y Fq(4.2.22)29 b(`)p Fn(-j)p Fq(':)i(Inhibit)21 b(m)n(ultiple)g(includes)137 1131 y Fz(File)14 b(inclusion)i(via)d Fw(Fweb)p Fz('s)g(`)p Fu(@i)p Fz(')f(command)h(su\013ers)f(from)g(a)h(design)h(de\014ciency:) 21 b(they)13 b(cannot)f(b)q(e)75 1186 y(inhibited)j(b)o(y)d(means)g(of) g Fw(Fweb)p Fz('s)g(prepro)q(cessor)g(commands.)19 b(\(The)12 b(reason)g(is)g(that)g(`)p Fu(@i)p Fz(')f(is)h(pro)q(cessed)75 1241 y(v)o(ery)j(early)h(in)h(the)f(input)g(stage,)f(b)q(efore)h(tok)o (enization.)22 b(This)16 b(design)h(decision)g(w)o(as)e(inherited)j (from)75 1295 y Fw(Cweb)p Fz(,)f(and)f(is)h(v)o(ery)f(di\016cult)i(to)e (c)o(hange.\))24 b(A)16 b(particularly)i(anno)o(ying)e(situation)h (arises)g(when)g(the)75 1350 y(same)i(\014le)i(is)f(included)i(m)o (ultiple)g(times;)f(v)m(arious)f(arra)o(y)f(space)g(ma)o(y)g(b)q(e)i (eaten)e(up)h(unnecessarily)l(.)75 1405 y(The)15 b(`)p Fu(-j)p Fz(')g(option)g(inhibits)i(suc)o(h)f(m)o(ultiple)h(includes.)75 1515 y Fq(4.2.23)29 b(`)p Fn(-k)p Fq(':)i(Don't)21 b(recognize)f(lo)n (w)n(er-case)i(forms)e(of)g(k)n(eyw)n(ords)137 1610 y Fz(By)f(de\014nition,)i(in)f Fw(F)o(or)m(tran)f Fz(and)f Fw(Ra)m(tf)o(or)p Fz(,)i(a)f(k)o(eyw)o(ord)e(is)j(one)e(of)h(the)f (parameters)g(suc)o(h)h(as)75 1665 y Fu(IOSTAT)14 b Fz(used)i(in)g(the) f(parameter)g(list)h(of)f(an)g(I/O)g(statemen)o(t.)k(F)l(or)c(example,) 195 1729 y Fu(open\(21,)23 b(FILE=file_name,)f(STATUS='old',)g (IOSTAT=io_flag\))75 1795 y Fz(Suc)o(h)f(k)o(eyw)o(ords)e(are)g(t)o(yp) q(eset)h(in)h Fu(typewriter)14 b(type)19 b Fz(to)h(b)q(etter)g (highligh)o(t)h(them.)34 b(In)21 b Fw(F)o(or)m(tran)p Fz(,)75 1850 y(these)14 b(k)o(eyw)o(ords)g(are)g(case-insensitiv)o(e.) 22 b(Ho)o(w)o(ev)o(er,)13 b(note)h(that)f(certain)i(of)f(the)g(lo)o(w)o (er-case)g(forms|in)75 1905 y(particular,)f(`)p Fu(end)p Fz(',)e(`)p Fu(read)p Fz(',)f(and)i(`)p Fu(write)p Fz('|ha)o(v)o(e)f (other)g(sp)q(ecial)j(meanings,)f(and)f(one)g(can)g(in)g(principle)75 1960 y(use)j(an)o(y)g(of)g(these)g(k)o(eyw)o(ords)f(as)h(ordinary)g(v)m (ariables)h(in)g(other)f(parts)f(of)h(the)g(co)q(de;)g(ho)o(w)o(ev)o (er,)f Fw(Fweb)75 2015 y Fz(iden)o(ti\014ers)g(can)f(ha)o(v)o(e)f(just) h(one)g(meaning)g(throughout)f(the)h(co)q(de.)19 b(By)13 b(default,)g(the)g(lo)o(w)o(er-case)g(forms)75 2069 y(are)19 b(also)g(recognized)i(as)e(k)o(eyw)o(ords)f(\(except)i(for)f(the)g (three)h(sp)q(ecial)h(iden)o(ti\014ers)g(just)e(men)o(tioned\),)75 2124 y(so)d(one)h(shouldn't)h(use)f(those)f(as)h(regular)g(v)m (ariables.)25 b(T)l(o)17 b(cause)g(only)g(the)g(upp)q(er-case)h(forms)e (to)g(b)q(e)75 2179 y(recognized,)g(use)g(the)f(`)p Fu(-k)p Fz(')f(option.)75 2289 y Fq(4.2.24)29 b(`)p Fn(-L)p Fq(':)i(Select)21 b(global)f(language)137 2384 y Fz(T)l(o)26 b(select)i(a)e(global)h (language)f(from)g(the)h(command)f(line,)k(sa)o(y)c(`)p Fu(-L)p Fs(l)r Fz(',)i(where)f Fs(l)i Fz(is)e(one)f(of)75 2439 y Fu({c,c++,n,n9,r,r9,v,x})p Fz(.)17 b(See)f(Chapter)f(8)g ([Languages],)f(page)h(83.)137 2506 y(Usually)l(,)k(the)e(global)h (language)g(is)f(set)g(via)h(an)f(`)p Fu(@)p Fz(')f(command)h(in)h(lim) o(b)q(o,)h(not)e(on)g(the)g(command)75 2560 y(line.)28 b(Ho)o(w)o(ev)o(er,)17 b(one)h(ma)o(y)e(need)j(to)d(use)i(a)f (command-line)j(option)d(suc)o(h)h(as)f(`)p Fu(-L_)p Fz(')f(if)i(a)f(subsequen)o(t)75 2615 y(command-line)f(option)f(is)g (language-dep)q(enden)o(t.)21 b(See,)15 b(for)f(example,)h(the)f (discussion)i(of)e(the)h(option)75 2670 y(`)p Fu(-D)p Fz(')f(in)i(Section)g(4.2.11)e([-D)p 573 2670 14 2 v 15 w(],)h(page)g(18.)p eop %%Page: 23 25 23 24 bop 75 -58 a Fz(Chapter)15 b(4:)k(R)o(UNNING)d Fw(Fweb)1166 b Fz(23)75 183 y Fq(4.2.25)29 b(`)p Fn(-l)p Fq(':)i(Ec)n(ho)22 b(input)e(line)137 275 y Fz(The)d(option)g(`)p Fu(-l)p Fs([mmm[:nnn]])r Fz(')c(ec)o(ho)q(es)k(the)f(input)i(lines)g (constructed)e(b)o(y)g(the)h(input)g(driv)o(er)g(b)q(e-)75 330 y(t)o(w)o(een)12 b(lines)i Fs(mmm)f Fz(and)f Fs(nnn)p Fz(.)20 b(Missing)14 b Fs(nnn)f Fz(means)f(ec)o(ho)h(to)f(the)h(end)g (of)f(\014le.)20 b(Missing)14 b Fs(mmm)e Fz(means)75 385 y(ec)o(ho)j(from)g(the)g(b)q(eginning.)137 448 y(This)i(option)f (is)h(useful)g(as)f(a)f(debugging)i(to)q(ol)f(\(usually)h(b)o(y)f(the)h (system)e(dev)o(elop)q(er\).)24 b(It)16 b(is)g(often)75 503 y(used)h(to)f(v)o(erify)h(that)f(the)h(input)g(driv)o(er)g(is)h (inserting)f(semicolons)h(correctly)l(.)25 b(F)l(or)16 b Fw(F)o(or)m(tran)p Fz({77,)g(it)75 558 y(is)g(also)f(useful)h(to)f(v) o(erify)g(that)g(commen)o(ts)f(are)h(b)q(eing)i(pro)q(cessed)f (correctly)l(.)75 657 y Fq(4.2.26)29 b(`)p Fn(-M)p Fq(':)i(Set)21 b(output)f(message)h(lev)n(el)137 750 y Fz(By)e(default,)h Fw(Fweb)f Fz(is)g(relativ)o(ely)h(v)o(erb)q(ose;)g(as)e(it)h(pro)q (ceeds,)h(it)e(prin)o(ts)h(messages)f(ab)q(out)h(what)75 804 y(\014les)d(it)f(is)g(reading)g(and)g(writing,)g(n)o(um)o(b)q(ers)g (of)g(the)f(starred)g(sections,)h(line)i(n)o(um)o(b)q(ers,)e(etc.)k(Ho) o(w)o(ev)o(er,)75 859 y(di\013eren)o(t)c(lev)o(els)i(of)e(v)o(erb)q (osit)o(y)g(can)g(b)q(e)h(set)f(b)o(y)g(the)g(command)g(`)p Fu(-M)p Fs(lev)o(el)r Fz(',)g(where)g(the)h(lev)o(el)g(ma)o(y)e(b)q(e)i (0)75 914 y(\(least)f(v)o(erb)q(ose\))g(through)g(4)g(\(most)f(v)o(erb) q(ose;)h(the)g(default\),)g(as)g(describ)q(ed)i(in)f(the)f(follo)o (wing)h(table:)195 982 y Fm(0)216 b Fz(Lik)o(e)17 b(lev)o(el)g(1,)e (but)h(the)g(start-up)f(banner)h(is)g(not)g(prin)o(ted.)22 b(If)16 b Fw(Fweb)h Fz(runs)435 1034 y(to)e(completion)h(with)f(no)h (errors,)e(nothing)h(at)g(all)h(will)h(b)q(e)f(prin)o(ted.)195 1103 y Fm(1)216 b Fz(Prin)o(t)15 b(only)h(error)e(messages.)195 1171 y Fm(2)216 b Fz(Prin)o(t)15 b(error)g(and)g(w)o(arning)g (messages.)195 1240 y Fm(3)216 b Fz(Prin)o(t)16 b(errors,)f(w)o (arnings,)h(and)g(short)f(information)i(messages)e(\(excluding)435 1292 y(starred)g(section)g(n)o(um)o(b)q(ers)h(and)f(line)i(n)o(um)o(b)q (ers\).)195 1360 y Fm(4)216 b Fz(Prin)o(t)15 b(ev)o(erything.)137 1432 y(The)f(start-up)e(banner,)h(whic)o(h)h(includes)i(the)d(v)o (ersion)g(n)o(um)o(b)q(er,)g(is)h(prin)o(ted)g(for)e(all)i(message)f (lev)o(els)75 1486 y(except)21 b(0.)36 b(F)l(or)20 b(lev)o(el)i(0,)g (one)f(can)f(use)h(the)g(`)p Fu(-V)p Fz(')f(option)h(to)f(request)h (the)f(start-up)h(banner.)36 b(See)75 1541 y(Section)16 b(4.2.63)d([-V)p 430 1541 14 2 v 17 w(],)h(page)h(32.)137 1604 y(This)i(option)g(is)g(v)o(ery)f(recen)o(t,)g(and)h(ma)o(y)e(not)h (b)q(e)h(fully)h(debugged)f(for)f(obscure)g(com)o(binations)h(of)75 1659 y(command-line)g(options.)j(Please)c(rep)q(ort)f(an)o(y)f(anno)o (y)o(ances.)137 1722 y(Another)20 b(w)o(a)o(y)f(of)h(discriminating)i (message)e(t)o(yp)q(es)g(is)g(via)h(color)f(output.)34 b(See)21 b(Section)g(12.3.7)75 1777 y([Color],)14 b(page)h(117.)75 1877 y Fq(4.2.27)29 b(`)p Fn(-m)p Fq(':)i(De\014ne)21 b Fo(Fweb)f Fq(macro)h(\()p Fo(Ft)m(angle)p Fq(\))137 1969 y Fz(The)16 b(command-line)h(construction)195 2029 y Fu(-mA\(x\)=x)75 2092 y Fz(de\014nes)f(the)g Fw(Fweb)g Fz(macro)e Fu(A)h Fz(as)g(though)g(the)g(de\014nition)195 2152 y Fu(@m)24 b(A\(x\))f(x)75 2215 y Fz(had)15 b(app)q(eared)h(in)g (the)g(\014rst)e(de\014nition)j(part)e(of)g(the)g(w)o(eb)g(\014le.)137 2279 y(One)i(can)f(also)g(sa)o(y)f(`)p Fu(-m'A\(x\))f(x')p Fz(',)h(where)i(the)f(quotes)f(are)h(remo)o(v)o(ed)f(b)o(y)h(the)g (shell.)24 b(That)16 b(is,)g(an)75 2333 y(`)p Fu(=)p Fz(')c(app)q(earing)i Fs(immediately)19 b Fz(after)12 b(the)h(macro)g(name)g(\(or)f(argumen)o(t)g(list,)i(if)g(there)f(is)h (one\))f(pla)o(ys)g(the)75 2388 y(role)j(of)e(the)i(space)f(in)h(the)f (con)o(v)o(en)o(tional)h(de\014nition.)22 b(Th)o(us,)14 b(carefully)j(distinguish)g(the)e(forms)195 2448 y Fu(-m'A\(x\)=x')70 b(//)24 b Fz(A\(x\))14 b(expands)i(to)f(`)p Fu(x)p Fz(')195 2500 y Fu(-m'A\(x\))23 b(=x')47 b(//)24 b Fz(A\(x\))14 b(expands)i(to)f(`)p Fu(=x)p Fz(')195 2552 y Fu(-m'A\(x\)==x')46 b(//)24 b Fz(Precisely)16 b(equiv)m(alen)o(t)h(to)e(the)g(previous)h (example.)137 2615 y(The)i(equals)h(sign)f(is)h(p)q(ermitted)g(only)f (with)g(command-line)i(macro)d(de\014nitions,)j(not)e(with)g(`)p Fu(@m)p Fz(')75 2670 y(commands)d(\(see)g(Section)h(5.5.16)e([A)l(Tm],) g(page)h(45\))f(in)i(the)f(de\014nition)i(parts)e(of)g(the)g(w)o(eb)g (\014le.)p eop %%Page: 24 26 24 25 bop 75 -58 a Fz(Chapter)15 b(4:)k(R)o(UNNING)d Fw(Fweb)1166 b Fz(24)75 183 y Fq(4.2.28)29 b(`)p Fn(-m4)p Fq(':)j(Understand)20 b Fn(m4)h Fq(built-in)g(commands)137 280 y Fz(This)12 b(tells)h Fw(Fwea)l(ve)f Fz(to)e(prop)q(erly)j(format) d(the)h(reserv)o(ed)g(w)o(ords)g(of)g(the)g Fu(m4)g Fz(prepro)q (cessor.)19 b(The)12 b(use)75 335 y(of)17 b(that)f(prepro)q(cessor)i (is)f Fs(not)g(recommended)j Fz(in)e(conjunction)h(with)e Fw(Fweb)p Fz(;)i(use)f Fw(Fweb)p Fz('s)g(built-in)75 389 y(C-lik)o(e)e(prepro)q(cessor)g(instead.)75 502 y Fq(4.2.29)29 b(`)p Fn(-m;)p Fq(':)j(App)r(end)20 b(pseudo-semicolons) 137 599 y Fz(When)g(`)p Fu(-m;)p Fz(')e(is)i(in)g(e\013ect,)g(the)g (construction)g(`)p Fu(@;)p Fz(')e(is)i(app)q(ended)h(automatically)f (to)f(all)h Fw(Fweb)75 654 y Fz(macro)14 b(de\014nitions.)137 721 y Fs(This)i(option)f(is)h(not)f(recommended.)21 b Fz(Please)15 b(insert)h(the)f(`)p Fu(@;)p Fz(')f(b)o(y)i(hand)f(when)h (necessary)l(,)f(as)g(in)195 786 y Fu(@m)24 b(SET\(x,y\))e(x=1;)i (y=2@;)195 838 y(@m)g(TEST\(x\))e(if\(x\))i(y;)f(else)h(z@;)75 950 y Fq(4.2.30)29 b(`)p Fn(-n)p Fq(':)i(Set)21 b(global)f(language)f (to)h Fo(F)o(or)m(tran)p Fq({77)137 1047 y Fz(This)15 b(is)g Fw(Fweb)p Fz('s)g(default,)f(so)g(it)h(generally)g(do)q(es)g (not)f(need)h(to)f(b)q(e)h(used)f(explicitly)m(.)22 b(\(See)15 b(also)f(the)75 1102 y(discussion)19 b(of)d(Section)i(4.2.24)d([-L)p 696 1102 14 2 v 16 w(],)i(page)f(22.\))24 b(Ho)o(w)o(ev)o(er,)16 b(v)m(arian)o(ts)h(of)f(this)h(option,)h(as)e(describ)q(ed)75 1156 y(b)q(elo)o(w,)f(ma)o(y)g(b)q(e)h(useful.)137 1224 y(See)g(also)f(Chapter)g(8)g([Languages],)f(page)h(83)g(and)g(Section)h (8.2.3)e([F)l(ortran],)f(page)i(85.)75 1337 y Fq(4.2.31)29 b(`)p Fn(-n9)p Fq(':)j(Set)20 b(global)g(language)f(to)h Fo(F)o(or)m(tran)p Fq({90)137 1433 y Fz(See)f(Chapter)f(8)h ([Languages],)f(page)g(83)g(and)g(Section)i(8.2.3)c([F)l(ortran],)h (page)i(85;)g(see)f(also)h(the)75 1488 y(discussion)e(of)e(`)p Fu(-L)p Fz(')f(in)i(Section)g(4.2.24)d([-L)p 830 1488 V 17 w(],)h(page)h(22.)75 1601 y Fq(4.2.32)29 b(`)p Fn(-n@;)p Fq(':)j(Supply)21 b(automatic)f(pseudo-semicolons)h([)p Fo(F)o(or)m(tran)p Fq(])137 1697 y Fz(\(Don't)d(forget)g(that)g(a)h (semicolon)h(has)e(sp)q(ecial)j(meaning)f(to)e Fw(unix)g Fz(shells,)j(so)e(y)o(ou'll)g(probably)75 1752 y(ha)o(v)o(e)c(to)f (quote)h(this)h(command:)k(`)p Fu(-n'@;')p Fz('.\))137 1820 y(This)c(is)f(the)h(default)f(mo)q(de)h(of)e(op)q(eration)h(for)g (free-form)f Fw(F)o(or)m(tran)p Fz(-90;)h(the)g(input)h(driv)o(er)f (auto-)75 1875 y(matically)i(app)q(ends)g(a)f(pseudo-semicolon)i(\(in)o (visible\))g(to)e(eac)o(h)g(logical)h(line)h(of)d(source)h(co)q(de.)23 b(Since)75 1929 y(it)15 b(is)g(the)g(default,)g(one)g(do)q(esn't)f(ha)o (v)o(e)h(to)f(use)h(it)g(unless)h(one)e(wishes)i(to)e(negate)g(it)h (\(see)g(Section)h(4.2.1)75 1984 y([Negating)21 b(options],)g(page)g (16\).)36 b(In)22 b(that)e(case,)i(it)f(is)h(b)q(est)f(to)f(place)i (the)f(`)p Fu(--n@;)p Fz(')e(command)i(in)75 2039 y(the)c(source)h (\014le,)g(as)f(`)p Fu(@n9[--n@;])p Fz('.)24 b(If)18 b(one)f(places)h(it)g(on)f(the)g(command)h(line,)h(b)q(e)f(sure)f(to)g (set)g(the)75 2094 y(language)e(\014rst:)20 b Fu(-n9)15 b(--n@;)p Fz(.)137 2161 y(F)l(or)g(free-format)g Fw(F)o(or)m(tran)p Fz(-90,)g(when)h(`)p Fu(-n@;)p Fz(')e(is)j(in)f(e\013ect)f(\(the)h (default\),)f(`)p Fu(-np)p Fz(')g(is)h(also)g(turned)75 2216 y(on.)k(See)c(Section)g(4.2.37)d([-np],)i(page)g(26.)137 2284 y(F)l(or)g(further)g(discussion,)h(see)g(the)f(companion)h (command)f(Section)h(4.2.33)d([-n;],)h(page)i(24.)75 2396 y Fq(4.2.33)29 b(`)p Fn(-n;)p Fq(':)j(Supply)21 b(automatic)f(semicolons)h([)p Fo(F)o(or)m(tran)p Fq(])137 2493 y Fz(\(Don't)d(forget)g(that)g(a)h(semicolon)h(has)e(sp)q(ecial)j (meaning)f(to)e Fw(unix)g Fz(shells,)j(so)e(y)o(ou'll)g(probably)75 2548 y(ha)o(v)o(e)c(to)f(quote)h(this)h(command:)k(`)p Fu(-n';')p Fz('.\))137 2615 y(This)15 b(command)f(functions)i(the)e (same)g(as)g(`)p Fu(-n@;)p Fz(')f(\(see)h(Section)i(4.2.32)c([-nA)l (T;],)i(page)g(24,)f(except)75 2670 y(that)k(actual)h(\(visible\))h (semicolons)g(rather)e(than)h(pseudo-semicolons)h(are)e(app)q(ended.)29 b(This)19 b(is)f(the)p eop %%Page: 25 27 25 26 bop 75 -58 a Fz(Chapter)15 b(4:)k(R)o(UNNING)d Fw(Fweb)1166 b Fz(25)75 183 y(default)16 b(mo)q(de)f(of)g(op)q(eration) h(for)f Fw(F)o(or)m(tran)p Fz(-77)g(\(and)g(for)g(that)f(language,)h (it)h(cannot)f(b)q(e)h(turned)g(o\013)75 238 y(b)o(y)f(negation\).)137 304 y(The)j(distinction)h(b)q(et)o(w)o(een)e(`)p Fu(-n@;)p Fz(')f(and)h(`)p Fu(-n;)p Fz(')f(has)h(to)g(do)g(with)g(what)g(is)g (visible)j(on)d(output.)25 b(In)75 358 y Fw(F)o(or)m(tran)p Fz(-77,)13 b(semicolons)h(are)e(not)h(prin)o(ted)g(b)o(y)g(default)h (since)g(that)e(seemed)h(to)f(anno)o(y)h(man)o(y)f(users.)75 413 y(Ho)o(w)o(ev)o(er,)19 b(that)f(causes)h(trouble)g(with)h Fw(F)o(or)m(tran)p Fz(-90)f(co)q(de)g(con)o(taining)h(m)o(ultiple)h (statemen)o(ts)c(p)q(er)75 468 y(line,)f(as)f(in)195 531 y Fu(a)24 b(=)f(b;)h(c)g(=)f(d)75 596 y Fz(If)e(`)p Fu(-np)p Fz(')f(is)h(not)g(used,)h(then)g(the)e(semicolon)i(in)g(the)f (ab)q(o)o(v)o(e)g(example)g(is)h(not)e(prin)o(ted,)j(hindering)75 651 y(legibilit)o(y)l(.)30 b(Th)o(us,)17 b(the)h(default)g(mo)q(de)g (of)f(op)q(eration)h(for)f(free-format)f Fw(F)o(or)m(tran)p Fz(-90)i(is)g(`)p Fu(-n@;)p Fz(')e(and)75 706 y(`)p Fu(-np)p Fz('.)j(This)c(turns)h(the)f(ab)q(o)o(v)o(e)g(example)h(in)o(to)f(`)p Fu(a)f(=)h(b;)g(c)g(=)g(d@;)p Fz(')g(and)g(displa)o(ys)h(it)g (correctly)l(.)137 771 y(When)21 b(`)p Fu(-n;)p Fz(')e(is)i(used,)h (semicolons)g(will)g(not)e(b)q(e)h(prin)o(ted)g(b)o(y)g(default.)36 b(T)l(o)20 b(force)g(them)g(to)g(b)q(e)75 826 y(prin)o(ted,)c(use)f (the)g(`)p Fu(-np)p Fz(')f(option)i(\(see)f(Section)h(4.2.37)d([-np],)i (page)g(26\).)137 892 y(Do)10 b(not)g(insert)h(semicolons)g(b)o(y)g (hand)g(in)g Fw(F)o(or)m(tran)p Fz(-77;)g(they)g(are)f(alw)o(a)o(ys)f (inserted)j(automatically)l(.)75 947 y(If)i(y)o(ou)g(ha)o(v)o(e)g (terminated)g Fw(F)o(or)m(tran)p Fz(-90)g(statemen)o(ts)f(b)o(y)h (hand,)h(turn)f(o\013)f(auto-semis)h(b)o(y)g(`)p Fu(-n;)p Fz(')f(\(and)75 1001 y(use)j(`)p Fu(-np)p Fz(')e(at)g(y)o(our)h (discretion\).)137 1067 y(The)e(follo)o(wing)g(table)h(summarizes)f (the)f(defaults)h(for)f(auto-semi)h(insertion)h(and)f(semicolon)g(prin) o(t-)75 1122 y(ing)j(in)g Fw(F)o(or)m(tran)p Fz(,)f(b)q(oth)g(\014xed)h (and)f(free)h(formats)d(\(`N/A')h(means)i(`not)e(applicable'\):)335 1236 y(Fixed)66 b(F)l(ree)195 1288 y(F77)e(`)p Fu(-n;)p Fz(')79 b(N/A)195 1340 y(F90)64 b(`)p Fu(-n;)p Fz(')79 b(`)p Fu(-n@;)14 b(-np)p Fz(')75 1469 y Fq(4.2.34)29 b(`)p Fn(-n:)p Fq(':)j(Put)20 b(statemen)n(t)g(lab)r(el)h(on)f (separate)g(line)h([)p Fo(F)o(or)m(tran)p Fq(])137 1564 y Fz(By)c(default,)g(in)g Fw(F)o(or)m(tran)g Fz(statemen)o(t)e(lab)q (els)k(are)d(placed)h(on)g(the)g(same)f(line,)i(and)f(bac)o(kspaced)75 1619 y(from,)d(the)h(command)g(that)g(is)h(b)q(eing)g(lab)q(eled,)h(as) e(in)195 1681 y Fu(EXIT:)23 b(continue)75 1747 y Fz(This)e(can)g(lo)q (ok)g(ugly)g(if)g(the)g(lab)q(el)h(is)f(v)o(ery)f(long.)37 b(The)20 b(command)h(`)p Fu(-n:)p Fz(')e(places)j(the)f(lab)q(el)h(on)e (a)75 1802 y(separate)15 b(line,)h(as)f(is)h(done)f(automatically)h (for)e Fw(Ra)m(tf)o(or)p Fz(|e.g.,)195 1864 y Fu(EXIT:)243 1916 y(continue)137 1982 y Fz(If)20 b(neither)g(of)e(these)i(options)f (app)q(eals)h(to)e(y)o(ou,)i(y)o(ou)e(could)i(try)f(rede\014ning)i(the) e(macro)f Fu(\\Wlbl)p Fz(,)75 2037 y(found)h(with)f(some)g(discussion)i (in)f(`)p Fu(fwebmac.web)p Fz('.)26 b(That)18 b(macro)g(is)g(emitted)h (only)g(when)f(`)p Fu(-n:)p Fz(')f(is)75 2091 y Fs(not)f Fz(used.)75 2198 y Fq(4.2.35)29 b(`)p Fn(-nb)p Fq(':)j(Num)n(b)r(er)20 b(ifs)h(and)f(dos)h([)p Fo(F)o(or)m(tran)p Fq(])e(\()p Fo(Fwea)l(ve)p Fq(\))137 2293 y Fz(In)13 b(the)g(w)o(o)o(v)o(en)e (output,)i(extra)e(commen)o(ts)h(are)g(added)h(to)f(help)i(one)e (correlate)h(the)f(blo)q(c)o(k)h(structure)75 2348 y(of)i(the)g(co)q (de.)21 b(F)l(or)14 b(more)h(discussion,)h(see)g(Section)g(4.2.7)e ([-b],)g(page)h(17.)75 2455 y Fq(4.2.36)29 b(`)p Fn(-nC)p Fq(':)j(Ignore)19 b(single-line)i(commen)n(ts)h([)p Fo(F)o(or)m(tran)p Fq(])137 2550 y Fz(Ignore,)15 b(at)g(the)g(input-driv)o(er)i(stage,)d (commen)o(t)h(lines)h(b)q(eginning)i(with)d(`)p Fu(C)p Fz(',)f(`)p Fu(c)p Fz(',)g(or)h(`)p Fu(*)p Fz('.)137 2615 y(In)o(terpretation:)23 b(In)18 b(the)f(usual)h(mo)q(de)f(of)f(op) q(eration,)h(the)g Fw(F)o(or)m(tran)p Fz(-77)g(input)h(driv)o(er)f(mak) o(es)f(a)75 2670 y(heroic)i(attempt)f(to)g(mix)h(the)f(original)i (single-line)i(column-1)d(commen)o(ting)g(st)o(yle)f(with)h(the)g Fw(Fweb)p eop %%Page: 26 28 26 27 bop 75 -58 a Fz(Chapter)15 b(4:)k(R)o(UNNING)d Fw(Fweb)1166 b Fz(26)75 183 y(st)o(yle)21 b(\(`)p Fu(/*...*/)p Fz(')e(and)i(`)p Fu(//)p Fz('\).)37 b(It)21 b(con)o(v)o(erts)f (single-line)k(commen)o(ts)d(to)f(the)h(`)p Fu(/*...*/)p Fz(')f(st)o(yle)h(and)75 238 y(passes)15 b(them)g(along)g(to)g(the)g (innards)h(of)f(the)g(pro)q(cessors.)137 305 y(Problems)i(sometimes)g (arise)g(when)g(con)o(v)o(erting)g(an)g(existing)g Fw(F)o(or)m(tran)g Fz(co)q(de)h(to)e Fw(Fweb)p Fz(.)25 b(Suc)o(h)75 359 y(co)q(des)18 b(ma)o(y)f(ha)o(v)o(e)g(v)o(ery)h(large)f(blo)q(c)o(ks)i (of)e(co)q(de)h(or)f(do)q(cumen)o(tation)h(commen)o(ted)g(out)f(with)h (a)f(`)p Fu(C)p Fz(')g(in)75 414 y(column)k(1.)36 b(Sp)q(ecial)22 b(T)496 424 y(E)522 414 y(X)e(c)o(haracters)g(in)h(those)f(commen)o(ts) g(can)h(cause)g(problems)g(for)f Fw(Fwea)l(ve)p Fz(;)75 469 y(sometimes)c Fw(Ft)m(angle)h Fz(gets)e(confused)i(as)f(w)o(ell.)23 b(The)16 b(`)p Fu(-nC)p Fz(')f(option)h(short-circuits)h(these)f (problems)75 524 y(b)o(y)f(simply)i(thro)o(wing)d(all)j(suc)o(h)e (lines)i(a)o(w)o(a)o(y)c(at)i(the)g(input)i(driv)o(er)e(stage.)137 590 y(This)h(option)f(is)h(not)f(a)g(recommended)h(long-term)f (solution.)21 b(Instead,)15 b(consider)h(the)f(follo)o(wing:)232 654 y Fx(\017)30 b Fz(In)21 b Fw(Fweb)p Fz(,)h(blo)q(c)o(ks)f(of)e(co)q (de)i(should)g(b)q(e)g(commen)o(ted)f(out)g(with)g(the)g(prepro)q(ces-) 285 706 y(sor)14 b(commands)g Fu(@#if)h(0...@#endif)p Fz(;)d(see)j(Section)g(6.3)f([T)l(emp)q(orary)f(commen)o(ts],)285 758 y(page)i(61.)232 821 y Fx(\017)30 b Fz(T)l(extual)14 b(commen)o(ts)g(for)f(do)q(cumen)o(tation)i(should)g(b)q(e)f(con)o(v)o (erted)g(to)f(the)h(standard)285 873 y Fw(Fweb)i Fz(commen)o(ting)g(st) o(yle.)232 937 y Fx(\017)30 b Fz(If)14 b(one)g(has)g(a)f(blo)q(c)o(k)i (of)f(co)q(de)g(prefaced)g(b)o(y)g(an)g(extremely)h(long)f(commen)o(t,) f(replace)285 989 y(that)i(b)o(y)i(a)f(named)g(mo)q(dule)h(and)g(put)f (the)g(commen)o(t)g(in)o(to)g(the)h(T)1444 998 y(E)1469 989 y(X)f(part)g(of)g(that)285 1041 y(section.)75 1151 y Fq(4.2.37)29 b(`)p Fn(-np)p Fq(':)j(Prin)n(t)20 b(semicolons)h([)p Fo(F)o(or)m(tran)p Fq(])f(\()p Fo(Fwea)l(ve)p Fq(\))137 1246 y Fz(Although)f(the)g Fw(F)o(or)m(tran)f Fz(input)i(driv)o(er)f (automatically)f(terminates)h(logical)g(lines)h(with)f(semi-)75 1301 y(colons)c(\()p Fw(F)o(or)m(tran)p Fz(-77;)e(see)i(Section)g (4.2.33)d([-n;],)i(page)g(24\))f(or)h(pseudo-semicolons)i(\()p Fw(F)o(or)m(tran)p Fz(-90;)75 1356 y(see)g(Section)h(4.2.32)e([-nA)l (T;],)g(page)h(24\))f(so)h(that)g(the)g(innards)h(of)e Fw(Fwea)l(ve)i Fz(can)g(pro)q(cess)f(them)g(cor-)75 1410 y(rectly)l(,)j(the)g(semicolons)g(are)f(not)g(prin)o(ted)h(b)o(y)f (default.)30 b(T)l(o)18 b(mak)o(e)g(actual)g(semicolons)i(b)q(e)f(prin) o(ted,)75 1465 y(use)d(the)f(`)p Fu(-np)p Fz(')f(option.)137 1532 y(`)p Fu(-np)p Fz(')19 b(is)g(turned)h(on)g(automatically)g(for)e (free-format)h Fw(F)o(or)m(tran)p Fz(-90)g(when)h(`)p Fu(-n@;)p Fz(')e(is)i(in)g(e\013ect)75 1587 y(\(the)15 b(default\).)20 b(F)l(or)15 b(more)f(discussion,)j(see)e(Section)i (4.2.33)c([-n;],)h(page)h(24.)75 1697 y Fq(4.2.38)29 b(`)p Fn(-n\\)p Fq(':)j(F)-5 b(ree-form)20 b(syn)n(tax)h(con)n(tin)n (ued)g(b)n(y)h(bac)n(kslash)137 1792 y Fz(In)c Fw(F)o(or)m(tran)p Fz({90,)e(this)i(turns)f(on)g(free-form)f(syn)o(tax)h(and)g(sets)g(the) g(con)o(tin)o(uation)g(c)o(haracter)g(to)75 1847 y(b)q(e)f(the)f(bac)o (kslash)h(\(as)e(it)i(w)o(ould)f(b)q(e)h(in)g(C\).)e(F)l(or)h(example,) 195 1911 y Fu(-n9[-n\\])195 1962 y(@)195 2014 y(@a)195 2066 y(program)23 b(main)195 2118 y(x)h(=)f(\\)219 2170 y(y)195 2222 y(end)75 2288 y Fz(In)15 b(the)g(tangled)f(output)h(the)f (bac)o(kslash)h(is)g(con)o(v)o(erted)f(in)o(to)h Fw(F)o(or)m(tran)p Fz(-90's)e(standard)i(con)o(tin)o(uation)75 2343 y(c)o(haracter,)f(the) h(amp)q(ersand.)137 2410 y(See)h(also)f(Section)h(4.2.39)e([-n&],)g (page)h(26.)75 2520 y Fq(4.2.39)29 b(`)p Fn(-n&)p Fq(':)j(F)-5 b(ree-form)20 b(syn)n(tax)h(con)n(tin)n(ued)g(b)n(y)h(amp)r(ersand)137 2615 y Fz(In)c Fw(F)o(or)m(tran)p Fz({90,)e(this)i(turns)f(on)g (free-form)f(syn)o(tax)h(and)g(sets)g(the)g(con)o(tin)o(uation)g(c)o (haracter)g(to)75 2670 y(b)q(e)f(the)f(amp)q(ersand.)20 b(F)l(or)15 b(example,)p eop %%Page: 27 29 27 28 bop 75 -58 a Fz(Chapter)15 b(4:)k(R)o(UNNING)d Fw(Fweb)1166 b Fz(27)195 183 y Fu(-n9[-n&])195 235 y(@)195 287 y(@a)195 339 y(program)23 b(main)195 391 y(x)h(=)f(&)219 443 y(y)195 495 y(end)137 567 y Fz(F)l(or)18 b Fw(F)o(or)m(tran)p Fz(-90,)g(free-form)g(syn)o(tax)f(con)o(tin)o(ued)i(b)o(y)f(the)g(amp)q (ersand)h(is)g Fw(Fweb)p Fz('s)f(default,)h(so)75 622 y(one)c(probably)h(will)h(not)e(need)h(to)e(use)i(`)p Fu(-n&)p Fz(')e(explicitly)l(.)137 695 y(See)i(also)f(Section)h(4.2.38) e([-n)p Fu(\\)p Fz(],)g(page)h(26.)75 818 y Fq(4.2.40)29 b(`)p Fn(-n/)p Fq(':)j(Recognize)20 b(short)g(commen)n(ts)h([)p Fo(F)o(or)m(tran)p Fq(])137 919 y Fz(The)14 b(standard)e Fw(Fweb)i Fz(notation)f(for)f(a)h(short)f(commen)o(t)h(\(one)g (terminated)g(b)o(y)g(the)g(next)g(newline\))75 974 y(is)21 b(`)p Fu(//)14 b(...)p Fz('.)34 b(Ho)o(w)o(ev)o(er,)19 b(in)i Fw(F)o(or)m(tran)f Fz(the)h(`)p Fu(//)p Fz(')d(denotes)j (concatenation)f(b)o(y)g(default.)35 b(T)l(o)19 b(mak)o(e)75 1029 y(it)f(denote)g(a)f(short)g(commen)o(t,)g(use)h(the)g(`)p Fu(-n/)p Fz(')e(option.)28 b(One)18 b(can)g(do)f(this)h(in)h(the)e(`)p Fu(.fweb)p Fz(')f(\014le)j(\(see)75 1084 y(Chapter)c(12)f ([Customization],)g(page)h(107\))f(or)h(with)g(the)g(language-setting)h (command)f(in)h(lim)o(b)q(o,)f(as)75 1139 y(in)h(`)p Fu(@n/)p Fz('.)75 1211 y(In)e Fw(Fweb)p Fz(,)h(one)f(ma)o(y)f(alw)o(a)o (ys)h(use)g(`)p Fu(\\/)p Fz(')e(for)i(concatenation,)g(so)f(there's)h (no)f(p)q(enalt)o(y)i(for)e(using)i(`)p Fu(-n/)p Fz('.)75 1334 y Fq(4.2.41)29 b(`)p Fn(-n!)p Fq(':)j(Mak)n(e)21 b(`)p Fn(!)p Fq(')f(denote)g(short)h(commen)n(t)g([)p Fo(F)o(or)m(tran)p Fq(])137 1436 y Fz(In)d Fw(F)o(or)m(tran)p Fz(-90,)f(`)p Fu(!)p Fz(')f(starts)f(a)i(short)f(commen)o(t.)25 b(Ho)o(w)o(ev)o(er,)16 b(b)o(y)h(default)g Fw(Fweb)h Fz(usurps)g(`)p Fu(!)p Fz(')e(for)75 1491 y(the)j(logical)h(not,)f(as)g (in)h(`)p Fu(if\(x)14 b(!=)h(y\))p Fz('.)30 b(T)l(o)19 b(force)g(it)g(to)f(recognize)i(`)p Fu(!)p Fz(')e(as)h(a)f(commen)o(t,) h(use)h(`)p Fu(-n!)p Fz('.)75 1546 y(Ho)o(w)o(ev)o(er,)d(the)h (recommended)g(st)o(yle)g(is)g(to)g(use)g Fw(Fweb)p Fz('s)g(standard)f (con)o(v)o(en)o(tion)h(that)f(`)p Fu(//)p Fz(')g(denotes)75 1600 y(the)d(start)f(of)h(a)f(short)h(commen)o(t)f(\(see)h(Section)h (4.2.40)e([-n/],)g(page)h(27\).)k(See)d(also)f(Section)h(4.2.81)d ([-!],)75 1655 y(page)j(37)g(and)g(Section)h(4.2.56)d([-r!],)h(page)h (30.)137 1728 y(In)g Fw(F)o(or)m(tran)p Fz(-77,)g(to)e(include)k(the)e (exclamation)g(p)q(oin)o(t)g(inside)h(a)f(string,)f(escap)q(e)h(it)g (with)g(a)f(bac)o(k-)75 1783 y(slash,)h(as)g(in)386 1852 y Fu(s)24 b(=)f("A)h(\\!)g(inside)f(a)g(string")75 1925 y Fz(This)18 b(p)q(ossibly)g(anno)o(ying)f(restriction)h(arises)f(b)q (ecause)h(the)f(unduly)h(complicated)h Fw(F)o(or)m(tran)e Fz(input)75 1980 y(driv)o(er)e(do)q(es)g(some)f(prepro)q(cessing)h(of)f (the)h Fw(F)o(or)m(tran)g Fz(source)f(b)q(efore)h(it)g(feeds)f(it)h(to) f(the)h(cores)f(of)g(the)75 2035 y(pro)q(cessors.)75 2158 y Fq(4.2.42)29 b(`)p Fn(-n\))p Fq(':)j(Rev)n(erse)21 b(arra)n(y)g(indices)g([)p Fo(F)o(or)m(tran)p Fq(])e(\()p Fo(Ft)m(angle)p Fq(\))137 2259 y Fz(This)f Fs(somewhat)e(exp)q(erimen)o (tal)21 b Fz(\015ag)16 b(p)q(ermits)i Fw(F)o(or)m(tran)f Fz(programmers)f(to)h(use)g(C-st)o(yle)g(arra)o(y)75 2314 y(indices.)k(Con)o(v)o(ersions)12 b(suc)o(h)h(as)g(the)f(follo)o (wing)i(are)e(made)h(\(during)g(the)f(output)h(phase)g(of)f Fw(Ft)m(angle)p Fz(\):)195 2384 y Fu(a\(k\)\(i\))23 b Fz(=)p Fu(>)h(a\(i,k\))195 2436 y(a\(k\)\(i,j\))f Fz(=)p Fu(>)h(a\(i,j,k\))195 2488 y(a\(k\)\(j\)\(i\))e Fz(=)p Fu(>)j(a\(i,j,k\))75 2560 y Fz([No)18 b(spaces)g(ma)o(y)g(in)o(terv)o (ene)g(b)q(et)o(w)o(een)h(`)p Fu(\))p Fz(')e(and)i(`)p Fu(\()p Fz(';)f(e\013ectiv)o(ely)l(,)i(`)p Fu(\)\()p Fz(')d(is)i(treated)f(as)f(one)i(tok)o(en)f(for)75 2615 y(the)c(purp)q(oses)g(of)g(`)p Fu(-n\))p Fz('.])j(This)e(feature)e(p)q (ermits)i(con)o(v)o(enien)o(t)f(de\014nitions)i(of)d(macros)g(that)g (deal)i(with)75 2670 y(m)o(ulti-dimensional)j(v)o(ectors.)p eop %%Page: 28 30 28 29 bop 75 -58 a Fz(Chapter)15 b(4:)k(R)o(UNNING)d Fw(Fweb)1166 b Fz(28)137 183 y(Unfortunately)l(,)19 b Fw(Ft)m(angle)g Fz(do)q(esn't)f(fully)h(understand)g(the)f(syn)o(tax)f (of)g(the)i(source)f(co)q(de|and)75 238 y(nev)o(er)h(will,)j(unless)e (it)g(is)g(fully)g(in)o(tegrated)f(with)h(a)f(compiler.)33 b(It)19 b(will)i(therefore)e(b)q(e)h(confused)g(b)o(y)75 293 y(situations)c(lik)o(e)g(the)f(follo)o(wing)h Fw(F)o(or)m(tran)g Fz(example:)195 356 y Fu(dimension)23 b(x\(0:4\)\(1:2\))f(//)i Fz(OK)195 408 y Fu(character*90)e(ch\(4\))h(//)h Fz(OK)195 460 y Fu(write\(6,*\))e(\(\(x\(i\)\(j\),i=1,2\),)g(j=3,4\))h(//)h Fz(Will)16 b(rev)o(erse)f(incorrectly)l(.)195 512 y Fu(c)24 b(=)f(ch\(4\)\(3:4\))g(//)h Fz(Shouldn't)16 b(rev)o(erse,)e(but)i (will.)75 578 y(One)j(solution,)g(due)g(to)e(Charles)h(Karney)l(,)h(is) g(to)e(insert)i(a)e(space)i(to)e(prev)o(en)o(t)h(`)p Fu(\)\()p Fz(')f(from)g(b)q(eing)j(rec-)75 633 y(ognized)j(as)e(a)g (single)i(tok)o(en.)39 b(Ho)o(w)o(ev)o(er,)22 b(since)h(ordinary)e (white)i(space)f(is)g(eaten)f(on)h(input,)i(one)75 687 y(m)o(ust)18 b(resort)g(to)h(something)g(lik)o(e)h(the)f(follo)o(wing)h (\(`)p Fu($UNQUOTE)p Fz(')d(is)i(a)g(built-in)i Fw(Fweb)f Fz(function;)i(see)75 742 y(Section)16 b(7.2.3.64)d([$UNQUOTE],)h(page) h(78\):)195 805 y Fu(@m)24 b(SP)f($UNQUOTE\(')g('\))195 857 y(@a)195 909 y(dimension)g(x\(0:4\)\(1:2\))195 961 y(character*90)f(ch\(4\))195 1013 y(write\(6,*\))g(SP)i (\(\(x\(i\)\(j\),i=1,2\),)e(j=3,4\))195 1065 y(c)i(=)f (ch\(4\)SP\(3:4\))137 1131 y Fz(This)d(option)g(is)g(con)o(trolled)g(b) o(y)f(the)h(three)f(st)o(yle-\014le)i(parameters)d(`)p Fu(paren.len)p Fz(',)g(`)p Fu(paren.num)p Fz(',)75 1186 y(and)e(`)p Fu(paren.nest)p Fz('.)i(\(See)d(Section)i(12.3)d([St)o (yle],)h(page)g(112.\))k(`)p Fu(paren.len)p Fz(')13 b(is)j(the)g (default)g(n)o(um)o(b)q(er)75 1241 y(of)f(b)o(ytes)h(to)f(b)q(e)h(allo) q(cated)h(for)e(eac)o(h)g(index;)i(if)f(an)g(index)h(is)f(longer)g (than)f(this)i(n)o(um)o(b)q(er,)e(the)h(curren)o(t)75 1295 y(length)j(is)f(increased)h(b)o(y)f(this)g(n)o(um)o(b)q(er)g(and)g (storage)f(is)h(automatically)g(reallo)q(cated.)29 b(`)p Fu(paren.num)p Fz(')75 1350 y(is)20 b(the)f(maxim)o(um)h(n)o(um)o(b)q (er)f(of)g(allo)o(w)o(ed)h(indices;)j(for)c(example,)h(when)g(pro)q (cessing)g(`)p Fu(a\(i\)\(j\)\(k\))p Fz(',)75 1405 y(`)p Fu(paren.num)p Fz(')14 b(is)j(3.)22 b(`)p Fu(paren.nest)p Fz(')14 b(is)j(the)f(maxim)o(um)g(paren)o(thesis)h(nesting)g(lev)o(el.) 24 b(In)17 b(the)f(example)75 1460 y(`)p Fu(x\(a\(i\)\(j\)\(k\)\))p Fz(',)i(`)p Fu(paren.nest)p Fz(')g(is)i(2.)34 b(If)20 b(either)h(of)e(the)h(last)g(t)o(w)o(o)f(parameters)g(is)h(exceeded,)i (a)75 1515 y(message)15 b(will)i(b)q(e)e(issued)i(asking)e(y)o(ou)g(to) g(increase)h(the)f(appropriate)g(v)m(alue.)75 1623 y Fq(4.2.43)29 b(`)p Fn(-o)p Fq(':)i(Don't)21 b(o)n(v)n(erload)f(op)r (erators)137 1718 y Fz(This)c(option)e(inhibits)j(the)e(op)q(erator-o)o (v)o(erloading)f(feature)h(in)o(v)o(ok)o(ed)f(b)o(y)h(the)g(command)f (`)p Fu(@v)p Fz(')g(\(see)75 1773 y(Section)i(10.2.3)d([Ov)o (erloading],)i(page)h(101\).)75 1882 y Fq(4.2.44)29 b(`)p Fn(-q)p Fq(':)i(Don't)21 b(translate)f Fo(Ra)m(tf)o(or)137 1977 y Fs(\(This)c(option)f(is)h(obsolete.\))75 2086 y Fq(4.2.45)29 b(`)p Fn(-P)p Fq(':)i(Select)21 b(T)612 2098 y(E)644 2086 y(X)g(pro)r(cessor)137 2181 y Fz(Sa)o(y)12 b(`)p Fu(-PT)p Fz(')f(or)h(`)p Fu(-PL)p Fz(')f(to)h(inform)g Fw(Fwea)l(ve)h Fz(that)f(its)h(output)f(will)i(b)q(e)f(pro)q(cessed)g (b)o(y)f(T)1602 2191 y(E)1627 2181 y(X)h(or)f(LaT)1803 2191 y(E)1828 2181 y(X,)75 2236 y(resp)q(ectiv)o(ely)l(.)30 b(Beginning)19 b(with)g(V)l(ersion)f(1.50,)f(the)h(default)h(pro)q (cessor)e(is)i(LaT)l(eX)f(\(`)p Fu(-PL)p Fz('\).)26 b(If)18 b(y)o(ou)75 2290 y(alw)o(a)o(ys)c(use)i(T)324 2300 y(E)349 2290 y(X,)f(it's)g(easiest)h(to)e(put)i(`)p Fu(-PT)p Fz(')e(in)o(to)h(the)g(`)p Fu(.fweb)p Fz(')f(initialization)k(\014le.) 137 2357 y Fs(Please)g(note)f(that)g(`)p Fu(-PT)p Fs(')f(is)i(no)f (longer)h(supp)q(orted;)h Fw(Fweb)f Fs(dev)o(elopmen)o(t)g(is)g(no)o(w) f(based)h(exclu-)75 2411 y(siv)o(ely)e(on)f(LaT)339 2421 y(E)365 2411 y(X.)75 2520 y Fq(4.2.46)29 b(`)p Fn(-p)p Fq(':)i(Bu\013er)20 b(up)h(a)f(st)n(yle-\014le)i(en)n(try)137 2615 y Fz(This)16 b(option)g(sp)q(eci\014es)h(a)e(st)o(yle-\014le)i(en) o(try)e(\(see)g(Section)h(12.3)e([St)o(yle],)h(page)g(112\).)k(Its)d (argumen)o(t)75 2670 y(is)23 b(exactly)g(the)f(same)g(as)g(a)h(line)h (that)d(one)i(ma)o(y)f(put)g(in)o(to)h(the)f(lo)q(cal)i Fw(Fweb)f Fz(st)o(yle)g(\014le.)42 b(Th)o(us,)p eop %%Page: 29 31 29 30 bop 75 -58 a Fz(Chapter)15 b(4:)k(R)o(UNNING)d Fw(Fweb)1166 b Fz(29)75 183 y(if)22 b(in)h(`)p Fu(fweb.sty)p Fz(')c(one)j(w)o(ould)g(sa)o(y)f(`)p Fu(entry="value")p Fz(',)f(the)i(form)f(of)g(the)h(`)p Fu(-p)p Fz(')e(option)i(w)o(ould)g (b)q(e)75 238 y(`)p Fu(-pentry='"value"')p Fz('.)16 b(\(The)11 b(single)i(quotes)e(are)h(required)g(on)g(a)f Fw(unix)g Fz(system)g(b)q(ecause)i(the)f(double)75 293 y(quotes)j(ha)o(v)o(e)g (sp)q(ecial)i(signi\014cance)g(to)d(the)i(shell.\))137 362 y(This)11 b(option)g(can)g(b)q(e)g(used)g(either)h(in)f(the)g(`)p Fu(.fweb)p Fz(')e(initialization)14 b(\014le)d(\(see)g(Section)g(12.2)f ([Initializa-)75 417 y(tion],)j(page)g(108\),)e(to)h(record)h(st)o (yle-\014le)h(en)o(tries)g(that)e(are)g(common)h(to)f(all)i(runs,)f(or) f(on)h(the)g(command)75 472 y(line,)18 b(to)e(o)o(v)o(erride)h(a)g(lo)q (cal)g(st)o(yle-\014le)i(en)o(try)d(for)g(a)g(single)i(run.)25 b(This)17 b(b)q(eha)o(vior)h(is)f(a)f(consequence)i(of)75 526 y(the)d(follo)o(wing)h(order)f(of)g(pro)q(cessing)h(st)o(yle)f (parameters:)220 593 y(1.)29 b(`)p Fu(-p)p Fz(')14 b(options)h(in)i(`)p Fu(.fweb)p Fz(';)220 658 y(2.)29 b(en)o(tries)16 b(in)g(the)f(lo)q(cal) h(st)o(yle)g(\014le)g(`)p Fu(fweb.sty)p Fz(';)220 723 y(3.)29 b(`)p Fu(-p)p Fz(')14 b(options)h(on)h(the)f(command)g(line.)75 839 y Fq(4.2.47)29 b(`)p Fn(-r)p Fq(':)i(Set)21 b(global)f(language)f (to)h Fo(Ra)m(tf)o(or)p Fq({77)137 938 y Fz(See)i(Chapter)e(8)h ([Languages],)g(page)f(83)h(and)g(Chapter)f(9)h([Ratfor],)f(page)h(89.) 36 b(See)21 b(also)g(Sec-)75 992 y(tion)15 b(4.2.24)f([-L)p 359 992 14 2 v 16 w(],)h(page)g(22.)75 1108 y Fq(4.2.48)29 b(`)p Fn(-r9)p Fq(':)j(Set)20 b(global)g(language)f(to)h Fo(Ra)m(tf)o(or)p Fq({90)137 1207 y Fz(See)i(Chapter)e(8)h ([Languages],)g(page)f(83)h(and)g(Chapter)f(9)h([Ratfor],)f(page)h(89.) 36 b(See)21 b(also)g(Sec-)75 1262 y(tion)15 b(4.2.24)f([-L)p 359 1262 V 16 w(],)h(page)g(22.)75 1378 y Fq(4.2.49)29 b(`)p Fn(-rg)p Fq(':)j(Set)20 b(goto)f(parameters)137 1476 y Fz(This)h(obscure)g(option)f(is)h(used)f(for)g(con\014guring)h Fw(Ra)m(tf)o(or)g Fz(\(and)f(really)h(should)g(b)q(e)g(a)f(st)o (yle-\014le)75 1531 y(parameter\).)g(\(Discussion)d(not)f (\014nished.\))75 1639 y Fq(4.2.50)29 b(`)p Fn(-rk)p Fq(':)j(Suppress)21 b(commen)n(ts)g(ab)r(out)f Fo(Ra)m(tf)o(or)f Fq(translation)262 1701 y(\()p Fo(Ft)m(angle)p Fq(\))137 1799 y Fz(By)f(default,)f(the)h Fw(Ra)m(tf)o(or)f Fz(translator)f (writes)h(commen)o(ts)g(ab)q(out)g(what)f(command)h(it)h(is)f(trans-)75 1854 y(lating.)23 b(The)16 b(`)p Fu(-rk)p Fz(')f(option)h(suppresses)h (those)f(commen)o(ts.)22 b(Argumen)o(ts)15 b(to)h(this)g(option)h(allo) o(ws)f(one)75 1909 y(to)f(suppress)g(commen)o(ts)g(ab)q(out)g(only)h (particular)g(commands,)e(according)i(to)e(the)i(follo)o(wing)g(list:) 195 1975 y Fu(b)24 b Fz(|)g Fu(break)195 2027 y(c)g Fz(|)g Fu(case)195 2079 y(t)g Fz(|)g Fu(default)195 2131 y(d)g Fz(|)g Fu(do)195 2183 y(f)g Fz(|)g Fu(for)195 2235 y(i)g Fz(|)g Fu(if)195 2287 y(n)g Fz(|)g Fu(next)195 2338 y(p)g Fz(|)g Fu(repeat,)f(until)195 2390 y(r)h Fz(|)g Fu(return)195 2442 y(s)g Fz(|)g Fu(switch)195 2494 y(h)g Fz(|)g Fu(where)195 2546 y(w)g Fz(|)g Fu(while)75 2615 y Fz(F)l(or)14 b(example,)h(one)g (can)g(sa)o(y)f(`)p Fu(-rkrb)p Fz(')f(to)h(suppress)h(commen)o(ts)f(ab) q(out)h(the)f Fp(return)i Fz(and)f Fp(break)h Fz(state-)75 2670 y(men)o(ts.)p eop %%Page: 30 32 30 31 bop 75 -58 a Fz(Chapter)15 b(4:)k(R)o(UNNING)d Fw(Fweb)1166 b Fz(30)75 183 y Fq(4.2.51)29 b(`)p Fn(-rK)p Fq(':)j(W)-5 b(rite)20 b(commen)n(ts)h(ab)r(out)f Fo(Ra)m(tf)o(or)f Fq(translation)h(\()p Fo(Ft)m(angle)p Fq(\))137 282 y Fz(This)14 b(is)h(the)e(negativ)o(e)h(of)f(`)p Fu(-rk)p Fz(')f(\(see)i(Section)g(4.2.50)e([-rk],)h(page)g(29\);)g(it)h(forces)f (commen)o(ts)g(ab)q(out)75 337 y(particular)j Fw(Ra)m(tf)o(or)g Fz(commands.)75 444 y Fq(4.2.52)29 b(`)p Fn(-r@;)p Fq(':)j(T)-5 b(urn)20 b(on)g(auto-semi)h(mo)r(de)f(using)g(pseudo-semis)262 506 y([)p Fo(Ra)m(tf)o(or)p Fq(])137 605 y Fz(Please)j(don't)e(use)h (this)h(option)f(\(it)g(ma)o(y)f(not)h(w)o(ork\).)38 b(Insert)23 b(semicolons)g(b)o(y)e(hand)i(in)f(y)o(our)75 660 y Fw(Ra)m(tf)o(or)16 b Fz(co)q(de,)f(just)g(as)g(one)g(do)q(es)h (in)g(C.)75 777 y Fq(4.2.53)29 b(`)p Fn(-r;)p Fq(':)j(T)-5 b(urn)20 b(on)g(auto-semi)h(mo)r(de)f(using)g(actual)h(semis)g([)p Fo(Ra)m(tf)o(or)p Fq(])137 876 y Fz(Please)i(don't)e(use)h(this)h (option)f(\(it)g(ma)o(y)f(not)h(w)o(ork\).)38 b(Insert)23 b(semicolons)g(b)o(y)e(hand)i(in)f(y)o(our)75 930 y Fw(Ra)m(tf)o(or)16 b Fz(co)q(de,)f(just)g(as)g(one)g(do)q(es)h(in)g(C.)75 1047 y Fq(4.2.54)29 b(`)p Fn(-rb)p Fq(':)j(Num)n(b)r(er)20 b(ifs)h(and)f(dos)h([)p Fo(Ra)m(tf)o(or)p Fq(])137 1146 y Fz(In)13 b(the)g(w)o(o)o(v)o(en)e(output,)i(extra)e(commen)o(ts)h (are)g(added)h(to)f(help)i(one)e(correlate)h(the)f(blo)q(c)o(k)h (structure)75 1201 y(of)i(the)g(co)q(de.)21 b(F)l(or)14 b(more)h(discussion,)h(see)g(Section)g(4.2.7)e([-b],)g(page)h(17.)75 1318 y Fq(4.2.55)29 b(`)p Fn(-r/)p Fq(':)j(Recognize)20 b(short)g(commen)n(ts)h([)p Fo(Ra)m(tf)o(or)p Fq(])137 1417 y Fz(The)14 b(standard)g Fw(Fweb)g Fz(notation)g(for)f(a)g(short)h (commen)o(t)f(is)h(`)p Fu(//)h(...)p Fz('.)j(Ho)o(w)o(ev)o(er,)13 b(in)h Fw(Ra)m(tf)o(or)h Fz(the)75 1472 y(`)p Fu(//)p Fz(')h(denotes)h(concatenation)g(b)o(y)g(default.)26 b(T)l(o)17 b(mak)o(e)f(it)i(denote)f(a)g(short)f(commen)o(t,)h(use)g (the)g(`)p Fu(-r/)p Fz(')75 1527 y(option.)j(F)l(or)15 b(concatenation,)g(use)g(`)p Fu(\\/)p Fz('.)137 1596 y(F)l(or)g(an)g(example,)h(see)f(Section)h(4.2.40)e([-n/],)g(page)h (27.)75 1714 y Fq(4.2.56)29 b(`)p Fn(-r!)p Fq(':)j(Mak)n(e)21 b(`)p Fn(!)p Fq(')f(denote)g(short)h(commen)n(t)g([)p Fo(Ra)m(tf)o(or)p Fq(])137 1812 y Fz(See)15 b(the)e(corresp)q(onding)i (discussion)g(of)f(`)p Fu(-!)p Fz(')e(in)j(Section)f(4.2.81)e([-!],)h (page)g(37)g(and)h(Section)h(4.2.41)75 1867 y([-n!],)f(page)h(27.)137 1937 y(In)g Fw(F)o(or)m(tran)p Fz(-77,)g(to)e(include)k(the)e (exclamation)g(p)q(oin)o(t)g(inside)h(a)f(string,)f(escap)q(e)h(it)g (with)g(a)f(bac)o(k-)75 1992 y(slash,)h(as)g(in)386 2059 y Fu(s)24 b(=)f("A)h(\\!)g(inside)f(a)g(string")75 2176 y Fq(4.2.57)29 b(`)p Fn(-r\))p Fq(':)j(Rev)n(erse)21 b(arra)n(y)g(indices)g([)p Fo(Ra)m(tf)o(or)p Fq(])e(\()p Fo(Ft)m(angle)p Fq(\))137 2275 y Fz(See)d(the)f(corresp)q(onding)i (discussion)f(of)f(`)p Fu(-n\))p Fz(')f(in)i(Section)g(4.2.42)e ([-n\)],)g(page)h(27.)75 2392 y Fq(4.2.58)29 b(`)p Fn(-s)p Fq(':)i(Prin)n(t)21 b(statistics)137 2491 y Fz(`)p Fu(-s)p Fz(')14 b(prin)o(ts)i(statistics)f(ab)q(out)g(memory)g(usage)g(at)f (the)h(end)h(of)f(the)g(run.)137 2560 y(`)p Fu(-sm)p Fz(')i(prin)o(ts)i(statistics)f(ab)q(out)g(memory)g(usage)g(at)f(the)h (end)h(of)f(the)g(run,)h(just)f(as)g(do)q(es)g(`)p Fu(-s)p Fz(';)h(it)75 2615 y(also)13 b(prin)o(ts)g(information)f(ab)q(out)h (dynamic)g(memory)g(allo)q(cations)g(as)g(they)f(o)q(ccur.)20 b(`)p Fu(-sm)p Fs(nnn)p Fz(')12 b(displa)o(ys)75 2670 y(allo)q(cations)k(of)f(nnn)h(b)o(ytes)f(or)g(more;)f(if)i Fs(nnn)g Fz(is)f(missing,)h(10000)e(is)h(assumed.)p eop %%Page: 31 33 31 32 bop 75 -58 a Fz(Chapter)15 b(4:)k(R)o(UNNING)d Fw(Fweb)1166 b Fz(31)75 183 y Fq(4.2.59)29 b(`)p Fn(-T)p Fq(':)i(Flag-setting)20 b(options)g(for)g Fo(Ft)m(angle)137 279 y Fz(This)c(is)g(a)f(family)h(of)e(options)i(that)e(set)h (miscellaneous)i(\015ags)e(appropriate)g(only)h(for)f Fw(Ft)m(angle)p Fz(.)75 390 y Fq(4.2.59.1)29 b(`)p Fn(-TD)p Fq(':)i(P)n(ermit)21 b(pro)r(cessing)g(of)e(deferred)i(macro)f (de\014nitions)137 486 y Fs(Deferred)13 b(macro)f(de\014nitions)k Fz(are)c(`)p Fu(@m)p Fz(')g(\(or,)g(equiv)m(alen)o(tly)l(,)j(`)p Fu(@#define)p Fz('\))10 b(commands)j(that)f(app)q(ear)75 541 y(in)g(the)f(co)q(de)h(part)f(rather)g(than)g(the)g(usual)h (de\014nition)h(part.)18 b(These)12 b(de\014nitions)h(are)e(ev)m (aluated)h(during)75 595 y(the)h(output)h(\(phase)f(2\),)g(and)g(can)h (cause)g(confusion)g(when)g(used)g(with)g(the)f(prepro)q(cessor)h (commands,)75 650 y(whic)o(h)i(are)g(ev)m(aluated)g(during)h(the)e (input)i(\(phase)e(1\).)20 b(Because)d(of)e(this)h(confusion,)g (deferred)g(macro)75 705 y(de\014nitions)c(are)f(prohibited)h(b)o(y)e (default.)19 b(T)l(o)11 b(p)q(ermit)g(them,)g(use)g(the)f(`)p Fu(-TD)p Fz(')g(option)h(\(then)f(b)q(e)i(prepared)75 760 y(to)j(mak)o(e)f(some)h(obscure)h(programming)e(errors\).)75 871 y Fq(4.2.59.2)29 b(`)p Fn(-Tb)p Fq(':)i(P)n(ermit)21 b(built-functions)g(to)f(b)r(e)g(rede\014ned)137 966 y Fz(By)13 b(default,)g(built-in)i(functions)f(suc)o(h)f(as)f Fu($IF)g Fz(\(see)h(Section)h(7.2.3)d([Built-in)j(functions],)f(page)g (66\))75 1021 y(ma)o(y)f(not)h(b)q(e)h(rede\014ned)h(b)o(y)e(an)g Fu(@m)g Fz(command.)19 b(T)l(o)13 b(allo)o(w)g(this)h(extremely)f (dangerous)g(op)q(eration,)h(use)75 1076 y(the)h(`)p Fu(-Tb)p Fz(')f(option.)75 1187 y Fq(4.2.59.3)29 b(`)p Fn(-Tm)p Fq(':)i(P)n(ermit)21 b(user)g(macros)f(to)g(b)r(e)h (rede\014ned)137 1283 y Fz(By)12 b(default,)g(user)g(macros)e(ma)o(y)h (not)g(b)q(e)h(rede\014ned)h(b)o(y)e(an)g Fu(@m)g Fz(command.)19 b(T)l(o)11 b(p)q(ermit)h(this,)g(use)g(the)75 1338 y(`)p Fu(-Tm)p Fz(')j(option.)24 b(Note)16 b(that)g(man)o(y)g(functions)h (describ)q(ed)h(under)f(Section)h(7.2.3)d([Built-in)j(functions],)75 1392 y(page)d(66,)f(suc)o(h)i(as)f Fu($PI)p Fz(,)f(are)h(in)h(fact)f (implemen)o(ted)h(as)f(macros.)75 1503 y Fq(4.2.59.4)29 b(`)p Fn(-Tv)p Fq(':)i(Don't)20 b(prin)n(t)h(header)g(info)137 1599 y Fz(By)g(default,)g Fw(Ft)m(angle)g Fz(attempts)e(to)g(b)q(e)i (helpful)h(and)f(writes)f(some)g(information)g(ab)q(out)g(the)75 1654 y(command)c(line,)i(input)g(and)e(c)o(hange)h(\014les,)g(etc.)f (at)g(the)h(b)q(eginning)h(of)e(the)h(output)f(\014le.)25 b(This)17 b(infor-)75 1709 y(mation)c(can)g(b)q(e)h(deleted)h(b)o(y)e (means)g(of)g(the)g(`)p Fu(-Tv)p Fz(')f(\015ag.)19 b([This)13 b(is)h(done)f(automatically)h(when)g(the)f(`)p Fu(-F)p Fz(')75 1763 y(\015ag)j(\(see)h(Section)h(4.2.15)c([-F)p 609 1763 14 2 v 16 w(],)i(page)h(19\))f(is)h(in)g(e\013ect,)g(since)h (the)e(header)h(information)g(includes)i(a)75 1818 y(time)d(stamp)e (that)h(w)o(ould)g(defeat)g(a)g(successful)i(\014le)f(comparison.])75 1929 y Fq(4.2.59.5)29 b(`)p Fn(-T\045)p Fq(':)i(Don't)20 b(retain)h(trailing)f(commen)n(ts)h(\(T)1389 1941 y(E)1421 1929 y(X\))137 2025 y Fz(Unless)16 b(the)f(`)p Fu(-v)p Fz(')f(option)h(is)h(used,)f(commen)o(ts)f(are)h(generally)h(deleted)h (b)o(y)d Fw(Ft)m(angle)i Fz(as)f(it)g(writes)75 2080 y(the)e(output)f(\014le.)20 b(Ho)o(w)o(ev)o(er,)11 b(in)j(the)e(T)731 2090 y(E)757 2080 y(X)g(language)h(suc)o(h)f(deletions)i(can)f(c)o (hange)f(the)h(b)q(eha)o(vior)g(of)f(the)75 2135 y(output)17 b(\(b)o(y)g(in)o(tro)q(ducing)h(extra)f(spaces\).)25 b(Therefore,)17 b(T)1099 2144 y(E)1125 2135 y(X)g(commen)o(ts)g(that)f (do)h(not)g(b)q(egin)h(a)f(line)75 2189 y(are)e(alw)o(a)o(ys)f (retained)i(unless)g(the)f(`)p Fu(-T\045)p Fz(')f(option)h(is)h(used.)k (This)c(option)f(has)g(no)g(e\013ect)f(for)h(languages)75 2244 y(other)g(than)g(T)325 2254 y(E)350 2244 y(X.)75 2355 y Fq(4.2.59.6)29 b(`)p Fn(-T#)p Fq(':)i(Don't)20 b(insert)h(`)p Fn(#line)p Fq(')g(command)g(after)f(`)p Fn(@\045)p Fq(')137 2451 y Fz(If)d(the)f(`)p Fu(@\045)p Fz(')g(command)g(\(see)g(Section)h(5.8.3)e([A)l(T\045],)h(page)g(52\))f (is)i(used)g(to)f(commen)o(t)g(out)g(a)g(line,)75 2506 y(it)g(eats)g(the)g(trailing)h(newline.)24 b(An)16 b(undesirable)i (consequence)f(of)f(this)g(is)h(that,)e(if)h(nothing)g(is)h(done,)75 2560 y(the)g(subsequen)o(t)h(line)g(n)o(um)o(b)q(ering)g(will)h(b)q(e)e (misundersto)q(o)q(d)h(b)o(y)f(a)g(debugger,)g(at)g(least)g(un)o(til)h Fw(Fweb)75 2615 y Fz(inserts)f(a)g(`)p Fu(#line)p Fz(')f(command)h(for) f(some)h(reason.)25 b(T)l(o)17 b(prev)o(en)o(t)g(this,)h Fw(Fweb)g Fz(inserts)f(b)o(y)g(default)h(an)75 2670 y(implicit)i(`)p Fu(@#line)p Fz(')c(command)h(\(see)h(Section)g(7.3)e([Prepro)q (cessing],)i(page)f(80\))g(after)g(eac)o(h)g(`)p Fu(@\045)p Fz(')g(that)p eop %%Page: 32 34 32 33 bop 75 -58 a Fz(Chapter)15 b(4:)k(R)o(UNNING)d Fw(Fweb)1166 b Fz(32)75 183 y(b)q(egins)18 b(a)f(line.)26 b(T)l(o)17 b(prev)o(en)o(t)g(this)g(from)f(happ)q(ening)j(\(p)q (ossibly)f(b)q(ecause)g(the)f(feature)f(do)q(esn't)h(w)o(ork)75 238 y(correctly)l(,)f(in)h(whic)o(h)g(case)f(y)o(ou)f(should)i(rep)q (ort)f(it;)g(see)g(Chapter)g(15)f([Supp)q(ort],)g(page)h(131\),)f(use)h (the)75 293 y(`)p Fu(-T#)p Fz(')e(option.)75 403 y Fq(4.2.60)29 b(`)p Fn(-t)p Fq(':)i(T)-5 b(runcate)21 b(iden)n(ti\014ers)137 498 y Fz(The)c(truncation)h(option)f(enables)h(one)f(to)f(use)i(a)e (wider)i(c)o(haracter)e(set)h(for)g(iden)o(ti\014ers)h(than)f(the)75 553 y(language)11 b(compiler)h(will)h(accept.)19 b(The)11 b(standard)f(example)i(is)f(v)m(anilla-\015a)o(v)o(ored)i Fw(F)o(or)m(tran)p Fz(-77,)e(whic)o(h)75 608 y(do)q(esn't)j(allo)o(w)h (the)f(underscore.)20 b(If)15 b(one)f(sa)o(ys)g(`)p Fu(`-tn6{_})p Fz('',)e(underscores)j(will)h(b)q(e)f(remo)o(v)o(ed)e(from)h(all)75 662 y(iden)o(ti\014ers,)h(then)f(the)g(result)g(will)h(b)q(e)f (truncated)g(to)f(length)h(6.)19 b(If)14 b(the)f(truncation)h(pro)q (cedure)h(results)75 717 y(in)h(non-unique)h(iden)o(ti\014ers,)f(these) g(are)f(listed.)75 817 y Fq(4.2.61)29 b(`)p Fn(-U)p Fq(':)i(Con)n(v)n (ert)22 b(reserv)n(ed)f(output)g(tok)n(ens)g(to)f(lo)n(w)n(er)h(case) 262 879 y(\()p Fo(Ft)m(angle)p Fq(\))137 974 y Fz(P)o(articularly)14 b(during)h Fw(Ra)m(tf)o(or)f Fz(expansion,)g(certain)g(tok)o(ens)f(suc) o(h)h(as)f(`)p Fu(DO)p Fz(')f(are)h(output)g(b)o(y)h Fw(Ft)m(an-)75 1029 y(gle)i Fz(in)g(upp)q(er)g(case.)k(The)c(`)p Fu(-U)p Fz(')e(option)h(forces)g(suc)o(h)g(tok)o(ens)g(to)g(b)q(e)h (pro)q(duced)g(in)g(lo)o(w)o(er)f(case.)75 1139 y Fq(4.2.62)29 b(`)p Fn(-u)p Fq(':)i(Unde\014ne)21 b Fo(Fweb)g Fq(macro)f(\()p Fo(Ft)m(angle)p Fq(\))137 1235 y Fz(`)p Fu(-uA)p Fz(')h(unde\014nes)j (the)e Fw(Fweb)h Fz(macro)f(`)p Fu(A)p Fz(')f(previously)i(de\014ned)h (on)e(the)g(command)g(line)i(\(or)d(in)75 1289 y(`)p Fu(.fweb)p Fz('\))13 b(via)j(`)p Fu(-m)p Fz('.)137 1356 y Fs(CA)o(UTION)5 b Fz(:)14 b(This)g(option)f(can)h(also)f(unde\014ne)i (built-in)h(functions)e(suc)o(h)g(as)f Fu($IF)p Fz(.)18 b(Don't)13 b(do)g(that,)75 1411 y(since)22 b(built-ins)h(can)e(use)g (other)g(built-ins)i(b)q(ehind)g(the)e(scenes;)i(unde\014ning)g(one)e (can)g(cause)g(v)o(ery)75 1465 y(strange)14 b(b)q(eha)o(vior.)75 1575 y Fq(4.2.63)29 b(`)p Fn(-V)p Fq(':)i(Prin)n(t)21 b Fo(Fweb)f Fq(v)n(ersion)i(n)n(um)n(b)r(er)137 1671 y Fz(This)17 b(\015ag)f(requests)g(the)h(startup)e(banner,)i(whic)o(h)g (includes)i(the)d Fw(Fweb)i Fz(v)o(ersion)e(n)o(um)o(b)q(er,)h(to)e(b)q (e)75 1725 y(prin)o(ted.)20 b(This)15 b(is)g(usually)h(done)e(an)o(yw)o (a)o(y)l(,)f(so)h(it)h(is)g(only)g(relev)m(an)o(t)g(when)f(the)h (message)f(lev)o(el)h(is)g(0)f(\(see)75 1780 y(Section)i(4.2.26)d([-M)p 438 1780 14 2 v 16 w(],)i(page)g(23\).)75 1890 y Fq(4.2.64)29 b(`)p Fn(-v)p Fq(':)i(Mak)n(e)22 b(all)e(commen)n(ts)h(v)n(erbatim)g (\()p Fo(Ft)m(angle)p Fq(\))137 1985 y Fz(By)d(default,)h(commen)o(ts)f (are)g(not)f(passed)i(to)e(the)h(tangled)h(output.)28 b(With)18 b(`)p Fu(-v)p Fz(',)g(all)h(commen)o(ts)75 2040 y(are)e(included)i(v)o(erbatim)e(in)h(the)e(tangled)i(output.)25 b(Since)18 b(there's)e(generally)i(no)f(harm)g(in)g(this,)h(one)75 2095 y(migh)o(t)d(w)o(an)o(t)f(to)h(put)g(this)h(option)f(in)o(to)g(`)p Fu(.fweb)p Fz(')f(\(see)h(Section)h(12.2)e([Initialization],)j(page)e (108\).)75 2205 y Fq(4.2.65)29 b(`)p Fn(-W)p Fq(':)i(Flag-setting)20 b(options)g(for)g Fo(Fwea)l(ve)137 2300 y Fz(This)f(is)h(a)e(family)h (of)f(options)h(that)f(set)g(miscellaneous)j(\015ags)d(appropriate)h (only)g(for)f Fw(Fwea)l(ve)p Fz(.)75 2355 y(Options)e(suc)o(h)f(as)g(`) p Fu(-W[)p Fz(')f(and)i(`)p Fu(-Wf)p Fz(')e(can)h(b)q(e)h(com)o(bined)g (as)f(`)p Fu(-W[f)p Fz('.)75 2465 y Fq(4.2.65.1)29 b(`)p Fn(-W@)p Fq(':)i(Set)21 b(mo)r(dule)f(w)n(arning)h(\015ag.)137 2560 y Fw(Fwea)l(ve)14 b Fz(can)g(c)o(hec)o(k)f(mo)q(dule)h(names)g (for)e(the)h(p)q(ossible)i(anomalous)e(conditions)i(of)e(\\nev)o(er)g (used")75 2615 y(or)j(\\m)o(ultiple)i(uses.")23 b(These)17 b(corresp)q(ond)g(to)e(a)i(mo)q(dule)g(w)o(arning)f(lev)o(el,)i(as)e (in)h(the)g(follo)o(wing)g(n)o(um-)75 2670 y(b)q(ered)f(list:)p eop %%Page: 33 35 33 34 bop 75 -58 a Fz(Chapter)15 b(4:)k(R)o(UNNING)d Fw(Fweb)1166 b Fz(33)100 183 y(1.)29 b(Nev)o(er)15 b(used.)100 248 y(2.)29 b(Multiple)17 b(uses.)75 321 y(The)d(mo)q(dule)h(w)o (arning)f(\015ag)g(is)h(the)f(bit)o(wise)h(OR)f(of)g(the)g(desired)h(w) o(arning)f(lev)o(els;)i(w)o(arning)d(messages)75 376 y(are)i(prin)o(ted)g(only)g(when)h(the)f(relev)m(an)o(t)g(bits)g(are)g (turned)g(on.)20 b(By)15 b(default,)g(it)g(is)g(1,)g(so)f(only)h (messages)75 431 y(ab)q(out)j(nev)o(er-used)g(mo)q(dules)h(are)e(prin)o (ted.)29 b(The)18 b(`)p Fu(-W@)p Fs(\015ag)t Fz(')e(o)o(v)o(errides)i (the)f(default.)28 b(F)l(or)17 b(example,)75 486 y(to)f(get)f(messages) h(only)h(ab)q(out)f(m)o(ultiple)i(uses,)f(sa)o(y)e(`)p Fu(-W@2)p Fz(';)g(to)h(get)g(no)g(messages,)g(sa)o(y)f(`)p Fu(-W@0)p Fz('.)22 b(One)75 540 y(can)17 b(put)g(suc)o(h)g(an)f(option) h(in)o(to)g(the)g(`)p Fu(.fweb)p Fz(')e(initialization)20 b(\014le)e(\(see)e(Section)i(12.2)d([Initialization],)75 595 y(page)g(108\).)137 660 y Fw(Fwea)l(ve)h Fz(will)h(alw)o(a)o(ys)e (complain)h(ab)q(out)f(mo)q(dule)h(names)g(that)e(are)h(nev)o(er)g (de\014ned.)75 763 y Fq(4.2.65.2)29 b(`)p Fn(-W1)p Fq(':)i (Cross-reference)22 b(single-c)n(haracter)f(iden)n(ti\014ers)137 856 y Fz(By)16 b(default,)h Fw(Fweb)g Fz(do)q(es)f(not)f(index)j(uses)e (of)f(single-c)o(haracter)i(iden)o(ti\014ers)h(\(follo)o(wing)e(Kn)o (uth's)75 911 y(original)g(design\).)21 b(\(It)15 b(do)q(es)g(index)i (their)e(de\014nitions.\))22 b(T)l(o)15 b(get)f(complete)i (cross-reference)g(informa-)75 966 y(tion)f(for)g(single-c)o(haracter)h (iden)o(ti\014ers,)g(use)g(the)f(`)p Fu(-W1)p Fz(')f(option.)75 1069 y Fq(4.2.65.3)29 b(`)p Fn(-W[)p Fq(':)i(Pro)r(cess)21 b(brac)n(k)n(eted)g(arra)n(y)g(indices)137 1162 y Fz(This)16 b Fs(exp)q(erimen)o(tal)j Fz(option)d(mak)o(es)f(square)g(brac)o(k)o (ets)g(b)q(eha)o(v)o(e)h(lik)o(e)h(paren)o(theses)e(in)i(the)f(con)o (text)75 1217 y(of)f(arra)o(y)f(indices.)137 1281 y(In)h Fw(F)o(or)m(tran)p Fz(,)f Fw(Ft)m(angle)g Fz(will)i(just)d(replace)i (the)f(brac)o(k)o(ets)f(b)o(y)h(paren)o(theses.)19 b(In)c(C,)e(the)h (brac)o(k)o(ets)75 1336 y(will)j(b)q(e)f(left)f(alone.)137 1400 y Fw(Fwea)l(ve)p Fz(,)30 b(ho)o(w)o(ev)o(er,)d(will)h(t)o(yp)q (eset)e(the)h(indices)h(according)f(to)e(the)i(`)p Fu(fwebmac.sty)p Fz(')d(macro)75 1455 y(`)p Fu(\\WARRAY)p Fz('.)j(This)18 b(macro)g(tak)o(es)f(one)h(argumen)o(t,)f(whic)o(h)i(is)g(just)f(the)g (arra)o(y)e(index)k(or)d(indices.)31 b(\(In)75 1510 y(C,)14 b(indexing)j(lik)o(e)g(`)p Fu(a[i][j][k])p Fz(')12 b(generates)j(the)g (argumen)o(t)f(`)p Fu(i,j,k)p Fz('.\))19 b(By)c(default,)g(`)p Fu(\\WARRAY)p Fz(')e(just)75 1565 y(surrounds)k(its)g(argumen)o(t)f (with)h(brac)o(k)o(ets.)23 b(Ho)o(w)o(ev)o(er,)16 b(the)h(user)f(ma)o (y)g(c)o(hange)h(its)g(de\014nition)h(to)e(get)75 1619 y(sp)q(ecial)e(e\013ects)d(suc)o(h)i(as)e(sup)q(erscripted)j(or)d (subscripted)i(indices.)21 b(A)12 b(simple)h(example)g(macro)e(`)p Fu(\\WSUB)p Fz(')75 1674 y(is)j(pro)o(vided)g(in)g(`)p Fu(fwebmac.sty)p Fz(';)e(one)h(can)h(sa)o(y)e(`)p Fu (\\let\\WARRAY\\WSUB)p Fz(')f(in)j(the)f(lim)o(b)q(o)i(section)f(to)e (ha)o(v)o(e)75 1729 y(brac)o(k)o(eted)j(indices)i(prin)o(t)f(as)e (subscripts.)137 1793 y(This)19 b(feature)f(ma)o(y)f(not)g(w)o(ork)h (when)g(the)g(con)o(ten)o(ts)f(of)h(the)g(brac)o(k)o(ets)f(are)h(to)q (o)f(complicated)j(\(so)75 1848 y(that)14 b Fw(Fwea)l(ve)i Fz(tries)g(to)e(t)o(yp)q(eset)h(them)h(b)o(y)f(going)g(in)h(and)f(out)g (of)g(math)g(mo)q(de\).)137 1912 y(F)l(or)g(more)g(information,)g(exp)q (erts)g(can)g(see)h(`)p Fu(fwebmac.web)p Fz(',)c(command)j Fu(\\WXA)p Fz(.)75 2016 y Fq(4.2.65.4)29 b(`)p Fn(-WH)p Fq(':)i(Send)21 b(additional)f(argumen)n(ts)h(to)f(the)g(C)h(prepro)r (cessor)137 2109 y Fz(When)d(the)f(`)p Fu(-H)p Fz(')f(option)i(\(see)f (Section)h(4.2.17)e([-H)p 1039 2109 14 2 v 16 w(],)h(page)g(20\))f(is)i (used,)g(the)f(C)g(prepro)q(cessor)g(is)75 2164 y(in)o(v)o(ok)o(ed)d (to)f(scan)g(include)j(header)e(\014les)h(for)e Fp(t)o(yp)q(edef)p Fz('s)g(and)h Fp(class)g Fz(declarations.)20 b(That)13 b(is)h(called)i(with)75 2218 y(a)e(standard)g(set)g(of)f(options.)20 b(\(Presen)o(tly)l(,)14 b Fu(gcc)g Fz(is)h(actually)g(called)h(to)d(in) o(v)o(ok)o(e)h(the)h(prepro)q(cessor;)f(it)g(is)75 2273 y(sen)o(t)i(the)h(options)g(`)p Fu(-E)p Fz(',)e(`)p Fu(-P)p Fz(',)h(and)h(`)p Fu(-I)p Fz('.\))23 b(Occasionally)18 b(it)f(ma)o(y)f(b)q(e)h(necessary)g(to)f(send)i(additional)75 2328 y(options.)34 b(Those)20 b(can)g(b)q(e)h(sp)q(eci\014ed)h(as)e (the)g(\(string\))f(argumen)o(t)h(to)f(`)p Fu(-WH)p Fz('.)33 b(Th)o(us,)21 b(to)e(de\014ne)i(t)o(w)o(o)75 2383 y(macros)14 b(to)h(the)g(prepro)q(cessor,)g(one)g(could)i(sa)o(y)d(either)i(of)195 2444 y Fu(-WH-Dtest1=1)22 b(-WH-Dtest2=2)195 2496 y(-WH"-Dtest1=1)g (-Dtest2=2")75 2560 y Fz(The)e(\014rst)e(form)h(sho)o(ws)g(that)f(`)p Fu(-WH)p Fz(')g(accretes)i(to)e(earlier)j(uses.)32 b(The)20 b(second)g(form)e(sho)o(ws)h(ho)o(w)g(to)75 2615 y(handle)c(em)o(b)q (edded)g(blanks)f(\(in)h(a)e Fw(unix)g Fz(shell\).)21 b(Then,)14 b(if)g(one)g(w)o(ere)f(programming)g(in)i(C,)e(use)h(of)f(`) p Fu(-H)p Fz(')75 2670 y(w)o(ould)j(issue)g(the)f(system)g(command)p eop %%Page: 34 36 34 35 bop 75 -58 a Fz(Chapter)15 b(4:)k(R)o(UNNING)d Fw(Fweb)1166 b Fz(34)195 183 y Fu(gcc)23 b(-E)h(-P)g(-Dtest1=1)e (-Dtest2=2)75 303 y Fq(4.2.65.5)29 b(`)p Fn(-WdfFlmvw)p Fq(':)j(Don't)20 b(prin)n(t)h(v)m(arious)f(things)h(in)f(w)n(o)n(v)n (en)i(output)137 402 y Fz(The)16 b(prin)o(ting)g(of)f(selected)h (de\014nition-part)h(commands)e(can)g(b)q(e)h(suppressed)g(as)f(follo)o (ws:)195 470 y Fu(-Wd)23 b Fz(|)16 b(outer)f(de\014nitions)i(\(`)p Fu(@d)p Fz(')d(or)g(`)p Fu(@D)p Fz('\))195 522 y Fu(-Wf)23 b Fz(|)16 b(format)e(statemen)o(ts)g(\(`)p Fu(@f)p Fz('\))195 574 y Fu(-WF)23 b Fz(|)16 b(format)e(statemen)o(ts)g(\(`)p Fu(@F)p Fz('\))195 626 y Fu(-Wl)23 b Fz(|)16 b(lim)o(b)q(o)g(text)f (de\014nitions)i(\(`)p Fu(@l)p Fz('\))195 678 y Fu(-Wm)23 b Fz(|)16 b(FWEB)f(macro)f(de\014nitions)j(\(`)p Fu(@m)p Fz(')d(or)h(`)p Fu(@M)p Fz('\))195 730 y Fu(-Wv)23 b Fz(|)16 b(op)q(erator)e(o)o(v)o(erloads)h(\(`)p Fu(@v)p Fz('\))195 782 y Fu(-Ww)23 b Fz(|)16 b(iden)o(ti\014er)h(o)o(v)o (erloads)d(\(`)p Fu(@w)p Fz(')g(or)h(`)p Fu(@W)p Fz('\))75 853 y(When)h(these)f(options)g(used,)h(asso)q(ciated)f (cross-referencing)h(is)g(suppressed)g(as)f(w)o(ell.)75 972 y Fq(4.2.66)29 b(`)p Fn(-w)p Fq(':)i(Change)21 b(name)f(of)g(macro) h(pac)n(k)m(age)f(\()p Fo(Fwea)l(ve)p Fq(\))137 1072 y Fz(The)15 b(option)f(`)p Fu(-w)p Fz(')f(means)h(\\Don't)f(prin)o(t)i (`)p Fu(\\input)e(fwebmac.sty)p Fz(')g(as)g(the)i(\014rst)f(line)h(of)f (the)g(`)p Fu(.tex)p Fz(')75 1127 y(output)20 b(\014le.")34 b(The)20 b(option)g(`)p Fu(-w)p Fs(fname)s Fz(')e(means)i(\\Prin)o(t)f (`)p Fu(\\input)14 b(fname)p Fz(')19 b(as)g(the)h(\014rst)g(line.")35 b(F)l(or)75 1181 y(example,)14 b(when)g(w)o(orking)e(with)i(REVT)775 1191 y(E)801 1181 y(X)f(\(see)g(Section)h(10.1.3.2)d([REVT)l(eX],)i (page)g(94\),)f(one)h(needs)75 1236 y(to)i(sa)o(y)f(`)p Fu(-wrwebmac.sty)p Fz('.)137 1307 y(This)i(option)g(can)g(b)q(e)g(used) g(for)f(sp)q(ecial)i(e\013ects)f(when)g(one)f(is)h(trying)g(to)f (obtain)g(b)q(eha)o(vior)h(di\013er-)75 1362 y(en)o(t)h(from)f(that)g (de\014ned)i(b)o(y)f Fw(Fweb)p Fz('s)h(macro)e(pac)o(k)m(age)h(`)p Fu(fwebmac.sty)p Fz(')e(\(see)h(Section)i(10.1.2)d([fw)o(eb-)75 1417 y(mac.st)o(y],)f(page)h(92\).)21 b(Ho)o(w)o(ev)o(er,)14 b(try)h(to)g(not)h(do)f(that.)21 b(Please)16 b(submit)h(requests)e(for) g(suc)o(h)h(b)q(eha)o(vior)75 1471 y(mo)q(di\014cations)g(to)f(the)g (dev)o(elop)q(er;)h(see)g(Chapter)f(15)f([Supp)q(ort],)h(page)g(131.)75 1583 y Fq(4.2.67)29 b(`)p Fn(-x)p Fq(':)i(Eliminate)21 b(or)f(reduce)h(cross-reference)h(information)262 1645 y(\()p Fo(Fwea)l(ve)p Fq(\).)137 1745 y Fz(Cross-reference)12 b(information)g(\(for)f Fw(Fwea)l(ve)p Fz(\))h(includes)i(the)e(T)l (able)h(of)e(Con)o(ten)o(ts)g(\('c'\),)g(the)h(Index)75 1800 y(\('i'\),)18 b(and)g(the)g(Mo)q(dule)h(List)f(\('m'\).)27 b(The)18 b(option)h(`)p Fu(-x)p Fz(')e(eliminates)i(all)g(of)f(that)f (information.)29 b(The)75 1855 y(option)13 b(`)p Fu(-x)p Fs(letters)r Fz(')e(eliminates)j(the)e(piece)i(of)e(information)h (corresp)q(onding)g(to)f(eac)o(h)g(letter)h(in)g(the)g(list.)75 1909 y(F)l(or)i(example,)g(`)p Fu(-xim)p Fz(')f(eliminates)j(the)e (Index)i(and)e(the)g(Mo)q(dule)h(List.)137 1980 y(Another)11 b(p)q(ossibilit)o(y)h(is)f(to)f(sa)o(y)g(`)p Fu(-xu)p Fz(',)f(whic)o(h)j(prev)o(en)o(ts)e(cross-references)h(from)e(unnamed)i (sections)75 2035 y(\(b)q(egun)16 b(with)f(`)p Fu(@a)p Fz(')f(or)h(`)p Fu(@A)p Fz('\))f(from)g(app)q(earing)i(in)g(the)g (Index.)75 2154 y Fq(4.2.68)29 b(`)p Fn(-X)p Fq(':)i(Prin)n(t)21 b(selected)g(cross-reference)h(information)d(\()p Fo(Fwea)l(ve)p Fq(\))137 2254 y Fz(When)h(used)h(with)f(an)o(y)f(of)g(the)h(argumen)o (ts)f(`)p Fu(cim)p Fz(',)g(this)h(option)g(is)h(the)e(opp)q(osite)i(of) e(`)p Fu(-x)p Fz('.)32 b(See)75 2309 y(Section)16 b(4.2.67)d([-x],)i (page)g(34.)137 2380 y(The)g(option)h(`)p Fu(-XI)p Fz(')d(tells)j Fw(Fwea)l(ve)g Fz(to)e(write)h(its)g(index)i(cross-references)e(to)f(a) h(\014le)h(formatted)e(for)75 2435 y(input)21 b(b)o(y)f(the)h Fu(makeindex)e Fz(utilit)o(y)l(.)36 b(This)21 b(feature)f(facilitates)h (creation)f(of)g(a)g(master)f(index)j(that)75 2490 y(spans)14 b(sev)o(eral)h(individual)j Fu(web)c Fz(\014les.)20 b(F)l(or)14 b(more)g(discussion,)i(see)f(Section)g(11.2)e([Using)i(mak)o(eindex],) 75 2544 y(page)g(103.)137 2615 y(The)i(construction)f(`)p Fu(-XI)p Fz(')f(stands)h(alone;)h(one)f(ma)o(y)f(not)h(mix)h(the)f(`)p Fu(I)p Fz(')f(with)h(the)h(list)g(`)p Fu(cim)p Fz('.)k(Also,)75 2670 y(this)16 b(option)f(is)h(o)o(v)o(erridden)f(b)o(y)h(`)p Fu(-xi)p Fz(',)d(whic)o(h)j(suppresses)g(output)f(of)g(all)h(index)g (information.)p eop %%Page: 35 37 35 36 bop 75 -58 a Fz(Chapter)15 b(4:)k(R)o(UNNING)d Fw(Fweb)1166 b Fz(35)75 183 y Fq(4.2.69)29 b(`)p Fn(-y)p Fq(':)i(Allo)r(cate)21 b(dynamic)g(memory)137 285 y Fz(This)f(option)f (c)o(hanges)f(the)h(default)g(size)h(for)e(a)h(dynamically)h(allo)q (cated)g(memory)e(bu\013er.)31 b(The)75 339 y(bu\013ers)13 b(are)g(indicated)i(b)o(y)f(a)f(one-)g(or)g(t)o(w)o(o-c)o(haracter)f (abbreviation)i(suc)o(h)g(as)f(`)p Fu(op)p Fz('.)18 b(F)l(or)13 b(example,)h(the)75 394 y(option)h(`)p Fu(-yop200)p Fz(')f(allo)q (cates)i(200)e(units)i(for)f(the)g(`)p Fu(op)p Fz(')f(bu\013er.)137 466 y(T)l(o)h(query)h(the)f(default)h(allo)q(cations,)g(just)e(sa)o(y)h (`)p Fu(-y)p Fz('.)137 539 y(When)h Fw(Fweb)h Fz(runs)f(out)f(of)g (space,)h(it)g(usually)h(\(but)f(not)f(alw)o(a)o(ys\))f(issues)j(a)e (message)g(telling)j(one)75 593 y(whic)o(h)d(`)p Fu(-y)p Fz(')e(command)h(to)g(use)h(in)g(order)f(to)f(increase)i(the)g(allo)q (cations.)20 b(\(Someda)o(y)14 b(it)g(will)i(reallo)q(cate)75 648 y(automatically)l(.\))k(One)c(ma)o(y)f(wish)g(to)g(add)g(some)g (suc)o(h)h(options)f(to)g(the)g(`)p Fu(.fweb)p Fz(')f(\014le.)137 720 y(F)l(or)g(a)f(more)h(detailed)h(discussion)h(of)d(memory)g(allo)q (cation)i(and)f(a)g(men)o(u)g(of)g(the)g(v)m(arious)g(dynamic)75 775 y(arra)o(ys,)f(see)j(Section)g(12.2.2)d([Memory)h(allo)q(cation],)i (page)f(108.)75 897 y Fq(4.2.70)29 b(`)p Fn(-Z)p Fq(':)i(Displa)n(y)22 b(default)e(st)n(yle-\014le)i(parameters)137 999 y Fz(The)15 b(information)g(option)f(`)p Fu(-Zabc)p Fz(')f(prin)o(ts)i(to)f(the)g (screen)i(the)e(default)h(con)o(ten)o(ts)f(of)g(the)h(st)o(yle-\014le) 75 1053 y(parameters)f(b)q(eginning)k(with)d(`)p Fu(abc)p Fz('.)k(Just)c(`)p Fu(-Z)p Fz(')f(prin)o(ts)i(ev)o(erything.)137 1126 y(After)i(prin)o(ting)i(the)e(defaults,)i(the)e(`)p Fu(-p)p Fz(')g(options)g(\(see)h(Section)g(4.2.46)e([-p],)h(page)h (28\))e(and)i(the)75 1180 y(st)o(yle)f(\014le)h(`)p Fu(fweb.sty)p Fz(')d(are)h(pro)q(cessed.)29 b(If)18 b(that)f(pro)q(cessing)i(has)f(o) o(v)o(erridden)g(an)o(y)f(of)h(the)g(defaults,)75 1235 y(the)d(parameters)g(are)g(prin)o(ted)g(again,)g(preceded)i(b)o(y)e(an) g(asterisk.)137 1307 y(T)l(o)g(see)h(only)f(the)h(parameters)e(that)h (ha)o(v)o(e)f(b)q(een)j(mo)q(di\014ed)f(from)f(the)g(defaults,)g(sa)o (y)g(`)p Fu(--Z)p Fz('.)137 1380 y(The)21 b(`)p Fu(-Z)p Fz(')e(option)h(b)q(eha)o(v)o(es)h(sligh)o(tly)g(di\013eren)o(tly)g (for)f(color)g(escap)q(e)h(sequences)h(than)e(for)f(other)75 1435 y(parameters;)14 b(see)h(Section)i(12.3.7)c([Color],)h(page)h (117.)75 1557 y Fq(4.2.71)29 b(`)p Fn(-z)p Fq(':)i(Change)21 b(name)f(of)g(st)n(yle)i(\014le)137 1658 y Fz(The)15 b(command)f(`)p Fu(-znew.sty)p Fz(')e(c)o(hanges)i(the)h(default)f(st)o (yle-\014le)i(name)e(`)p Fu(fweb.sty)p Fz(')e(to)i(`)p Fu(new.sty)p Fz('.)75 1713 y(The)h(command)h(`)p Fu(-z)p Fz(')e(\(with)h(no)g(argumen)o(t\))f(means)h(\\Don't)f(read)h(an)o(y)g (st)o(yle)g(\014le.")137 1785 y(Normally)22 b(the)g(st)o(yle)f(\014le)i (is)f(read)g(from)e(the)i(same)f(directory)h(in)g(whic)o(h)h(the)e Fu(web)g Fz(source)h(\014le)75 1840 y(resides)17 b(\(or)e(from)g(the)h (path)g(de\014ned)i(b)o(y)e(the)g(en)o(vironmen)o(t)g(v)m(ariable)h Fu(FWEB_STYLE_DIR)p Fz(\).)j(T)l(o)c(force)75 1894 y Fu(fweb.sty)e Fz(to)h(b)q(e)g(read)h(from)e(the)h(curren)o(t)g (directory)l(,)h(sa)o(y)e(`)p Fu(-z.)p Fz('.)75 2017 y Fq(4.2.72)29 b(`)p Fn(-.)p Fq(':)i(Don't)21 b(recognize)f(dot)g (constan)n(ts)137 2118 y Fz(If)d(this)g(command)f(is)h(used,)f(the)h (pro)q(cessors)f(will)i(not)e(understand)h(that)e(constructions)i(suc)o (h)f(as)75 2173 y(`)p Fu(.LT.)p Fz(')g(are)h(op)q(erators)f(in)i Fw(F)o(or)m(tran)g Fz(or)f Fw(Ra)m(tf)o(or)p Fz(.)26 b(This)18 b(command)f(is)h(useful)g(if)g(one)g(is)f(trying)h(to)75 2227 y(mo)q(dernize)f(the)e(source)g(co)q(de)h(to)e(use)i Fw(Fweb)g Fz(con)o(v)o(en)o(tions)f(suc)o(h)h(as)f(`)p Fu(<)p Fz(')f(instead)i(of)f(`)p Fu(.LT.)p Fz('.)75 2350 y Fq(4.2.73)29 b(`)p Fn(-\\)p Fq(':)i(Explicitly)22 b(escap)r(e)f(con)n (tin)n(ued)g(strings)137 2451 y Fz(In)c Fw(Fweb)p Fz(,)g(long)g (strings)f(are)g(con)o(tin)o(ued)h(with)f(the)h(bac)o(kslash.)23 b(Normally)l(,)16 b(the)h(con)o(tin)o(uation)f(of)75 2506 y(the)e(string)h(m)o(ust)e(start)g(in)i(the)g(\014rst)f(column)h (of)f(the)g(next)g(line;)i(otherwise,)e(spurious)h(blanks)g(will)h(b)q (e)75 2560 y(in)o(tro)q(duced.)k(Ho)o(w)o(ev)o(er,)13 b(when)h(the)f(`)p Fu(-\\)p Fz(')f(option)i(is)g(in)g(e\013ect,)f Fw(Fweb)h Fz(exp)q(ects)g(that)f(the)h(con)o(tin)o(uation)75 2615 y(will)h(also)f(b)q(egin)h(with)f(the)g(bac)o(kslash,)g(and)g(it)g (will)i(ignore)e(leading)h(white)f(space)g(and)g(the)g(bac)o(kslash.)75 2670 y(\(This)h(feature)g(w)o(as)g(inspired)i(b)o(y)e Fw(F)o(or)m(tran)p Fz(-90.\))k(Th)o(us,)c(in)h(the)f(example)p eop %%Page: 36 38 36 37 bop 75 -58 a Fz(Chapter)15 b(4:)k(R)o(UNNING)d Fw(Fweb)1166 b Fz(36)195 183 y Fu("This)23 b(is)h(\\)338 235 y(\\continued";)75 316 y Fz(the)15 b(e\013ectiv)o(e)h(string)f(is)h Fu("This)e(is)h(continued")f Fz(when)h(`)p Fu(-\\)p Fz(')g(is)g(in)h (e\013ect.)137 397 y(Note)f(that)g(this)g(option)h(a\013ects)e(all)i (strings)f(in)h(the)g(source)f(\014le;)h(one)f(cannot)g(mix)h(and)f (matc)o(h.)75 537 y Fq(4.2.74)29 b(`)p Fn(-\()p Fq(':)i(Con)n(tin)n(ue) 22 b(paren)n(thesized)f(strings)g(with)f(bac)n(kslashes)137 647 y Fz(This)d(option)f(is)h(lik)o(e)g(`)p Fu(-\\)p Fz(')e(\(see)h(Section)h(4.2.73)d([-)p Fu(\\)p Fz(],)h(page)h(35\),)f (but)h(it)g(refers)g(to)g(certain)g(strings)75 702 y(that)e(are)h(not)g (normally)h(quoted,)f(suc)o(h)g(as)g(the)g(argumen)o(ts)g(of)g(`)p Fu(ifelse)p Fz(')e(commands)i(in)h Fu(m4)p Fz(.)75 841 y Fq(4.2.75)29 b(`)p Fn(-:)p Fq(':)i(Set)21 b(starting)f(automatic)g (statemen)n(t)h(n)n(um)n(b)r(er)137 951 y Fz(This)f(option)f(is)h (useful)g(for)f Fw(F)o(or)m(tran)g Fz(and)g Fw(Ra)m(tf)o(or)p Fz(.)33 b(Sym)o(b)q(olic)20 b(statemen)o(t)e(lab)q(els)j(that)d(are)75 1006 y(de\014ned)e(with)e(the)h(`)p Fu(#:0)p Fz(')e(macro)g(command)h (\(Section)h(7.2.2)e([T)l(ok)o(ens],)g(page)h(65;)g(Section)h(8.2.3)e ([F)l(or-)75 1061 y(tran],)g(page)h(85\),)f(as)h(in)h(`)p Fu(@m)f(EXIT)h(#:0)p Fz(',)e(are)g(incremen)o(ted)j(starting)d(with)i (the)f(default)g(of)g(90000.)k(T)l(o)75 1116 y(c)o(hange)d(this)h(to,)e (e.g.,)g(789,)g(sa)o(y)h(`)p Fu(-:789)p Fz('.)75 1255 y Fq(4.2.76)29 b(`)p Fn(->)p Fq(':)i(Redirect)21 b(output)f(\()p Fo(Ft)m(angle)p Fq(\))137 1365 y Fz(This)12 b(c)o(hanges)f(the)g(name)g (of)f Fw(Ft)m(angle)p Fz('s)i(output)e(\014le.)20 b(If)11 b(no)g(name)g(is)h(giv)o(en,)g(output)e(is)i(redirected)75 1420 y(to)j(the)g(terminal.)137 1501 y(This)h(command)f(has)g(no)g (e\013ect)g(for)g Fw(Fwea)l(ve)p Fz(.)137 1582 y(Although)k(the)f(app)q (earance)h(of)e(this)i(command)f(is)h(highly)g(in)o(tuitiv)o(e,)h(it)e (ma)o(y)g(b)q(e)g(hard)g(to)g(t)o(yp)q(e)75 1637 y(quic)o(kly)l(.)j(An) 16 b(equiv)m(alen)o(t)h(command)e(is)h(`)p Fu(-=)p Fz(')e(\(see)h (Section)h(4.2.77)d([-=],)i(page)g(36\).)75 1776 y Fq(4.2.77)29 b(`)p Fn(-=)p Fq(':)i(Redirect)21 b(output)f(\()p Fo(Ft)m(angle)p Fq(\))137 1887 y Fz(Equiv)m(alen)o(t)h(to)d(`)p Fu(->)p Fz(')f(\(see)i(Section)h(4.2.76)d([-)p Fu(>)p Fz(],)i(page)f(36\),)h (and)g(faster)f(to)g(t)o(yp)q(e)h(on)g(man)o(y)f(k)o(ey-)75 1941 y(b)q(oards.)75 2062 y Fq(4.2.78)29 b(`)p Fn(-#)p Fq(':)i(T)-5 b(urn)21 b(o\013)f(commen)n(ts)h(ab)r(out)e(line)i(and)g (section)f(n)n(um)n(b)r(ers)262 2124 y(\()p Fo(Ft)m(angle)p Fq(\))137 2234 y Fz(By)c(default,)h(tangled)f(output)g(includes)i (commen)o(ts)d(ab)q(out)h(the)g(line)h(and)f(section)h(n)o(um)o(b)q (ers)f(cor-)75 2289 y(resp)q(onding)g(to)f(the)g(curren)o(t)g(piece)i (of)e(co)q(de.)20 b(T)l(o)15 b(eliminate)i(this)f(clutter,)f(sa)o(y)g (`)p Fu(-#)p Fz('.)k(\(But)c(note)g(that)75 2344 y(the)j(line-n)o(um)o (b)q(er)i(information)e(is)g(v)o(ery)g(useful)h(for)e(debugging)i(in)f (C)g(and)g(C)p Fu(++)p Fz(,)f(as)h(it)g(enables)h(the)75 2398 y(debugger)d(to)e(displa)o(y)i(the)g(source)f(line)i(in)f(the)f(w) o(eb)g(\014le.\))137 2479 y(In)j(some)g(cases,)f(bugs)h(in)g(tangled)g (output,)g(particularly)g(from)f Fw(F)o(or)m(tran)p Fz(,)h(can)g(b)q(e) g(eliminated)75 2534 y(b)o(y)d(using)h(`)p Fu(-#)p Fz('.)j(\(But)c (please)h(rep)q(ort)f(the)g(bug)g(an)o(yw)o(a)o(y;)f(Chapter)h(15)f ([Supp)q(ort],)h(page)g(131.\))137 2615 y(In)j(some)f(cases,)g(it)h(is) g(useful)g(to)e(turn)i(o\013)e(the)h(line-)i(and)f(section-n)o(um)o(b)q (er)g(information)f(lo)q(cally)l(.)75 2670 y(This)f(can)f(b)q(e)h(done) g(with)f(the)g(`)p Fu(@q)p Fz(')g(command.)k(See)d(Section)g(5.5.22)d ([A)l(Tq],)i(page)g(48.)p eop %%Page: 37 39 37 38 bop 75 -58 a Fz(Chapter)15 b(4:)k(R)o(UNNING)d Fw(Fweb)1166 b Fz(37)75 183 y Fq(4.2.79)29 b(`)p Fn(-+)p Fq(':)i(Don't)21 b(in)n(terpret)f(comp)r(ound)h(assignmen)n(t)g(op)r (erators)137 280 y Fz(Both)d Fw(Ra)m(tf)o(or)g Fz(and)g Fw(F)o(or)m(tran)g Fz(attempt)f(to)g(translate)h(the)g(commands)f(`)p Fu(++)p Fz(',)g(`)p Fu(--)p Fz(',)g(`)p Fu(+=)p Fz(',)g(`)p Fu(-=)p Fz(',)75 334 y(`)p Fu(*=)p Fz(',)c(and)i(`)p Fu(/=)p Fz(')e(in)o(to)h(co)q(de)h(that)f(b)q(eha)o(v)o(es)h(as)f (their)h(C/C)p Fu(++)e Fz(coun)o(terparts.)19 b(T)l(o)14 b(turn)g(this)h(feature)f(o\013,)75 389 y(use)i(`)p Fu(-+)p Fz('.)137 456 y(Notice)i(that)f(in)h Fw(F)o(or)m(tran)p Fz(-90)f(`)p Fu(/=)p Fz(')g(is)g(a)h(tok)o(en)e(for)h(\\not)g(equal,")h (so)f(if)h(y)o(ou)f(w)o(an)o(t)f(to)h(use)h(that)75 511 y(y)o(ou)h(m)o(ust)f(turn)h(o\013)g(the)g(comp)q(ound)h(assignmen)o(t)f (op)q(erators)f(with)h(use)h(`)p Fu(-+)p Fz('.)30 b(Ho)o(w)o(ev)o(er,) 19 b(a)g(b)q(etter)75 566 y(solution)d(is)g(to)e(lea)o(v)o(e)i(them)f (turned)g(on)g(and)h(use)f Fw(Fweb)p Fz('s)h(standard)f(`)p Fu(!=)p Fz(')f(tok)o(en)h(for)f(\\not)h(equal.")137 633 y(See)h(also)f(Section)h(12.2.2.16)d([-ylx],)i(page)g(110.)75 745 y Fq(4.2.80)29 b(`)p Fn(-/)p Fq(':)i(Recognize)21 b(short)f(commen)n(ts)h(\()p Fo(F)o(or)m(tran)e Fq(&)i Fo(Ra)m(tf)o(or)p Fq(\))137 842 y Fz(If)14 b(this)f(command)g(is)h(not) f(used)h(with)f(the)g Fw(F)o(or)m(tran)p Fz(-lik)o(e)i(languages,)e (the)h(`)p Fu(//)p Fz(')e(construction)h(will)75 896 y(b)q(e)j(in)o(terpreted)g(as)f(concatenation)g(rather)g(than)g(as)f (the)i(b)q(eginning)h(of)e(a)g(short)f(commen)o(t.)137 964 y(Concatenation)d(can)h(b)q(e)g(signi\014ed)h(with)f Fw(Fweb)p Fz('s)g(tok)o(en`)p Fu(\\/)p Fz(',)e(so)h(no)h(p)q(enalt)o(y) g(is)g(incurred)g(for)f(using)75 1018 y(`)p Fu(-/)p Fz('.)137 1086 y(One)20 b(w)o(a)o(y)d(of)h(in)o(v)o(oking)h(this)g(option)g(is)g (with)g(the)g(global)g(language)g(command,)g(suc)o(h)f(as)h(`)p Fu(@n/)p Fz('.)75 1140 y(Another)c(is)h(to)e(put)i(the)f(command)g(in)o (to)g(the)h(initialization)i(\014le)e(`)p Fu(.fweb)p Fz('.)137 1208 y(See)g(also)f(Section)h(4.2.40)e([-n/],)g(page)h(27)f (and)i(Section)g(4.2.55)d([-r/],)h(page)h(30.)75 1320 y Fq(4.2.81)29 b(`)p Fn(-!)p Fq(':)i(Mak)n(e)22 b(`)p Fn(!)p Fq(')e(denote)g(short)h(commen)n(t)g(\()p Fo(F)o(or)m(tran)e Fq(&)h Fo(Ra)m(tf)o(or)p Fq(\))137 1416 y Fz(This)c(option)f(is)h(not)f (recommended;)h(use)f Fw(Fweb)p Fz('s)h(standard)f(`)p Fu(//)p Fz(')f(to)g(b)q(egin)j(short)d(commen)o(ts.)137 1483 y(T)l(o)h(include)j(the)d(exclamation)h(p)q(oin)o(t)g(inside)h(a)d (string,)h(escap)q(e)h(it)g(with)f(a)g(bac)o(kslash,)g(as)g(in)386 1548 y Fu(s)24 b(=)f("A)h(\\!)g(inside)f(a)g(string")75 1660 y Fq(4.2.82)29 b(Information)20 b(options)137 1756 y Fz(Sev)o(eral)d(of)f(the)g(command-line)i(options)e(can)g(b)q(e)h (used)g(to)e(elicit)j(information)f(ab)q(out)f(the)g(initial)75 1811 y(state)e(of)h Fw(Fweb)p Fz(.)195 1875 y(`)p Fu(-@)p Fz(')21 b(displa)o(ys)j(information)e(ab)q(out)h(the)f(con)o(trol)g(co) q(des.)43 b(See)23 b(Section)g(4.2.4)e([-A)l(T],)195 1927 y(page)15 b(16.)195 1991 y(`)p Fu(-D)p Fz(')25 b(displa)o(ys)j (information)e(ab)q(out)g(reserv)o(ed)h(w)o(ords.)52 b(See)27 b(Section)g(4.2.11)e([-D)p 1717 1991 14 2 v 16 w(],)195 2043 y(page)15 b(18.)195 2108 y(`)p Fu(-y)p Fz(')23 b(displa)o(ys)i(default)f(dynamic)h(memory)e(allo)q(cations.)48 b(See)24 b(Section)h(4.2.69)d([-y],)195 2160 y(page)15 b(35.)195 2224 y(`)p Fu(-Z)p Fz(')k(displa)o(ys)i(default)g(v)m(alues)g (of)f(st)o(yle-\014le)h(parameters.)34 b(See)21 b(Section)g(4.2.70)d ([-Z)p 1717 2224 V 16 w(],)195 2276 y(page)d(35.)75 2343 y(The)j(`)p Fu(-h)p Fz(')f(option)g(reminds)i(one)f(ab)q(out)f(these)h (information)g(options;)h(it)f(also)f(pro)o(vides)h(con)o(v)o(enien)o (t)75 2398 y(access)d(to)g(the)g(GNU)g Fu(info)g Fz(bro)o(wser.)k(See)d (Section)g(4.2.18)d([-h],)i(page)g(21.)p eop %%Page: 38 40 38 39 bop 75 -58 a Fz(Chapter)15 b(5:)k Fw(Fweb)e Fz(COMMANDS)1105 b(38)75 183 y Ft(5)41 b Fv(Fweb)26 b Ft(COMMANDS)137 323 y Fz(All)18 b Fw(Fweb)e Fz(commands)g(b)q(egin)h(with)g(the)f(c)o (haracter)f(`)p Fu(@)p Fz('.)21 b(It)16 b(is)h(recommended)f(that)g (these)g(b)q(egin)75 378 y(in)e(column)f(1)f(if)i(p)q(ossible.)20 b(This)14 b(is)f(required)h(in)f(some)f(cases)h([e.g.,)f(the)g(`)p Fu(@x)p Fz(',)g(`)p Fu(@y)p Fz(',)g(and)h(`)p Fu(@z)p Fz(')e(in)j(c)o(hange)75 433 y(\014les)i(\(see)f(Section)h(3.3)f ([Change)f(\014les],)i(page)f(13\),)f(or)g(column-orien)o(ted)j Fw(F)o(or)m(tran)p Fz(-77)e(pro)q(cessing].)137 508 y(Some)21 b(of)g(these)g(con)o(trol)g(co)q(des)g(ma)o(y)g(b)q(e)g(used)h(an)o (ywhere;)h(others)e(b)q(egin)h(a)f(new)g(part)f(of)h(the)75 563 y(curren)o(t)13 b(section.)20 b(\(F)l(or)13 b(a)g(discussion)i(of)e (sections)h(and)g(parts,)f(see)h(Section)g(2.2)f([Structure],)g(page)g (5.\))75 618 y(F)l(or)g(a)f(quic)o(k)i(summary)f(of)g(the)g(con)o (trol-co)q(de)g(mappings)h(and)g(to)e(see)h(whic)o(h)h(co)q(des)g(b)q (egin)h(new)e(parts,)75 672 y(sa)o(y)i(`)p Fu(ftangle)e(-@)p Fz('.)20 b(See)15 b(Section)h(4.2.4)e([-A)l(T],)g(page)h(16.)75 820 y Fy(5.1)33 b(Debugging)22 b(commands)137 924 y Fz(Sev)o(eral)h (commands)g(pro)o(vide)g(lo)q(calized)i(v)o(ersions)e(of)g(the)f(`)p Fu(-1)p Fz(')g(and)h(`)p Fu(-2)p Fz(')f(options)g(related)i(to)75 979 y(debugging)16 b(of)f(prett)o(y-prin)o(ting.)75 1107 y Fq(5.1.1)30 b(`)p Fn(@0)p Fq(':)h(T)-5 b(urn)20 b(o\013)g(debugging) 137 1211 y Fz(This)f(cancels)f(the)g(e\013ect)g(of)f(a)g(previous)i(`)p Fu(@1)p Fz(')e(or)g(`)p Fu(@2)p Fz(')g(\(see)g(Section)i(5.1.2)d([A)l (T1],)h(page)h(38)f(and)75 1265 y(Section)f(5.1.3)d([A)l(T2],)g(page)i (38\).)k(The)c(`)p Fu(@0)p Fz(')e(command)i(should)h(app)q(ear)e(in)i (a)e(di\013eren)o(t)h(section)h(from)75 1320 y(the)f(`)p Fu(@1)p Fz(')f(or)h(`)p Fu(@2)p Fz(')f(commands.)75 1448 y Fq(5.1.2)30 b(`)p Fn(@1)p Fq(':)h(Displa)n(y)21 b(irreducible)g (scraps)137 1552 y Fz(This)16 b(is)g(a)g(lo)q(cal)g(v)o(ersion)g(of)f (the)h(command-line)h(option)e(`)p Fu(-1)p Fz(')g(\(see)g(Section)i (4.2.2)d([-1],)g(page)h(16\);)75 1606 y(refer)g(to)g(that)f(discussion) j(for)e(more)f(information.)75 1734 y Fq(5.1.3)30 b(`)p Fn(@2)p Fq(':)h(Displa)n(y)21 b(detailed)g(reductions)f(of)g(the)h (scraps)137 1838 y Fz(This)16 b(is)g(a)g(lo)q(cal)g(v)o(ersion)g(of)f (the)h(command-line)h(option)e(`)p Fu(-2)p Fz(')g(\(see)g(Section)i (4.2.3)d([-2],)g(page)h(16\);)75 1893 y(refer)g(to)g(that)f(discussion) j(for)e(more)f(information.)75 2041 y Fy(5.2)33 b(Literal)24 b(con)n(trol)f(c)n(haracters)137 2145 y Fz(Sev)o(eral)16 b(commands)f(insert)h(sp)q(eci\014c)h(c)o(haracters.)75 2272 y Fq(5.2.1)30 b(`)p Fn(@@)p Fq(':)h(The)20 b(c)n(haracter)h(`)p Fn(@)p Fq(')137 2376 y Fz(`)p Fu(@@)p Fz(')14 b(inserts)i(the)f(single) i(c)o(haracter)d(`)p Fu(@)p Fz('.)137 2451 y(Don't)g(forget)h(to)f (double)j(the)e(`)p Fu(@)p Fz(')f(ev)o(en)i(inside)h(strings.)j(F)l(or) 14 b(example,)i(the)f Fw(Fweb)h Fz(source)g(line)195 2523 y Fu(puts\("'@@')22 b(is)i(represented)e(by)i(`@@@@'"\);)75 2598 y Fz(will)17 b(b)q(e)f(tangled)f(to)195 2670 y Fu(puts\("'@')23 b(is)g(represented)g(by)g(`@@'"\);)p eop %%Page: 39 41 39 40 bop 75 -58 a Fz(Chapter)15 b(5:)k Fw(Fweb)e Fz(COMMANDS)1105 b(39)75 183 y Fq(5.2.2)30 b(`)p Fn(@|)p Fq(':)h(Literal)20 b(v)n(ertical)h(bar,)g(or)f(optional)g(line)g(break)137 279 y Fz(In)d(the)e(T)298 288 y(E)324 279 y(X)h(\(do)q(cumen)o (tation\))f(part)g(of)g(a)h(section,)g(`)p Fu(@|)p Fz(')f(inserts)h(a)f (v)o(ertical)h(bar.)21 b(This)c(is)f(useful)75 333 y(inside)j(LaT)282 343 y(E)307 333 y(X)e(v)o(erbatim)f(en)o(vironmen)o(ts.)25 b(\(A)16 b(simple)j(bar)d(w)o(ould)h(signal)h(a)e(shift)h(in)o(to)g(co) q(de)g(mo)q(de,)75 388 y(whic)o(h)d(is)g(probably)f(not)g(what)g(one)g (w)o(an)o(ts.\))18 b(F)l(or)12 b(an)h(example,)h(see)g(Section)g (5.12.4)d([A)l(T)p Fu(|)p 1661 388 14 2 v 16 w Fz(],)i(page)g(56.)137 454 y(In)j(a)f(co)q(de)h(part,)e(`)p Fu(@|)p Fz(')g(inserts)i(an)f (optional)h(line)g(break)g(in)g(an)f(expression|e.g.,)195 518 y Fu(`f\(a,b,@|c+d,...\)'.)75 584 y Fz(This)j(helps)g(T)324 594 y(E)349 584 y(X)f(to)g(break)g(the)g(line)h(at)f(an)g(appropriate)g (place.)26 b(If)17 b(the)g(line)i(do)q(es)e(not)g(need)h(to)e(b)q(e)75 639 y(brok)o(en,)j(the)g(command)g(do)q(es)h(nothing.)31 b([Compare)18 b(`)p Fu(@|)p Fz(')g(with)h(`)p Fu(@\\)p Fz(')f(\(see)h(Section)h(5.12.3)d([A)l(Tbs],)75 694 y(page)e(56\))f (and)i(`)p Fu(@/)p Fz(')e(\(see)h(Section)h(5.12.2)d([A)l(T/],)h(page)h (55\),)f(whic)o(h)i(alw)o(a)o(ys)f(break)g(the)g(line.])75 819 y Fy(5.3)33 b(Beginning)23 b(of)f(section)137 915 y Fz(Sections)16 b(are)f(b)q(egun)h(b)o(y)f(either)h(`)p Fu(@*)p Fz(')e(or)h(`)p Fu(@ )o Fz('.)75 1024 y Fq(5.3.1)30 b(`)p Fn(@)20 b Fq(':)31 b(Begin)20 b(minor)h(section)137 1119 y Fz(`)p Fu(@ )p Fz(')e(b)q(egins)h(a)g(new)f(minor)h(\(unstarred) f(or)g(unnamed\))h(section)g(that)f(is)h(not)g(en)o(tered)f(in)o(to)h (the)75 1174 y(T)l(able)c(of)f(Con)o(ten)o(ts.)k(F)l(or)14 b(example,)195 1237 y Fu(@)24 b(This)f(is)h(an)f(example)g(of)h(a)f (minor)h(\(unnamed\))e(section.)47 b(\(No)23 b(entry)h(is)f(made)195 1289 y(in)h(the)f(Table)g(of)h(Contents.\))195 1393 y(@a)195 1445 y(main\(\))195 1497 y({})75 1606 y Fq(5.3.2)30 b(`)p Fn(@*)p Fq(',)21 b(`)p Fn(@*)p Fl(n)p Fq(':)30 b(Begin)20 b(ma)s(jor)h(section)137 1701 y Fz(`)p Fu(@*)p Fz(')16 b(b)q(egins)i(a)e(new)h(ma)s(jor)e(\(starred\))g(section)i(\(of)f(lev)o (el)i(0\).)23 b(The)17 b(command)f(m)o(ust)g(b)q(e)i(follo)o(w)o(ed)75 1756 y(b)o(y)h(the)f(name)h(of)f(the)h(section)g(\(en)o(try)f(in)i(the) f(T)l(able)g(of)f(Con)o(ten)o(ts\),)g(follo)o(w)o(ed)h(b)o(y)g(a)f(p)q (erio)q(d.)32 b(\(If)18 b(a)75 1811 y(p)q(erio)q(d)f(app)q(ears)e(in)h (the)f(name)g(itself,)h(it)g(m)o(ust)e(b)q(e)i(protected)f(b)o(y)g (braces.\))137 1877 y(The)h(section)f(name)g(is)h(also)f(used)g(as)g(a) g(running)h(head)f(on)g(the)g(output)g(pages.)20 b(T)l(o)15 b(deal)g(with)h(the)75 1932 y(p)q(ossibilit)o(y)k(that)d(the)h(full)h (name)f(ma)o(y)f(b)q(e)i(to)q(o)e(long,)h(the)g(section)h(name)e(ma)o (y)h(b)q(e)g(preceded)h(b)o(y)f(an)75 1987 y(optional)13 b(argumen)o(t)e(enclosed)j(in)f(brac)o(k)o(ets.)18 b(If)12 b(it)g(is)h(presen)o(t,)f(the)h(optional)f(argumen)o(t)g(is)g(used)h (as)f(the)75 2042 y(running)17 b(head.)22 b(\(If)15 b(a)h(p)q(erio)q(d) h(app)q(ears)f(as)f(part)g(of)h(the)f(optional)i(argumen)o(t,)d(it)i(m) o(ust)g(b)q(e)g(protected)75 2096 y(b)o(y)f(braces.\))137 2163 y(If)g(`)p Fu(@*)p Fz(')d(is)j(follo)o(w)o(ed)f(b)o(y)g(a)g(digit) h Fs(n)p Fz(,)f(it)g(b)q(egins)h(a)f(new)g(ma)s(jor)f(\(sub\)section)h (of)g(lev)o(el)h Fs(n)p Fz(.)20 b(This)14 b(is)h(also)75 2218 y(en)o(tered)g(in)o(to)h(the)f(T)l(able)h(of)f(Con)o(ten)o(ts.)k (Th)o(us,)14 b(the)i(complete)g(syn)o(tax)e(to)h(b)q(egin)h(a)f(ma)s (jor)f(section)h(is)195 2281 y Fu(@*)p Fs(n)24 b Fu([Short)f(name]Full) g(name.)137 2347 y Fz(F)l(or)15 b(example,)195 2411 y Fu(@*)24 b(MAIN)f(PROGRAM.)47 b(This)23 b(begins)g(a)h(major)f(section) g(\(of)g(level)g(0\).)195 2514 y(@a)195 2566 y(main\(\))195 2618 y({})p eop %%Page: 40 42 40 41 bop 75 -58 a Fz(Chapter)15 b(5:)k Fw(Fweb)e Fz(COMMANDS)1105 b(40)195 183 y Fu(@*1)23 b([Input)g(routines\\dots]A)f(very)i(long)f (section)g(name)g(that)g(essentially)195 235 y(means)g(``input)g (routines.'')46 b(Now)24 b(follow)f(some)g(subroutines.)195 339 y(@a)195 391 y(get_input\(\))195 443 y({})137 515 y Fz(F)l(or)15 b(LaT)295 525 y(E)320 515 y(X,)g(the)h(highest)f(p)q (ermissible)j(ma)s(jor)c(lev)o(el)i(is)g(2)f(\(a)g(subsubsection\).)137 588 y(Section)h(names)e(can)g(con)o(tain)h(reasonably)f(arbitrary)g(T) 1119 598 y(E)1145 588 y(X)g(text,)g(including)j(fon)o(t-c)o(hanging)d (com-)75 643 y(mands)k(and)h(other)f(macros.)29 b(Ho)o(w)o(ev)o(er,)18 b(it)h(is)f(necessary)h(to)f(understand)h(that)f Fs(fragile)j Fz(commands)75 698 y(\(in)15 b(the)f(sense)g(of)g(LaT)464 708 y(E)489 698 y(X\))g(ma)o(y)g(not)f(w)o(ork)g(b)q(ecause)i(the)f (section)h(name)f(is)h(used)f(in)h(v)m(arious)g(con)o(texts)75 753 y(\(e.g.,)e(as)i(a)g(page)g(header\).)k(If)d(a)e(macro)h(in)g(a)g (section)h(name)e(do)q(esn't)h(w)o(ork)f(prop)q(erly)l(,)i(try)e (preceding)75 807 y(it)h(with)h(`)p Fu(\\protect)p Fz('.)137 880 y Fw(Fwea)l(ve)h Fz(con)o(v)o(erts)e(`)p Fu(@*)p Fz(')g(commands)h(to)f(section)i(n)o(um)o(b)q(ers.)23 b(F)l(or)15 b(a)h(discussion)i(of)d(section)i(n)o(um-)75 935 y(b)q(ering,)f(see)f(Section)h(10.1.6)e([Num)o(b)q(ering],)h(page)g (98.)75 1078 y Fy(5.4)33 b(Beginning)23 b(of)f(co)r(de)g(part)137 1179 y Fz(The)16 b(co)q(de)f(part)g(is)h(b)q(egun)g(b)o(y)f(the)g(app)q (earance)h(of)f(either)h(`)p Fu(@a)p Fz(')e(or)h(`)p Fu(@<)f Fs(Mo)q(dule)i(name)i Fu(@>=)p Fz('.)75 1303 y Fq(5.4.1)30 b(`)p Fn(@<)p Fq(':)h(Begin)20 b(mo)r(dule)g(name)137 1405 y Fz(`)p Fu(@<)p Fz(')13 b(b)q(egins)h(a)g(mo)q(dule)g(name,)g (whic)o(h)g(has)g(the)f(form)g(`)p Fu(@<)h Fs(T)1180 1414 y(E)1206 1405 y(X)h(text)h Fu(@>)p Fz('.)j(\(Mo)q(dule)14 b(names)f(inside)75 1459 y Fw(Fweb)j Fz(macro)f(de\014nitions)i(b)q (egin)f(with)g(`)p Fu(@#)p Fz(',)d(not)i(`)p Fu(@<)p Fz('.\))75 1583 y Fq(5.4.2)30 b(`)p Fn(@>)p Fq(':)h(End)21 b(mo)r(dule)f(name)137 1684 y Fz(`)p Fu(@>)p Fz(')14 b(ends)i(a)f(mo)q(dule)h(name,)f(of)g(the)g(form)g(`)p Fu(@<)f Fs(T)999 1694 y(E)1025 1684 y(X)h(text)h Fu(@>)p Fz('.)137 1757 y(T)l(ec)o(hnically)l(,)22 b(`)p Fu(@>)p Fz(')c(is)h(not)f(a)g(command;)i(rather,)f(it)g(is)g(a)f(delimiter)j (that)d(terminates)g(`)p Fu(@<)p Fz('.)30 b(An)75 1812 y(unmatc)o(hed)16 b(`)p Fu(@>)p Fz(')e(is)h(simply)i(ignored)f(\(after) e(a)h(w)o(arning)g(message)f(is)i(issued\).)75 1935 y Fq(5.4.3)30 b(`)p Fn(@A)p Fq(':)h(Begin)20 b(co)r(de)g(part)g(of)g (unnamed)h(section)137 2037 y Fz(`)p Fu(@A)p Fz(')14 b(b)q(egins)j(the)e(co)q(de)h(part)e(of)h(an)g(unnamed)h(section.)21 b(F)l(or)14 b(example,)195 2107 y Fu(@)24 b(In)f(an)h(unnamed)f (section,)g(the)g(code)g(part)h(begins)f(with)g(`@a')g(or)h(`@A'.)195 2159 y(@A)195 2211 y(main\(\))195 2263 y({})137 2335 y Fz(F)l(or)19 b(more)h(discussion)h(of)f(the)f(distinction)j(b)q(et)o (w)o(een)e(`)p Fu(@A)p Fz(')f(and)h(`)p Fu(@a)p Fz(',)f(see)h(Section)h (5.4.4)d([A)l(T)l(a],)75 2390 y(page)d(40.)75 2513 y Fq(5.4.4)30 b(`)p Fn(@a)p Fq(':)h(Begin)20 b(co)r(de)g(part)g(of)g (unnamed)h(section,)f(and)h(mark)137 2615 y Fz(`)p Fu(@a)p Fz(')e(b)q(egins)j(the)e(co)q(de)g(part)g(of)f(an)h(unnamed)h(section)g (\(just)e(as)h(do)q(es)g(`)p Fu(@A)p Fz('\),)g(and)g(in)h(addition)75 2670 y(marks)14 b(the)i(next)f(unreserv)o(ed)h(iden)o(ti\014er)h(it)e (\014nds)h(as)f(de\014ned)h(in)g(this)g(section.)k(Precisely)l(,)p eop %%Page: 41 43 41 42 bop 75 -58 a Fz(Chapter)15 b(5:)k Fw(Fweb)e Fz(COMMANDS)1105 b(41)195 183 y Fu(`@a')23 b(==)h(`@A@[')137 257 y Fz(Originally)l(,)17 b Fw(Fweb)g Fz(did)f(not)e(con)o(tain)i(the)f(`)p Fu(@A)p Fz(')f(command,)g(so)h(when)g(the)h(functionalit)o(y)g(of)e(auto-)75 311 y(matically)g(marking)f(the)f(next)h(unreserv)o(ed)h(iden)o (ti\014er)g(\(see)f(Section)h(5.7)d([A)l(T[],)h(page)h(51\))f(w)o(as)g (added,)75 366 y(it)18 b(w)o(as)f(natural)h(to)f(add)h(it)h(to)e(`)p Fu(@a)p Fz('.)27 b(A)18 b(reasonable)g(st)o(yle)g(of)f(co)q(ding)i(is)g (to)e(alw)o(a)o(ys)g(use)h(`)p Fu(@a)p Fz(')f(if)h(y)o(ou)75 421 y(don't)13 b(kno)o(w)f(an)o(y)h(b)q(etter;)h(if)f(y)o(ou)g (sometime)g(run)h(in)o(to)f(trouble,)h(y)o(ou)f(can)g(then)g(c)o(hange) h(selected)g(`)p Fu(@a)p Fz('s)75 476 y(to)j(`)p Fu(@A)p Fz('s.)28 b(F)l(or)17 b(example,)i(it)g(is)f(appropriate)g(to)g(use)g (`)p Fu(@a)p Fz(')f(if)h(one)h(co)q(des)f(one)g(function)h(p)q(er)g (section.)75 530 y(E.g.,)195 601 y Fu(@c)195 653 y(@)195 705 y(@a)195 757 y(int)195 808 y(subrtn\(\))195 860 y({})75 934 y Fz(Here)d(the)g(`)p Fu(@a)p Fz(')e(marks)h(`)p Fu(subrtn)p Fz(')g(as)g(de\014ned)i(in)g(this)f(section;)g(if)g(that)f (iden)o(ti\014er)j(is)e(used)g(elsewhere,)75 988 y(it)22 b(will)g(b)q(e)g(subscripted)h(with)f(the)f(section)h(n)o(um)o(b)q(er.) 38 b(\(T)l(o)21 b(turn)g(this)h(feature)f(o\013,)g(use)h(`)p Fu(-f)p Fz(';)h(see)75 1043 y(Section)15 b(4.2.16)d([-f)t(],)h(page)h (20.\))19 b(Ho)o(w)o(ev)o(er,)13 b(if)i(a)e(section)i(con)o(tains)g(an) f(arbitrary)f(co)q(de)i(fragmen)o(t,)e(the)75 1098 y(co)q(de)j(part)e (should)j(probably)e(b)q(egin)i(with)e(`)p Fu(@A)p Fz('.)k(E.g.,)195 1168 y Fu(@c)195 1220 y(@)195 1272 y(@A)195 1324 y(x)24 b(=)f(y;)75 1397 y Fz(If)14 b(one)g(had)g(used)h(`)p Fu(@a)p Fz(')e(here,)h(the)g Fu(x)g Fz(w)o(ould)g(ha)o(v)o(e)f(b)q(een) i(mark)o(ed)f(as)f(de\014ned)j(here,)e(whic)o(h)h(is)f(not)g(what)75 1452 y(one)h(w)o(an)o(ts.)75 1596 y Fy(5.5)33 b(Con)n(trol)23 b(co)r(des)e(b{z)75 1749 y Fq(5.5.1)30 b(`)p Fn(@B)p Fq(':)h(Suppress)21 b(insertion)g(of)e(breakp)r(oin)n(t)i(command)137 1851 y Fz(This)g(is)f(for)f(detailed)i(debugging)g(of)f Fw(Fweb)g Fz(co)q(des.)35 b(It)20 b(inserts)g(a)f(left)h(brace)g(and)g (suppresses)75 1906 y(the)d(insertion)i(of)d(a)h(breakp)q(oin)o(t)h (command.)26 b(See)18 b(the)f(discussion)i(of)e(`)p Fu(@b)p Fz(')f(in)i(Section)g(5.5.2)e([A)l(Tb],)75 1961 y(page)f(41.)75 2085 y Fq(5.5.2)30 b(`)p Fn(@b)p Fq(':)h(Insert)20 b(a)h(breakp)r(oin)n (t)f(command)137 2187 y Fz(\(Discussion)d(to)f(b)q(e)h(\014nished.)25 b(Useful)17 b(only)g(for)f(v)o(ery)g(in)o(timate)g(debugging)h(of)f Fw(Fweb)i Fz(co)q(des.)23 b(In)75 2242 y(these)15 b(da)o(ys)g(of)g (safe)g(sex,)g(suc)o(h)g(in)o(timacy)h(ma)o(y)f(not)f(b)q(e)i (desirable.\))137 2315 y(See)g(also)f(Section)h(5.5)f([A)l(TB)p 653 2315 14 2 v 16 w(],)f(page)h(41.)75 2440 y Fq(5.5.3)30 b(`)p Fn(@c)p Fq(':)h(Set)20 b(language)g(to)g(C)137 2542 y Fz(The)d(command)f(`)p Fu(@c)p Fz(')f(is)h(a)g(shorthand)g(for)g (`)p Fu(@Lc)p Fz('.)21 b(F)l(or)16 b(a)f(discussion)j(of)e(language)g (commands)g(in)75 2597 y(lim)o(b)q(o,)g(see)f(Section)h(5.5.13)e([A)l (TL)p 685 2597 V 16 w(],)h(page)g(45.)137 2670 y(See)h(Chapter)f(8)g ([Languages],)f(page)h(83)f(and)i(Section)g(8.2.1)e([C],)f(page)i(84.)p eop %%Page: 42 44 42 43 bop 75 -58 a Fz(Chapter)15 b(5:)k Fw(Fweb)e Fz(COMMANDS)1105 b(42)75 183 y Fq(5.5.4)30 b(`)p Fn(@c++)p Fq(':)h(Set)20 b(language)g(to)g(C)p Fn(++)137 276 y Fz(The)13 b(command)g(`)p Fu(@c++)p Fz(')f(is)h(a)g(shorthand)g(for)f(`)p Fu(@Lc++)p Fz('.)18 b(F)l(or)12 b(a)h(discussion)h(of)f(language)g(commands)75 331 y(in)j(lim)o(b)q(o,)g(see)f(Section)h(5.5.13)e([A)l(TL)p 738 331 14 2 v 16 w(],)h(page)g(45.)137 395 y(See)h(Chapter)f(8)g ([Languages],)f(page)h(83)f(and)i(Section)g(8.2.2)e([Cpp],)g(page)h (85.)75 497 y Fq(5.5.5)30 b(`)p Fn(@D)p Fq(':)h(De\014ne)20 b(outer)h(macro)137 590 y Fs(This)16 b(command)f(b)q(egins)i(the)e (de\014nition)i(part.)137 654 y Fz(`)p Fu(@D)p Fz(')11 b(de\014nes)h(an)f(outer)g(macro.)18 b(F)l(or)11 b(more)f(discussion,)k (see)d(Section)i(7.1)d([Outer)h(macros],)g(page)g(62.)75 709 y(F)l(or)k(example,)g(in)h(C)195 770 y Fu(@D)24 b(A)f(1)75 834 y Fz(will)17 b(b)q(e)f(tangled)f(to)g(the)g(b)q(eginning)j(of)c (the)i(output)f(\014le)h(as)f(`)p Fu(#define)e(A)i(1)p Fz('.)75 936 y Fq(5.5.6)30 b(`)p Fn(@d)p Fq(':)h(De\014ne)20 b(outer)h(macro,)f(and)h(mark)137 1029 y Fs(This)16 b(command)f(b)q (egins)i(the)e(de\014nition)i(part.)137 1093 y Fz(`)p Fu(@d)p Fz(')i(de\014nes)i(an)f(outer)f(macro)g(\(just)g(as)h(`)p Fu(@D)p Fz(')f(do)q(es\),)h(and)g(also)g(marks)f(the)h(next)g(iden)o (ti\014er)h(as)75 1147 y(de\014ned)c(in)f(the)f(presen)o(t)g(section.) 21 b(It)15 b(is)g(equiv)m(alen)o(t)i(to)195 1208 y(`)p Fu(@d)p Fz(')d(==)i(`)p Fu(@D@[)p Fz(')75 1272 y(\(see)f(Section)h(5.7) e([A)l(T[],)g(page)h(51\).)137 1336 y(The)j(distinction)h(b)q(et)o(w)o (een)f(`)p Fu(@d)p Fz(')e(and)h(`)p Fu(@D)p Fz(')g(is)h(analagous)f(to) f(the)i(distinction)h(b)q(et)o(w)o(een)e(`)p Fu(@a)p Fz(')g(and)75 1391 y(`)p Fu(@A)p Fz('.)i(See)d(Section)g(5.4.4)d([A)l (T)l(a],)h(page)h(40.)75 1493 y Fq(5.5.7)30 b(`)p Fn(@E)p Fq(':)h(T)-5 b(reat)20 b(next)g(iden)n(ti\014er)h(as)g(ordinary)g (expression)g(\()p Fo(Fwea)l(ve)p Fq(\))137 1586 y Fz(F)l(or)15 b(formatting)f(purp)q(oses,)h(treat)g(the)g(next)g(iden)o(ti\014er)i (as)e(an)g(ordinary)g(expression.)137 1650 y(This)f(command)g(is)g (useful)g(in)h(prett)o(y-prin)o(ting)e(certain)h(kinds)h(of)e(macro)g (constructions.)19 b(F)l(urther)75 1705 y(discussion)e(is)f(giv)o(en)f (in)h Fx(h)p Fz(unde\014ned)p Fx(i)h Fz([Macros)d(and)h(formatting],)e (page)i Fx(h)p Fz(unde\014ned)p Fx(i)p Fz(.)75 1807 y Fq(5.5.8)30 b(`)p Fn(@f)p Fq(':)h(F)-5 b(ormat)19 b(iden)n(ti\014er)i (or)f(mo)r(dule)h(name)137 1900 y Fs(This)16 b(command)f(b)q(egins)i (the)e(de\014nition)i(part.)137 1964 y Fz(The)f(construction)195 2025 y Fu(@f)24 b(identifier)e(old_identifier)75 2088 y Fz(mak)o(es)15 b Fw(Fwea)l(ve)h Fz(treat)e Fs(iden)o(ti\014er)20 b Fz(lik)o(e)c Fs(old)p 851 2088 V 17 w(iden)o(ti\014er)p Fz(.)22 b(F)l(or)14 b(example,)195 2150 y Fu(@f)24 b(mytype)f(int)75 2213 y Fz(sa)o(ys)18 b(to)f(treat)g(the)i(v)m(ariable)g Fu(mytype)f Fz(just)g(as)g Fu(int)g Fz(is)g(treated)g(\(e.g.,)g(as)f(a) h(reserv)o(ed)h(w)o(ord)e(in)i(C)f(or)75 2268 y(C)p Fu(++)p Fz(\).)137 2332 y(T)l(raditionally)l(,)23 b(C)d(programmers)f(needed)i (to)f(use)g(this)h(command)f(to)f(format)g(iden)o(ti\014ers)j(that)75 2387 y(w)o(ere)e(de\014ned)i(in)f Fu(#include)e Fz(\014les.)37 b(This)21 b(anno)o(ying)f(redundancy)i(has)e(no)o(w)g(b)q(een)i (eliminated)g(b)o(y)75 2442 y(means)14 b(of)g(the)g(`)p Fu(-H)p Fz(')g(command,)g(whic)o(h)h(tells)g Fw(Fwea)l(ve)g Fz(to)e(scan)i Fu(#include)e Fz(\014les)i(automatically)l(.)20 b(See)75 2496 y(Section)c(4.2.17)d([-H)p 430 2496 V 17 w(],)h(page)h(20.)137 2560 y(The)h Fs(old)p 294 2560 V 17 w(iden)o(ti\014er)21 b Fz(ma)o(y)15 b(b)q(e)i(one)f(of)f(the)h (follo)o(wing)h(sp)q(ecial)h(names,)d(whic)o(h)i(insert)f(extra)g (spaces)75 2615 y(according)e(to)g(the)g(p)q(ositions)h(of)e(the)h (underscores)h(and)f(b)q(eha)o(v)o(e)g(as)g(the)g(part)f(of)g(sp)q(eec) o(h)i(indicated)h(b)o(y)75 2670 y(the)f(base)h(names:)p eop %%Page: 43 45 43 44 bop 75 -58 a Fz(Chapter)15 b(5:)k Fw(Fweb)e Fz(COMMANDS)1105 b(43)195 183 y Fu($_BINOP_)195 235 y($_COMMA_)195 287 y($_EXPR)195 339 y($_EXPR_)195 391 y($EXPR_)195 443 y($UNOP_)75 515 y Fz(These)16 b(are)e(useful)j(for)d(dealing)j(with)e(certain)h (macro)f(constructions.)20 b(F)l(or)14 b(example,)195 585 y Fu(@f)24 b(PLUS)f($_BINOP_)195 637 y(@m)h(PLUS)f(+)195 689 y(@m)h(ADD\(x,)f(y\))g(\(\(x\))h(PLUS)f(\(y\)\))75 762 y Fz(Without)14 b(the)h(format)e(command,)h(the)h(`)p Fu(ADD)p Fz(')e(macro)h(will)i(prett)o(y-prin)o(t)e(without)g(spaces)h (b)q(efore)g(and)75 817 y(after)f(the)i(`)p Fu(PLUS)p Fz('.)137 889 y(When)11 b(the)f(curren)o(t)h(language)f(is)h(T)742 899 y(E)768 889 y(X,)f(the)g(format)f(command)h(can)h(b)q(e)g(used)g (to)e(c)o(hange)i(a)f(category)75 944 y(co)q(de)16 b(according)f(to)g (the)g(format)195 1014 y Fu(@f)24 b(`TeXchar)e(new_cat_code)75 1087 y Fz(Di\016culties)g(ma)o(y)e(ensue)h(if)g(one)f(try)g(to)g(c)o (hange)g(the)g(category)g(co)q(de)h(of)f(`)p Fu(@)p Fz(')f(in)i(this)g (w)o(a)o(y;)h(a)e(fully)75 1142 y(op)q(erational)12 b Fw(web)g Fz(for)f(T)502 1151 y(E)528 1142 y(X)g(is)h(quite)h (di\016cult)g(and)e(has)h(b)q(een)h(neither)f(accomplished)i(nor)d (attempted.)75 1265 y Fq(5.5.9)30 b(`)p Fn(@i)p Fq(':)h(Include)21 b(\014le)f(\(unconditional\))137 1366 y Fz(If)c(one)f(sa)o(ys)195 1436 y Fu(@i)24 b(test.hweb)75 1509 y Fz(the)15 b(\014le)h(`)p Fu(test.hweb)p Fz(')c(is)k(inserted)f(at)g(the)f(presen)o(t)h(p)q(oin)o (t)g(of)g(the)g(w)o(eb)f(\014le.)21 b(By)15 b(default,)g(the)g(curren)o (t)75 1564 y(directory)i(is)g(searc)o(hed.)26 b(Files)17 b(can)g(b)q(e)h(included)h(from)d(other)h(directories)h(b)o(y)f(means)f (of)h(the)g Fu(FWEB_)75 1619 y(INCLUDES)j Fz(en)o(vironmen)o(t)h(v)m (ariable)i(and/or)d(the)i(`)p Fu(-I)p Fz(')e(command-line)j(option.)37 b(See)22 b(Section)g(12.1)75 1673 y([En)o(vironmen)o(t)15 b(v)m(ariables],)h(page)f(107)f(and)h(Section)h(4.2.19)e([-I)p 1189 1673 14 2 v 16 w(],)h(page)g(21.)137 1746 y(In)j(principle,)j(the) c(included)j(\014le)e(ma)o(y)f(con)o(tain)h(an)o(y)f(fragmen)o(t)f(of)h (source)g(text.)26 b(Ho)o(w)o(ev)o(er,)17 b(it)g(is)75 1801 y(b)q(est)e(to)g(mak)o(e)g(it)g(a)g(complete)h(section)g(\(b)q (egun)g(b)o(y)f(`)p Fu(@*)p Fz(')f(or)g(`)p Fu(@ )p Fz('\))g(if)i(at)e (all)j(p)q(ossible.)137 1874 y(Unfortunately)l(,)j(the)e(`)p Fu(@i)p Fz(')g(command)g(cannot)h(b)q(e)g(commen)o(ted)f(out)g(or)h (conditionally)h(included)75 1928 y(b)o(y)15 b(use)h(of)f(an)g Fw(Fweb)i Fz(prepro)q(cessor)e(command.)21 b(That)15 b(is)h(b)q(ecause)g(`)p Fu(@i)p Fz(')e(is)i(pro)q(cessed)g(v)o(ery)f (early)h(in)75 1983 y(the)h(parsing)h(pro)q(cess.)26 b(\(Consider:)f(`)p Fu(@i)p Fz(')16 b(could)i(include)i(T)1126 1993 y(E)1151 1983 y(X)e(text,)f(but)g(the)g(prepro)q(cessor)h(is)f (only)75 2038 y(activ)o(e)e(in)h(the)g(de\014nition)h(and)e(co)q(de)h (parts.\))137 2111 y(Include)d(commands)d(ma)o(y)f(b)q(e)i(nested)g(to) f(a)g(depth)g(set)g(b)o(y)h(the)f(option)h(`)p Fu(-yid)p Fz('.)16 b(See)11 b(Section)g(12.2.2.9)75 2166 y([-yid],)k(page)g(109.) 137 2238 y(In)g(the)f(w)o(o)o(v)o(en)f(output,)h(if)h(a)f(section)g (comes)g(from)g(an)g(include)i(\014le,)f(the)f(name)h(of)e(the)h (include)j(\014le)75 2293 y(is)g(prin)o(ted)h(in)g(square)e(brac)o(k)o (ets)g(as)h(the)g(\014rst)f(text)h(of)f(the)h(T)1149 2303 y(E)1175 2293 y(X)f(part.)25 b(T)l(o)16 b(inhibit)j(prin)o(ting)f (of)f(that)75 2348 y(name,)e(sa)o(y)195 2418 y Fu(\\def\\WIF#1{})75 2491 y Fz(in)24 b(the)f(lim)o(b)q(o)h(section.)44 b(T)l(o)23 b(c)o(hange)g(the)g(w)o(a)o(y)f(that)g(name)h(is)h(formatted,)f (rede\014ne)i(the)e(macro)75 2545 y(`)p Fu(\\WIFfmt)p Fz(',)18 b(whose)h(single)h(argumen)o(t)f(is)g(the)h(name)f(of)f(the)h (include)j(\014le.)33 b(\(It)18 b(is)i(not)f(called)h(when)75 2600 y(there)15 b(is)h(no)f(curren)o(t)g(include)j(\014le.\))i(The)c (default)g(de\014nition)h(is)195 2670 y Fu(\\def\\WIFfmt#1{[{\\tt#1}]}) p eop %%Page: 44 46 44 45 bop 75 -58 a Fz(Chapter)15 b(5:)k Fw(Fweb)e Fz(COMMANDS)1105 b(44)75 183 y Fq(5.5.10)29 b(`)p Fn(@I)p Fq(':)i(Include)21 b(\014le)g(\(conditional\))137 278 y Fz(This)13 b(command)g(b)q(eha)o (v)o(es)f(lik)o(e)i(`)p Fu(@i)p Fz(')d(if)i(the)g(command-line)h (option)e(`)p Fu(-i)p Fz(')g(is)h(not)f(used.)19 b(If)13 b(it)g(is)g(used,)75 333 y(then)h(the)g(con)o(ten)o(ts)f(of)h(the)f (included)k(\014le)e(is)f(not)f(prin)o(ted)i(in)g(the)f(w)o(o)o(v)o(en) f(output.)19 b(See)14 b(Section)h(4.2.20)75 388 y([-i],)g(page)g(21)f (and)i(Section)g(4.2.21)d([-i!],)i(page)g(22.)75 496 y Fq(5.5.11)29 b(`)p Fn(@K)p Fq(':)i(Extract)21 b(global)f(R)n(CS-lik)n (e)i(k)n(eyw)n(ord)137 592 y Fz(The)14 b(construction)f(`)p Fu(@K)h Fs(Keyw)o(ord)j Fu(@>)p Fz(')12 b(accesses)i(the)f(v)m(alue)h (of)f(a)f(global)i(R)o(CS-lik)o(e)h(k)o(eyw)o(ord.)j(\(F)l(or)75 646 y(more)i(discussion)h(of)f(suc)o(h)g(k)o(eyw)o(ords,)h(see)f (Section)h(5.5.31)d([A)l(Tz],)j(page)f(50.\))33 b(The)20 b(command)g(is)75 701 y(treated)15 b(di\013eren)o(tly)h(b)o(y)f Fw(Ft)m(angle)h Fz(and)f Fw(Fwea)l(ve)h Fz(dep)q(ending)i(on)d(its)g (lo)q(cation)h(in)g(the)f(source)h(\014le.)137 767 y Fw(Fwea)l(ve)k Fz(will)h(expand)f(the)g(construction)f(in)h(the)g(lim)o (b)q(o)g(section)g(and)f(T)1471 777 y(E)1497 767 y(X)g(parts)g(only)l (.)33 b(The)75 822 y(v)m(alue)16 b(is)g(not)f(surrounded)h(b)o(y)f (quotes.)20 b(F)l(or)14 b(example,)195 885 y Fu(@z)195 937 y($Id:)47 b(test)23 b($)195 989 y(@x)195 1093 y(@c)195 1197 y(\\def\\ID{Id)f(=)i(\\.{"@K)f(Id)h(@>"}})195 1300 y(@)g(\\ID.)47 b(This)23 b(is)h(a)g(@K)f(Id)h(@>.)75 1366 y Fz(will)17 b(expand)f(in)o(to)195 1430 y Fu(@c)195 1533 y(@)24 b(\\ID.)47 b(This)23 b(is)h(a)g(test.)75 1599 y Fz(and)16 b(when)h(LaT)360 1609 y(E)386 1599 y(X)f(is)h(run)f (the)h(macro)e Fu(\\ID)h Fz(will)i(expand)f(to)e(`)p Fu(Id)g(=)g(\\.{"Test"})p Fz('.)21 b(The)16 b(quotes)g(are)75 1654 y(not)k(necessary)h(in)g(the)g(macro)f(de\014nition;)k(they)d(are) f(included)j(only)f(to)e(emphasize)h(that)f(in)i(this)75 1709 y(\(lim)o(b)q(o\))15 b(con)o(text)f(the)g(`)p Fu(@K)p Fz(')g(construction)g(can)h(e\013ectiv)o(ely)g(b)q(e)h(put)e(inside)i (a)f(string.)k(This)c(is)g(p)q(ossible)75 1764 y(b)q(ecause)23 b(the)e(routine)h(that)f(copies)h(the)g(lim)o(b)q(o)h(section)f(simply) h(copies)f(c)o(haracters;)i(it)d(do)q(es)h(not)75 1819 y(tok)o(enize)16 b(an)o(ything.)137 1885 y Fw(Fwea)l(ve)j Fz(do)q(es)g(not)f(expand)h(`)p Fu(@K)p Fz(')e(constructions)h(in)h (the)f(de\014nition)j(or)c(co)q(de)i(parts;)g(it)f(merely)75 1939 y(giv)o(es)d(them)h(a)e(sym)o(b)q(olic)j(represen)o(tation.)137 2005 y Fw(Ft)m(angle)p Fz(,)f(on)e(the)h(other)g(hand,)g(expands)g(`)p Fu(@K)p Fz(')f(constructions)h(in)h(the)f(de\014nition)i(or)d(co)q(de)i (parts)75 2060 y(\(during)d(input\).)20 b(The)13 b(v)m(alues)h(are)f (surrounded)g(b)o(y)g(quotes.)19 b(\(As)12 b(usual,)i Fw(Ft)m(angle)g Fz(ignores)f(material)75 2115 y(in)j(the)f(lim)o(b)q(o) i(section)e(and)h(T)598 2125 y(E)623 2115 y(X)f(parts.\))137 2181 y(F)l(or)22 b Fw(Ft)m(angle)p Fz(,)i(the)e(built-in)i(function)f (`)p Fu($KEYWORD)p Fz(')d(\(see)i(Section)h(7.2.3.30)c([$KEYW)o(ORD],) 75 2236 y(page)g(72\))g(b)q(eha)o(v)o(es)h(essen)o(tially)h(as)e(do)q (es)h(`)p Fu(@K)p Fz(',)f(except)h(that)f(it)g(is)h(expanded)h(during)f (output,)g(not)75 2291 y(input.)h Fw(Fwea)l(ve)16 b Fz(do)q(es)f(not)g (expand)h(`)p Fu($KEYWORD)p Fz('.)137 2357 y(The)d(command)f(`)p Fu(@k)p Fz(')f(b)q(eha)o(v)o(es)h(as)g(do)q(es)g(`)p Fu(@K)p Fz(')f(except)i(that)e(it)h(accesses)h(lo)q(cal)g(k)o(eyw)o (ords,)f(not)f(global)75 2412 y(ones.)20 b(See)c(Section)g(5.5.12)d([A) l(Tk],)h(page)h(44.)75 2520 y Fq(5.5.12)29 b(`)p Fn(@k)p Fq(':)i(Access)22 b(lo)r(cal)e(R)n(CS-lik)n(e)i(k)n(eyw)n(ord)137 2615 y Fz(The)13 b(construction)f(`)p Fu(@k)j(keyword)p Fz(')c(b)q(eha)o(v)o(es)i(as)e(`)p Fu(@K)p Fz(')h(do)q(es)g(\(see)h (Section)g(5.5.11)d([A)l(TK)p 1644 2615 14 2 v 17 w(],)i(page)g(44\),) 75 2670 y(except)k(it)f(accesses)h(lo)q(cal)g(k)o(eyw)o(ords)e (\(de\014ned)j(at)d(the)h(top)g(of)g(include)j(\014les\).)p eop %%Page: 45 47 45 46 bop 75 -58 a Fz(Chapter)15 b(5:)k Fw(Fweb)e Fz(COMMANDS)1105 b(45)75 183 y Fq(5.5.13)29 b(`)p Fn(@L)p Fq(':)i(Set)21 b(language)137 293 y Fz(`)p Fu(@Ll)p Fz(')14 b(sets)g(the)h(language)f (to)g Fs(l)p Fz(,)h(where)g Fs(l)i Fz(is)e(one)g(of)f(`)p Fu({c,c++,n,n9,r,r9,v,x})p Fz(')o(.)j(See)e(Chapter)f(8)75 348 y([Languages],)g(page)h(83.)137 429 y(There)h(are)g(shorthand)f (forms)g(of)g(this)i(command)e(for)g(some)h(languages;)g(see)g(`)p Fu(@c)p Fz(')e(\(Section)j(5.5.3)75 484 y([A)l(Tc],)11 b(page)f(41\),)h(`)p Fu(@c++)p Fz(')e(\(Section)i(5.5.4)f([A)l(Tcpp],)h (page)g(42\),)f(`)p Fu(@n)p Fz(')g(\(Section)h(5.5.18)e([A)l(Tn],)i (page)f(47\),)75 539 y(`)p Fu(@n9)p Fz(')k(\(Section)h(5.5.19)e([A)l (Tn9],)h(page)h(47\),)f(`)p Fu(@r)p Fz(')g(\(Section)h(5.5.24)e([A)l(T) l(r],)h(page)h(49\),)f(and)h(`)p Fu(@r9)p Fz(')f(\(Sec-)75 594 y(tion)h(5.5.25)f([A)l(T)l(r9],)g(page)h(49\).)137 675 y(Generally)l(,)h(the)f(global)g(language)g(should)h(b)q(e)g(set)e (in)i(the)f(lim)o(b)q(o)h(section)f(b)o(y)g(means)g(of)f(`)p Fu(@L)p Fz(',)f(`)p Fu(@c)p Fz(',)75 730 y(etc.)i(rather)f(on)i(the)f (command)g(line)i(b)o(y)e(options)g(suc)o(h)h(as)f(`)p Fu(-L)p Fz(')f(or)g(`)p Fu(-c)p Fz('.)75 870 y Fq(5.5.14)29 b(`)p Fn(@l)p Fq(':)i(Sp)r(ecify)21 b(lim)n(b)r(o)g(text)137 980 y Fs(This)16 b(command)f(b)q(egins)i(the)e(de\014nition)i(part.)137 1061 y Fz(Lim)o(b)q(o)f(text)f(is)h(material)f(that)f Fw(Fwea)l(ve)i Fz(should)g(output)f(b)q(efore)h(the)f(start)f(of)h(the) g(\014rst)g(section.)75 1116 y(F)l(or)g(example,)195 1194 y Fu(@l)24 b("\\\\def\\\\A{abc}")75 1275 y Fz(Note)16 b(that)f(`)p Fu(\\\\)p Fz(')g(stands)h(for)g(a)f(bac)o(kslash.)24 b(In)16 b(general,)h(c)o(haracters)e(m)o(ust)h(b)q(e)g(escap)q(ed)i (just)d(as)h(in)h(C)75 1330 y([so)d(that)h(one)g(can)h(include)h (things)f(lik)o(e)g(`)p Fu(\\n)p Fz(')e(\(newline\))j(in)f(the)f (de\014nitions].)137 1411 y(Lim)o(b)q(o)e(text)f(ma)o(y)f(also)h(b)q(e) g(t)o(yp)q(ed)h(directly)g(in)o(to)f(the)g(lim)o(b)q(o)h(section;)g(in) g(that)e(case,)i(no)f(escap)q(es)g(are)75 1466 y(necessary)18 b(since)h(one)f(is)g(t)o(yping)g(ordinary)f(T)881 1476 y(E)907 1466 y(X)h(text.)26 b(Sometimes,)19 b(ho)o(w)o(ev)o(er,)e(the)g (`)p Fu(@l)p Fz(')g(command)75 1521 y(is)g(useful)h(for)e(p)q (edagogical)i(purp)q(oses,)g(as)e(the)h(lim)o(b)q(o)h(material)f(can)g (then)g(b)q(e)g(de\014ned)h(at)f(the)f(p)q(oin)o(t)75 1576 y(where)f(the)h(logical)g(discussion)h(is)f(made.)75 1716 y Fq(5.5.15)29 b(`)p Fn(@M)p Fq(':)i(De\014ne)21 b Fo(Fweb)f Fq(macro)137 1826 y Fs(This)c(command)f(b)q(egins)i(the)e (de\014nition)i(part.)137 1907 y Fz(F)l(or)e(a)g(detailed)h(discussion) h(of)e Fw(Fweb)h Fz(macros,)e(see)i(Chapter)f(7)g([Macros],)e(page)i (62.)75 2047 y Fq(5.5.16)29 b(`)p Fn(@m)p Fq(':)i(De\014ne)21 b Fo(Fweb)f Fq(macro,)h(and)f(mark)137 2157 y Fs(This)c(command)f(b)q (egins)i(the)e(de\014nition)i(part.)137 2239 y Fz(`)p Fu(@m)p Fz(')h(de\014nes)h(an)g Fw(Fweb)g Fz(macro,)f(and)h(also)f (marks)g(the)g(next)h(iden)o(ti\014er)h(as)e(de\014ned)i(here.)30 b(It)18 b(is)75 2293 y(equiv)m(alen)o(t)f(to)195 2372 y(`)p Fu(@m)p Fz(')d(==)i(`)p Fu(@M@[)p Fz(')75 2453 y(\(see)f(Section)h(5.7)e([A)l(T[],)g(page)h(51\).)137 2534 y(F)l(or)g(a)g(detailed)h(discussion)h(of)e Fw(Fweb)h Fz(macros,)e(see)i(Chapter)f(7)g([Macros],)e(page)i(62.)137 2615 y(The)j(distinction)h(b)q(et)o(w)o(een)f(`)p Fu(@m)p Fz(')e(and)h(`)p Fu(@M)p Fz(')g(is)h(analagous)f(to)f(the)i (distinction)h(b)q(et)o(w)o(een)e(`)p Fu(@a)p Fz(')g(and)75 2670 y(`)p Fu(@A)p Fz('.)i(See)d(Section)g(5.4.4)d([A)l(T)l(a],)h(page) h(40.)p eop %%Page: 46 48 46 47 bop 75 -58 a Fz(Chapter)15 b(5:)k Fw(Fweb)e Fz(COMMANDS)1105 b(46)75 183 y Fq(5.5.17)29 b(`)p Fn(@N)p Fq(':)i(T)-5 b(urn)21 b(on)f(N)g(mo)r(de)137 279 y Fs(This)f(command)f(m)o(ust)g (app)q(ear)h(b)q(efore)f(the)h(co)q(de)g(part.)28 b Fz(Generally)l(,)20 b(this)f(means)f(immediately)75 334 y(b)q(efore)d(`)p Fu(@a)p Fz('.)k Fs(Do)c(not)g(use)g(this)h(command)f(in)h(lim)o(b)q(o;) g(use)f(`)p Fu(@Lv)p Fs(')f(instead.)137 400 y Fz(The)21 b(N)f(mo)q(de)g(in)o(v)o(ok)o(es)h(language-indep)q(enden)o(t)h(b)q (eha)o(vior)f(within)h(the)e(scop)q(e)h(of)e(a)h(particular)75 455 y(language.)h(The)16 b(scoping)h(rules)f(are)f(the)h(same)f(as)h (for)f(language)h(c)o(hanges;)f(i.e.,)g(using)i(`)p Fu(@N)p Fz(')d(within)j(a)75 510 y(giv)o(en)d(section)g(pro)q(duces)g (language-indep)q(enden)o(t)i(b)q(eha)o(vior)e(for)e(that)h(section)h (and)f(for)g(an)o(y)g(mo)q(dules)75 565 y(\014rst)i(referenced)h(in)g (that)e(section.)137 631 y(F)l(undamen)o(tally)l(,)j Fs(language-indep)q(enden)o(t)i Fz(b)q(eha)o(vior)d(essen)o(tially)h (means)e(a)h(literal)g(transcription)75 686 y(of)h(the)h(input)h(to)f (the)g(output.)28 b(F)l(or)17 b(example,)i(it)f(inhibits)i(blank)f (compression)f(b)o(y)g Fw(Ft)m(angle)h Fz(and)75 741 y(tells)13 b Fw(Fwea)l(ve)g Fz(to)e(turn)h(o\013)g(\\prett)o(y-prin)o (ting")g(\(instead,)g(the)g(output)g(is)h(prin)o(ted)g(in)g(t)o(yp)q (ewriter)f(t)o(yp)q(e)75 796 y(within)k(a)f(`)p Fu (\\begin{verbatim}...\\end{ve)o(rbatim})o Fz(')d(en)o(vironmen)o(t\).) 137 862 y(There)k(are)f(some)f(subtleties)j(with)f(this)f(mo)q(de)h (\(not)e(to)h(men)o(tion)g(the)g(lik)o(eliho)q(o)q(d)k(of)14 b(bugs\):)100 929 y(1.)29 b Fw(Fweb)13 b Fz(macros)e(and)h(built-in)i (functions)f(will)g(normally)f(b)q(e)h(expanded)g(ev)o(en)f(in)h(the)e (N)h(mo)q(de.)19 b(T)l(o)165 984 y(inhibit)14 b(expansion)f(of)f(a)g (particular)g(iden)o(ti\014er,)i(place)f(`)p Fu(@!)p Fz(')e(b)q(efore)i(the)f(iden)o(ti\014er.)20 b(F)l(or)11 b(example,)285 1048 y Fu(@)285 1100 y(@m)24 b(A)f(1)285 1151 y(@N)285 1203 y(@a)285 1255 y(@!A)g(=)h(A;)165 1322 y Fz(expands)16 b(to)e(`)p Fu(A)h(=)g(1)p Fz('.)100 1388 y(2.)29 b(Blank)21 b(lines)h(are)d(signi\014can)o(t.)36 b(The)20 b(N)g(mo)q(de)h(is)f(ended)i(b)o(y)e(the)g(app)q(earance)h(of) e(the)h(`)p Fu(@*)p Fz(')f(or)165 1443 y(`)p Fu(@ )o Fz('denoting)d(the)f(start)e(of)i(the)g(next)g(section.)21 b(If)15 b(that)f(w)o(ere)h(preceded)h(b)o(y)f(one)g(or)g(more)f(blank) 165 1498 y(lines,)g(those)e(w)o(ould)g(sho)o(w)f(up)i(in)f(b)q(oth)g (the)g(tangled)h(and)f(w)o(o)o(v)o(en)f(output.)19 b(They)12 b(migh)o(t)g(or)f(migh)o(t)165 1553 y(not)i(b)q(e)h(signi\014can)o(t)h (in)f(the)g(tangled)g(output,)f(but)h(they)g(almost)f(certainly)h(will) i(lo)q(ok)d(ugly)h(in)h(the)165 1608 y(w)o(o)o(v)o(en)h(output.)24 b(T)l(o)16 b(a)o(v)o(oid)g(this,)h(use)g(the)g(command)f(`)p Fu(@\045\045)p Fz(',)f(whic)o(h)j(deletes)f(the)g(remainder)g(of)165 1662 y(the)e(curren)o(t)g(line)i(and)f(all)g(immediately)h(follo)o (wing)e(empt)o(y)g(lines.)22 b(F)l(or)14 b(example,)285 1726 y Fu(@)285 1778 y(@N)285 1830 y(@a)285 1882 y(x;@\045\045)285 2089 y(@)24 b(Next)f(section.)100 2156 y Fz(3.)29 b(If)24 b(the)f(N)h(mo)q(de)f(is)h(in)o(v)o(ok)o(ed)g(from)e(a)i(compiler-lik)o (e)i(language)d(suc)o(h)h(as)f Fw(F)o(or)m(tran)p Fz(,)i(cross-)165 2211 y(referencing)15 b(of)f(v)m(ariables)h(is)g(done)f(as)g(usual.)20 b(Ho)o(w)o(ev)o(er,)13 b(if)i(the)f(language)g(is)h Fw(verba)m(tim)f Fz(\(whic)o(h)165 2266 y(turns)h(on)h(the)f(N)h(mo)q(de)f (automatically\),)h(no)f(cross-referencing)h(is)g(done.)21 b(\(Iden)o(ti\014ers)16 b(are)g(still)165 2320 y(recognized)i (according)g(to)e Fw(Fweb)p Fz('s)i(rules.)27 b(Those)17 b(rules)h(as)e(curren)o(tly)i(implemen)o(ted)h(ma)o(y)d(b)q(e)165 2375 y(essen)o(tially)j(meaningless)g(for)d(some)i(languages;)g(in)g (the)g(future,)f(pro)o(vision)h(ma)o(y)f(b)q(e)h(made)g(for)165 2430 y(generalizing)e(these)d(rules)i(b)o(y)e(the)h(user.\))19 b(T)l(o)14 b(force)f(an)h(iden)o(ti\014er)h(to)e(b)q(e)h(placed)h(in)o (to)f(the)f(Index,)165 2485 y(precede)j(it)g(b)o(y)f(`)p Fu(@+)p Fz('.)100 2551 y(4.)29 b(A)15 b(mo)q(dule)i(name)e(m)o(ust)g(b) q(e)g(within)i(the)e(scop)q(e)h(of)f(an)g(`)p Fu(@N)p Fz(')f(the)h(\014rst)g(time)h(the)f(name)g(is)h(seen,)f(if)165 2606 y(it)g(is)h(ev)o(er)f(to)g(b)q(e)h(within)g(suc)o(h)g(scop)q(e.)k (Th)o(us,)15 b(the)g(follo)o(wing)h(do)q(es)g(not)e(w)o(ork)h(prop)q (erly:)285 2670 y Fu(@)24 b(Consider)e(the)i(module)f(@.)46 b(\(Not)24 b(yet)f(within)g(scope)g(of)h(\\.{@N}.\))p eop %%Page: 47 49 47 48 bop 75 -58 a Fz(Chapter)15 b(5:)k Fw(Fweb)e Fz(COMMANDS)1105 b(47)285 183 y Fu(@N)285 235 y(@a)285 287 y(x;)285 339 y(@@;)285 391 y(y;)165 457 y Fz(What)12 b(happ)q(ens)i(is)f (that)e(the)i(N)g(mo)q(de)g(is)g(not)f(restored)g(after)g(the)g(co)q (de-part)h(use)g(of)f(`)p Fu(@)p Fz('.)165 512 y(This)k(is)f(a)g(bug.)20 b(There)c(are)f(v)o(ery)g(tric)o(ky)g(design) h(issues)g(to)f(b)q(e)g(dealt)h(with)g(here.)75 620 y Fq(5.5.18)29 b(`)p Fn(@n)p Fq(':)i(Set)21 b(language)f(to)g Fo(F)o(or)m(tran)p Fq({77)137 715 y Fw(F)o(or)m(tran)p Fz(-77)e(is)g Fw(Fweb)p Fz('s)g(default)g(language,)g(so)f(this)h (command)g(is)g(usually)h(not)e(strictly)h(nec-)75 769 y(essary)l(.)23 b(Ho)o(w)o(ev)o(er,)15 b(it)h(is)h(go)q(o)q(d)f (practice)h(to)f(include)i(it,)e(so)g(a)g(user)h(lo)q(oking)g(at)e(the) i Fu(web)e Fz(\014le)j(can)e(tell)75 824 y(immediately)h(what)d (language)i(it)f(is)h(supp)q(osed)g(to)f(pro)q(cess.)137 890 y(F)l(or)21 b(more)f(discussion)j(of)d(languages,)j(see)e(Section)h (5.5.13)d([A)l(TL)p 1336 890 14 2 v 16 w(],)j(page)f(45)f(and)i (Chapter)e(8)75 945 y([Languages],)14 b(page)h(83.)75 1053 y Fq(5.5.19)29 b(`)p Fn(@n9)p Fq(':)j(Set)20 b(language)g(to)g Fo(F)o(or)m(tran)p Fq({90)137 1148 y Fz(F)l(or)h(more)f(discussion)j (of)d(languages,)j(see)e(Section)h(5.5.13)d([A)l(TL)p 1336 1148 V 16 w(],)j(page)f(45)f(and)i(Chapter)e(8)75 1203 y([Languages],)14 b(page)h(83.)137 1269 y(F)l(or)g(hin)o(ts)g(ab)q (out)h Fw(Fweb)g Fz(programming)e(in)i Fw(F)o(or)m(tran)p Fz(,)f(see)h(Section)g(8.2.3)e([F)l(ortran],)e(page)k(85.)75 1377 y Fq(5.5.20)29 b(`)p Fn(@O)p Fq(':)i(Op)r(en)21 b(output)f(\014le)h(\(global)e(scop)r(e\))137 1472 y Fz(A)d(statemen)o(t)e(of)g(the)i(form)195 1535 y Fu(@O)24 b Fs(new)p 348 1535 V 16 w(output)p 498 1535 V 16 w(\014le)p 571 1535 V 18 w(name)75 1601 y Fz(c)o(hanges)15 b(the)f(name)h(of)f Fw(Ft)m(angle)p Fz('s)h(output)f(\014le.)21 b(This)15 b(c)o(hange)g(remains)f(in)i(e\013ect)e(for)g(the)h(duration)75 1655 y(of)h(the)h(\014le,)g(or)f(un)o(til)i(another)e(`)p Fu(@O)p Fz(')f(is)j(encoun)o(tered.)24 b(\(If)17 b(that)e(o)q(ccurs,)i (the)g(previously)h(op)q(en)f(\014le)g(is)75 1710 y(closed.\))137 1776 y(This)f(command)f(is)h(expanded)g(during)g(output,)f(so)g(it)g(m) o(ust)g(app)q(ear)g(in)h(the)f(co)q(de)h(part.)137 1842 y(F)l(or)i(an)h(example)g(of)g(using)g(the)g(`)p Fu(@O)p Fz(')f(command)g(to)g(pro)q(duce)i(b)q(oth)f(C)f(header)h(\014les)h (\(`)p Fu(.h)p Fz('\))d(and)75 1897 y(source)e(\014les)h(\(`)p Fu(.c)p Fz('\),)e(see)h(the)g(discussion)i(in)f(Section)g(7.1)f([Outer) g(macros],)e(page)i(62.)137 1963 y(T)l(o)20 b(c)o(hange)g(the)g(name)h (of)e(the)h(output)g(\014le)h(lo)q(cally)h(\(for)d(just)h(the)g(presen) o(t)h(section\),)g(see)f(Sec-)75 2017 y(tion)15 b(5.5.21)f([A)l(T)l (o],)g(page)h(47.)75 2126 y Fq(5.5.21)29 b(`)p Fn(@o)p Fq(':)i(Op)r(en)21 b(output)f(\014le)h(\(lo)r(cal)e(scop)r(e\))137 2221 y Fz(This)h(b)q(eha)o(v)o(es)f(lik)o(e)i(`)p Fu(@O)p Fz(',)d(except)i(that)e(the)i(new)f(\014le)h(name)f(is)h(in)g(e\013ect) f(only)g(for)g(the)g(curren)o(t)75 2275 y(section.)j(A)15 b(subsequen)o(t)i(`)p Fu(@o)p Fz(')d(issued)j(in)g(a)e(di\013eren)o(t)h (section)g(but)g(for)f(the)g(same)h(\014le)g(name)g(accretes)75 2330 y(material)f(to)g(the)g(\014le.)137 2396 y(An)j(anno)o(ying)g (problem)g(arises)f(in)i(C)e(programming)g(when)h(`)p Fu(@o)p Fz('s)e(are)h(used)h(to)f(create)g(m)o(ultiple)75 2451 y(source)11 b(\014les)h(that)f(are)f(subsequen)o(tly)j(compiled)f (under)g(the)f(con)o(trol)g(of)g(a)f Fu(Makefile)p Fz(.)18 b(Remem)o(b)q(er)12 b(that)75 2506 y(b)o(y)i(default)h(line-n)o(um)o(b) q(er)i(information)d(is)h(written)f(in)o(to)g(the)h(C)f(\014les.)20 b(This)15 b(means)f(that)g(a)g(c)o(hange)g(in)75 2560 y(the)h Fu(web)g Fz(\014le)h(co)q(de)g(for)f(one)g(source)g(\014le)h (can)g(a\013ect)e(all)i(of)f(the)g(others,)g(b)q(ecause)h(the)f(line)i (n)o(um)o(b)q(ering)75 2615 y(in)g(the)f Fu(web)g Fz(\014le)h(c)o (hanges.)23 b(Therefore,)16 b(a)g(trivial)h(c)o(hange)f(to)g(the)g(co)q (de)h(for)e(just)h(one)g(source)h(\014le)g(can)75 2670 y(cause)e(all)i(of)d(the)i(others)e(to)h(b)q(e)h(recompiled.)p eop %%Page: 48 50 48 49 bop 75 -58 a Fz(Chapter)15 b(5:)k Fw(Fweb)e Fz(COMMANDS)1105 b(48)137 183 y(As)18 b(long)h(as)f(one)g(desires)h(debugging)g (information)g(relativ)o(e)g(to)e(the)h(original)i Fu(web)e Fz(\014le,)h(there)f(is)75 238 y(really)j(no)f(solution)h(to)e(this)i (problem;)i(one)d(needs)h(the)f(prop)q(er)h(line)h(information)e(in)h (eac)o(h)f(\014le)h(in)75 293 y(order)13 b(to)g(w)o(ork)f(with)h(the)h (debugger,)f(so)g(if)h(line)h(n)o(um)o(b)q(ers)e(c)o(hange)h(the)f (sources)g(m)o(ust)g(b)q(e)h(recompiled.)75 348 y(One)21 b(can,)g(of)e(course,)i(turn)f(o\013)f(the)h(line)h(n)o(um)o(b)q(ering) g(with)f(the)g(command-line)i(option)e(`)p Fu(-#)p Fz(')f(\(see)75 402 y(Section)i(4.2.78)e([-#],)i(page)f(36\),)h(but)f(then)h(debugger)g (statemen)o(ts)e(will)j(refer)f(to)f(the)g(tangled)h(C)75 457 y(co)q(de,)14 b(whic)o(h)g(is)g(undesirable.)21 b(A)13 b(b)q(etter)g(partial)h(solution)g(is)f(to)g(use)g(`)p Fu(@q)p Fz(')g(\(see)g(Section)h(5.5.22)d([A)l(Tq],)75 512 y(page)19 b(48\))f(to)h(turn)g(o\013)g(the)g(line)i(n)o(um)o(b)q (ering)f(for)f(output)g(co)q(de)h(that)e(is)i(curren)o(tly)g(stable.)32 b(In)20 b(the)75 567 y(follo)o(wing)15 b(example,)g(the)g(co)q(de)g (for)e(eac)o(h)i(\014le)g(is)g(put)g(in)o(to)f(a)g(mo)q(dule,)h(then)g (the)g(mo)q(dules)g(are)f(output)75 622 y(in)h(the)g(unnamed)g (section;)g(it)g(is)g(assumed)f(that)g(the)g(programmer)g(is)h(curren)o (tly)g(making)f(c)o(hanges)h(to)75 676 y(the)g(co)q(de)h(for)f(`)p Fu(file2.c)p Fz(':)195 746 y Fu(@)195 798 y(@a)195 849 y(@q0)195 901 y(@o)24 b(file1.c)386 953 y(@@;)195 1005 y(@q1)195 1057 y(@o)h(file2.c)386 1109 y(@@;)195 1161 y(@q0)195 1213 y(@o)h(file3.c)386 1265 y(@@;)137 1337 y Fz(F)l(or)11 b(v)o(ery)f(large)h(pro)s(jects,)g(another)f (solution)i(is)f(to)g(main)o(tain)g(m)o(ultiple)i Fu(web)d Fz(source)h(\014les.)20 b(T)l(o)10 b(a)o(v)o(oid)75 1391 y(losing)k(the)f(substan)o(tial)g(b)q(ene\014ts)h(of)e(the)h(automatic) g(index,)h(refer)f(to)f(the)h(discussion)i(in)e(Section)h(11.3)75 1446 y([Merging)e(indexes],)i(page)e(105)g(to)g(learn)h(ho)o(w)f(to)g (create)g(a)g(master)g(index)h(that)f(con)o(tains)h(information)75 1501 y(ab)q(out)i(sev)o(eral)g Fu(web)g Fz(\014les.)75 1623 y Fq(5.5.22)29 b(`)p Fn(@q)p Fq(':)i(T)-5 b(urn)21 b(o\013)f(mo)r(dule)g(and)g(line)h(info)f(lo)r(cally)137 1724 y Fz(The)h(command-line)i(option)e(`)p Fu(-#)p Fz(')e(\(see)i (Section)h(4.2.78)d([-#],)i(page)f(36\))g(turns)h(o\013)f(commen)o(ts) 75 1779 y(ab)q(out)d(mo)q(dule)h(and)f(line)i(n)o(um)o(b)q(ers)e (globally)l(,)i(for)d(the)h(en)o(tire)g(co)q(de.)26 b(Ho)o(w)o(ev)o (er,)16 b(in)i(some)f(cases)g(one)75 1834 y(w)o(an)o(ts)j(to)g(turn)h (that)g(o\013)f(in)i(just)f(a)g(small)h(blo)q(c)o(k)f(of)g(co)q(de.)38 b(One)22 b(imp)q(ortan)o(t)f(example)h(arises)f(in)75 1889 y Fw(F)o(or)m(tran)p Fz(.)f(Consider)195 1958 y Fu(@)195 2010 y(@a)338 2062 y(x)k(=)g(@)195 2165 y(@)195 2217 y(@=)195 2269 y(y)h(+)f(z)75 2341 y Fz(This)16 b(example)g(will)h(tangle)e(to)g(something)g(lik)o(e) 338 2411 y Fu(x)24 b(=)195 2462 y(C*)g(1:)f(*)195 2514 y(*line)g(20)h("test.web")338 2566 y(y)g(+)g(z)195 2618 y(C*)g(:1)f(*)195 2670 y(*line)g(5)h("test.web")p eop %%Page: 49 51 49 50 bop 75 -58 a Fz(Chapter)15 b(5:)k Fw(Fweb)e Fz(COMMANDS)1105 b(49)75 183 y(Unfortunately)l(,)15 b(the)g(information)h(commen)o(ts)e (ha)o(v)o(e)h(created)g(in)o(v)m(alid)j(co)q(de)e(that)e(will)j(not)e (compile.)137 252 y(The)i(`)p Fu(@q)p Fz(')f(command)h(solv)o(es)g (this)h(problem)f(b)o(y)g(turning)h(o\013)e(or)g(on)h(the)g (information)h(commen)o(ts)75 306 y(lo)q(cally)l(.)k(`)p Fu(@q0)p Fz(')13 b(turns)i(them)g(o\013;)f(`)p Fu(@q1)p Fz(')f(turns)i(them)g(on.)k(Th)o(us,)c(if)g(one)g(rewrites)g(the)g(ab)q (o)o(v)o(e)f(example)75 361 y(as)195 427 y Fu(@)195 479 y(@a)195 531 y(@q0)338 582 y(x)24 b(=)g(@)195 634 y(@q1)75 703 y Fz(it)15 b(will)i(tangle)f(to)338 768 y Fu(x)24 b(=)g(y)f(+)h(z)75 837 y Fz(as)15 b(one)g(desires.)137 905 y(F)l(or)g(another)g(use)g(of)g(the)g(`)p Fu(@q)p Fz(')f(command,)h(see)h(Section)g(5.5.21)d([A)l(T)l(o],)h(page)h(47.)75 1019 y Fq(5.5.23)29 b(`)p Fn(@R)p Fq(':)i(T)-5 b(reat)20 b(next)h(iden)n(ti\014er)g(as)g(in)n(teger-lik)n(e)g(reserv)n(ed)137 1117 y Fz(w)o(ord)15 b(\()p Fw(Fwea)l(ve)p Fz(\))137 1185 y(F)l(or)g(formatting)f(purp)q(oses,)h(treat)g(the)g(next)g(iden)o (ti\014er)i(as)e(an)g(in)o(teger-lik)o(e)i(reserv)o(ed)e(w)o(ord.)137 1254 y(This)f(command)g(is)g(useful)g(in)h(prett)o(y-prin)o(ting)e (certain)h(kinds)h(of)e(macro)g(constructions.)19 b(F)l(urther)75 1308 y(discussion)e(is)f(giv)o(en)f(in)h Fx(h)p Fz(unde\014ned)p Fx(i)h Fz([Macros)d(and)h(formatting],)e(page)i Fx(h)p Fz(unde\014ned)p Fx(i)p Fz(.)75 1423 y Fq(5.5.24)29 b(`)p Fn(@r)p Fq(':)i(Set)21 b(language)f(to)g Fo(Ra)m(tf)o(or)p Fq({77)137 1520 y Fz(See)c(Section)g(5.5.13)d([A)l(TL)p 615 1520 14 2 v 17 w(],)h(page)h(45)g(and)g(Chapter)g(8)g([Languages],) f(page)h(83.)75 1635 y Fq(5.5.25)29 b(`)p Fn(@r9)p Fq(':)j(Set)20 b(language)g(to)g Fo(Ra)m(tf)o(or)p Fq({90)137 1732 y Fz(See)c(Section)g(5.5.13)d([A)l(TL)p 615 1732 V 17 w(],)h(page)h(45)g (and)g(Chapter)g(8)g([Languages],)f(page)h(83.)75 1847 y Fq(5.5.26)29 b(`)p Fn(@u)p Fq(':)i(Unde\014ne)21 b(outer)g(macro)137 1944 y Fs(This)16 b(command)f(b)q(egins)i(the)e(de\014nition)i(part.) 137 2012 y Fz(`)p Fu(@u)p Fz(')d(is)i(the)f(in)o(v)o(erse)h(of)f(`)p Fu(@d)p Fz('.)k(F)l(or)14 b(example,)i(in)g(C)f(the)g(command)g(`)p Fu(@u)g(A)p Fz(')f(tangles)i(to)e(`)p Fu(#undef)g(A)p Fz('.)75 2127 y Fq(5.5.27)29 b(`)p Fn(@v)p Fq(':)i(Ov)n(erload)21 b(op)r(erator)137 2224 y Fs(This)16 b(command)f(b)q(egins)i(the)e (de\014nition)i(part.)137 2293 y Fz(`)p Fu(@v)p Fz(')10 b(is)i(used)f(to)f(c)o(hange)h(the)g(w)o(o)o(v)o(en)g(app)q(earance)g (of)g(an)g(op)q(erator.)17 b(If)11 b(one)g(de\014nes)h(a)f(new)g(op)q (erator,)75 2347 y(for)k(example)h(b)o(y)f(a)g(statemen)o(t)f(suc)o(h)h (as)195 2413 y Fu(interface)23 b(operator\(.BETA.\))75 2481 y Fz(in)16 b Fw(F)o(or)m(tran)p Fz(-90,)f(one)g(should)h(also)f (use)h(an)f(`)p Fu(@v)p Fz(')f(in)i(the)g(de\014nition)h(part|for)d (example,)195 2547 y Fu(@v)24 b(.BETA.)f("\\\\beta")f(+)75 2615 y Fz(F)l(or)f(a)g(detailed)i(discussion)h(of)d(o)o(v)o(erloading)g (\(the)h(output)f(app)q(earance)h(of)t(\))e(op)q(erators,)i(see)g(Sec-) 75 2670 y(tion)15 b(10.2.3)f([Ov)o(erloading],)h(page)g(101.)p eop %%Page: 50 52 50 51 bop 75 -58 a Fz(Chapter)15 b(5:)k Fw(Fweb)e Fz(COMMANDS)1105 b(50)75 183 y Fq(5.5.28)29 b(`)p Fn(@W)p Fq(':)i(Ov)n(erload)21 b(iden)n(ti\014er)137 278 y Fs(This)16 b(command)f(b)q(egins)i(the)e (de\014nition)i(part.)137 343 y Fz(F)l(or)f(a)f(detailed)i(discussion)h (of)d(o)o(v)o(erloading)h(\(the)g(output)g(app)q(earance)g(of)t(\))f (iden)o(ti\014ers,)i(see)f(Sec-)75 398 y(tion)f(10.2.3)f([Ov)o (erloading],)h(page)g(101.)75 497 y Fq(5.5.29)29 b(`)p Fn(@x)p Fq(':)i(T)-5 b(erminate)20 b(ignorable)g(material,)h(or)f(b)r (egin)g(material)g(to)g(b)r(e)262 560 y(c)n(hanged)137 654 y Fz(In)e(a)e(c)o(hange)h(\014le,)h(this)g(command)f(b)q(egins)h (material)f(to)f(b)q(e)i(c)o(hanges;)f(see)h(Section)f(3.3)f([Change)75 709 y(\014les],)f(page)g(13.)137 775 y(In)22 b Fu(web)f Fz(source)h(\014les,)h(this)f(command)g(has)f(a)g(di\013eren)o(t)h (use;)i(see)e(the)f(discussion)i(of)f(the)f(`)p Fu(@z)p Fz(')75 829 y(command)15 b(\(see)g(Section)h(5.5.31)e([A)l(Tz],)g(page) h(50\).)75 936 y Fq(5.5.30)29 b(`)p Fn(@y)p Fq(':)i(Begin)20 b(c)n(hange)h(material)137 1031 y Fz(The)h(`)p Fu(@y)p Fz(')e(command)h(is)g(p)q(ermitted)h(only)g(in)g(c)o(hange)f(\014les.) 39 b(See)22 b(Section)g(3.3)e([Change)h(\014les],)75 1086 y(page)15 b(13.)75 1193 y Fq(5.5.31)29 b(`)p Fn(@z)p Fq(':)i(Begin)20 b(ignorable)g(material,)h(or)f(terminate)g(c)n(hange) 137 1287 y Fw(Fweb)d Fz(\014les)f(ma)o(y)e(b)q(egin)j(with)e(the)g (construction)195 1350 y Fu(@z)195 1402 y(.)195 1454 y(.)195 1506 y(@x)75 1571 y Fz(where)f(the)h(`)p Fu(@z)p Fz(')e(o)q(ccupies)j(the)e(v)o(ery)g(\014rst)g(t)o(w)o(o)f(c)o (haracters)g(of)h(the)g(\014le,)h(and)g(where)f(the)g(`)p Fu(@z)p Fz(')g(and)g(`)p Fu(@x)p Fz(')75 1626 y(m)o(ust)k(b)q(egin)j (in)e(column)h(1.)31 b(Material)19 b(b)q(et)o(w)o(een)g(the)g(`)p Fu(@z)p Fz(')f(and)h(`)p Fu(@x)p Fz(')f(is)h Fs(pure)h(commen)o(tary)h Fz(and)e(is)75 1681 y(ignored)d(b)o(y)f(b)q(oth)g(pro)q(cessors,)g (with)g(one)h(exception.)137 1746 y(The)g(exception)g(is)g(that)f(an)g (R)o(CS-lik)o(e)i(line)g(\(R)o(CS)e(stands)g(for)f(\\revision-con)o (trol)i(system"\))f(with)75 1801 y(syn)o(tax)195 1864 y Fu($Keyword:)23 b(Text)g(of)h(Keyword)e($)75 1929 y Fz(\(at)14 b(least)i(one)f(blank)h(after)f(the)g(colon,)g(and)h(at)e (least)i(one)f(b)q(efore)h(the)f(last)g(dollar)h(sign;)g Fw(unix)e Fz(users,)75 1984 y(see)19 b(`)p Fu(man)c(ident)p Fz('\))j(is)h(parsed,)h(and)g(the)f(text)g(of)f(the)i Fu(Keyword)e Fz(is)h(made)h(a)o(v)m(ailable)g(to)f(the)g(con)o(trol)75 2039 y(co)q(des)c(`)p Fu(@K)p Fz(')e(\(see)i(Section)g(5.5.11)d([A)l (TK)p 777 2039 14 2 v 17 w(],)i(page)g(44\))f(and)i(`)p Fu(@k)p Fz(')e(\(see)h(Section)i(5.5.12)c([A)l(Tk],)i(page)g(44\))75 2094 y(as)k(w)o(ell)h(as)f(to)f Fw(Ft)m(angle)p Fz('s)i(built-in)h (function)f Fu($KEYWORD)e Fz(\(see)h(Section)h(7.2.3.30)d([$KEYW)o (ORD],)75 2148 y(page)f(72.)137 2214 y(A)g(distinction)h(is)g(made)e(b) q(et)o(w)o(een)h(k)o(eyw)o(ords)f(that)g(are)g(found)h(in)h(the)e (ignorable)i(commen)o(tary)e(at)75 2269 y(the)j(b)q(eginning)i(of)e (the)g(master)f(w)o(eb)h(\014le,)h(whic)o(h)g(are)f(called)i Fs(global)e(k)o(eyw)o(ords)p Fz(,)g(and)g(ones)g(that)f(are)75 2324 y(found)g(at)e(the)h(b)q(eginning)j(of)c(\014les)j(included)g(via) f(`)p Fu(@i)p Fz(',)e(whic)o(h)i(are)f(called)h Fs(lo)q(cal)h(k)o(eyw)o (ords)p Fz(.)137 2389 y(The)f(commands)f(that)f(access)i(R)o(CS-lik)o (e)g(k)o(eyw)o(ords)f(function)h(as)e(follo)o(ws:)232 2452 y Fx(\017)30 b Fz(`)p Fu($KEYWORD\(Keyword\))p Fz(')14 b(accesses)k(a)f(global)h(k)o(eyw)o(ord.)26 b(It)18 b(is)g(a)f (built-in)j(function)285 2504 y(that)d(is)h(expanded)g(b)o(y)f Fw(Ft)m(angle)i Fz(\(during)f(output\))e(in)o(to)i(the)f(quoted)h(c)o (haracter)285 2555 y(string)d Fu("Text)g(of)g(Keyword")p Fz(.)232 2618 y Fx(\017)30 b Fz(`)p Fu(@K)p Fz(')17 b(and)h(`)p Fu(@k)p Fz(')e(are)i(expanded)h(during)g(input.)28 b(`)p Fu(@K)p Fz(')17 b(accesses)h(a)g(global)g(k)o(eyw)o(ord,)285 2670 y(whereas)d(`)p Fu(@k)p Fz(')f(accesses)i(a)f(lo)q(cal)h(k)o(eyw)o (ord.)p eop %%Page: 51 53 51 52 bop 75 -58 a Fz(Chapter)15 b(5:)k Fw(Fweb)e Fz(COMMANDS)1105 b(51)232 183 y Fx(\017)30 b Fz(In)16 b(the)g(lim)o(b)q(o)g(section)g (or)f(a)g(T)818 193 y(E)844 183 y(X)g(part,)g Fw(Fwea)l(ve)h Fz(will)h(expand)f(`)p Fu(@K)e(Keyword)h(@>)p Fz(')285 235 y(in)o(to)g Fu(Text)g(of)g(Keyword)f Fz(\(without)h(the)h (surrounding)g(quotes\),)f(and)g(similarly)j(for)285 287 y(`)p Fu(@k)p Fz('.)30 b(\(The)19 b(in)o(ten)o(tion)h(is)g(that)e (the)h(expanded)h(text)f(can)g(b)q(e)h(used)f(as)g(b)q(o)q(dies)h(of) 285 339 y(T)310 349 y(E)336 339 y(X)14 b(macros.\))k Fw(Fwea)l(ve)d Fz(will)h(also)e(prin)o(t)g(the)g(v)m(alues)i(of)d (global)i(k)o(eyw)o(ords)e(at)h(the)285 391 y(end)i(of)f(its)g(output,) g(whether)g(or)g(not)f(they)i(are)f(referenced)h(b)o(y)f(`)p Fu(@K)p Fz('.)232 457 y Fx(\017)30 b Fz(Elsewhere)15 b Fw(Fwea)l(ve)h Fz(will)g(just)e(prin)o(t)h(the)f(k)o(eyw)o(ord)g (name)h(itself,)g(surrounded)g(b)o(y)285 509 y(double)20 b(angle)f(brac)o(k)o(ets.)30 b(If)19 b(the)g(k)o(eyw)o(ord)f(w)o(as)g (lo)q(cal)i(\(`)p Fu(@k)p Fz('\),)d(the)i(brac)o(k)o(ets)f(will)285 561 y(carry)d(the)g(subscript)h(0.)232 628 y Fx(\017)30 b Fw(Ft)m(angle)22 b Fz(treats)f(the)h(global)g(command)g(`)p Fu(@K)14 b(Keyword)h(@>)p Fz(')21 b(essen)o(tially)i(lik)o(e)g(it)285 679 y(do)q(es)14 b(`)p Fu($Keyword)p Fz(',)e(except)j(that)e(the)h (construction)h(is)f(expanded)h(on)f(input)i(rather)285 731 y(than)f(output.)232 798 y Fx(\017)30 b Fw(Ft)m(angle)19 b Fz(expands)h(the)e(command)h(`)p Fu(@k)14 b(keyword)h(@>)p Fz(')j(on)g(input,)i(generating)f(a)285 850 y(quoted)c(string)g(con)o (taining)h(the)g(v)m(alue)g(of)f(the)g(lo)q(cal)h(k)o(eyw)o(ord.)137 936 y(The)f(command)g(`)p Fu(@z)p Fz(')e(is)j(also)e(used)h(in)h(c)o (hange)f(\014les)g(to)f(end)i(a)e(c)o(hange.)20 b(See)15 b(Section)h(3.3)d([Change)75 991 y(\014les],)i(page)g(13.)75 1130 y Fy(5.6)33 b(Con)n(v)n(ersion)23 b(to)f(ASCI)r(I)137 1230 y Fz(Sev)o(eral)e(commands)f(are)g(useful)h(for)e(generating)h (mac)o(hine-indep)q(en)q(den)o(t)j(co)q(de.)32 b(F)l(or)18 b(example,)75 1285 y Fw(Fweb)h Fz(w)o(orks)e(in)o(ternally)i(with)f (the)g(ASCI)q(I)h(c)o(haracter)e(set,)h(so)f(uses)h(these)g(commands)g (hea)o(vily)h(to)75 1340 y(con)o(v)o(ert)d(from)g(the)h(p)q(ossibly)h (non-ASCI)q(I)g(nativ)o(e)f(c)o(haracter)f(set)h(of)f(the)h(mac)o(hine) h(on)e(whic)o(h)i Fw(Fweb)75 1395 y Fz(is)e(running.)75 1515 y Fq(5.6.1)30 b(`)p Fn(@')p Fq(':)h(Con)n(v)n(ert)21 b(c)n(haracter)g(to)f(ASCI)r(I)137 1616 y Fz(The)d(construction)g(`)p Fu(@'c')p Fz(')f(con)o(v)o(erts)g(`)p Fu(c)p Fz(')f(to)h(its)h(ASCI)q (I)h(v)m(alue.)26 b(In)17 b(C)g(and)g(C)p Fu(++)p Fz(,)f(it)h(is)g(con) o(v)o(erted)75 1671 y(to)d(o)q(ctal;)g(for)g(example,)h(`)p Fu(@'A')p Fz(')d(is)j(output)f(as)g(`)p Fu(0101)p Fz('.)k(In)d Fw(F)o(or)m(tran)g Fz(and)f Fw(Ra)m(tf)o(or)p Fz(,)h(it)f(is)h(con)o(v) o(erted)75 1726 y(to)g(decimal;)h(the)f(previous)h(example)g(w)o(ould)g (b)q(e)g(output)f(as)f(`)p Fu(65)p Fz('.)137 1797 y(If)19 b(the)f(nativ)o(e)g(c)o(haracter)f(set)h(of)g(one's)g(mac)o(hine)h(is)f (ASCI)q(I,)h(the)f(con)o(v)o(ersion)g(will)i(not)e(b)q(e)h(done)75 1852 y(unless)d(the)g(`)p Fu(-A)p Fz(')e(command-line)j(option)e(is)h (used.)k(See)c(Section)g(4.2.5)e([-A)p 1391 1852 14 2 v 16 w(],)g(page)h(17.)75 1972 y Fq(5.6.2)30 b(`)p Fn(@")p Fq(':)h(Con)n(v)n(ert)21 b(string)g(to)f(ASCI)r(I)137 2073 y Fz(The)15 b(construction)g(`)p Fu(@"abc")p Fz(')e(con)o(v)o (erts)h(the)g(enclosed)i(string)f(to)e(its)i(ASCI)q(I)h(represen)o (tation.)k(F)l(or)75 2128 y(example,)c(in)g(C)f(and)g(C)p Fu(++)g Fz(`)p Fu(@"abc")p Fz(')e(will)k(b)q(e)f(output)f(as)g(`)p Fu("\\141\\142\\143")p Fz('.)137 2199 y(In)h Fw(F)o(or)m(tran)f Fz(and)g Fw(Ra)m(tf)o(or)p Fz(,)g(no)f(suc)o(h)i(simple)g(mec)o(hanism) f(exists)g(in)h(the)f(language,)f(so)h(a)f(func-)75 2254 y(tion)c(call)i(is)e(issued.)20 b(F)l(or)9 b(example,)j(the)e(previous) h(example)g(w)o(ould)f(b)q(e)h(output)f(as)g(`)p Fu(ASCIIstr\('abc'\))p Fz('.)p 1896 2263 21 41 v 75 2309 a(The)k(user)g(is)h(resp)q(onsible)g (for)f(de\014ning)h(the)f(function)h(`)p Fu(ASCIIstr)p Fz('.)i(The)d(name)g(of)g(this)g(function)h(can)75 2364 y(b)q(e)h(c)o(hanged)f(b)o(y)h(the)f(st)o(yle-\014le)h(en)o(try)f(`)p Fu(ASCII_fcn)p Fz('.)j(See)e(Section)g(12.3.8.1)d([ASCI)q(I)p 1573 2364 14 2 v 17 w(fcn],)i(page)g(118.)137 2435 y(If)k(the)f(nativ)o (e)g(c)o(haracter)f(set)h(of)g(one's)g(mac)o(hine)h(is)f(ASCI)q(I,)h (the)f(con)o(v)o(ersion)g(will)i(not)e(b)q(e)h(done)75 2490 y(unless)d(the)g(`)p Fu(-A)p Fz(')e(command-line)j(option)e(is)h (used.)k(See)c(Section)g(4.2.5)e([-A)p 1391 2490 V 16 w(],)g(page)h(17.)75 2629 y Fy(5.7)33 b(F)-6 b(orw)n(ard)23 b(referencing)p eop %%Page: 52 54 52 53 bop 75 -58 a Fz(Chapter)15 b(5:)k Fw(Fweb)e Fz(COMMANDS)1105 b(52)75 183 y Fq(5.7.1)30 b(`)p Fn(@[)p Fq(':)h(Mark)21 b(as)f(de\014ned)137 285 y Fz(This)f(command)f(marks)g(the)g(next)h (\(non-reserv)o(ed\))f(iden)o(ti\014er)i(that)e(app)q(ears)g(after)g (the)g(`)p Fu(@[)p Fz(')f(as)75 340 y(b)q(eing)f(de\014ned)h(in)f(the)f (curren)o(t)g(section.)21 b(It)15 b(is)g(usually)i(issued)f (automatically;)f(for)g(example,)g(`)p Fu(@a)p Fz(')f(is)75 395 y(equiv)m(alen)o(t)j(to)d(`)p Fu(@A@[)p Fz(',)g(`)p Fu(@d)p Fz(')g(is)i(equiv)m(alen)o(t)h(to)d(`)p Fu(@D@[)p Fz(',)g(and)h(`)p Fu(@m)p Fz(')f(is)i(equiv)m(alen)o(t)h(to)d(`)p Fu(@M@[)p Fz('.)137 468 y(If)f(the)g(appropriate)g(st)o(yle-\014le)h (parameter)e Fu(mark_defined.???)e Fz(is)j(1,)g(this)g(command)f (causes)h(an)o(y)75 522 y(app)q(earance)g(of)f(the)h(iden)o(ti\014er)h (to)e(b)q(e)h(subscripted)h(with)f(a)f(section)h(n)o(um)o(b)q(er.)19 b(F)l(or)12 b(more)g(information,)75 577 y(see)j(Section)i(12.3.4)c ([Subscript)j(params],)e(page)h(114.)137 650 y(The)h(utilit)o(y)g(of)f (this)g(command)h(can)f(b)q(e)h(seen)f(from)g(the)g(c)o(haracteristic)h (construction)195 720 y Fu(@)24 b(This)f(is)h(section)f(5.)195 772 y(@a)h(@\045)f(Issues)g(an)h(implicit)f(@[,)g(which)g(marks)g (|test|)g(as)h(defined)f(in)h(section)e(5.)386 824 y(subroutine)g(test) 386 876 y(...)386 927 y(end)195 1031 y(@)i(This)f(is)h(section)f(6.)195 1083 y(@a)386 1135 y(program)g(main)386 1187 y(call)g(test)h(//)f(This) g(will)h(print)f(as)h($|test|_5$.)386 1239 y(end)137 1312 y Fz(The)17 b(`)p Fu(@[)p Fz(')e(command)g(should)i(b)q(e)g (distinguished)i(from)c(`)p Fu(@_)p Fz(')g(\(see)h(Section)h(5.10)e([A) l(T)p 1638 1312 14 2 v 16 w(],)g(page)h(54\).)75 1366 y(The)j(latter)f(causes)g(the)h(index)h(en)o(try)e(for)f(the)i(iden)o (ti\014er)h(to)e(b)q(e)h(underlined;)j(the)d(former)e(p)q(ossibly)75 1421 y(causes)f(the)g(iden)o(ti\014er)i(to)d(b)q(e)i(subscripted)g(b)o (y)f(a)g(section)h(n)o(um)o(b)q(er.)22 b(One)17 b(ma)o(y)f(wish)g(to)g (turn)g(o\013)f(the)75 1476 y(subscripts)f(b)q(ecause)f(they)g(b)q (ecome)h(to)q(o)e(cluttered;)i(ho)o(w)o(ev)o(er,)e(the)h(underlined)i (index)f(en)o(tries)g(remain)75 1531 y(useful)i(and)g(unobtrusiv)o(e.) 75 1673 y Fy(5.8)33 b(Commen)n(ts)137 1775 y Fw(Fweb)20 b Fz(supp)q(orts)g(a)e(v)m(ariet)o(y)i(of)e(commen)o(ting)h(st)o(yles)h (b)q(orro)o(w)o(ed)e(from)g(C,)h(C)p Fu(++)p Fz(,)g(and)g(T)1717 1785 y(E)1743 1775 y(X.)g(F)l(or)75 1830 y(more)c(discussion,)h(see)g (Chapter)f(6)g([Commen)o(ts],)e(page)i(60.)75 1953 y Fq(5.8.1)30 b(`)p Fn(@/*)p Fq(':)h(Begin)20 b(long)g(v)n(erbatim)h (commen)n(t)137 2055 y Fz(The)16 b(follo)o(wing)f(commen)o(t)g(is)g (copied)i(to)d(the)h(tangled)g(output.)20 b(\(By)15 b(default,)g (commen)o(ts)g(are)f(not)75 2110 y(copied.\))20 b(If)12 b(y)o(ou)f(desire)i(all)f(commen)o(ts)f(to)h(b)q(e)g(so)f(copied,)i (use)g(`)p Fu(-v)p Fz('.)k(See)c(Section)f(4.2.64)e([-v],)h(page)h(32.) 75 2233 y Fq(5.8.2)30 b(`)p Fn(@//)p Fq(':)h(Begin)20 b(short)g(v)n(erbatim)h(commen)n(t)137 2335 y Fz(See)16 b(the)f(discussion)i(of)e(`)p Fu(@/*)p Fz(')f(in)i(Section)g(5.8.2)e ([A)l(T//],)f(page)i(52.)75 2459 y Fq(5.8.3)30 b(`)p Fn(@\045)p Fq(':)h(Ignorable)20 b(commen)n(t)137 2560 y Fz(If)d(an)o(y)g(line)i(in)e(a)g(w)o(eb)g(source)g(co)q(de)g(con)o (tains)g(the)g(command)g(`)p Fu(@\045)p Fz(',)f(all)i(remaining)g (material)f(on)75 2615 y(that)e(line)i(\(to)d(and)i(including)i(the)d (newline)i(c)o(haracter\))e(is)h(ignored)f(b)o(y)h(the)f(input)i(driv)o (er)e(and)h(nev)o(er)75 2670 y(pro)q(cessed)g(at)e(all.)p eop %%Page: 53 55 53 54 bop 75 -58 a Fz(Chapter)15 b(5:)k Fw(Fweb)e Fz(COMMANDS)1105 b(53)137 183 y(A)12 b(stronger)f(form)g(of)g(this)i(command)e(is)i(`)p Fu(@\045\045)p Fz('.)k(This)c(deletes)g(the)e(curren)o(t)h(line)i(as)d (w)o(ell)i(an)o(y)e(empt)o(y)75 238 y(lines)17 b(that)e(immediately)i (follo)o(w.)k(This)16 b(command)f(is)h(particularly)h(useful)f(when)g (the)g(N)f(mo)q(de)h(is)g(in)75 293 y(e\013ect.)k(See)15 b(Section)i(5.5.17)c([A)l(TN)p 697 293 14 2 v 16 w(],)h(page)i(46.)137 360 y(Line-n)o(um)o(b)q(ering)21 b(problems)e(can)f(arise)g(when)h (these)f(commands)g(are)g(used.)29 b(F)l(or)18 b(a)g(discussion,)75 415 y(see)d(Section)i(4.2.59.6)12 b([-T#],)i(page)h(31.)75 527 y Fq(5.8.4)30 b(`)p Fn(@?)p Fq(':)h(Begin)20 b(compiler)g(directiv) n(e)137 623 y Fz(The)13 b(remainder)h(of)f(the)g(line)h(is)g(pro)q (cessed)f(as)g(a)f(compiler)i(directiv)o(e.)21 b(Optional)14 b(material)f(ma)o(y)f(b)q(e)75 678 y(inserted)i(automatically)g(at)f (the)h(b)q(eginning)h(of)e(the)h(tangled)g(output)f(line)i(b)o(y)f (means)f(of)g(the)h(st)o(yle-\014le)75 733 y(option)h Fu(cdir_start)p Fz(.)k(See)d(Section)g(12.3.8)d([Miscellaneous)k (params],)d(page)h(118.)75 845 y Fq(5.8.5)30 b(`)p Fn(@\()p Fq(':)h(Begin)20 b(meta-commen)n(t)137 942 y Fz(Material)15 b(b)q(et)o(w)o(een)h(`)p Fu(@\()p Fz(')e(and)h(`)p Fu(@\))p Fz(')g(is)g(treated)g(in)h(the)f(N)h(mo)q(de.)k(F)l(or)14 b(example,)195 1006 y Fu(@\()195 1058 y(Comment)23 b(1)195 1110 y(Comment)g(2)195 1162 y(@\))137 1229 y Fz(St)o(yle-\014le)e (parameters)c(allo)o(w)i(optional)g(material)g(to)f(b)q(e)i(insert)f (at)f(the)g(b)q(eginning)j(and)e(end)g(of)75 1284 y(the)c(meta-commen)o (t,)f(and)h(at)g(the)g(b)q(eginning)i(of)e(eac)o(h)g(line)i(of)d (output.)20 b(F)l(or)14 b(more)h(information,)g(see)75 1339 y(the)h(st)o(yle-\014le)h(parameters)f(b)q(eginning)i(with)e(`)p Fu(meta)p Fz(')f(\(see)h(Section)h(12.3.8)d([Miscellaneous)j(params],) 75 1393 y(page)e(118\).)75 1506 y Fq(5.8.6)30 b(`)p Fn(@\))p Fq(':)h(End)21 b(meta-commen)n(t)137 1602 y Fz(See)16 b(the)f(discussion)i(of)e(`)p Fu(@\()p Fz(',)f(Section)i(5.8.5)d([A)l (Tlp],)i(page)h(53.)75 1731 y Fy(5.9)33 b(Sp)r(ecial)23 b(left)g(brace)137 1827 y Fz(The)e(command)g(`)p Fu(@{)p Fz(')f(is)h(useful)h(in)g(C/C)p Fu(++)e Fz(programming)g(to)h(b)q (eautify)g(some)g(of)g(the)g(prett)o(y-)75 1882 y(prin)o(ting.)40 b(It)21 b(translates)g(in)o(to)h(a)f(left)h(brace,)h(but)f(also)f (suppresses)h(the)g(automatic)f(insertion)h(of)75 1937 y(newlines)17 b(in)o(to)f(the)f(subsequen)o(t)h(function)g(b)q(o)q(dy)h (or)d(blo)q(c)o(k.)22 b(This)16 b(is)g(desirable)h(for)d(v)o(ery)h (short)g(func-)75 1991 y(tions,)g(suc)o(h)h(as)e(simple)j(constructors) d(in)i(C)p Fu(++)p Fz(.)k(F)l(or)14 b(example,)195 2056 y Fu(class)23 b(C)195 2108 y({)195 2160 y(private:)386 2212 y(int)g(i;)195 2315 y(public:)386 2367 y(C\(int)g(i0\))h(@{i)f(=)h (i0;})195 2419 y(})75 2486 y Fz(Here)15 b(the)h(function)g(will)h(b)q (e)e(t)o(yp)q(eset)h(as)195 2551 y Fu(C\(int)23 b(i0\))243 2603 y({)g(i)h(=)g(i0;)f(})75 2670 y Fz(rather)15 b(than)g(the)g (default)p eop %%Page: 54 56 54 55 bop 75 -58 a Fz(Chapter)15 b(5:)k Fw(Fweb)e Fz(COMMANDS)1105 b(54)195 183 y Fu(C\(int)23 b(i0\))243 235 y({)243 287 y(i)g(=)h(i0;)243 339 y(})75 456 y Fy(5.10)32 b(Index)24 b(en)n(tries)137 548 y Fz(Although)18 b(most)e(information)g(for)h(the) f(Index)i(is)g(gathered)e(automatically)l(,)i(in)f(some)g(situations)75 603 y(it)e(m)o(ust)g(b)q(e)h(done)g(b)o(y)f(hand.)75 703 y Fq(5.10.1)29 b(`)p Fn(@_)p Fq(':)i(F)-5 b(orce)20 b(index)h(en)n(try)h(to)e(b)r(e)g(underlined)137 795 y Fz(This)14 b(command)f(applies)h(to)f(the)g(next)g(iden)o(ti\014er)h (that)e(app)q(ears)i(after)e(the)h(`)p Fu(@_)p Fz('.)18 b(The)13 b(index)h(en)o(try)75 850 y(for)h(that)f(iden)o(ti\014er)j (will)g(b)q(e)f(underlined.)22 b(\(By)15 b(con)o(v)o(en)o(tion,)g(this) h(means)f(`de\014ned')h(or)e(`declared'.\))137 913 y(This)19 b(command)f(is)g(usually)h(issued)h(automatically)l(.)28 b(F)l(or)18 b(example,)h(the)f(index)h(en)o(tries)g(for)e(the)75 968 y(v)m(ariables)h(`)p Fu(i)p Fz(')d(and)i(`)p Fu(j)p Fz(')e(in)i(the)g(C)f(statemen)o(t)f(`)p Fu(int)f(i,)h(j;)p Fz(')h(will)i(b)q(e)f(underlined,)i(since)e Fw(Fwea)l(ve)g Fz(un-)75 1023 y(derstands)d(enough)g(of)g(the)g(syn)o(tax)f(to)g(kno)o (w)g(that)g(v)m(ariables)j(are)d(b)q(eing)i(de\014ned.)21 b(Macro)13 b(de\014nitions)75 1077 y(\(b)q(egun)j(b)o(y)f(`)p Fu(@D)p Fz(')f(or)h(`)p Fu(@M)p Fz('\))f(will)i(also)g(b)q(e)f (underlined)j(automatically)l(.)75 1178 y Fq(5.10.2)29 b(`)p Fn(@-)p Fq(':)i(Delete)21 b(index)g(en)n(try)137 1270 y Fz(This)c(command)g(applies)h(to)e(the)h(next)g(iden)o(ti\014er) h(that)e(app)q(ears)g(after)g(the)h(`)p Fu(@-)p Fz(';)f(it)h(prev)o(en) o(ts)f(an)75 1325 y(index)e(en)o(try)f(asso)q(ciated)h(with)f(that)g (iden)o(ti\014er)h(from)f(b)q(eing)h(made.)19 b(This)14 b(migh)o(t)f(b)q(e)h(useful)g(when)g(the)75 1379 y(N)h(mo)q(de)h(is)f (in)h(e\013ect.)75 1479 y Fq(5.10.3)29 b(`)p Fn(@+)p Fq(':)i(F)-5 b(orce)20 b(index)h(en)n(try)137 1572 y Fz(This)g(command)f(applies)i(to)e(the)g(next)g(iden)o(ti\014er)i(that) e(app)q(ears)g(after)g(the)g(`)p Fu(@+)p Fz(';)i(it)e(forces)g(an)75 1627 y(index)g(en)o(try)f(for)g(that)f(iden)o(ti\014er.)34 b(It)19 b(is)g(particularly)i(useful)f(when)g(the)f(language)g(is)h Fw(verba)m(tim)p Fz(,)75 1681 y(since)c(cross-referencing)g(is)g (turned)g(o\013)e(in)i(that)f(case.)75 1781 y Fq(5.10.4)29 b(`)p Fn(@^)p Fq(':)i(Mak)n(e)22 b(index)f(en)n(try)g(\(Roman)f(t)n(yp) r(e\))137 1874 y Fz(T)l(o)15 b(insert)h(one's)f(o)o(wn)f(index)j(en)o (try)e(in)h(Roman)f(t)o(yp)q(e,)g(sa)o(y)f(`)p Fu(@^)p Fs(My)h(en)o(try)t Fu(@>)p Fz('.)75 1974 y Fq(5.10.5)29 b(`)p Fn(@.)p Fq(':)i(Mak)n(e)22 b(index)f(en)n(try)g(\(t)n(yp)r (ewriter)g(t)n(yp)r(e\))137 2066 y Fz(T)l(o)15 b(insert)h(one's)f(o)o (wn)f(index)j(en)o(try)e(in)h(t)o(yp)q(ewriter)f(t)o(yp)q(e,)g(sa)o(y)f (`)p Fu(@.)p Fs(My)h(en)o(try)t Fu(@>)p Fz('.)75 2166 y Fq(5.10.6)29 b(`)p Fn(@9)p Fq(':)i(Mak)n(e)22 b(index)f(en)n(try)g (\(user-de\014ned)g(format\))137 2258 y Fz(The)15 b(construction)g(`)p Fu(@9)p Fs(T)l(ext)q Fu(@>)p Fz(')e(is)i(used)g(to)f(create)h(an)f (index)i(en)o(try)e(in)i(a)e(format)f(de\014ned)j(b)o(y)f(the)75 2313 y(user.)28 b(It)18 b(is)g(asso)q(ciated)g(with)g(the)g(macro)f Fu(\\9)p Fz(,)g(whic)o(h)i(will)g(b)q(e)g(called)g(during)g(T)1509 2323 y(E)1534 2313 y(X's)f(pro)q(cessing)g(of)75 2368 y(the)d(Index)i(as)d Fu(\\9{)p Fs(T)l(ext)q Fu(})p Fz(.)20 b(The)15 b(user)g(m)o(ust)g(de\014ne)h Fu(\\9)f Fz(according)h(to)e (the)i(format)195 2428 y Fu(\\def\\9#1{...})75 2492 y Fz(where)f(argumen)o(t)f(`)p Fu(#1)p Fz(')f(is)j(the)e(text)g(b)q(et)o (w)o(een)h(`)p Fu(@9)p Fz(')f(and)h(`)p Fu(@>)p Fz('.)j(F)l(or)c (example,)i(to)e(prin)o(t)h(that)f(text)g(in)h(a)75 2546 y(sans)g(serif)h(fon)o(t,)e(sa)o(y)195 2607 y Fu(\\def\\9#1{{\\sf)22 b(#1}})75 2670 y Fz(\(Note)15 b(the)g(extra)f(lev)o(el)j(of)e(braces)g (to)f(prev)o(en)o(t)h(the)h(fon)o(t)e(command)h(from)g(propagating.\))p eop %%Page: 55 57 55 56 bop 75 -58 a Fz(Chapter)15 b(5:)k Fw(Fweb)e Fz(COMMANDS)1105 b(55)75 183 y Fy(5.11)32 b(Con)n(trol)23 b(text)137 279 y Fs(Con)o(trol)c(text)h Fz(is)g(material)g(terminated)g(b)o(y)g(`)p Fu(@>)p Fz(';)g(it)g(m)o(ust)f(b)q(e)h(all)h(on)e(one)h(line)h(and)f(m) o(ust)f(not)75 334 y(con)o(tain)c(an)o(y)g(`)p Fu(@)p Fz('s.)75 444 y Fq(5.11.1)29 b(`)p Fn(@t)p Fq(':)i(Put)21 b(con)n(trol)f(text)h(in)n(to)f(a)h(T)1065 456 y(E)1097 444 y(X)f Fn(\\)p Fq(h)n(b)r(o)n(x)h(\()p Fo(Fwea)l(ve)p Fq(\))137 540 y Fz(When)d Fw(Fwea)l(ve)g Fz(sees)f(the)h(command)f(`)p Fu(@t)p Fs(con)o(trol)d(text)q Fu(@>)p Fz(',)i(it)i(pac)o(k)m(ages)f (the)g(con)o(trol)g(text)g(in)o(to)75 594 y(an)e Fu(\\hbox)g Fz(and)g(ships)h(it)g(to)e(the)h(output.)20 b(This)c(command)f(is)h (ignored)f(b)o(y)h Fw(Ft)m(angle)p Fz(.)75 705 y Fq(5.11.2)29 b(`)p Fn(@=)p Fq(':)i(P)n(ass)21 b(con)n(trol)g(text)f(v)n(erbatim)i (to)e(the)g(output)137 800 y Fz(F)l(or)h Fw(Ft)m(angle)p Fz(,)i(the)f(command)f(`)p Fu(@=)p Fs(con)o(trol)14 b(text)q Fu(@>)p Fz(')20 b(sends)i(the)f(con)o(trol)g(text)g(to)g(the)g(output) 75 855 y(exactly)16 b(as)e(input.)21 b Fw(Fwea)l(ve)16 b Fz(highligh)o(ts)h(the)e(con)o(trol)g(text)g(b)o(y)g(dra)o(wing)g(a)g (b)q(o)o(x)g(around)g(it.)75 982 y Fy(5.12)32 b(Spacing)137 1078 y Fz(The)18 b(spacing)g(commands)f(are)h(used)g(to)f(re\014ne)h Fw(Fwea)l(ve)p Fz('s)g(prett)o(y-prin)o(ted)f(output.)27 b(Generally)75 1132 y(it's)15 b(not)g(necessary)g(to)g(b)q(other)g (with)h(these)f(un)o(til)h(one)g(is)f(putting)h(the)f(\014nal)h(touc)o (hes)f(on)h(a)e(co)q(de.)75 1242 y Fq(5.12.1)29 b(`)p Fn(@,)p Fq(':)i(Insert)21 b(a)f(thin)h(space)137 1338 y Fz(Extra)10 b(spacings)i(are)e(sometimes)h(necessary)h(when)f(w)o (orking)g(with)g(un)o(usual)h(macro)e(constructions.)75 1393 y(`)p Fu(@,)p Fz(')k(inserts)i(a)f(thin)h(space,)f(analogous)f(to) h(T)866 1403 y(E)892 1393 y(X's)f Fu(\\,)p Fz(.)137 1460 y(An)i(example)g(where)f(explicit)j(spacing)d(w)o(ould)h(b)q(e)g (necessary)f(is)h(as)f(follo)o(ws:)195 1523 y Fu(@c)195 1575 y(@)195 1627 y(@m)24 b(OP)f(+)195 1679 y(@m)h(A\(x,y\))f(x)g(@,)h (OP)g(@,)f(y)195 1783 y(@a)195 1835 y(z)h(=)f(A\(a,)h(b\);)75 1901 y Fz(Without)18 b(the)h(`)p Fu(@,)p Fz(''s,)f(the)g(b)q(o)q(dy)i (of)e(the)h Fu(A)f Fz(macro)g(will)i(w)o(ea)o(v)o(e)e(as)g(the)h(unapp) q(ealing)i(`)p Fu(xOPy)p Fz('.)28 b(This)75 1956 y(o)q(ccurs)13 b(b)q(ecause)g(although)f Fu(OP)g Fz(is)h(de\014ned)h(to)d(b)q(e)i(a)f (binary)h(op)q(erator,)f Fw(Fwea)l(ve)h Fz(thinks)g(of)f(it)g(as)g (just)g(a)75 2011 y(mere)j(expression,)g(and)g(one)g(of)f(its)h (fundamen)o(tal)g(pro)q(duction)h(rules)f(is)h(to)e(concatenate)g (expressions)75 2066 y(with)i(no)f(in)o(terv)o(ening)h(expressions.)137 2132 y(This)d(demonstrates)f(that)g(situations)h(arise)g(in)g(whic)o(h) g(one)g(needs)g(to)f(o)o(v)o(erride)h Fw(Fwea)l(ve)p Fz('s)f(default)75 2187 y(pro)q(cessing.)21 b(But)14 b(for)g(the)h(ab)q(o)o(v)o(e)f(example,)h(there)g(is)g(actually)g(a)f (b)q(etter)h(solution.)20 b(Instead)15 b(of)f(using)75 2242 y(the)f(`)p Fu(@,)p Fz(''s,)f(include)k(the)d(format)f(command)i (`)p Fu(@f)g(OP)h($_BINOP_)p Fz('.)j(See)c(Section)g(5.5.8)e([A)l(Tf)t (],)g(page)h(42.)75 2352 y Fq(5.12.2)29 b(`)p Fn(@/)p Fq(':)i(F)-5 b(orce)20 b(a)h(line)f(break,)h(preserving)g(inden)n (tation.)137 2448 y Fz(This)d(command)f(is)h(used)g(to)e(o)o(v)o (erride)h Fw(Fwea)l(ve)p Fz('s)h(natural)f(inclinations.)28 b(F)l(or)17 b(example,)h(if)g(one)75 2503 y(w)o(an)o(ts)c(eac)o(h)h (piece)i(of)e(a)g(declaration)h(to)e(app)q(ear)i(on)f(a)g(separate)f (line,)j(one)e(can)g(sa)o(y)195 2566 y Fu(int@/)243 2618 y(i,@/)243 2670 y(j,@/)p eop %%Page: 56 58 56 57 bop 75 -58 a Fz(Chapter)15 b(5:)k Fw(Fweb)e Fz(COMMANDS)1105 b(56)243 183 y Fu(k;)137 249 y Fz(This)16 b(command)f(preserv)o(es)f (the)h(natural)g(inden)o(tation)h(that)e(w)o(ould)i(ha)o(v)o(e)e(happ)q (ened)j(if)e Fw(Fwea)l(ve)75 303 y Fz(or)g(LaT)207 313 y(E)233 303 y(X)g(had)h(brok)o(en)f(a)h(long)f(line)i(sp)q(on)o (taneously)l(.)22 b(Th)o(us,)15 b(the)h(declared)h(v)m(ariables)f(are)g (inden)o(ted)75 358 y(in)h(the)f(ab)q(o)o(v)o(e)f(example.)23 b(T)l(o)16 b(remo)o(v)o(e)f(that)h(inden)o(t,)g(use)h(`)p Fu(@\\)p Fz(')d(instead.)23 b(See)17 b(Section)g(5.12.3)d([A)l(Tbs],)75 413 y(page)h(56.)137 478 y(T)l(ry)g(to)g(use)g(the)h(line-break)h (commands)e(sparingly|i.e.,)h(let)g Fw(Fwea)l(ve)g Fz(do)f(the)g(w)o (ork.)k(Often,)c(if)75 533 y(lines)g(run)f(together)f(in)h(an)f(unexp)q (ected)j(or)d(unreadable)h(w)o(a)o(y)l(,)f(it's)g(b)q(ecause)i Fw(Fwea)l(ve)f Fz(w)o(asn't)e(able)j(to)75 588 y(parse)h(the)h(relev)m (an)o(t)g(blo)q(c)o(k)h(of)e(co)q(de,)h(p)q(erhaps)g(b)q(ecause)g(it)g (didn't)g(understand)h(that)d(some)i(v)m(ariable)75 643 y(in)f(an)g(include)i(\014le)f(has)e(a)h(sp)q(ecial)h(meaning.)22 b(In)16 b(suc)o(h)g(cases,)g(trying)f(to)g(\014x)h(things)g(with)g(`)p Fu(@/)p Fz(')f(is)h(the)75 697 y(wrong)d(solution.)20 b(Either)15 b(use)f(`)p Fu(@f)p Fz(')e(\(see)i(Section)h(5.5.8)d([A)l (Tf)t(],)h(page)g(42\))g(or)h(`)p Fu(-H)p Fz(')e(\(see)i(Section)h (4.2.17)75 752 y([-H)p 140 752 14 2 v 16 w(],)g(page)g(20\).)137 817 y(Distinguish)g(the)e(`)p Fu(@/)p Fz(')f(command)h(from)f(`)p Fu(@|)p Fz(')h(\(see)g(Section)h(5.2.2)d([A)l(T)p Fu(|)p Fz(],)h(page)h(39\),)g(whic)o(h)h(inserts)75 872 y(an)h(optional)h (breakp)q(oin)o(t)g(in)o(to)f(an)g(expression.)75 978 y Fq(5.12.3)29 b(`)p Fn(@\\)p Fq(':)i(F)-5 b(orce)20 b(a)h(line)f(break,)h(then)g(inden)n(t)137 1073 y Fz(The)c(`)p Fu(@\\)p Fz(')e(command)i(b)q(eha)o(v)o(es)g(lik)o(e)g(`)p Fu(@/)p Fz(')f(\(see)g(Section)i(5.12.2)c([A)l(T/],)i(page)g(55\),)g (except)h(that)f(it)75 1128 y(bac)o(kspaces)d(one)f(notc)o(h)g(after)g (the)g(line)i(break.)19 b(This)13 b(usually)h(has)e(the)h(e\013ect)f (of)g(undoing)h(the)g(natural)75 1182 y(inden)o(tation)i(that)e(w)o (ould)h(ha)o(v)o(e)g(b)q(een)h(inserted)f(had)g(a)g(long)g(line)i(b)q (een)f(sp)q(on)o(taneously)f(brok)o(en.)19 b(One)75 1237 y(common)14 b(case)h(where)g(the)g(`)p Fu(@\\)p Fz(')f(command)h(migh)o (t)f(b)q(e)i(used)f(w)o(ould)h(b)q(e)f(to)f(put)h(the)g(return)g(t)o (yp)q(e)g(of)f(a)75 1292 y(C)h(function)h(on)f(a)g(separate)g(line:)195 1354 y Fu(int)23 b(@\\)195 1406 y(main\(\))195 1458 y({})137 1523 y Fz(It)15 b(w)o(ould)f(b)q(e)h(nice)h(to)e(ha)o(v)o(e)g Fw(Fwea)l(ve)h Fz(do)f(that)g(automatically)l(.)20 b(Unfortunately)l(,) 14 b(the)h(syn)o(tax)e(of)h(a)75 1578 y(function)i(isn't)f(recognized)h (un)o(til)g(the)f(op)q(ening)h(braces)f(are)g(sensed;)g(b)o(y)g(that)f (time,)h(the)g(declaration)75 1633 y(part)f(of)h(the)g(statemen)o(t)f (has)h(already)g(b)q(een)i(pro)q(cessed.)j(This)c(is)f(one)g(example)h (of)f(the)g(fact)g(that)f(the)75 1688 y Fw(Fweb)19 b Fz(pro)q(cessors)g(are)f(m)o(uc)o(h)g(less)h(in)o(telligen)o(t)h(and)f (sophisticated)g(than)g(language)f(compilers.)31 b(A)75 1743 y(clev)o(er)16 b(\(and)f(simple\))h(idea)g(for)f(getting)g(around) g(this)h(kind)g(of)f(problem)h(is)f(lac)o(king)h(at)f(this)h(p)q(oin)o (t.)75 1849 y Fq(5.12.4)29 b(`)p Fn(@|)p Fq(':)i(Literal)21 b(v)n(ertical)g(bar,)f(or)h(optional)e(line)i(break)137 1943 y Fz(In)13 b(the)g(T)292 1953 y(E)317 1943 y(X)g(\(do)q(cumen)o (tation\))f(part)g(of)g(a)g(section,)i(`)p Fu(@|)p Fz(')d(inserts)i(a)f (v)o(ertical)h(bar.)19 b(Here's)12 b(a)g(LaT)1815 1953 y(E)1841 1943 y(X)75 1998 y(example:)195 2060 y Fu(\\begin{verbatim}) 243 2112 y(The)23 b(constructions)f(@|x@|)h(and)h(|x|)f(are)h(very)f (different.)195 2164 y(\\end{verbatim})75 2229 y Fz(Y)l(ou)15 b(migh)o(t)g(wish)h(to)f(try)f(this)i(out)f(to)f(see)i(what)f Fw(Fwea)l(ve)h Fz(pro)q(duces.)137 2295 y(In)g(a)f(co)q(de)h(part,)e(`) p Fu(@|)p Fz(')g(inserts)i(an)f(optional)h(line)g(break)g(in)g(an)f (expression.)75 2401 y Fq(5.12.5)29 b(`)p Fn(@#)p Fq(':)i(Blank)21 b(line)137 2495 y Fz(`)p Fu(@#)p Fz(')15 b(forces)g(a)h(line)h(break)f (with)g(some)f(extra)g(v)o(ertical)h(white)h(space.)k(Ho)o(w)o(ev)o (er,)15 b(note)g(that)g Fs(blank)75 2550 y(lines)i(in)f(the)f(source)g (are)g(signi\014can)o(t)p Fz(,)h(so)f(this)g(command)h(should)g(seldom) g(if)f(ev)o(er)g(b)q(e)h(necessary)l(.)137 2615 y(if)e(`)p Fu(@#)p Fz(')e(is)h(immediately)i(follo)o(w)o(ed)e(b)o(y)g(a)g(letter)g (\(e.g.,)f(`)p Fu(@#if)p Fz('\),)g(it)h(is)h(assumed)f(that)f(a)h (prepro)q(cessor)75 2670 y(command)i(is)h(b)q(eginning.)22 b(See)16 b(Section)g(7.3)e([Prepro)q(cessing],)h(page)g(80.)p eop %%Page: 57 59 57 58 bop 75 -58 a Fz(Chapter)15 b(5:)k Fw(Fweb)e Fz(COMMANDS)1105 b(57)75 183 y Fq(5.12.6)29 b(`)p Fn(@~)p Fq(':)i(Cancel)21 b(line)g(break)137 285 y Fz(`)p Fu(@~)p Fz(')f(is)h(analogous)g(to)f(T) 584 295 y(E)610 285 y(X's)g(`)p Fu(~)p Fz(')g(\(tie\);)j(it)f(prev)o (en)o(ts)e(a)h(line)h(break,)g(whic)o(h)g Fw(Fwea)l(ve)g Fz(usually)75 340 y(inserts)16 b(after)e(eac)o(h)h(complete)h(statemen) o(t)e(it)i(recognizes.)k(F)l(or)15 b(example,)195 409 y Fu(printf\("Working..."\);)21 b(@~)j(fflush\(stdout\);)195 461 y(x)g(=)f(y;)h(@~)g(break;)75 584 y Fq(5.12.7)29 b(`)p Fn(@&)p Fq(':)i(Join)20 b(items)137 685 y Fz(During)13 b Fw(Fwea)l(ve)p Fz('s)g(output,)f(`)p Fu(@&)p Fz(')f(joins)i(the)f (items)h(to)f(either)h(side)g(with)g(no)f(spaces)g(or)g(line)i(breaks) 75 740 y(in)o(b)q(et)o(w)o(een.)137 812 y(This)j(command)g(m)o(ust)e(b) q(e)i(distinguished)i(from)d(the)g(prepro)q(cessor)h(construction)g Fu(##)f Fz(\(paste)f(to-)75 867 y(k)o(ens)g(together\).)j(In)e(a)e (macro)g(de\014nition,)i(`)p Fu(a##bc)p Fz(')e(creates)g(the)h(single)h (iden)o(ti\014er)g(`)p Fu(abc)p Fz('.)j(If)c(one)f(said)75 922 y(`)p Fu(a@&bc)p Fz(',)h(t)o(w)o(o)g(iden)o(ti\014ers)j(w)o(ould)f (b)q(e)g(output)f(with)h(no)g(spaces)f(separating)h(them.)23 b(In)17 b(simple)h(cases,)75 977 y(the)h(results)g(ma)o(y)e(lo)q(ok)i (iden)o(tical,)i(but)e(consider)g(ho)o(w)f(things)h(w)o(ould)g (di\013er)g(if)g Fu(abc)f Fz(w)o(ere)h(itself)g(an)75 1032 y Fw(Fweb)d Fz(macro)f(that)f(should)i(itself)h(b)q(e)e(expanded.) 75 1173 y Fy(5.13)32 b(Pseudo)22 b(\(in)n(visibl)q(e\))j(op)r(erators) 137 1275 y Fz(Pseudo-)20 b(or)f(in)o(visible)j(op)q(erators)c(are)h (ignored)h(b)o(y)g Fw(Ft)m(angle)g Fz(and)f(not)g(prin)o(ted)h(b)o(y)g Fw(Fwea)l(ve)p Fz(;)75 1330 y(ho)o(w)o(ev)o(er,)e(they)h(retain)g (grammatical)g(signi\014cance)h(that)e(helps)i(out)f Fw(Fwea)l(ve)g Fz(in)h(its)f(attempts)f(to)75 1385 y(understand)e(the)f (syn)o(tax.)75 1507 y Fq(5.13.1)29 b(`)p Fn(@e)p Fq(':)i (Pseudo-expression)137 1609 y Fz(`)p Fu(@e)p Fz(')9 b(is)i(an)f(in)o (visible)j(expression)e(\(`pseudo-expression'\))f(\(see)h(Section)g (10.2.1)d([Pseudo-op)q(erators],)p 1881 1620 21 46 v 75 1663 a(page)15 b(101\).)j(It)d(is)g(sometimes)g(useful)h(in)f (situations)g(where)g Fw(Fwea)l(ve)p Fz('s)g(prett)o(y-prin)o(ting)g (has)g(brok)o(en)75 1718 y(do)o(wn)f(b)q(ecause)h(it)g(didn't)g(prop)q (erly)g(understand)g(the)g(language)f(syn)o(tax.)19 b(If,)14 b(for)g(example,)h Fw(Fwea)l(ve)75 1773 y Fz(failed)h(to)f(prop)q(erly) h(parse)f(the)g(C)g(statemen)o(t)195 1843 y Fu(p)24 b(=)f(\(int)h (\(*\)\)q;)75 1915 y Fz(one)15 b(migh)o(t)g(get)g(things)h(to)e(w)o (ork)h(prop)q(erly)h(b)o(y)f(sa)o(ying)195 1985 y Fu(p)24 b(=)f(\(int)h(\(*@e\)\)q;)137 2057 y Fz(In)19 b(this)f(particular)h (case,)f(one)g(is)h(patc)o(hing)f(up)h(a)e(de\014ciency)k(\(all)d(righ) o(t,)g(a)g(bug\))g(in)h Fw(Fwea)l(ve)p Fz('s)75 2112 y(\\pro)q(duction)g(rules.")28 b(\(This)18 b(particular)h(bug)f(ma)o(y) f(no)h(longer)g(exist.\))28 b(Ho)o(w)o(ev)o(er,)18 b(there)g(are)f (other)75 2167 y(situations)e(in)h(whic)o(h)g(the)f(use)g(of)f(`)p Fu(@e)p Fz(')g(migh)o(t)h(b)q(e)g(necessary)l(.)20 b(Consider,)15 b(for)g(example,)g(the)g(C)g(macro)75 2221 y(de\014nition)195 2291 y Fu(#define)23 b(A\(x\))g(=)h(x)75 2364 y Fz(Here)16 b(the)h(replacemen)o(t)f(text)g(of)g(the)g(macro)f(is)i(`)p Fu(=)d(x)p Fz(',)i(whic)o(h)h(b)o(y)f(itself)h(is)f(not)g(a)g(v)m(alid) i(construction)75 2418 y(in)i(C.)f(When)h(the)g(`)p Fu(-1)p Fz(')e(or)h(`)p Fu(-2)p Fz(')f(options)i(are)f(used,)i Fw(Fwea)l(ve)f Fz(will)h(rep)q(ort)f(an)f(\\irreducible)j(scrap)75 2473 y(sequence")15 b(in)g(this)g(situation)g(\(although)f(it)h(ma)o(y) e(t)o(yp)q(eset)i(it)f(correctly)h(an)o(yw)o(a)o(y\).)j(T)l(o)c (eliminate)i(the)75 2528 y(w)o(arning)f(message,)f(sa)o(y)h(instead)195 2598 y Fu(#define)23 b(A\(x\))g(@e)h(=)g(x)75 2670 y Fz(No)o(w)15 b(the)g(fragmen)o(t)f(`)p Fu(@e)g(=)h(x)p Fz(')g(is)h(in)o(terpreted)g(as)e(a)h(v)m(alid)i(expression.)p eop %%Page: 58 60 58 59 bop 75 -58 a Fz(Chapter)15 b(5:)k Fw(Fweb)e Fz(COMMANDS)1105 b(58)75 183 y Fq(5.13.2)29 b(`)p Fn(@;)p Fq(':)i(Pseudo-semicolon)137 295 y Fz(`)p Fu(@;)p Fz(')17 b(is)i(an)f(in)o(visible)j(semicolon.)29 b(These)19 b(are)e(often)h(used)h(in)g(C)e(programming)h(to)f (terminate)h(a)75 350 y(mo)q(dule)g(name)f(that)f(expands)h(to)f(a)g (comp)q(ound)i(statemen)o(t.)23 b(Carefully)18 b(compare)e(the)h(uses)g (of)f(`)p Fu(@;)p Fz(')75 405 y(and)f(`)p Fu(;)p Fz(')g(in)h(the)f (follo)o(wing)h(example:)195 484 y Fu(@c)195 536 y(@a)195 588 y(if\(flag\))386 640 y(@@;)195 692 y(else)386 744 y(@;)195 848 y(@)h(This)f(compound)g(statement)f(ends)i(with)f(a)h(brace,)f(but)g (is)h(used)f(as)h(an)195 899 y(expression)e(above.)195 951 y(@=)195 1055 y({)195 1107 y(x;)195 1159 y(y;)195 1211 y(})195 1315 y(@)i(This)f(fragment)g(does)g(not)h(end)f (with)g(a)h(semicolon,)f(so)g(one)h(must)f(be)195 1366 y(supplied)g(above.)195 1470 y(@=)195 1522 y(z)137 1605 y Fz(Here)16 b(is)f(a)g(case)h(for)e(whic)o(h)i(the)f (pseudo-semicolon)j(is)d(not)g(necessary)l(.)20 b(Consider)195 1685 y Fu(@c)195 1737 y(@)k(The)f(code)g(fragment)g(|x)h(=)g(y|)f(...) 75 1819 y Fz(If)16 b(the)h(`)p Fu(-1)p Fz(')e(is)i(turned)f(on,)g(one)g (migh)o(t)g(think)h(that)f Fw(Fwea)l(ve)h Fz(w)o(ould)f(rep)q(ort)g(an) g(\\irreducible)j(scrap)75 1874 y(sequence")d(b)q(ecause)g(`)p Fu(x)f(=)g(y)p Fz(')g(is)h(an)f(expression)h(but)f(not)g(a)g(complete)h (statemen)o(t.)j(\(T)l(urning)d(on)f(`)p Fu(-2)p Fz(')75 1929 y(demonstrates)j(this.\))31 b(Ho)o(w)o(ev)o(er,)18 b(it)i(is)f(not)f(necessary)h(to)g(sa)o(y)f(`)p Fu(|x)c(=)h(y@;|)p Fz(')j(b)q(ecause)i(the)f(w)o(arning)75 1984 y(message)c(is)g(not)g (issued)i(if)e(the)h(parsing)f(reduces)h(to)f(just)f(one)i(unresolv)o (ed)g(scrap.)137 2066 y(On)h(the)f(other)g(hand,)g(`)p Fu(|goto)e(done|)p Fz(')h(do)q(es)h(not)g(reduce)h(to)e(just)h(one)g (unresolv)o(ed)h(scrap,)f(so)g(sa)o(y)75 2121 y(`)p Fu(|goto)e(done@;|) p Fz(')g(in)i(cases)f(suc)o(h)h(as)e(this.)21 b(See)16 b(Section)g(10.2.1)d([Pseudo-op)q(erators],)h(page)h(101.)137 2204 y(In)i(some)e(situations,)h(pseudo-semicolons)h(are)e(inserted)i (automatically)l(.)22 b(An)16 b(imp)q(ortan)o(t)f(case)g(is)75 2259 y(free-format)i Fw(F)o(or)m(tran)p Fz(-90.)29 b(There)19 b(the)f(language)h(syn)o(tax)e(sa)o(ys)h(that)f(newlines)j(terminate)f (state-)75 2313 y(men)o(ts)h(\(except)h(when)g(there's)f(a)g(trailing)h (amp)q(ersand\).)36 b(Ho)o(w)o(ev)o(er,)20 b(newlines)j(are)d(thro)o (wn)g(a)o(w)o(a)o(y)75 2368 y(b)q(efore)i(tok)o(enized)h(text)f(is)g (seen)h(b)o(y)e Fw(Fwea)l(ve)p Fz('s)i(parser)e(\(and)h(in)h(an)o(y)f (ev)o(en)o(t)f(w)o(ould)i(just)e(b)q(e)i(in-)75 2423 y(terpreted)c(as)g(white)h(space\).)32 b(Therefore,)20 b(b)o(y)f(default)h(newlines)h(that)e(terminate)g(statemen)o(ts)f(are) 75 2478 y(replaced)e(b)o(y)g(pseudo-semicolons,)g(so)f(the)g(parsing)h (pro)q(ceeds)g(correctly)l(.)137 2560 y(In)i(the)f Fw(F)o(or)m(tran)p Fz(-90)g(case,)h(one)f(could)h(also)f(insert)h(pseudo-semicolons)h(or)e (actual)g(semicolons)75 2615 y(b)o(y)e(hand,)h(and)f(some)g(users)g (prefer)h(that.)j(The)d(p)q(ossibilities)i(are)d(con)o(trolled)h(b)o(y) f(the)h(options)f(`)p Fu(-n@;)p Fz(')75 2670 y(\(see)g(Section)h (4.2.32)e([-nA)l(T;],)g(page)h(24\))f(and)h(`)p Fu(-n;)p Fz(')f(\(see)i(Section)g(4.2.33)d([-n;],)h(page)h(24\).)p eop %%Page: 59 61 59 60 bop 75 -58 a Fz(Chapter)15 b(5:)k Fw(Fweb)e Fz(COMMANDS)1105 b(59)75 183 y Fq(5.13.3)29 b(`)p Fn(@:)p Fq(':)i(Pseudo-colon)137 280 y Fz(`)p Fu(@:)p Fz(')19 b(is)g(an)h(in)o(visible)i(colon)e(\(see)f (Section)h(10.2.1)d([Pseudo-op)q(erators],)i(page)g(101\).)31 b(It)20 b(can)f(b)q(e)75 334 y(helpful)h(in)f(formatting)e(certain)h(C) g(constructions)g(correctly)l(.)29 b(F)l(or)17 b(example,)j(if)e(one)g (has)g(a)g(named)75 389 y(mo)q(dule)e(de\014ned)h(as)195 453 y Fu(@=)195 505 y(case)23 b(1:)195 557 y(case)g(2:)195 609 y(case)g(3@:)h(@;)75 676 y Fz(then)16 b(one)f(can)g(use)h(it)f(as)g (a)g(case)g(construction)h(follo)o(w)o(ed)f(b)o(y)g(the)g(usual)h (colon,)g(as)f(in)195 741 y Fu(switch\(c\))386 793 y({)267 845 y(@:)386 896 y(stuff;)386 948 y(break;)386 1000 y(})75 1129 y Fy(5.14)32 b(Miscellaneous)23 b(commands)75 1270 y Fq(5.14.1)29 b(`)p Fn(@!)p Fq(':)i(Inhibit)21 b(macro)f(expansion)137 1366 y Fw(Fweb)i Fz(macros)d(and)i(built-in)i (functions)e(are)f(alw)o(a)o(ys)g(expanded)i(b)o(y)e(default.)37 b(This)21 b(ma)o(y)e(not)75 1421 y(b)q(e)f(desirable,)g(particularly)h (in)e(the)h(N)f(mo)q(de.)25 b(T)l(o)17 b(inhibit)i(expansion)f(of)f(an) g(individual)j(iden)o(ti\014er,)75 1476 y(preface)15 b(it)h(b)o(y)f(`)p Fu(@!)p Fz('.)p eop %%Page: 60 62 60 61 bop 75 -58 a Fz(Chapter)15 b(6:)k(COMMENTING)c(STYLES)996 b(60)75 183 y Ft(6)41 b(COMMENTING)26 b(STYLES)137 305 y Fw(Fweb)d Fz(allo)o(ws)e(a)h(v)m(ariet)o(y)f(of)g(commen)o(ting)h(st) o(yles.)38 b(The)22 b(visible)i(commen)o(ts)d(are)g(in)h(the)g(fon)o(t) 75 360 y Fu(\\cmntfont)p Fz(,)14 b(whic)o(h)i(defaults)f(to)g Fu(\\mainfont)p Fz(,)e(a)i(ten-p)q(oin)o(t)h(Roman)f(fon)o(t.)75 492 y Fy(6.1)33 b(In)n(visible)25 b(commen)n(ts)75 603 y Fu(@z...@x)72 b Fz(If)13 b(a)f(source)h(or)f(include)j(\014le)f(b)q (egins)g(with)f(`)p Fu(@z)p Fz(')f(\(in)h(the)g(v)o(ery)f(\014rst)g(t)o (w)o(o)g(c)o(haracters)g(of)g(the)315 658 y(\014le\),)i(then)g(all)g (material)g(is)f(skipp)q(ed)i(un)o(til)g(and)e(including)j(a)d(line)i (b)q(eginning)h(in)e(column)315 713 y(1)j(with)h(`)p Fu(@x)p Fz(')f([except)h(that)f(lines)i(of)e(the)h(form)f(`)p Fu($Keyword:)c(text)i(of)g(keyword)f($)p Fz(')j(are)315 767 y(pro)q(cessed;)e(see)g(Section)h(7.2.3.30)c([$KEYW)o(ORD],)i(page) h(72,)f(Section)h(5.5.11)e([A)l(TK)p 1836 767 14 2 v 17 w(],)315 822 y(page)i(44)g(\(source)g(\014les\),)g(or)g(Section)h (5.5.12)d([A)l(Tk],)h(page)h(44)g(\(include)i(\014les\)].)75 903 y Fu(@\045)192 b Fz(All)16 b(material)g(un)o(til)g(and)g(including) i(the)d(next)g(newline)i(is)f(completely)h(ignored.)75 985 y Fu(@\045\045)168 b Fz(As)15 b(`)p Fu(@\045)p Fz(',)f(but)h(also)g (skip)h(blank)g(lines)h(that)e(immediately)h(follo)o(w)g(the)f(curren)o (t)g(line.)137 1066 y(F)l(or)g(example,)195 1132 y Fu(@z)195 1184 y(Author:)47 b(J.)23 b(A.)h(Krommes)195 1236 y(@x)195 1288 y(@c)g(@\045)f(This)g(sets)h(the)f(global)g(language)g(to)h(C.)195 1340 y(@*)g(EXAMPLE.)75 1472 y Fy(6.2)33 b(Visible)23 b(commen)n(ts)137 1570 y Fz(`)p Fu(/*)15 b(...)g(*/)p Fz(')f(is)i(a)f(long)g(commen)o(t)g(\(it)g(ma)o(y)f(extend)i(o)o(v)o (er)e(sev)o(eral)i(lines\).)137 1639 y(`)p Fu(//)f(...)p Fz(')f(is)i(a)f(short)f(commen)o(t)h(\(terminated)g(b)o(y)g(the)h(next) f(newline\).)137 1708 y(`)p Fu(@\(...@\))p Fz(')21 b(is)h(a)g (meta-commen)o(t.)39 b(Meta-commen)o(ts)21 b(are)h(a)f(lo)q(calized)k (form)c(of)h(the)g(N)g(mo)q(de)75 1762 y(\(see)g(Chapter)f(8)h ([Languages],)g(page)g(83\).)39 b(T)l(angled)23 b(meta-commen)o(ts)e (are)g(b)q(egun)i(b)o(y)f(the)g(con-)75 1817 y(ten)o(ts)f(of)g(the)g (st)o(yle-\014le)i(en)o(try)e(`)p Fu(meta.top)p Fz(')f(and)i (terminated)f(b)o(y)h(`)p Fu(meta.bottom)p Fz('.)36 b(Eac)o(h)21 b(line)i(of)75 1872 y(the)i(meta-commen)o(t)f(is)h(b)q(egun)g(b)o(y)g (`)p Fu(meta.prefix)p Fz('.)46 b(W)l(o)o(v)o(en)24 b(meta-commen)o(ts)g (are)g(b)q(egun)i(b)o(y)75 1927 y(`)p Fu(meta_code.begin)p Fz(')c(and)j(ended)g(b)o(y)g(`)p Fu(meta_code.end)p Fz('.)46 b(See)25 b(Section)h(12.3.8)c([Miscellaneous)75 1982 y(params],)14 b(page)h(118.)195 2047 y Fu(@n)195 2099 y(@a)386 2151 y(program)23 b(main)195 2203 y(/*)h(Get)f(input.)g(*/)386 2255 y(call)g(get_input)g(//)g(Read)h(the)f(parameter)g(file.)195 2307 y(/*)h(Process)e(information.)47 b(Comments)22 b(like)i(this)267 2359 y(can)f(be)h(split)f(over)g(several)g(lines.)g(*/)195 2411 y(@\()195 2462 y(Meta-comments)f(provide)h(a)h(poor-person's)e (alignment)g(feature)219 2514 y(i)i(---)f(counter)219 2566 y(x)h(---)f(data)g(value)195 2618 y(@\))386 2670 y(i)h(=)f(1)p eop %%Page: 61 63 61 62 bop 75 -58 a Fz(Chapter)15 b(6:)k(COMMENTING)c(STYLES)996 b(61)386 183 y Fu(x)24 b(=)f(2.0)386 235 y(call)g(exec\(i,x\))386 287 y(end)137 354 y Fs(The)c(use)h(of)e(meta-commen)o(ts)g(is)i(not)f (recommended;)j Fz(they)d(are)f(only)i(marginally)g(supp)q(orted.)75 409 y(Use)d(ordinary)g(long)g(commen)o(ts)f(instead.)26 b(Inside)18 b(of)f(them,)f(use)i(the)f(v)m(arious)g(p)q(o)o(w)o(erful)g (features)f(of)75 464 y(T)100 474 y(E)126 464 y(X)i(or)h(LaT)314 474 y(E)340 464 y(X)f(\(suc)o(h)h(as)g Fu(\\halign)f Fz(or)g Fu(\\begin{verbatim})f(...)h(\\end{verbatim})p Fz(\))f(to)h(format)75 519 y(y)o(our)d(commen)o(t)f(appropriately)l(.) 75 647 y Fy(6.3)33 b(T)-6 b(emp)r(orary)23 b(commen)n(ts)137 744 y Fz(During)e(dev)o(elopmen)o(t,)h(one)e(frequen)o(tly)h(desires)g (to)e(temp)q(orarily)i(commen)o(t)f(out)g(a)g(section)g(of)75 798 y(co)q(de.)38 b(C)21 b(programmers)e(sometimes)i(try)g(to)f(do)h (this)h(b)o(y)f(enclosing)h(the)f(co)q(de)h(in)g Fu(/*...*/)p Fz(,)f(but)75 853 y(this)d(is)g Fs(not)g Fz(go)q(o)q(d)f(st)o(yle)g (for)g(sev)o(eral)h(reasons.)26 b(First,)17 b(it)h(is)f(imp)q(ossible)j (if)e(the)f(co)q(de)h(itself)h(includes)75 908 y(commen)o(ts,)f(since)h (commen)o(ts)f(do)g(not)f(nest)h(in)h(C.)f(Second,)h Fw(Fwea)l(ve)g Fz(will)h(treat)d(the)h(commen)o(ted)75 963 y(co)q(de)g(as)e(T)264 973 y(E)290 963 y(X)h(rather)g(than)g(C)f (co)q(de)i(and)g(will)g(\(at)e(b)q(est\))i(format)d(it)j(v)o(ery)e(p)q (o)q(orly)l(.)27 b(In)18 b(fact,)e(LaT)1815 973 y(E)1841 963 y(X)75 1018 y(will)21 b(frequen)o(tly)f(complain,)i(b)q(ecause)f (the)e(commen)o(ted)h(co)q(de)g(migh)o(t)g(con)o(tain)g(c)o(haracters)e (suc)o(h)i(as)75 1072 y(underscores)f(that)f(T)451 1082 y(E)476 1072 y(X)h(exp)q(ects)g(to)f(b)q(e)h(in)g(math)f(mo)q(de.)30 b(\(Those)18 b(are)g(dealt)h(with)g(automatically)75 1127 y(when)c Fw(Fwea)l(ve)h Fz(is)f(in)h(co)q(de)f(mo)q(de.\))20 b(The)15 b(trivial)g(example)h(`)p Fu(/*)e(a_b;)h(*/)p Fz(')f(is)h(su\016cien)o(t)h(to)e(illustrate)75 1182 y(this)i(p)q(oin)o(t.)137 1249 y(The)e(prop)q(er)f(w)o(a)o(y)f(of)h (commen)o(ting)g(out)g(sections)h(of)e(co)q(de)i(is)g(to)e(use)i (prepro)q(cessor)f(constructions:)75 1304 y Fu(#if)i(0...#endif)d Fz(in)i(C,)f(or)g(more)g(generally)i Fu(@#if)g(0...@#endif)d Fz(\(usable)i(in)g(all)h(languages\).)k(\(The)75 1359 y Fw(Fweb)14 b Fz(prepro)q(cessor)e(is)i(describ)q(ed)g(in)g(Section)f (7.3)f([Prepro)q(cessing],)h(page)f(80.\))18 b(With)13 b(this)g(metho)q(d,)75 1414 y(there)k(is)h(no)g(trouble)g(with)f (nested)h(commen)o(ts,)f(and)h Fw(Fwea)l(ve)g Fz(will)h(con)o(tin)o(ue) f(to)f(format)f(the)h(co)q(de)75 1468 y(as)e(co)q(de,)g(so)g(the)g(do)q (cumen)o(tation)h(will)h(mak)o(e)d(sense.)137 1536 y(F)l(or)h Fw(F)o(or)m(tran)g Fz(programmers)f(con)o(v)o(erting)h(an)h(existing)g (co)q(de)g(to)e Fw(Fweb)p Fz(,)i(the)f(`)p Fu(-nC)p Fz(')g(option)g (\(see)75 1590 y(Section)h(4.2.36)d([-nC],)i(page)g(25\))f(ma)o(y)g(b)q (e)i(helpful.)p eop %%Page: 62 64 62 63 bop 75 -58 a Fz(Chapter)15 b(7:)k(MA)o(CR)o(OS)d(and)f(PREPR)o (OCESSING)826 b(62)75 183 y Ft(7)41 b(MA)n(CR)n(OS)26 b(and)g(PREPR)n(OCESSING)137 300 y Fw(Fweb)14 b Fz(o\013ers)d(a)h (built-in)j(prepro)q(cessor)d(facilit)o(y)l(,)i(esp)q(ecially)h(useful) e(for)f Fw(F)o(or)m(tran)h Fz(programmers.)75 355 y(It)21 b(is)h(closely)g(patterned)f(after)f(the)h(C/C)p Fu(++)g Fz(prepro)q(cessor,)h(but)f(with)g(some)g(extensions)h(suc)o(h)f(as)75 409 y(v)m(ariable)16 b(n)o(um)o(b)q(ers)g(of)e(argumen)o(ts.)19 b(In)d(addition,)g(there)f(are)f(some)h(built-in)i(functions)f(that)e (pro)o(vide)75 464 y(functionalit)o(y)i(that)f(cannot)g(b)q(e)h(em)o (ulated)f(b)o(y)h(user-de\014ned)h(macros.)137 531 y(When)i(w)o(orking) e(with)i(a)e(language)h(suc)o(h)h(as)e(C)h(that)f(has)h(its)g(o)o(wn)g (prepro)q(cessor,)g(the)g(question)75 586 y(arises)13 b(when)f(to)g(use)h(that)f(and)g(when)h(to)f(use)g Fw(Fweb)p Fz('s)h(facilities.)21 b(The)13 b(answ)o(er)f(generally)h(comes)g(with) 75 641 y(exp)q(erience.)28 b(Remem)o(b)q(er)18 b(that)e Fw(Fweb)p Fz('s)i(macros)e(ha)o(v)o(e)g(b)q(een)j(expanded)f(b)o(y)f (the)g(time)g(the)h(tangled)75 696 y(output)f(\014le)h(is)g(pro)q (duced,)g(whereas)f(language-sp)q(eci\014c)i(prepro)q(cessor)e (commands)g(are)g(just)g(passed)75 751 y(through)e(to)f(that)h(\014le.) 137 818 y(If)g(y)o(ou're)f(a)g Fw(F)o(or)m(tran)h Fz(programmer,)e Fs(strongly)18 b Fz(consider)e(the)e(use)h(of)f Fw(Fweb)p Fz('s)h(macro)f(facilities;)75 873 y(they)i(will)h(simplify)h(y)o(our)d (presen)o(t)g(and)h(future)g(life)h(b)o(y)f(creating)f(more)h(legible)i (co)q(des)e(and)g(reducing)75 927 y(programming)j(errors)g(b)o(y)h (eliminating)i(redundan)o(t)e(pieces)h(of)e(co)q(de.)34 b(C/C)p Fu(++)19 b Fz(programmers)g(ma)o(y)75 982 y(also)c(appreciate)h (the)f(prepro)q(cessor)h(extensions.)137 1049 y(In)h(addition)h(to)d (con)o(v)o(en)o(tional)i(macro)f(pro)q(cessing,)h Fw(Fweb)g Fz(also)g(o\013ers)e(the)i(con)o(v)o(enience)h(of)e(cer-)75 1104 y(tain)j(built-in)j(functions)e(that)e(b)q(eha)o(v)o(e)h(in)h(man) o(y)f(w)o(a)o(ys)f(lik)o(e)i(macros.)31 b(As)19 b(a)f(trivial)i (example,)h(the)75 1159 y(v)m(alue)c(of)e Fk(\031)j Fz(is)e(a)o(v)m (ailable)i(through)d(the)h(built-in)i(function)f(`)p Fu($PI)p Fz('.)k(Built-in)d(functions)e(are)g(describ)q(ed)75 1214 y(in)k(Section)g(7.2.3)e([Built-in)j(functions],)g(page)e(66.)32 b(They)19 b(can)h(b)q(e)g(useful)g(to)f(programmers)f(in)i(all)75 1268 y(languages.)137 1336 y Fw(Fweb)c Fz(recognizes)g(t)o(w)o(o)d (kinds)j(of)e(macros:)19 b Fs(outer)14 b(macros)p Fz(,)g(and)h Fs(WEB)f(macros)i Fz(\()p Fs(inner)g(macros)r Fz(\).)75 1390 y(Con)o(trol)22 b(co)q(des)g(asso)q(ciated)h(with)f(either)h(of)f (these)h(kinds)g(normally)g(b)q(egin)g(the)g(de\014nition)h(part.)75 1445 y(Ho)o(w)o(ev)o(er,)c Fw(Fweb)h Fz(macros)e(are)g(sometimes)h (allo)o(w)o(ed)g(in)h(the)f(co)q(de)g(part)g(as)f(w)o(ell;)k(see)d (Section)h(7.2)75 1500 y([FWEB)14 b(macros],)g(page)h(63.)137 1567 y(Macros)h(are)g(expanded)i(b)o(y)e Fw(Ft)m(angle)i Fz(only;)f Fw(Fwea)l(ve)h Fz(merely)f(prin)o(ts)g(them)f(as)g(they)h(o) q(ccur)g(in)75 1622 y(the)e(source)h(\014le.)75 1750 y Fy(7.1)33 b(Outer)22 b(macros)137 1847 y Fz(Outer)16 b(macros)f(pro)o(vide)i(a)e(shorthand)h(w)o(a)o(y)f(of)g(in)o(v)o (oking)i(macro)e(de\014nitions)j(in)e(the)g(source)g(lan-)75 1901 y(guage;)d(they)g(are)f(not)g(expanded)i(b)o(y)f Fw(Fweb)p Fz(.)20 b(Outer)13 b(macros)f(are)g(de\014ned)i(b)o(y)f(`)p Fu(@d)p Fz(')e(\(see)i(Section)h(5.5.6)75 1956 y([A)l(Td],)e(page)h (42\))e(or)i(`)p Fu(@D)p Fz(')e(\(see)i(Section)g(5.5.5)e([A)l(TD)p 997 1956 14 2 v 16 w(],)h(page)h(42\).)18 b(They)13 b(ma)o(y)e(b)q(e)j (placed)f(in)h(an)o(y)e(de\014-)75 2011 y(nition)j(part.)k Fw(Ft)m(angle)14 b Fz(collects)h(them)e(during)i(phase)f(1;)f(during)i (phase)f(2,)f(they)h(are)f(simply)i(copied)75 2066 y(in)i(order)f(of)g (their)h(app)q(earance)g(to)f(the)h(b)q(eginning)h(of)e(the)h(output)f (\014le.)24 b(This)17 b(is)g(most)f(useful)h(for)f(C)75 2121 y(or)e(C)p Fu(++)g Fz(co)q(des;)h(it's)f(a)g(quic)o(k)h(w)o(a)o(y) f(of)g(t)o(yping)g(`)p Fu(#define)p Fz(')f(when)i(the)f(p)q(ositioning) i(of)e(the)h(`)p Fu(#define)p Fz(')d(is)75 2175 y(unimp)q(ortan)o(t.) 137 2243 y(As)j(an)h(example,)195 2307 y Fu(@c)195 2359 y(@)195 2411 y(@d)24 b(YES)f(1)195 2462 y(@d)h(NO)f(0)195 2514 y(@a)195 2566 y(main\(\))195 2618 y({})p eop %%Page: 63 65 63 64 bop 75 -58 a Fz(Chapter)15 b(7:)k(MA)o(CR)o(OS)d(and)f(PREPR)o (OCESSING)826 b(63)195 183 y Fu(@)195 235 y(@d)24 b(BUF_LEN)e(100)195 287 y(@a)195 339 y(...)137 404 y Fz(The)16 b(k)o(eyw)o(ord)e(in)o(to)h (whic)o(h)h(the)f(`)p Fu(@d)p Fz(')f(is)h(translated)g(is)h (language-dep)q(enden)o(t;)g(it)g(is)f(con)o(trolled)h(b)o(y)75 459 y(the)f(st)o(yle-\014le)i(parameter)d(`)p Fu(outer_def)p Fz('.)k(See)e(Section)g(12.3.8)d([Miscellaneous)k(params],)d(page)h (118.)137 524 y(Outer)k(macros)e(can)h(b)q(e)h(unde\014ned)h(b)o(y)e(`) p Fu(@u)p Fz('.)28 b(The)18 b(translation)h(is)f(con)o(trolled)h(b)o(y) f(the)h(st)o(yle-\014le)75 579 y(parameter)14 b(`)p Fu(outer_undef)p Fz('.)k(See)e(Section)g(12.3.8)d([Miscellaneous)k(params],)d(page)h (118.)137 644 y(The)k(default)g(b)q(eha)o(vior,)h(in)g(whic)o(h)f(the)g (outer)f(macro)g(de\014nitions)j(are)d(just)h(copied)h(to)e(the)g(top) 75 699 y(of)h(the)h(output)g(\014le,)i(is)e(\014ne)h(for)e(simple)i (applications.)35 b(Ho)o(w)o(ev)o(er,)20 b(often)g(C)f(programmers)g (prefer)75 754 y(to)e(main)o(tain)h(their)g(macro)f(de\014nitions)i(in) f(a)g(header)f(\014le)i(suc)o(h)f(as)f(`)p Fu(test.h)p Fz('.)25 b(One)19 b(w)o(a)o(y)d(of)h(accom-)75 809 y(plishing)g(this)f (is)g(to)e(redirect)i Fw(Ft)m(angle)p Fz('s)f(output)g(from)f(the)i (command)f(line,)h(as)f(in)h(`)p Fu(ftangle)e(test)75 864 y(-=test.h)p Fz(',)d(then)i(use)g(an)g(`)p Fu(@O)p Fz(')f(command)g(immediately)i(after)e(the)h(\014rst)f(`)p Fu(@a)p Fz(')g(in)i(the)e Fu(web)h Fz(\014le)g(to)f(op)q(en)75 918 y(up)i(`)p Fu(test.c)p Fz('.)k(A)c(more)f(complicated)i(v)m(arian)o (t)f(of)g(this)g(allo)o(ws)g(additional)h(information)f(to)f(b)q(e)i (placed)75 973 y(in)o(to)g(the)g(header)h(\014le,)g(as)f(in)h(the)f (follo)o(wing)h(example:)195 1036 y Fu(@c)195 1087 y(@*)24 b(INTRO.)195 1139 y(We)g(assume)f(command-line)f(redirection)g(into)i (\\.{test.h})e(\(`\\.{-=test.h}'\).)195 1243 y(@d)i(A)f(1)h(//)g(This)f (will)g(go)h(into)f(\\.{test.h}.)195 1347 y(@a)195 1399 y(@@;)f(//)i(Also)f(goes)g(into)h(\\.{test.h}.)195 1451 y(@O)g(test.c)f(//)g(Remaining)g(unnamed)g(sections)g(go)g(into)g (\\.{test.c}.)195 1554 y(@)h(Header)f(material)g(may)g(be)h(defined)e (as)i(needed)f(throughout)g(the)g(code,)g(but)195 1606 y(with)g(this)h(design)f(it)g(will)h(all)f(go)h(into)f(\\.{test.h}.)195 1710 y(@=)195 1814 y(@@;)195 1866 y(@@;)195 1918 y(@@;)75 2092 y Fy(7.2)33 b Fr(Fweb)22 b Fy(macros)137 2187 y Fw(Fweb)e Fz(macros)d(\(sometimes)i(called)h Fs(inner)f(macros)r Fz(\))e(are)h(de\014ned)i(b)o(y)f(`)p Fu(@m)p Fz(')e(\(see)h(Section)i (5.5.16)75 2241 y([A)l(Tm],)e(page)f(45\))h(or)f(`)p Fu(@M)p Fz(')g(\(see)h(Section)h(5.5.15)d([A)l(TM)p 1083 2241 14 2 v 16 w(],)i(page)g(45\).)27 b(These)19 b(should)g(normally)f (b)q(e)75 2296 y(placed)e(in)g(the)g(de\014nition)h(part,)d(as)h(in)195 2359 y Fu(@n)195 2411 y(@)24 b(Documentation...)195 2514 y(@m)g(CUBE\(x\))e(\(x\)**3)195 2618 y(@a)386 2670 y(z3)h(=)h (CUBE\(x\))f(+)h(CUBE\(y\))p eop %%Page: 64 66 64 65 bop 75 -58 a Fz(Chapter)15 b(7:)k(MA)o(CR)o(OS)d(and)f(PREPR)o (OCESSING)826 b(64)75 183 y(\(the)19 b(app)q(earance)h(of)f(an)h(`)p Fu(@m)p Fz(')e(in)j(the)e(do)q(cumen)o(tation)h(part)f(b)q(egins)i(the) e(de\014nition)j(part\).)32 b(They)75 238 y(are)17 b(collected)h (during)g Fw(Ft)m(angle)p Fz('s)f(phase)h(1)e(and)i(e\013ectiv)o(ely)f (placed)i(at)d(the)h(top)g(of)f(the)h(unnamed)75 293 y(section,)e(so)g(they)g(are)g(all)h(kno)o(wn)f(during)h(the)g(output)f (in)h(phase)f(2.)137 362 y(In)21 b(un)o(usual)g(situations)g(when)f (macros)g(are)g(b)q(eing)h(conditionally)h(de\014ned)g(and/or)d (unde\014ned,)75 417 y(the)c(order)g(of)f(pro)q(cessing)i(a)f(macro)f (de\014nition)j(b)q(ecomes)f(signi\014can)o(t.)21 b(If)15 b(the)g(command-line)i(option)75 472 y(`)p Fu(-TD)p Fz(')c(is)h(used,)g (then)g Fw(Fweb)h Fz(macros)e(ma)o(y)g(b)q(e)i(used)f(in)h(the)f(co)q (de)g(part)g(as)f(w)o(ell;)i(they)f(are)f(then)h(called)75 526 y Fs(deferred)k(macros)p Fz(.)24 b(These)17 b(de\014nitions)i(will) g(b)q(e)e(pro)q(cessed)h(during)g(phase)f(2)g(in)h(the)f(order)g(that)f (the)75 581 y(co)q(de)f(sections)g(are)f(pro)q(cessed,)h(whic)o(h)g(ma) o(y)f(not)g(b)q(e)h(the)f(same)g(as)g(the)g(ph)o(ysical)i(order)e(in)h (the)g(source)75 636 y(\014le.)137 705 y Fs(The)e(use)f(of)g(deferred)h (macros)e(is)i(highly)h(discouraged)p Fz(,)f(for)f(the)g(follo)o(wing)h (reason.)18 b Fw(Fweb)c Fz(macros)75 760 y(are)i(often)h(used)g(in)g (conjunction)h(with)f(the)f Fw(Fweb)i Fz(prepro)q(cessor)f(commands.)24 b Fs(Prepro)q(cessor)16 b(com-)75 815 y(mands)f(are)f(alw)o(a)o(ys)g (pro)q(cessed)h(during)h(phase)f(1)p Fz(,)f(so)g(they)h(do)g(not)f(in)o (teract)h(prop)q(erly)g(with)g(deferred)75 870 y(macros.)22 b(It)16 b(is)h(for)e(this)i(reason)f(that)f(deferred)i(macros)e(are)h (normally)h(prohibited)h(from)d(app)q(earing)75 925 y(in)h(the)f(co)q (de)h(part.)75 1041 y Fq(7.2.1)30 b(V)-5 b(arious)20 b(features)h(of)f Fo(Fweb)g Fq(macros)232 1136 y Fx(\017)30 b Fz(F)l(undamen)o(tally)l(,)13 b Fw(Fweb)g Fz(macros)f(follo)o(w)g (the)g(syn)o(tax)f(for)g(ANSI)i(C.)e(There)h(are)g(also)285 1188 y(a)17 b(few)g(extensions,)h(notably)f(the)g(p)q(ossibilit)o(y)j (of)c(v)m(ariable)j(\(optional\))e(argumen)o(ts)285 1240 y(\(see)k(Section)g(7.2.1.1)e([V)l(ariable)i(argumen)o(ts],)g(page)f (64\))g(and)h(some)g(additional)285 1292 y(prepro)q(cessing)16 b(tok)o(ens)f(\(see)g(Section)h(7.2.2)e([T)l(ok)o(ens],)g(page)h(65\).) 232 1357 y Fx(\017)30 b Fz(Adjacen)o(t)15 b(strings)g(in)h(macro)f (text)f(are)h(automatically)h(concatenated.)75 1473 y Fq(7.2.1.1)30 b Fo(Fweb)20 b Fq(macros)g(with)h(v)m(ariable)g(argumen)n (ts)137 1572 y Fz(An)12 b(imp)q(ortan)o(t)f(extension)h(to)f(the)h (ANSI-C)g(syn)o(tax)e(is)i(to)f(allo)o(w)h(macros)e(with)i(v)m(ariable) h(\(optional\))75 1626 y(argumen)o(ts.)18 b Fw(Fweb)d Fz(macros)d(with)h(a)g(v)m(ariable)i(n)o(um)o(b)q(er)e(of)g(argumen)o (ts)g(are)f(indicated)j(b)o(y)e(an)h(ellipsis,)75 1681 y(as)h(in)195 1748 y Fu(@m)24 b(VAR\(x,y,z,...\))e(text)75 1817 y Fz(The)14 b(tok)o(ens)g(`)p Fu(#0)p Fz(')f(\(n)o(um)o(b)q(er)h (of)g(v)m(ariable)h(argumen)o(ts\),)e(`)p Fu(#)p Fs(n)p Fz(')h(\(v)m(alue)h(of)e(the)h Fs(n)p Fz(th)h(optional)f(argumen)o (t\),)75 1872 y(and)h(`)p Fu(#.)p Fz(')g(\(comma-delimited)h(list)g(of) f(the)g(optional)h(argumen)o(ts\))e(are)h(useful)h(in)g(this)g(con)o (text.)75 1988 y Fq(7.2.1.2)30 b(Recursion)137 2086 y Fz(ANSI)16 b(C)f(do)q(es)h(not)f(p)q(ermit)g(recursiv)o(e)h(macros)f (\(for)f(go)q(o)q(d)h(reason\).)k(Th)o(us,)c(in)h(the)f(example)195 2153 y Fu(@m)24 b(recurse)e(recurse)75 2222 y Fz(the)g(iden)o(ti\014er) i Fu(recurse)d Fz(simply)j(expands)e(as)g(`)p Fu(recurse)p Fz(',)g(not)g(as)g(an)g(in\014nite)i(lo)q(op.)41 b(Ho)o(w)o(ev)o(er,)75 2277 y(in)19 b Fw(Fweb)h Fz(recursion)f(ma)o(y)e(b)q(e)i(useful)h(in)f (conjunction)g(with)g(some)f(of)g(the)g(built-in)j(functions)e(\(see)75 2331 y(Section)d(7.2.3)e([Built-in)j(functions],)e(page)g(66\).)k(T)l (o)c(p)q(ermit)h(a)f(macro)f(to)h(b)q(e)h(recursiv)o(e,)f(sa)o(y)g(`)p Fu(@m*)p Fz('.)137 2401 y Fs(No)e(formal)f(supp)q(ort)h(is)g(pro)o (vided)h(for)e(recursiv)o(e)h(macros!)21 b Fz(If)13 b(they)g(don't)f(w) o(ork,)g(or)g(suddenly)i(stop)75 2456 y(w)o(orking)h(in)h(a)f(new)g (release,)h Fs(y)o(ou're)e(on)h(y)o(our)g(o)o(wn)p Fz(!)75 2572 y Fq(7.2.1.3)30 b(Protecting)19 b(macros)i(against)f (rede\014nition)137 2670 y Fz(Normally)c(an)f Fw(Fweb)h Fz(macro)f(can)g(b)q(e)h(rede\014ned)h(at)d(will.)22 b(The)15 b(example)p eop %%Page: 65 67 65 66 bop 75 -58 a Fz(Chapter)15 b(7:)k(MA)o(CR)o(OS)d(and)f(PREPR)o (OCESSING)826 b(65)195 183 y Fu(@m)24 b(PI)f(3.14159)195 235 y(@m)h(PI)f(\(-3\))75 302 y Fz(is)18 b(p)q(ermissible,)i(but)e (probably)g(not)f(a)h(go)q(o)q(d)f(idea.)28 b(If)18 b(y)o(ou)f(w)o(an)o (t)f(to)h(ensure)i(that)d(a)i(crucial)h(macro)75 357 y(de\014nition)e(is)f(nev)o(er)f(rede\014ned)i(inadv)o(erten)o(tly)l(,) e(sa)o(y)g(`)p Fu(@m!)p Fz(',)f(as)g(in)195 421 y Fu(@m!)23 b(PI)h(3.14159)75 487 y Fz(That)15 b(is)g(called)i Fs(protecting)i Fz(the)d(macro.)137 554 y Fw(Fweb)p Fz('s)f(built-in)j(functions)d(and) g(macros)f(\(b)q(eginning)i(with)f(`)p Fu($)p Fz('\))e(are)i(protected) f(b)o(y)h(default;)g(see)75 609 y(Section)20 b(7.2.3.2)c([Protection],) j(page)f(67.)30 b(T)l(o)19 b(o)o(v)o(erride)g(that)f(protection,)h(use) g(the)g(command-line)75 664 y(options)10 b(`)p Fu(-Tb)p Fz(')g(\(Section)g(4.2.59.2)e([-Tb],)j(page)f(31;)h(for)e(built-in)k (functions\))e(or)f(`)p Fu(-Tm)p Fz(')f(\(Section)h(4.2.59.3)75 719 y([-Tm],)k(page)h(31;)f(for)h(macros\).)75 829 y Fq(7.2.2)30 b(Sp)r(ecial)20 b(tok)n(ens)137 925 y Fz(The)c(follo)o (wing)g(sp)q(ecial)h(tok)o(ens)d(ma)o(y)h(b)q(e)h(used)f(in)h(the)g (text)e(of)h Fw(Fweb)h Fz(macro)f(de\014nitions:)75 1036 y Fq(7.2.2.1)30 b(ANSI)20 b(C-compatible)i(tok)n(ens)219 1129 y Fu(##)238 b Fz(|)16 b(P)o(aste)e(tok)o(ens)h(on)g(either)h(side) g(to)f(form)f(a)h(new)g(iden)o(ti\014er.)219 1181 y Fu(#)p Fs(parameter)50 b Fz(|)16 b(Con)o(v)o(ert)e(parameter)g(to)h(string)g (\(without)g(expansion\).)137 1247 y(F)l(or)g(example,)195 1311 y Fu(@m)24 b(FORTRAN\(type,)e(name\))h(type)g(_##name\(\))195 1363 y(@m)h(TRACE\(where\))e(puts\("At)h(")g(#where\))195 1415 y(@a)195 1467 y(FORTRAN\(int,)f(fcalc\);)h(//)h Fz(Expands)15 b(to)g(`)p Fu(int _fcalc\(\);)p Fz(')195 1519 y Fu(TRACE\(predictor\);)22 b(//)h Fz(Expands)16 b(to)e(`)p Fu(puts\("At " "predictor"\);)p Fz(')75 1629 y Fq(7.2.2.2)30 b(Extensions)21 b(to)f(ANSI)h(C)f(macro)h(syn)n(tax)137 1725 y Fz(The)h(most)f(frequen)o(tly)i(used)f(extensions)h(are)e(the)h (follo)o(wing)h(ones)e(asso)q(ciated)h(with)h(v)m(ariable)75 1780 y(argumen)o(ts:)d(`)p Fu(#0)p Fz(',)14 b(`)p Fu(#)p Fs(n)p Fz(',)h(and)h(`)p Fu(#.)p Fz('.)k Fw(F)o(or)m(tran)p Fz(-77)c(users)f(should)i(also)f(emplo)o(y)g(`)p Fu(#:0)p Fz(')e(to)h(allo)o(w)h(sym-)75 1835 y(b)q(olic)i(rather)f(than)f(n)o (umeric)i(statemen)o(t)d(lab)q(els.)26 b(T)l(ry)17 b(not)f(to)g(use)h (the)g(other)g(extensions;)g(they)g(are)75 1890 y(exp)q(erimen)o(tal,)f (complicated,)g(and)g(unlik)o(ely)h(to)e(w)o(ork)f(in)i(all)g (situations.)137 1956 y(In)f(the)g(follo)o(wing)g(list,)g(the)f(forms)g (`)p Fu(#{n})p Fz(')f(and)i(`)p Fu(#[n])p Fz(')e(ma)o(y)g(not)h(w)o (ork)g(correctly)g(in)i(complicated)75 2011 y(situations.)k(This)c(is)g (a)f(design)h(de\014ciency)h(that)e(ma)o(y)f(b)q(e)i(corrected)f (someda)o(y)l(.)195 2087 y Fu(#*)p Fs(param)65 b Fz(Lik)o(e)16 b(`)p Fu(#)p Fs(parameter)s Fz(',)e(but)h(pass)g(a)g(quoted)g(string)g (through)g(unc)o(hanged.)195 2163 y Fu(#!)p Fs(param)65 b Fz(Don't)14 b(expand)i(argumen)o(t.)195 2239 y Fu(#')p Fs(param)65 b Fz(Con)o(v)o(ert)14 b(parameter)h(to)f(a)h(single-quoted) i(string)e(\(no)g(expansion\).)195 2315 y Fu(#")p Fs(param)65 b Fz(Con)o(v)o(ert)14 b(parameter)h(to)f(a)h(double-quoted)i(string)e (\(no)g(expansion\).)195 2391 y Fu(#0)192 b Fz(Num)o(b)q(er)16 b(of)e(v)m(ariable)j(argumen)o(ts.)195 2466 y Fu(#)p Fs(n)191 b Fz(n-th)15 b(v)m(ariable)i(argumen)o(t,)d(coun)o(ting)i (from)e(1.)195 2542 y Fu(#{0})144 b Fz(Lik)o(e)18 b(`)p Fu(#0)p Fz(',)d(but)i(the)g(argumen)o(t)f(ma)o(y)g(b)q(e)h(a)g(macro)f (expression)h(kno)o(wn)g(at)435 2594 y(run)e(time.)195 2670 y Fu(#{)p Fs(n)p Fu(})143 b Fz(Lik)o(e)16 b(`)p Fu(#)p Fs(n)p Fz(',)e(but)i(the)f(argumen)o(t)f(ma)o(y)h(b)q(e)h(a)f (macro)f(expression.)p eop %%Page: 66 68 66 67 bop 75 -58 a Fz(Chapter)15 b(7:)k(MA)o(CR)o(OS)d(and)f(PREPR)o (OCESSING)826 b(66)195 183 y Fu(#[0])144 b Fz(The)16 b(total)f(n)o(um)o(b)q(er)i(of)e(argumen)o(ts)g(\(\014xed)h Fu(+)g Fz(v)m(ariable\).)23 b(\(The)16 b(argumen)o(t)435 235 y(inside)h(the)e(brac)o(k)o(ets)g(ma)o(y)f(b)q(e)i(a)f(macro)f (expression.\))195 305 y Fu(#[)p Fs(n)p Fu(])143 b Fz(The)11 b Fs(n)p Fz(th)g(argumen)o(t)f(\(including)k(the)d(\014xed)g(ones\),)g (coun)o(ting)h(from)e(1.)18 b(\(The)435 357 y(argumen)o(t)c(inside)j (the)f(brac)o(k)o(ets)e(ma)o(y)h(b)q(e)g(a)g(macro)g(expressions.)195 426 y Fu(#.)192 b Fz(Comma-separated)14 b(list)i(of)f(all)h(v)m (ariable)h(argumen)o(ts.)195 496 y Fu(#:0)168 b Fz(Unique)17 b(statemen)o(t)d(n)o(um)o(b)q(er)h(\(expanded)h(in)g(phase)g(1\).)195 565 y Fu(#:)p Fs(nnn)117 b Fz(Unique)21 b(statemen)o(t)e(n)o(um)o(b)q (er)h(for)f(eac)o(h)h(in)o(v)o(o)q(cation)g(of)g(this)g(macro)f(\(ex-) 435 617 y(panded)d(in)g(phase)g(2\).)195 687 y Fu(#<)192 b Fz(Begin)16 b(a)f(mo)q(dule)h(name.)195 756 y Fu(#,)192 b Fz(In)o(ternal)16 b(comma;)e(do)q(esn't)h(delimit)i(macro)e(argumen)o (t.)137 829 y(A)h(few)f(examples)h(of)e(the)i(more)e(imp)q(ortan)o(t)h (of)g(these)g(tok)o(ens)g(are)g(as)g(follo)o(ws:)195 889 y Fu(@c)195 941 y(@m)24 b(FPRINTF\(fmt,...\))d (fprintf\(fp,fmt,#.\))386 993 y(//)i(Use)h(the)f(whole)h(list)f(of)g (variable)g(args.)195 1045 y(@m)h(B\(...\))f(printf\("There)f(were)h (\045i)h(arguments\\n",)e(#0\))386 1097 y(//)h(Use)h(the)f(number)g(of) h(var)f(args.)195 1201 y(@n)195 1253 y(@)195 1305 y(@m)h(DONE)f(#:0)g (//)h(Symbolic)f(statement)f(label)i(in)f Fw(F)o(or)m(tran)p Fu(.)195 1356 y(@a)386 1408 y(goto)g(DONE)386 1460 y(...)195 1512 y(DONE:)386 1564 y(call)g(endup)75 1665 y Fq(7.2.3)30 b(Built-in)21 b(functions)137 1758 y Fz(Built-in)i(functions)d(b)q(eha) o(v)o(e)g(in)h(most)e(w)o(a)o(ys)g(lik)o(e)i(macros.)34 b(In)20 b(some)g(cases)g(they)g(actually)g(are)75 1813 y(macros,)d(but)h(other)f(times)h(they)f(implemen)o(t)i(functions)g (that)d(a)i(user)f(could)i(not)e(de\014ne.)28 b(They)18 b(all)75 1868 y(b)q(egin)e(with)g(a)f(dollar)h(sign)f(and)h(are)f(in)h (upp)q(er)g(case.)137 1931 y(In)g(using)f(these)g(built-ins,)h (confusion)g(ma)o(y)e(arise)h(regarding)f(the)h(order)g(of)f(expansion) h(of)f(v)m(arious)75 1986 y(argumen)o(ts.)22 b(When)17 b(they)f(are)g(implemen)o(ted)i(as)e(macros,)g(they)g(are)g(sub)s(ject) g(to)g(the)g(same)g(ANSI-C)75 2041 y(prepro)q(cessor)h(rules)h(as)e (other)h Fw(Fweb)h Fz(macros,)e(whic)o(h)i(is)g(that)e(all)i(argumen)o (ts)e(are)h(fully)h(expanded)75 2096 y(b)q(efore)d(generating)h(the)f (replacemen)o(t)h(text)f(of)f(the)i(macro.)j(When)d(they)f(are)g (directly)h(implemen)o(ted)75 2150 y(as)11 b(a)f(primitiv)o(e)j (function,)f(ho)o(w)o(ev)o(er,)f(that)f(rule)i(ma)o(y)f(not)f(apply)l (.)20 b(F)l(or)10 b(example,)j Fu($IF)d Fz(expands)i(only)g(its)75 2205 y(\014rst)g(argumen)o(t)f(during)i(its)f(\014rst)f(pass)h(of)g (pro)q(cessing;)h(dep)q(ending)h(on)e(the)g(results)h(of)e(that)g (expansion,)75 2260 y(it)k(then)h(expands)g Fs(either)j Fz(its)c(second)h(or)f(third)g(argumen)o(t,)g(but)g(not)g(b)q(oth.)137 2324 y(The)h(built-in)i(function)e Fu($DUMPDEF)f Fz(can)g(b)q(e)i(used) f(to)f(understand)h(and)f(debug)h(the)g(action)g(of)f(the)75 2378 y(built-in)j(functions.)i(See)c(Section)g(7.2.3.14)d([$DUMPDEF],)f (page)j(70.)137 2442 y(In)k(the)e(original)i Fw(Fweb)g Fz(design,)f(built-in)i(functions)f(b)q(egan)f(with)g(an)f(underscore.) 28 b(This)18 b(usage)75 2497 y(con\015icts)e(with)g(the)g(con)o(v)o(en) o(tions)f(for)g(reserv)o(ed)g(w)o(ords)g(in)h(ANSI)h(C,)d(and)i(has)f (b)q(een)i(eliminated.)23 b Fs(All)75 2552 y Fw(Fweb)16 b Fs(built-ins)i(no)o(w)c(b)q(egin)j(with)e(a)g(dollar)h(sign.)137 2615 y(No)22 b(user-de\014ned)h(macro)f(should)g(b)q(egin)i(with)e(a)f (dollar)i(sign!)43 b Fz(It)22 b(migh)o(t)f(in)o(terfere)i(with)f(the)75 2670 y(functioning)17 b(of)d(some)h(in)o(ternal)h(built-in)i(function.) p eop %%Page: 67 69 67 68 bop 75 -58 a Fz(Chapter)15 b(7:)f(MA)o(CR)o(OS)i(and)f(PREPR)o (OCESSING)831 b(67)75 183 y Fq(7.2.3.1)30 b(Strings)20 b(and)h(quotes)137 307 y Fz(Sev)o(eral)c(of)f(the)h(built-in)i (functions)e(exp)q(ect)g(or)f(return)h(a)f(string)h(argumen)o(t.)23 b(Examples)17 b(include)75 361 y Fu($STRING)e Fz(\(see)h(Section)h (7.2.3.58)c([$STRING],)i(page)h(77\),)f Fu($UNQUOTE)g Fz(\(see)h(Section)h(7.2.3.64)c([$UN-)75 416 y(QUOTE],)22 b(page)g(78\),)h(and)f Fu($UNSTRING)f Fz(\(see)i(Section)g(7.2.3.65)c ([$UNSTRING],)j(page)g(78\).)40 b(In)75 471 y(understanding)18 b(the)e(op)q(eration)g(of)g(those)g(functions,)h(it)g(is)g(imp)q(ortan) o(t)f(to)g(understand)g(just)g(what)g(a)75 526 y(string)h(means)g(in)h (the)f Fw(Fweb)h Fz(con)o(text.)24 b(As)17 b(usual,)h(it)f(is)g(a)g(v)o (ector)f(of)h(c)o(haracters.)24 b(Ho)o(w)o(ev)o(er,)16 b Fs(those)75 581 y(need)g(not)g(b)q(e)g(delimited)i(b)o(y)d(quotes)p Fz(,)h(although)f(they)h(ma)o(y)f(b)q(e.)22 b(In)o(ternally)l(,)16 b(a)g(string)f(is)h(represen)o(ted)75 635 y(b)o(y)f(the)g(construction) g Fs(sqc...cqs)p Fz(,)e(where)j Fs(s)g Fz(is)g(a)e(sp)q(ecial)j(string) e(delimiter)h(nev)o(er)f(seen)h(b)o(y)e(the)h(user,)g Fs(q)75 690 y Fz(is)j(an)f(optional)h(quote)f(c)o(haracter)f(\(either)i (single)g(or)f(double)i(quote)e(dep)q(ending)i(on)e(the)g(language\),) 75 745 y(and)c Fs(c)j Fz(is)e(an)f(ordinary)g(c)o(haracter.)19 b(Whether)13 b(or)f(not)h(the)g(quotes)g(are)g(presen)o(t,)g(the)g (string)g(delimiters)75 800 y(inhibit)k(macro)e(expansion.)137 894 y(The)g(di\013erence)g(b)q(et)o(w)o(een)g Fu($UNQUOTE)e Fz(and)h Fu($UNSTRING)f Fz(can)h(no)o(w)g(b)q(e)h(stated)e(as)h(follo)o (ws.)20 b(Giv)o(en)14 b(a)75 949 y(quoted)h(string)g(suc)o(h)h(as)f Fu("abc")f Fz(\(in)i(C\),)112 1043 y Fx(\017)30 b Fz(`)p Fu($UNQUOTE)p Fz(')13 b(remo)o(v)o(es)i(the)g(quote)g(c)o(haracters)f Fs(q)p Fz(,)h(lea)o(ving)h Fs(sab)q(cs)i Fz(\(still)e(a)f(string\).)112 1124 y Fx(\017)30 b Fz(`)p Fu($UNSTRING)p Fz(')15 b(remo)o(v)o(es)h(b)q (oth)i(the)f(quote)g(c)o(haracters)f Fs(q)i Fz(and)g(the)f(string)g (delimiters)i Fs(s)p Fz(,)e(lea)o(ving)165 1179 y Fs(ab)q(c)24 b Fz(\(a)c(collection)i(of)e(three)h(c)o(haracters\).)35 b(This)21 b(collection)i(is)e Fs(not)g Fz(tok)o(enized;)j(it)c(do)q(es) h Fs(not)165 1234 y Fz(represen)o(t)16 b(the)f(single)i(iden)o (ti\014er)h(name)d Fu(abc)h Fz(\(and)f(therefore)g(is)i(not)e(v)o(ery)g (useful\).)22 b Fu($UNSTRING)165 1289 y Fz(is)16 b(primarily)g(used)g (in)o(ternally)l(.)137 1409 y(The)e(built-ins)i Fu($P)e Fz(\(see)f(Section)i(7.2.3.46)c([$P],)h(page)i(76\))f(and)h Fu($PP)f Fz(\(see)h(Section)g(7.2.3.49)e([$PP],)75 1464 y(page)18 b(76\),)g(whic)o(h)h(b)q(oth)g(generate)f(the)g(prepro)q (cessor)h(c)o(haracter)e(`)p Fu(#)p Fz(',)h(pro)o(vide)h(a)f(go)q(o)q (d)g(illustration)75 1519 y(of)g(the)g(di\013erences)h(b)q(et)o(w)o (een)f Fu($UNQUOTE)f Fz(and)i Fu($UNSTRING)p Fz(.)27 b(Consider)18 b Fw(F)o(or)m(tran)h Fz(as)e(an)h(example.)75 1573 y(Essen)o(tially)l(,)j Fu($P)e Fz(is)h(de\014ned)g(as)f(`)p Fu($UNQUOTE\('#'\))p Fz(',)e(whic)o(h)j(is)g(in)o(ternally)h Fs(s)p Fu(#)p Fs(s)p Fz(.)31 b(When)20 b(this)f(single-)75 1628 y(c)o(haracter)d(string)g(is)h(sen)o(t)f(to)f(the)i(output,)f(it)h (is)f(treated)g(lik)o(e)i(an)o(y)e(other)g(expression)h(and)f (therefore)75 1683 y(w)o(ould)c(app)q(ear)g(in)h(column)g(7)e(or)h (greater)f(ev)o(en)h(if)g(the)g(construction)h(app)q(eared)f(at)f(the)h (v)o(ery)g(b)q(eginning)75 1738 y(of)k(the)h(line.)25 b(On)17 b(the)g(other)f(hand,)h Fu($PP)f Fz(is)h(\(essen)o(tially\))g (de\014ned)h(as)e(`)p Fu($UNSTRING\('#'\))p Fz(',)e(whic)o(h)j(is)75 1793 y(in)o(ternally)c(the)e(single)h(c)o(haracter)f Fu(#)p Fz(.)18 b(Because)12 b(this)f(c)o(haracter)g(is)g(not)g(a)g (string,)h(the)f Fw(F)o(or)m(tran)g Fz(output)75 1847 y(driv)o(er)j(treats)e(it)i(as)g(a)f(sp)q(ecial)i(con)o(trol)e(c)o (haracter,)g(de\014ned)i(in)g(this)f(case)f(to)g(force)g(the)h(c)o (haracter)f(in)o(to)75 1902 y(the)i(\014rst)g(column.)75 2069 y Fq(7.2.3.2)30 b(Rede\014ning)20 b(built-in)h(functions)137 2192 y Fz(By)i(default,)i(built-in)g(functions)e(are)f Fs(protected)p Fz(|that)h(is,)h(they)f(ma)o(y)f(not)g(b)q(e)h (rede\014ned)h(b)o(y)75 2247 y(an)f Fu(@m)f Fz(command.)42 b(\(T)l(o)22 b(do)g(so)g(ca)o(v)m(alierly)j(in)o(vites)e(man)o(y)f (kinds)i(of)e(w)o(eird)h(disasters.\))42 b(If)23 b(it)f(is)75 2302 y(absolutely)15 b(necessary)g(to)e(rede\014ne)i(a)f(built-in)j (function,)e(use)f(the)h(command-line)h(option)e(`)p Fu(-Tb)p Fz(')f(\(see)75 2356 y(Section)j(4.2.59.2)d([-Tb],)h(page)h (31\).)137 2451 y(Man)o(y)c(of)g Fw(Fweb)p Fz('s)h(\\built-in)h (functions")f(are)f(in)h(fact)f(ordinary)h(macros)e(that)h(are)g (implemen)o(ted)i(in)75 2506 y(terms)i(of)g(lo)o(w)o(er-lev)o(el)i (built-ins.)24 b(An)16 b(example)g(is)g Fu($POW)f Fz(\(see)h(Section)h (7.2.3.48)c([$PO)o(W],)h(page)h(76\),)75 2560 y(whic)o(h)27 b(is)f(constructed)h(from)e(the)h(built-in)i(function)f Fu($EVAL)f Fz(\(see)g(Section)g(7.2.3.17)e([$EV)-5 b(AL],)75 2615 y(page)16 b(70\).)23 b(By)17 b(default,)g(suc)o(h)g(macros)e(are)i (also)f(protected)h(against)f(rede\014nition;)i(to)e(o)o(v)o(erride,)h (use)75 2670 y(the)e(option)h(`)p Fu(-Tm)p Fz(')e(\(see)h(Section)h (4.2.59.3)d([-Tm],)g(page)j(31\).)p eop %%Page: 68 70 68 69 bop 75 -58 a Fz(Chapter)15 b(7:)k(MA)o(CR)o(OS)d(and)f(PREPR)o (OCESSING)826 b(68)75 183 y Fq(7.2.3.3)30 b Fn($A)p Fq(:)g(Con)n(v)n (ert)22 b(to)e(ASCI)r(I)137 277 y Fz(`)p Fu($A\()p Fs(string)t Fu(\))p Fz(')9 b(is)j(the)e(built-in)j(equiv)m(alen)o(t)g(of)d(`)p Fu(@'...')p Fz(')f(or)h(`)p Fu(@"...")p Fz('.)17 b(\(See)11 b(Section)g(5.6)f([A)l(Tquote],)75 331 y(page)18 b(51)g(and)g(Section)i (5.6.2)c([A)l(Tdquote],)j(page)f(51.\))28 b(Note)18 b(the)g(extra)g (paren)o(theses)h(required)g(b)o(y)75 386 y(the)c(built-in.)137 450 y Fu($A)g Fz(\014rst)g(expands)h(its)f(argumen)o(t,)f(in)i(case)f (it)h(is)g(a)e(macro)h(de\014ned)h(as)f(a)g(string.)75 553 y Fq(7.2.3.4)30 b Fn($ABS)p Fq(:)h(Absolute)20 b(v)m(alue)137 647 y Fz(`)p Fu($ABS\()p Fs(expression)p Fu(\))p Fz(')f(returns)g(the)h (absolute)g(v)m(alue)h(of)e(the)g(macro)g(expression.)34 b(It)19 b(is)h(a)g(macro)75 702 y(implemen)o(ted)d(in)f(terms)f(of)f Fu($IF)h Fz(and)h Fu($EVAL)p Fz(.)75 805 y Fq(7.2.3.5)30 b Fn($ASSERT)p Fq(:)h(Assert)21 b(a)f(condition)137 898 y Fz(`)p Fu($ASSERT\()p Fs(expression)p Fu(\))p Fz(')11 b(ev)m(aluates)i(the)f(macro)f(expression.)20 b(If)12 b(the)h(expression)g(is)f(false,)h(an)f(error)75 953 y(message)j(is)g(prin)o(ted)h(and)g(the)f(run)h(ab)q(orts.)137 1017 y(This)f(built-in)i(is)e(useful)g(for)f(ensuring)h(that)e Fw(Fweb)j Fz(macros)d(required)j(b)o(y)e(the)g(co)q(de)h(are)f(prop)q (erly)75 1072 y(initialized.)22 b(Because)14 b(it)f(is)g(expanded)h (during)g(the)f(output)f(phase,)h(it)g(m)o(ust)g(app)q(ear)g(in)g(the)g Fs(co)q(de)h(part)75 1126 y Fz(\(not)g(in)j(the)e(de\014nition)i (part\).)75 1230 y Fq(7.2.3.6)30 b Fn($AUTHOR)p Fq(:)h(V)-5 b(alue)20 b(of)g(R)n(CS)h(global)f(k)n(eyw)n(ord)i Fn(Author)137 1323 y Fz(Equiv)m(alen)o(t)17 b(to)d(`)p Fu($KEYWORD\(Author\))p Fz('.)j(See)f(Section)g(7.2.3.30)d([$KEYW)o(ORD],)h(page)h(72.)75 1426 y Fq(7.2.3.7)30 b Fn($COMMENT)p Fq(:)h(Generate)20 b(a)h(commen)n(t)137 1519 y Fz(`)p Fu($COMMENT)p Fz('\()p Fs(string)t Fz(\))13 b(generates)i(a)g(commen)o(t)f(in)i(the)g(output)f (\014le.)137 1583 y(This)j(function)f(is)g(sometimes)g(useful)h(in)g (conjunction)f(with)h(the)e(pro)q(cessing)i(of)e Fw(Fweb)i Fz(macros,)75 1638 y(since)d(ordinary)f(commen)o(ts)g(are)g(remo)o(v)o (ed)f(when)i(macros)e(are)h(pro)q(cessed.)20 b(F)l(or)13 b(example,)i(if)g(one)f(sa)o(ys)195 1700 y Fu(@c)195 1751 y(@)195 1803 y(@m)24 b(M)f("abc")g($COMMENT\("Test"\))195 1855 y(@a)195 1907 y(m)h(=)f(M)75 1971 y Fz(the)15 b(tangled)h(output)f (will)i(b)q(e)f(`)p Fu(m=)e("abc"/*)g(Test)h(*/)p Fz(')75 2074 y Fq(7.2.3.8)30 b Fn($DATE)p Fq(:)h(T)-5 b(o)r(da)n(y's)20 b(date)137 2168 y Fz(`)p Fu($DATE)p Fz(')c(generates)h(a)g(string)g (consisting)h(of)f(the)g(date)g(in)h(the)g(form)e Fu("August)e(16,)h (2001")p Fz(.)25 b(It)17 b(is)75 2222 y(implemen)o(ted)g(as)e(a)g (macro)f(that)h(calls)h(other)f(macros)f(and)h(primitiv)o(e)i (functions.)75 2326 y Fq(7.2.3.9)30 b Fn($DATE_TIME)p Fq(:)h(V)-5 b(alue)21 b(of)e(R)n(CS)i(global)f(k)n(eyw)n(ord)i Fn(Date)137 2419 y Fz(Equiv)m(alen)o(t)17 b(to)d(`)p Fu($KEYWORD\(Date\))p Fz('.)k(See)d(Section)i(7.2.3.30)12 b([$KEYW)o(ORD],)i(page)h(72.)75 2522 y Fq(7.2.3.10)29 b Fn($DAY)p Fq(:)i(The)20 b(da)n(y)137 2615 y Fz(`)p Fu($DAY)p Fz(')g(generates)g(a)g(string)h(consisting)g(of)f(the)h(da)o (y)f(of)g(the)h(w)o(eek,)h(suc)o(h)f(as)f Fu("Monday")p Fz(.)35 b(It)20 b(is)75 2670 y(implemen)o(ted)d(as)e(a)g(macro)f(that)h (calls)h(other)f(macros)f(and)h(primitiv)o(e)i(functions.)p eop %%Page: 69 71 69 70 bop 75 -58 a Fz(Chapter)15 b(7:)k(MA)o(CR)o(OS)d(and)f(PREPR)o (OCESSING)826 b(69)75 183 y Fq(7.2.3.11)29 b Fn($DECR)p Fq(:)i(Decremen)n(t)21 b(a)g(macro)137 278 y Fz(`)p Fu($DECR\()p Fs(N)5 b Fu(\))p Fz(')13 b(rede\014nes)j(the)f(n)o(umeric)h(macro)e Fs(N)20 b Fz(to)14 b(b)q(e)h(one)g(less)h(than)f(its)g(previous)g(v)m (alue.)21 b(\(If)15 b Fs(N)75 333 y Fz(do)q(es)h(not)g(simplify)i(to)d (a)h(n)o(um)o(b)q(er,)g(an)g(error)f(results.\))23 b(In)16 b(other)g(w)o(ords,)f(in)i(the)f(language)g(of)g(C)g(the)75 388 y(e\013ect)f(is)h(to)e(sa)o(y)h(`)p Fs(N)p Fu(--)p Fz('.)137 454 y(The)h(t)o(w)o(o-argumen)o(t)d(form)h(`)p Fu($DECR\()p Fs(N,m)p Fu(\))p Fz(')f(executes)j(the)g(equiv)m(alen)o(t) g(of)f(`)p Fs(N)20 b Fu(-=)15 b Fs(m)p Fz('.)75 563 y Fq(7.2.3.12)29 b Fn($DEFINE)p Fq(:)i(Deferred)21 b(macro)f (de\014nition)137 658 y Fz(`)p Fu($DEFINE)p Fz(')c(b)q(eha)o(v)o(es)j (lik)o(e)g(the)f Fw(Fweb)h Fz(macro)e(command)h Fu(@m)p Fz(,)g(but)g(it)g(is)g(in)o(tended)i(to)d(app)q(ear)h(in)75 713 y(the)e Fs(co)q(de)k Fz(part,)15 b(not)h(the)h(de\014nition)h(part) e(\(so)f(it)i(is)f(pro)q(cessed)h(during)h Fs(output)p Fz(,)e(not)g(input\).)23 b(Th)o(us,)75 768 y(the)15 b(co)q(de)h (fragmen)o(t)195 831 y Fu(a)24 b(=)f(A;)195 883 y($DEFINE\(A)g (1\)@\045)195 935 y(a)h(=)f(A;)75 1001 y Fz(tangles)15 b(to)195 1064 y Fu(a=)24 b(A;)195 1116 y(a=)g(1;)75 1182 y Fz(\(Notice)13 b(ho)o(w)f(the)h(`)p Fu(@\045)p Fz(')e(command)i(w)o (as)e(used)i(to)f(kill)j(an)d(un)o(w)o(an)o(ted)h(newline,)h(analogous) f(to)e(the)i(`)p Fu(dnl)p Fz(')75 1237 y(macro)h(in)j Fu(m4)p Fz(.\))137 1303 y(In)23 b(the)f(ab)q(o)o(v)o(e)g(example,)i (one)e(could)h(also)f(sa)o(y)f(`)p Fu($DEFINE\(A=1\))p Fz('.)38 b(T)l(o)22 b(de\014ne)h(a)e(macro)h(with)75 1358 y(argumen)o(ts,)16 b(sa)o(y)f(something)i(lik)o(e)h(`)p Fu($DEFINE\(A\(x\)x*x\))p Fz('.)i(Do)c Fs(not)h Fz(sa)o(y)f(`)p Fu($DEFINE\(A\(x\)=x*x\))p Fz(',)d(as)75 1412 y(in)20 b(this)g(case)g(the)f(equals)h(sign)g(will)h(b)q(e)f(included)i(in)e (the)g(macro)f(expansion.)33 b(One)20 b(m)o(ust)f(use)h(the)75 1467 y(equals)15 b(sign)g(as)g(a)f(means)h(of)f(prev)o(en)o(ting)h (paren)o(theses)f(from)g(b)q(eing)i(in)o(terpreted)g(as)e(an)g(argumen) o(t)g(in)75 1522 y(examples)i(lik)o(e)195 1585 y Fu($DEFINE\(A=\(x\)\)) 75 1651 y Fz(This)g(expands)g(to)e(`)p Fu(\(x\))p Fz('.)137 1717 y(A)i(completely)g(equiv)m(alen)o(t)h(shorthand)e(notation)g(for)f Fu($DEFINE)h Fz(is)g Fu($M)p Fz(.)75 1826 y Fq(7.2.3.13)29 b Fn($DO)p Fq(:)i(Macro)21 b(do)f(lo)r(op)137 1921 y Fz(`)p Fu($DO\()p Fs(macro,imin,imax[,di])r Fu(\){...})p Fz(')h(rep)q(etitiv)o(ely)26 b(de\014nes)f Fs(macro)g Fz(as)f(w)o(ould)g(the)g Fw(F)o(or)m(tran)75 1976 y Fz(statemen)o(t)14 b(`)p Fu(do)h(macro)f(=)h(imin,imax,di)p Fz('.)j(F)l(or)c(example,)195 2039 y Fu($DO\(I,0,2\))243 2091 y({)243 2143 y(a[I])23 b(=)h(I;)243 2195 y(})75 2261 y Fz(generates)15 b(the)g(three)g (statemen)o(ts)243 2324 y Fu(a[0])23 b(=)h(0;)243 2376 y(a[1])f(=)h(1;)243 2428 y(a[2])f(=)h(2;)137 2494 y Fz(In)18 b(general,)g(the)g(macro)e(name)i(used)g(as)f(lo)q(op)h(coun)o(ter)f (should)h Fs(not)g Fz(b)q(e)g(explicitly)j(de\014ned)d(as)f(a)75 2549 y(macro)d(prior)i(to)e(the)i Fu($DO)p Fz(.)j(If)d(it)f(is)h(not,)e (it)i(will)g(remain)g(unde\014ned)h(after)e(the)g(end)h(of)f(the)g (iteration.)137 2615 y(Instead)g(of)g(the)f(delimiting)k(braces,)c (paren)o(theses)h(ma)o(y)f(b)q(e)h(used.)20 b(These)15 b(ma)o(y)f(b)q(e)i(useful)g(to)e(help)75 2670 y Fw(Fwea)l(ve)i Fz(format)e(certain)h(constructions)h(correctly)l(.)p eop %%Page: 70 72 70 71 bop 75 -58 a Fz(Chapter)15 b(7:)k(MA)o(CR)o(OS)d(and)f(PREPR)o (OCESSING)826 b(70)137 183 y(Nested)14 b(delimiters)h(are)e(handled)h (correctly)l(.)20 b(The)14 b(delimiters)h(are)d(required)j(ev)o(en)e (if)h(only)g(a)f(single)75 238 y(statemen)o(t)h(is)i(to)e(expanded.)137 308 y Fu($DO)e Fz(is)g(implemen)o(ted)i(in)f(terms)e(of)h(a)f(command)h Fu($UNROLL)p Fz(.)18 b(Ho)o(w)o(ev)o(er,)11 b(if)h(one)g(sa)o(ys)g (something)g(lik)o(e)75 363 y(`)p Fu($DUMPDEF\($UNROLL\(0,5,1\))o(\))p Fz(',)k Fw(Fweb)21 b Fz(will)f(resp)q(ond)g(that)e Fu($UNROLL)g Fz(is)i(not)e(an)h Fw(Fweb)h Fz(macro.)75 418 y(Rather,)d Fu($UNROLL)e Fz(is)j(pro)q(cessed)f(lik)o(e)h(expandable)g(commands)f (in)g Fw(Ra)m(tf)o(or)g Fz(suc)o(h)g(as)g Fu(while)p Fz(.)23 b(This)75 473 y(implies)17 b(that)e(it)g(cannot)g(b)q(e)h (rede\014ned)h(as)d(ordinary)i(macros)e(or)h(built-in)j(functions)d (can)h(b)q(e.)75 590 y Fq(7.2.3.14)29 b Fn($DUMPDEF)p Fq(:)i(Dump)21 b(macro)g(de\014nitions)f(to)g(the)h(terminal)137 690 y Fz(In)15 b(the)f(call)i(`)p Fu($DUMPDEF\()p Fs(m1,)d(m2,)h(...)p Fu(\))p Fz(',)e Fs(m1)p Fz(,)i Fs(m2)p Fz(,)f(and)i(so)f(on)g(are)g (macro)f(calls)j(\(with)e(argumen)o(ts)75 744 y(if)i(appropriate\).)21 b(Tw)o(o)15 b(lines)i(of)f(output)f(are)h(generated)f(for)h(eac)o(h)f (argumen)o(t.)21 b(Line)c(1)f(is)g(the)g(macro)75 799 y(de\014nition;)h(line)g(2)d(is)i(its)f(expansion)i(using)f(the)f(pro)o (vided)h(argumen)o(ts.)137 869 y(One)d(can)g(use)g(this)f(built-in)j (to)d(debug)h(one's)f(o)o(wn)g(macros,)f(or)h(to)g(\014nd)h(out)f(the)g (secrets)g(of)g Fw(Fweb)p Fz('s)75 924 y(built-ins.)22 b(As)15 b(an)h(example,)f(if)h(one)f(sa)o(ys)195 991 y Fu($DUMPDEF\($EVAL\(2^^4\)\)@\045)75 1062 y Fz(it)g(resp)q(onds)h (with)g(the)f(t)o(w)o(o)f(lines)195 1129 y Fu($EVAL\($0\))23 b(=)g($$EVAL\($0\))195 1181 y($EVAL\(2**4\))f(=)i(16)75 1251 y Fz(\(The)18 b Fu($)p Fs(n)g Fz(notation)g(indicates)i(the)e Fs(n)p Fz(-th)g(argumen)o(t)g(of)f(the)i(macro.\))27 b(If)19 b(one)f(replaces)h Fu($EVAL)f Fz(with)75 1306 y Fu($$EVAL)c Fz(in)i(the)g(ab)q(o)o(v)o(e)e Fu($DUMPDEF)p Fz(,)g(it)i(will)g(resp)q(ond)195 1373 y Fu($$EVAL\($0\))22 b(=)i()195 1425 y($$EVAL\(2**4\))e(=)i(16)137 1510 y Fz(The)16 b(purp)q(ose)g(of)f(co)q(de)h(suc)o(h)g(as)f(`)p Fu($EVAL\($0\))e(=)i($$EVAL\($0\))p Fz(')f(is)i(to)f(ensure)h(that)e (the)i(argumen)o(t)75 1565 y(of)e Fu($EVAL)g Fz(is)i(expanded)f(if)h (it)f(con)o(tains)f(macros;)g(the)h(primitiv)o(e)h(function)g Fu($$EVAL)e Fz(do)q(es)h(not)f(do)h(that)75 1620 y(expansion)h (automatically)l(.)137 1690 y(Names)j(indicated)i(as)e(`)p Fu()p Fz(')e(b)o(y)i Fu($DUMPDEF)f Fz(ma)o(y)g(b)q(e)i (rede\014ned)g(as)f(ordinary)g(macros,)75 1745 y(but)14 b(this)h(is)f(in)h(general)g(a)f Fs(v)o(ery)f(bad)i(idea)p Fz(;)f(other)g(parts)g(of)f Fw(Fweb)i Fz(ma)o(y)f(m)o(ysteriously)g (stop)g(w)o(orking.)75 1863 y Fq(7.2.3.15)29 b Fn($E)p Fq(:)i(Base)20 b(of)g(the)g(natural)h(logarithms)137 1962 y Fz(The)14 b(expression)g(`)p Fu($E)p Fz(')f(returns)g Fs(e)p Fz(,)g(the)h(base)f(of)g(the)h(natural)f(logarithms,)h(to)f(the) g(default)h(mac)o(hine)75 2017 y(precision.)22 b(The)15 b(expression)h(`)p Fu($E\()p Fs(iprec)s Fu(\))p Fz(')f(returns)g Fs(e)j Fz(to)d(the)g(decimal)i(precision)g Fs(iprec)i Fz(\(whic)o(h)d(m)o(ust)75 2071 y(b)q(e)g(less)g(than)f(50\).)75 2189 y Fq(7.2.3.16)29 b Fn($ERROR)p Fq(:)i(Send)21 b(error)f(message)h (to)f(output)137 2289 y Fz(`)p Fu($ERROR\()p Fs(string)t Fu(\))p Fz(')13 b(prin)o(ts)j(an)f(error)g(message)f(in)i Fw(Fweb)p Fz('s)g(standard)f(form.)75 2406 y Fq(7.2.3.17)29 b Fn($EVAL)p Fq(:)i(Ev)m(aluate)21 b(a)f(macro)g(expression)137 2506 y Fz(`)p Fu($EVAL\()p Fs(expression)p Fu(\))p Fz(')d(uses)i Fw(Fweb)p Fz('s)f(macro-expression)h(ev)m(aluator)f(\(see)g(Section)g (7.3)f([Prepro-)75 2560 y(cessing],)e(page)g(80\))g(to)f(reduce)i(the)f (macro)g(expression)h(to)e(its)i(simplest)g(form.)j(An)d(attempt)e(to)g (p)q(er-)75 2615 y(form)f(arithmetic)h(on)f(com)o(binations)h(of)f (non-macro)g(iden)o(ti\014ers)i(and)e(n)o(um)o(b)q(ers)h(generates)f(a) g(w)o(arning)75 2670 y(message.)p eop %%Page: 71 73 71 72 bop 75 -58 a Fz(Chapter)15 b(7:)k(MA)o(CR)o(OS)d(and)f(PREPR)o (OCESSING)826 b(71)75 183 y Fq(7.2.3.18)29 b Fn($EXP)p Fq(:)i(Exp)r(onen)n(tial)21 b(function)137 278 y Fz(`)p Fu($EXP\()p Fs(x)s Fu(\))p Fz(')14 b(returns)h Fk(e)526 261 y Fj(x)547 278 y Fz(.)75 385 y Fq(7.2.3.19)29 b Fn($GETENV)p Fq(:)i(Get)21 b(v)m(alue)f(of)g(en)n(vironmen)n(t)i(v)m(ariable)137 480 y Fz(`)p Fu($GETENV\()p Fs(name)s Fu(\))p Fz(')c(returns)j(a)f (string)g(consisting)i(of)e(the)g(curren)o(t)g(v)m(alue)i(of)e(the)h (en)o(vironmen)o(t)75 535 y(v)m(ariable)c Fs(name)p Fz(.)i(\(Under)d (VMS,)f(logical)h(names)f(b)q(eha)o(v)o(e)h(lik)o(e)g(en)o(vironmen)o (t)g(v)m(ariables.\))137 601 y(The)11 b(argumen)o(t)e(to)h Fu($GETENV)f Fz(need)i(not)f(b)q(e)g(a)g(string)g(\(double-quoted\),)i (but)e(it)h(ma)o(y)e(b)q(e)i(if)g(necessary)75 655 y(to)k(a)o(v)o(oid)g (the)g(expansion)h(of)f(a)g(macro.)75 763 y Fq(7.2.3.20)29 b Fn($HEADER)p Fq(:)i(V)-5 b(alue)21 b(of)f(R)n(CS)h(global)f(k)n(eyw)n (ord)i Fn(Header)137 857 y Fz(Equiv)m(alen)o(t)17 b(to)d(`)p Fu($KEYWORD\(Header\))p Fz('.)j(See)f(Section)g(7.2.3.30)d([$KEYW)o (ORD],)h(page)h(72.)75 965 y Fq(7.2.3.21)29 b Fn($HOME)p Fq(:)i(The)21 b(user's)g(home)f(directory)137 1060 y Fz(`)p Fu($HOME)p Fz(')14 b(is)i(a)f(con)o(v)o(enience)h(macro)f(equiv) m(alen)o(t)i(to)d(`)p Fu($GETENV\(HOME\))p Fz('.)75 1167 y Fq(7.2.3.22)29 b Fn($ID)p Fq(:)i(V)-5 b(alue)21 b(of)f(R)n(CS)h (global)e(k)n(eyw)n(ord)j Fn(Id)137 1262 y Fz(Equiv)m(alen)o(t)17 b(to)d(`)p Fu($KEYWORD\(Id\))p Fz('.)k(See)e(Section)g(7.2.3.30)c ([$KEYW)o(ORD],)j(page)g(72.)75 1369 y Fq(7.2.3.23)29 b Fn($IF)p Fq(:)i(Tw)n(o-w)n(a)n(y)22 b(conditional)137 1464 y Fu($IF)17 b Fz(is)h(a)g(primitiv)o(e)h(function)f(\(not)f(a)g (macro\))g(that)g(is)h(the)f(co)q(de-part)h(v)o(ersion)g(of)f(`)p Fu(@#if)p Fz('.)26 b(The)75 1519 y(syn)o(tax)14 b(is)195 1581 y Fu($IF\()p Fs(expr)p Fu(,)23 b Fs(action-if-true)p Fu(,)i Fs(action-if-false)s Fu(\))75 1647 y Fz(The)14 b Fs(expr)j Fz(is)d(an)g Fw(Fweb)h Fz(macro)e(expression)h(that)f(m)o (ust)h(reduce)g(to)f(0)h(\(false\))f(or)g(1)h(\(true\).)k(First)c(that) 75 1702 y(argumen)o(t)i(is)i(expanded.)27 b(If)18 b(it)f(is)h(true,)f Fs(action-if-true)k Fz(is)d(expanded;)h(otherwise)e Fs(action-if-false) k Fz(is)75 1757 y(expanded.)137 1822 y(There)d(ma)o(y)g(b)q(e)g(p)q (eculiarities)j(with)d(this)h(and)f(the)g(other)f(built-in)j Fu($IF)e Fz(function)h(ha)o(ving)f(to)f(do)75 1877 y(with)f(the)f (order)g(of)g(expansion)i(when)e(the)h(actions)f(con)o(tain)h(macros)f (whose)g(argumen)o(ts)f(themselv)o(es)75 1932 y(are)h(macros.)k (Therefore,)c(do)g(not)g(use)g(them)g(unless)i(absolutely)f(necessary)l (.)137 1998 y Fs(Do)j(not)f(rede\014ne)23 b Fu($IF)c Fz(or)f(an)o(y)h(other)g(built-in)i(conditionals,)h(as)c(they)i(are)e (used)i(in)o(ternally)h(to)75 2052 y Fw(Fweb)p Fz(.)75 2160 y Fq(7.2.3.24)29 b Fn($IFCASE)p Fq(:)i(n-w)n(a)n(y)23 b(conditional)137 2255 y Fz(This)16 b(primitiv)o(e)h(built-in)g(b)q (eha)o(v)o(es)f(lik)o(e)g(T)875 2264 y(E)901 2255 y(X's)e(`)p Fu(\\ifcase)p Fz(')g(command.)20 b(The)15 b(syn)o(tax)f(is)195 2317 y Fu($IFCASE\()p Fs(expr)p Fu(,)23 b Fs(case-0)p Fu(,)h Fs(case-1)p Fu(,)f(...,)p Fs(case-n-1)p Fu(,)h Fs(default)q Fu(\))75 2383 y Fz(If)13 b Fs(expr)j Fz(reduces)d(to)f(an) h(in)o(teger)g(b)q(et)o(w)o(een)g(0)f(and)h Fs(n-1)p Fz(,)g(inclusiv)o(ely)l(,)j(the)d(appropriate)f(case)h(is)g(selected;) 75 2438 y(otherwise,)i(the)g(default)h(case)f(is)h(selected.)137 2503 y(As)f(examples,)195 2566 y Fu($IFCASE\(2,)22 b(zero,)i(one,)f (two,)g(default\))g Fz(=)p Fu(>)h(`two')195 2618 y($IFCASE\(2,)e(zero,) i(one,)f(three\))g Fz(=)p Fu(>)h(`three')195 2670 y($IFCASE\(2,)e (zero,)i(one\))f Fz(=)p Fu(>)h(`one')p eop %%Page: 72 74 72 73 bop 75 -58 a Fz(Chapter)15 b(7:)k(MA)o(CR)o(OS)d(and)f(PREPR)o (OCESSING)826 b(72)75 183 y Fq(7.2.3.25)29 b Fn($IFDEF)p Fq(:)i(Tw)n(o-w)n(a)n(y)22 b(conditional)137 279 y Fz(This)16 b(built-in)i(primitiv)o(e)e(is)g(the)f(co)q(de-part)h(v)o(ersion)f(of)g (`)p Fu(@#ifdef)p Fz('.)j(The)d(syn)o(tax)g(is)195 344 y Fu($IFDEF\()p Fs(macro)p Fu(,)22 b Fs(action-if-de\014ned)p Fu(,)p Fs(action-if-n)q(ot-de\014ned)s Fu(\))75 455 y Fq(7.2.3.26)29 b Fn($IFNDEF)p Fq(:)i(Tw)n(o-w)n(a)n(y)22 b(conditional)137 552 y Fz(This)11 b(built-in)i(primitiv)o(e)e(is)g (the)f(co)q(de-part)g(v)o(ersion)h(of)e(`)p Fu(@#ifndef)p Fz('.)17 b(The)10 b(syn)o(tax)g(is)g(`)p Fu($IFNDEF\()p Fs(macro)p Fu(,)p 1958 560 21 41 v 75 606 a Fs(action-if-not-de\014ned) p Fu(,)17 b Fs(action-if-de\014ned)r Fu(\))p Fz('.)75 718 y Fq(7.2.3.27)29 b Fn($IFELSE)p Fq(:)i(Tw)n(o-w)n(a)n(y)22 b(conditional)137 814 y Fz(The)15 b(syn)o(tax)f(of)h(this)g(built-in)i (primitiv)o(e)f(is)f(`)p Fu($IFELSE\()p Fs(expr1)p Fu(,)f Fs(expr2)p Fu(,)h Fs(action-if-equal)p Fu(,)i Fs(action-)75 869 y(if-not-equal)r Fu(\))p Fz('.)25 b(The)17 b(expansions)h(of)f Fs(expr1)j Fz(and)d Fs(expr2)j Fz(are)d(compared)g(on)g(a)f(b)o(yte-b)o (y-b)o(yte)h(basis.)75 924 y(If)e(they)h(are)f(equal,)g(the)g(\014rst)g (action)h(is)f(tak)o(en,)g(otherwise)g(the)g(second)h(action)f(is)h (tak)o(en.)137 991 y(F)l(or)f(example,)195 1055 y Fu ($M\(S="abc"\)@\045)195 1107 y($IFELSE\("abc",)22 b(S,)i(yes,)f(no\))75 1174 y Fz(ev)m(aluates)16 b(to)f(`)p Fu(yes)p Fz('.)75 1286 y Fq(7.2.3.28)29 b Fn($INCR)p Fq(:)i(Incremen)n(t)21 b(a)g(macro)137 1382 y Fz(`)p Fu($INCR\()p Fs(N)5 b Fu(\))p Fz(')17 b(rede\014nes)i(the)g(n)o(umeric)g(macro)f Fs(N)23 b Fz(to)18 b(b)q(e)h(one)g(greater)e(than)h(its)h(previous)g(v)m(alue.) 75 1437 y(\(If)d Fs(N)22 b Fz(do)q(es)17 b(not)f(simplify)i(to)e(a)g(n) o(um)o(b)q(er,)h(an)f(error)g(results.\))24 b(In)17 b(other)f(w)o (ords,)g(in)h(the)g(language)f(of)75 1492 y(C)f(the)g(e\013ect)g(is)h (to)e(sa)o(y)h(`)p Fs(N)5 b Fu(++)p Fz('.)137 1559 y(The)16 b(t)o(w)o(o-argumen)o(t)d(form)h(`)p Fu($INCR\()p Fs(N,m)p Fu(\))p Fz(')f(executes)j(the)g(equiv)m(alen)o(t)g(of)f(`)p Fs(N)20 b Fu(+=)15 b Fs(m)p Fz('.)75 1671 y Fq(7.2.3.29)29 b Fn($INPUT_LINE)p Fq(:)j(Line)20 b(n)n(um)n(b)r(er)h(that)f(b)r(egins) h(curren)n(t)g(section)137 1767 y Fz(`)p Fu($INPUT_LINE)p Fz(')f(is)j(the)f(n)o(um)o(b)q(er)g(of)g(the)g(line)i(in)f(the)f Fu(web)f Fz(source)i(\014le)g(that)e Fs(b)q(egins)i(the)g(cur-)75 1822 y(ren)o(t)16 b(section)i Fz(\(not)e(the)h(source)g(line)h(in)g (whic)o(h)f(the)g Fu($INPUT_LINE)e Fz(command)i(app)q(ears\).)25 b(Compare)75 1876 y Fu($OUTPUT_LINE)p Fz(,)13 b(Section)j(7.2.3.45)d ([$OUTPUT)p 954 1876 14 2 v 16 w(LINE],)i(page)g(76.)75 1988 y Fq(7.2.3.30)29 b Fn($KEYWORD)p Fq(:)i(V)-5 b(alue)21 b(of)f(global)g(R)n(CS-lik)n(e)i(k)n(eyw)n(ord)137 2084 y Fz(`)p Fu($KEYWORD)p Fz(')12 b(pro)o(vides)j(a)e(built-in)k(function) d(alternativ)o(e)g(to)g(the)g(use)g(of)f(`)p Fu(@K)p Fz(')g(in)i(a)f(co)q(de)g(part.)19 b(\(see)75 2139 y(Section)d(5.5.11)d ([A)l(TK)p 479 2139 V 17 w(],)h(page)h(44\).)137 2206 y(`)p Fu($KEYWORD\()p Fs(Keyw)o(ord)r Fu(\))p Fz(')f(extracts)h(\(as)g (a)h(c)o(haracter)f(string\))h(the)g(text)g(of)f(an)h(R)o(CS-lik)o(e)i (k)o(eyw)o(ord)75 2261 y(de\014ned)j(in)g(the)f(ignorable)h(commen)o (tary)e(b)q(et)o(w)o(een)h(`)p Fu(@z)p Fz(')f(and)h(`)p Fu(@x)p Fz(')e(at)i(the)g(b)q(eginning)i(of)d(the)h(w)o(eb)75 2316 y(source)15 b(\014le)h(\(see)f(Section)h(5.5.31)d([A)l(Tz],)h (page)h(50\).)k(\()p Fs(R)o(CS)f Fz(stands)c(for)h(\\revision-con)o (trol)g(system."\))75 2371 y(The)g(general)h(syn)o(tax)f(is)g(\()p Fw(unix)f Fz(users,)h(see)h(`)p Fu(man)e(ident)p Fz('\))195 2435 y Fu($)p Fs(Keyw)o(ord)r Fu(:)23 b Fz(text)15 b(of)g(k)o(eyw)o (ord)23 b Fu($)75 2502 y Fz(F)l(or)15 b(example,)195 2566 y Fu(@z)195 2618 y($Author:)23 b(krommes)g($)195 2670 y(@x)p eop %%Page: 73 75 73 74 bop 75 -58 a Fz(Chapter)15 b(7:)k(MA)o(CR)o(OS)d(and)f(PREPR)o (OCESSING)826 b(73)195 235 y Fu(@c)195 287 y(@)195 339 y(@a)195 391 y(char)23 b(author[])g(=)h($KEYWORD\(Author\);)75 461 y Fz(This)16 b(tangles)f(to)195 528 y Fu(char)23 b(author[])g(=)h("krommes";)137 598 y Fz(In)14 b(this)g(example,)g(`)p Fu($Author)p Fz(')e(is)i(one)g(of)f(the)g(standard)g(R)o(CS)h(k)o(eyw)o (ords.)k(Ho)o(w)o(ev)o(er,)13 b(an)o(y)g(k)o(eyw)o(ord)75 653 y(that)k(\014ts)g(the)h(syn)o(tax)e(`)p Fu($)p Fs(k)o(eyw)o(ord)r Fu(:)e Fs(con)o(ten)o(ts)i Fu($)p Fz(')h(can)h(b)q(e)g(accessed)g(b)o (y)g(`)p Fu($KEYWORD)p Fz('.)25 b(\(A)o(t)16 b(least)i(one)75 708 y(blank)i(is)h(necessary)f(b)q(efore)f(and)h(after)f Fs(con)o(ten)o(ts)p Fz(.\))33 b(The)20 b(argumen)o(t)e(of)i(`)p Fu($KEYWORD)p Fz(')d(need)k(not)e(b)q(e)75 763 y(quoted,)c(but)g(it)h (ma)o(y)e(b)q(e.)21 b(In)16 b(either)f(ev)o(en)o(t,)g(the)g(output)g (is)h(a)f(quoted)g(string.)137 833 y(Keyw)o(ords)e(extracted)g(from)g (ignorable)h(commen)o(tary)e(at)h(the)g(b)q(eginning)j(of)d(a)g(w)o(eb) g(\014le)h(are)f(called)75 888 y Fs(global)h Fz(and)e(are)g(kno)o(wn)f (throughout)h(the)g(co)q(de.)19 b(Distinguish)13 b(these)f(from)f Fs(lo)q(cal)k Fz(k)o(eyw)o(ords)c(extracted)75 943 y(from)17 b(ignorable)i(commen)o(tary)e(at)g(the)h(b)q(eginning)i(of)d(an)h (include)i(\(`)p Fu(@i)p Fz('\))c(\014le.)29 b(Suc)o(h)18 b(k)o(eyw)o(ords)f(are)75 997 y(kno)o(wn)j(only)h(during)h(the)e(time)h (that)f(\014le)i(is)f(b)q(eing)h(read)e(and)h(are)f(accessible)i(via)f (`)p Fu(@k)p Fz(')f(\(see)g(Sec-)75 1052 y(tion)15 b(5.5.12)f([A)l (Tk],)g(page)h(44\).)137 1122 y(F)l(or)j(con)o(v)o(enience,)i (built-ins)g(are)e(de\014ned)i(for)d(some)h(standard)g(R)o(CS)g(global) h(k)o(eyw)o(ords.)28 b(These)75 1177 y(are)195 1245 y Fu($AUTHOR)94 b Fz(=)p Fu(>)25 b($KEYWORD\(Author\))195 1296 y($DATE_TIME)d Fz(=)p Fu(>)j($KEYWORD\(Date\))195 1348 y($HEADER)94 b Fz(=)p Fu(>)25 b($KEYWORD\(Header\))195 1400 y($ID)190 b Fz(=)p Fu(>)25 b($KEYWORD\(Id\))195 1452 y($LOCKER)94 b Fz(=)p Fu(>)25 b($KEYWORD\(Locker\))195 1504 y($NAME)142 b Fz(=)p Fu(>)25 b($KEYWORD\(Name\))195 1556 y($RCSFILE)70 b Fz(=)p Fu(>)25 b($KEYWORD\(RCSfile\))195 1608 y($REVISION)46 b Fz(=)p Fu(>)25 b($KEYWORD\(Revision\))195 1660 y($SOURCE)94 b Fz(=)p Fu(>)25 b($KEYWORD\(Source\))195 1712 y($STATE)118 b Fz(=)p Fu(>)25 b($KEYWORD\(State\))75 1782 y Fz(There)18 b(are)f(no)g(suc)o(h)h(abbreviations)g(for)e(lo)q (cal)j(k)o(eyw)o(ords,)d(b)q(ecause)j(suc)o(h)e(abbreviations)i(w)o (ould)e(b)q(e)75 1837 y(expanded)d(during)g(output)f(whereas)g(it)g(is) h(necessary)f(to)g(recognize)g(and)h(expand)f(the)h(lo)q(cal)g(k)o(eyw) o(ords)75 1891 y(during)i(input.)21 b(Presumably)16 b(suc)o(h)f(lo)q (cal)i(k)o(eyw)o(ords)d(will)j(b)q(e)f(used)f(rarely)l(,)h(if)f(at)g (all.)75 2009 y Fq(7.2.3.31)29 b Fn($L)p Fq(:)i(Change)21 b(to)f(lo)n(w)n(er)h(case)137 2109 y Fz(`)p Fu($L\()p Fs(string)t Fu(\))p Fz(')13 b(c)o(hanges)i Fs(string)k Fz(to)14 b(lo)o(w)o(er)g(case.)19 b(The)c(argumen)o(t)f(is)h(\014rst)f (expanded)i(in)g(case)e(it)h(is)g(a)75 2163 y(macro.)75 2281 y Fq(7.2.3.32)29 b Fn($L_KEYWORD)p Fq(:)j(V)-5 b(alue)20 b(of)g(lo)r(cal)g(R)n(CS-lik)n(e)i(k)n(eyw)n(ord)137 2381 y Fz(F)l(or)14 b(most)g(purp)q(oses,)h(`)p Fu($L_KEYWORD)p Fz(')d(b)q(eha)o(v)o(es)j(as)g(`)p Fu(@k)p Fz(')e(\(see)i(Section)g (5.5.12)e([A)l(Tk],)h(page)g(44\).)19 b(It)75 2435 y(is)d(still)g (under)g(dev)o(elopmen)o(t)g(and)g(should)g(not)f(b)q(e)g(used)h(y)o (et.)137 2506 y(`)p Fu($L_KEYWORD\(")p Fs(Keyw)o(ord)r Fu("\))p Fz(')c(extracts)i(\(as)g(a)h(c)o(haracter)f(string\))g(the)h (text)f(of)h(an)g(R)o(CS-lik)o(e)h(k)o(ey-)75 2560 y(w)o(ord)f (de\014ned)j(in)f(the)f(ignorable)h(commen)o(tary)e(b)q(et)o(w)o(een)h (`)p Fu(@z)p Fz(')f(and)h(`)p Fu(@x)p Fz(')f(at)g(the)h(b)q(eginning)j (of)c(a)h(\014le)75 2615 y(included)e(via)e(`)p Fu(@i)p Fz('.)18 b(`)p Fu($L_KEYWORD\(")p Fs(lo)q(cal)c(k)o(eyw)o(ord)r Fu("\))p Fz(')c(is)i(expanded)h(during)f(input,)h(and)f(the)g(results) 75 2670 y(are)j(kno)o(wn)g(only)h(during)g(the)f(time)g(the)h(include)h (\014le)g(is)e(b)q(eing)i(read.)p eop %%Page: 74 76 74 75 bop 75 -58 a Fz(Chapter)15 b(7:)k(MA)o(CR)o(OS)d(and)f(PREPR)o (OCESSING)826 b(74)137 183 y(Note)12 b(that)g(the)g(argumen)o(t)g(of)g (`)p Fu($L_KEYWORD)p Fz(')e(m)o(ust)i(b)q(e)h(a)f(quoted)h(string.)19 b(F)l(or)11 b(more)h(discussion)i(of)75 238 y(the)h(distinction)i(b)q (et)o(w)o(een)e(lo)q(cal)h(and)f(global)g(k)o(eyw)o(ords,)f(please)i (see)f(Section)h(5.5.31)d([A)l(Tz],)h(page)h(50)75 293 y(and)g(Section)h(7.2.3.30)d([$KEYW)o(ORD],)h(page)h(72.)137 365 y(It)j(is)g(exp)q(ected)h(that)e(lo)q(cal)i(k)o(eyw)o(ords)e(will)j (rarely)d(b)q(e)i(used,)f(as)g(fundamen)o(tal)g(revision-con)o(trol)75 420 y(information)d(should)i(presumably)f(b)q(e)f(extracted)g(from)g (the)g(top)g(of)g(the)g(master)f(w)o(eb)h(\014le.)75 541 y Fq(7.2.3.33)29 b Fn($LANGUAGE)p Fq(:)j(Iden)n(ti\014er)20 b(for)g(curren)n(t)i(language)137 642 y Fz(This)16 b(expands)g(to)e(an) h(iden)o(ti\014er)i(that)e(denotes)g(the)g(curren)o(t)h(language,)f(as) f(follo)o(ws:)195 711 y(Language)182 b Fu($LANGUAGE)195 763 y Fz(C)339 b Fu($C)195 815 y Fz(C)p Fu(++)291 b($CPP)195 867 y Fz(F)l(ortran)221 b Fu($N)195 919 y Fz(F)l(ortran-90)160 b Fu($N90)195 971 y Fz(Ratfor)243 b Fu($R)195 1023 y Fz(Ratfor-90)182 b Fu($R90)195 1075 y Fz(T)l(eX)289 b Fu($X)195 1127 y Fz(VERBA)l(TIM)121 b Fu($V)75 1199 y Fz(Note)15 b(that)f(this)i(outputs)f(iden)o(ti\014ers,)h(not)f Fw(Fweb)h Fz(macros.)j(They)d(are)f(in)o(tended)h(to)f(b)q(e)h(used)f (in)h Fu($IF)75 1253 y Fz(or)f Fu($IFELSE)f Fz(statemen)o(ts)g(suc)o(h) h(as)195 1322 y Fu($IF\($LANGUAGE==$C,)21 b Fs(C-text)p Fu(,)j Fs(other-text)q Fu(\))137 1394 y Fz(F)l(or)16 b(m)o(ultiw)o(a)o(y)h(switc)o(hes,)f(the)h Fu($LANGUAGE_NUM)e Fz(built-in)k(is)e(more)f(useful;)i(see)f(Section)g(7.2.3.34)75 1449 y([$LANGUA)o(GE)p 380 1449 14 2 v 16 w(NUM],)d(page)h(74.)75 1571 y Fq(7.2.3.34)29 b Fn($LANGUAGE_NUM)p Fq(:)j(Num)n(b)r(er)21 b(of)f(curren)n(t)h(language)137 1672 y Fz(`)p Fu($LANGUAGE_NUM)p Fz(')16 b(expands)i(to)g(an)f(in)o(teger)i(that)e(uniquely)j(de\014nes) f(the)f(curren)o(t)g(language,)g(as)75 1727 y(follo)o(ws:)195 1796 y(Language)182 b Fu($LANGUAGE_NUM)195 1848 y Fz(C)339 b Fu(0)195 1900 y Fz(C)p Fu(++)291 b(1)195 1951 y Fz(F)l(ortran)221 b Fu(2)195 2003 y Fz(F)l(ortran-90)160 b Fu(3)195 2055 y Fz(Ratfor)243 b Fu(4)195 2107 y Fz(Ratfor-90)182 b Fu(5)195 2159 y Fz(T)l(eX)289 b Fu(6)195 2211 y Fz(VERBA)l(TIM)121 b Fu(7)75 2283 y Fz(This)20 b(built-in)i(is)e(useful)g(in)h (conjunction)f(with)g(an)f Fu($IFCASE)g Fz(construction;)i(see)f (Section)g(7.2.3.24)75 2338 y([$IF)o(CASE],)14 b(page)h(71.)75 2459 y Fq(7.2.3.35)29 b Fn($LEN)p Fq(:)i(Length)20 b(of)g(string)137 2560 y Fz(`)p Fu($LEN\()p Fs(string)t Fu(\))p Fz(')g(returns)i(the)f (length)i(of)e Fs(string)k Fz(in)e(b)o(ytes.)39 b(If)22 b Fs(string)j Fz(is)d(not)g(surrounded)g(b)o(y)75 2615 y(quotes,)16 b(it)g(is)g(in)o(terpreted)h(as)f(if)g(it)g(w)o(ere)g (quoted)g(\(so)g(it)g(is)g(not)g(expanded)h(if)g(it)f(is)g(a)g (macro\).)21 b(Th)o(us,)75 2670 y(in)16 b(the)f(example)p eop %%Page: 75 77 75 76 bop 75 -58 a Fz(Chapter)15 b(7:)k(MA)o(CR)o(OS)d(and)f(PREPR)o (OCESSING)826 b(75)195 183 y Fu(@m)24 b(SS)f(string)195 235 y($LEN\(SS\))75 307 y Fz(the)15 b(v)m(alue)i(returned)e(is)h(2,)f (not)f(5.)137 379 y(T)l(o)h(expand)h(the)f(argumen)o(t)g(b)q(efore)g (taking)g(the)h(length,)f(one)g(can)h(sa)o(y)e(something)i(lik)o(e)195 448 y Fu(@m)24 b($XLEN\(s\))e($LEN\(s\))75 570 y Fq(7.2.3.36)29 b Fn($LOCKER)p Fq(:)i(V)-5 b(alue)21 b(of)f(R)n(CS)h(global)f(k)n(eyw)n (ord)i Fn(Locker)137 671 y Fz(Equiv)m(alen)o(t)17 b(to)d(`)p Fu($KEYWORD\(Locker\))p Fz('.)j(See)f(Section)g(7.2.3.30)d([$KEYW)o (ORD],)h(page)h(72.)75 792 y Fq(7.2.3.37)29 b Fn($LOG)p Fq(:)i(Natural)20 b(logarithm)137 893 y Fz(`)p Fu($LOG\()p Fs(x)s Fu(\))p Fz(')14 b(returns)h(ln)9 b Fk(x)p Fz(.)75 1015 y Fq(7.2.3.38)29 b Fn($LOG10)p Fq(:)i(Logarithm)20 b(to)g(the)g(base)h(10)137 1116 y Fz(`)p Fu($LOG10\()p Fs(x)s Fu(\))p Fz(')14 b(returns)h(log)611 1127 y Fi(10)654 1116 y Fk(x)p Fz(.)75 1237 y Fq(7.2.3.39)29 b Fn($M)p Fq(:)i(De\014ne)21 b(a)f(deferred)h(macro)137 1338 y Fu($M)15 b Fz(is)h(equiv)m(alen)o(t)h(to)d Fu($DEFINE)p Fz(.)19 b(See)d(Section)g(7.2.3.12)d([$DEFINE],)g(page)i(69.)75 1460 y Fq(7.2.3.40)29 b Fn($MAX)p Fq(:)i(Maxim)n(um)22 b(of)e(a)g(list)137 1561 y Fz(`)p Fu($MAX\()p Fs(x1)p Fu(,)p Fs(x2)p Fu(,...\))p Fz(')15 b(returns)i(the)h(maxim)o(um)g(of)f (the)g(list)i(of)e(argumen)o(ts.)26 b(\(There)17 b(m)o(ust)g(b)q(e)i (at)75 1616 y(least)c(one)h(argumen)o(t.\))75 1737 y Fq(7.2.3.41)29 b Fn($MIN)p Fq(:)i(Minim)n(um)137 1838 y Fz(`)p Fu($MIN\()p Fs(x1)p Fu(,)p Fs(x2)p Fu(,...\))p Fz(')16 b(returns)i(the)g(minim)o(um)h(of)f(the)g(list)h(of)f(argumen)o (ts.)28 b(\(There)18 b(m)o(ust)g(b)q(e)h(at)75 1893 y(least)c(one)h (argumen)o(t.\))75 2014 y Fq(7.2.3.42)29 b Fn($MODULE_NAME)p Fq(:)j(Name)20 b(of)g(presen)n(t)h Fn(web)g Fq(mo)r(dule)137 2115 y Fz(`)p Fu($MODULE_NAME)p Fz(')15 b(returns)i(the)g(name)g(of)g (the)g(presen)o(t)g Fu(web)g Fz(mo)q(dule.)27 b(If)17 b(the)g(presen)o(t)g(mo)q(dule)h(is)75 2170 y(unnamed,)e(it)f(returns)g (the)g(string)h Fu("unnamed")p Fz(.)75 2292 y Fq(7.2.3.43)29 b Fn($MODULES)p Fq(:)i(T)-5 b(otal)20 b(n)n(um)n(b)r(er)h(of)f(indep)r (enden)n(t)h(mo)r(dules)137 2393 y Fz(`)p Fu($MODULES)p Fz(')15 b(giv)o(es)i(the)g(total)f(n)o(um)o(b)q(er)h(of)g(indep)q (enden)o(t)i(mo)q(dules|that)e(is,)h(the)f(n)o(um)o(b)q(er)g(of)f(in-) 75 2447 y(dep)q(enden)o(t)h(mo)q(dule)f(names,)f(plus)h(1)f(for)f(the)i (unnamed)g(mo)q(dule.)75 2569 y Fq(7.2.3.44)29 b Fn($NAME)p Fq(:)i(V)-5 b(alue)21 b(of)f(R)n(CS)h(global)f(k)n(eyw)n(ord)i Fn(Name)137 2670 y Fz(Equiv)m(alen)o(t)17 b(to)d(`)p Fu($KEYWORD\(Name\))p Fz('.)k(See)d(Section)i(7.2.3.30)12 b([$KEYW)o(ORD],)i(page)h(72.)p eop %%Page: 76 78 76 77 bop 75 -58 a Fz(Chapter)15 b(7:)k(MA)o(CR)o(OS)d(and)f(PREPR)o (OCESSING)826 b(76)75 183 y Fq(7.2.3.45)29 b Fn($OUTPUT_LINE)p Fq(:)j(Curren)n(t)21 b(line)g(n)n(um)n(b)r(er)g(of)f(tangled)g(output) 137 278 y Fz(This)15 b(returns)e(the)h(curren)o(t)g(line)h(n)o(um)o(b)q (er)g(of)e(the)h(tangled)g(output.)19 b(Con)o(trast)13 b(this)h(with)g Fu($INPUT_)75 333 y(LINE)p Fz(,)g(Section)i(7.2.3.29)d ([$INPUT)p 711 333 14 2 v 16 w(LINE],)i(page)g(72.)75 441 y Fq(7.2.3.46)29 b Fn($P)p Fq(:)i(The)20 b(C)h(prepro)r(cessor)g (sym)n(b)r(ol)137 536 y Fu($P)16 b Fz(is)h(\(essen)o(tially\))h(a)e (synon)o(ym)g(for)g(`)p Fu($UNQUOTE\("#"\))p Fz(')e(\(see)i(Section)i (7.2.3.64)c([$UNQUOTE],)75 591 y(page)d(78\).)17 b(It)11 b(is)g(useful)h(for)f(constructing)g Fw(Fweb)h Fz(macro)e (de\014nitions)i(that)f(expand)g(to)f(C)h(prepro)q(cessor)75 646 y(statemen)o(ts.)19 b(F)l(or)14 b(example,)195 709 y Fu(@m)24 b(CHECK\(flag\))386 761 y($P)f(if\(flag\))577 813 y(special)g(code;)386 865 y($P)g(endif)137 931 y Fz(Another)15 b(v)o(ersion)f(of)g(the)g(prepro)q(cessor)h(sym)o(b)q(ol) f(is)h Fu($PP)f Fz(\(see)g(Section)i(7.2.3.49)11 b([$PP],)i(page)h (76\).)75 985 y(F)l(or)e(most)g(purp)q(oses,)h Fu($P)g Fz(and)g Fu($PP)f Fz(will)i(b)q(eha)o(v)o(e)g(in)f(exactly)g(the)g (same)f(w)o(a)o(y)l(.)19 b(The)13 b(di\013erence)h(b)q(et)o(w)o(een)75 1040 y(them)h(is)g(that)f Fu($P)g Fz(is)h(treated)g(as)f(a)g(string)h (\(without)f(surrounding)i(quotes\),)d(whereas)i Fu($PP)f Fz(is)h(treated)75 1095 y(as)c(a)g(c)o(haracter.)18 b(The)12 b(c)o(haracter)e(nature)h(of)g Fu($PP)g Fz(is)h(used)g(b)o(y)f Fw(F)o(or)m(tran)h Fz(to)f(reset)g(the)g(column)i(n)o(um)o(b)q(er)75 1150 y(to)i(1,)f(so)h(C-lik)o(e)h(prepro)q(cessor)f(commands)g(app)q (ear)h(there)f(rather)g(than)g(in)h(column)g(7.)137 1216 y(F)l(or)24 b(further)g(discussion)j(of)d(strings)g(and)h(the)f (di\013erences)i(b)q(et)o(w)o(een)f Fu($P)f Fz(and)g Fu($PP)p Fz(,)i(see)f(Sec-)75 1270 y(tion)15 b(7.2.3.1)e([Strings)i (and)h(quotes],)e(page)h(67.)75 1379 y Fq(7.2.3.47)29 b Fn($PI)p Fq(:)i(Pi)137 1474 y Fz(The)c(expression)g(`)p Fu($PI)p Fz(')e(returns)h Fk(\031)i Fz(to)e(the)g(default)h(mac)o(hine) g(precision.)55 b(The)26 b(expression)75 1528 y(`)p Fu($PI\()p Fs(iprec)s Fu(\))p Fz(')15 b(returns)g Fk(\031)h Fz(to)f(the)g(decimal) i(precision)g Fs(iprec)i Fz(\(whic)o(h)c(m)o(ust)g(b)q(e)h(less)g(than) f(50\).)75 1637 y Fq(7.2.3.48)29 b Fn($POW)p Fq(:)i(Exp)r(onen)n (tiation)137 1732 y Fz(`)p Fu($POW\()p Fs(x,y)t Fu(\))p Fz(')13 b(generates)i Fk(x)611 1715 y Fj(y)631 1732 y Fz(.)20 b(\(It)15 b(is)h(a)e(macro)h(de\014ned)h(in)g(terms)f(of)g Fu($EVAL)f Fz(\(see)h(Section)h(7.2.3.17)75 1786 y([$EV)-5 b(AL],)14 b(page)h(70\))g(and)g(the)g(exp)q(onen)o(tiation)i(op)q (erator.\))75 1895 y Fq(7.2.3.49)29 b Fn($PP)p Fq(:)i(The)20 b(C)h(prepro)r(cessor)g(sym)n(b)r(ol)137 1990 y Fu($PP)f Fz(is)g(shorthand)g(for)g(`)p Fu($UNSTRING\($P\))p Fz(')d(\(see)j (Section)h(7.2.3.46)d([$P],)g(page)i(76\),)g(or)g(\(essen-)75 2044 y(tially\))d(a)g(synon)o(ym)f(for)g(`)p Fu($UNSTRING\("#"\))p Fz(')e(\(see)i(Section)i(7.2.3.65)c([$UNSTRING],)i(page)g(78\).)23 b(It)75 2099 y(is)18 b(useful,)h(particularly)f(in)g Fw(F)o(or)m(tran)p Fz(,)g(for)f(constructing)g Fw(Fweb)i Fz(macro)e(de\014nitions)i(that)d(expand)75 2154 y(to)i(C)g(prepro)q (cessor)g(statemen)o(ts.)28 b(F)l(or)18 b(an)g(example,)i(see)f (Section)g(7.2.3.46)d([$P],)h(page)h(76.)29 b(F)l(or)17 b(a)75 2209 y(detailed)f(discussion)g(of)e(the)g(di\013erence)i(b)q(et) o(w)o(een)e(`)p Fu($P)p Fz(')f(and)i(`)p Fu($PP)p Fz(',)e(see)h (Section)i(7.2.3.1)c([Strings)i(and)75 2264 y(quotes],)g(page)h(67.)75 2372 y Fq(7.2.3.50)29 b Fn($RCSFILE)p Fq(:)i(V)-5 b(alue)21 b(of)f(R)n(CS)h(global)f(k)n(eyw)n(ord)i Fn($RCSfile)137 2467 y Fz(Equiv)m(alen)o(t)17 b(to)d(`)p Fu($KEYWORD\(RCSfile\))p Fz('.)j(See)f(Section)g(7.2.3.30)d([$KEYW)o(ORD],)h(page)h(72.)75 2575 y Fq(7.2.3.51)29 b Fn($REVISION)p Fq(:)j(V)-5 b(alue)20 b(of)g(R)n(CS)h(global)f(k)n(eyw)n(ord)i Fn(Revision)137 2670 y Fz(Equiv)m(alen)o(t)17 b(to)d(`)p Fu($KEYWORD\(Revision\))p Fz('.)j(See)f(Section)g(7.2.3.30)d([$KEYW)o(ORD],)h(page)h(72.)p eop %%Page: 77 79 77 78 bop 75 -58 a Fz(Chapter)15 b(7:)k(MA)o(CR)o(OS)d(and)f(PREPR)o (OCESSING)826 b(77)75 183 y Fq(7.2.3.52)29 b Fn($ROUTINE)p Fq(:)i(Curren)n(t)22 b(function)e(\()p Fo(Ra)m(tf)o(or)f Fq(only\))137 291 y Fz(When)12 b Fw(Ra)m(tf)o(or)f Fz(is)h(the)f (curren)o(t)g(language,)g Fu($ROUTINE)f Fz(expands)i(to)e(a)h(string)f (built)j(of)d(the)h(name)g(of)75 346 y(the)g(curren)o(t)g(program,)f (function,)i(or)e(subroutine.)20 b(This)11 b(function)h(is)f(not)g (useful)h(for)e(other)g(languages,)75 401 y(for)15 b(whic)o(h)h(it)f (expands)h(to)e(the)i(n)o(ull)g(string.)75 535 y Fq(7.2.3.53)29 b Fn($SECTION_NUM)p Fq(:)j(Num)n(b)r(er)21 b(of)e(curren)n(t)j Fo(Fweb)e Fq(section)137 643 y Fz(`)p Fu($SECTION_NUM)p Fz(')g(returns)i(an)g(in)o(teger)g(greater)f(than)h(0)g(that)f(is)i (the)f(in)o(teger)g(n)o(um)o(b)q(er)g(of)g(the)75 698 y(curren)o(t)15 b Fu(web)g Fz(section.)20 b(\(This)c(is)f(not)g(the)h (LaT)892 708 y(E)917 698 y(X)f(section)h(n)o(um)o(b)q(er)g(suc)o(h)f (as)g(3.4.\))75 833 y Fq(7.2.3.54)29 b Fn($SECTIONS)p Fq(:)j(Maxim)n(um)21 b(section)g(n)n(um)n(b)r(er)137 941 y Fz(`)p Fu($SECTIONS)p Fz(')13 b(is)j(the)f(maxim)o(um)h(section)f (n)o(um)o(b)q(er)h(as)f(understo)q(o)q(d)g(b)o(y)h Fw(Fwea)l(ve)p Fz(.)75 1075 y Fq(7.2.3.55)29 b Fn($SOURCE)p Fq(:)i(V)-5 b(alue)21 b(of)f(R)n(CS)h(global)f(k)n(eyw)n(ord)i Fn(Source)137 1183 y Fz(Equiv)m(alen)o(t)17 b(to)d(`)p Fu($KEYWORD\(Source\))p Fz('.)j(See)f(Section)g(7.2.3.30)d([$KEYW)o(ORD],)h(page)h(72.)75 1318 y Fq(7.2.3.56)29 b Fn($SQRT)p Fq(:)i(Square)21 b(ro)r(ot)137 1426 y Fz(`)p Fu($SQRT\()p Fs(x)s Fu(\))p Fz(')c(returns)535 1393 y Fx(p)p 573 1393 26 2 v 33 x Fk(x)p Fz(.)28 b(It)19 b(is)f(a)g(con)o(v)o(enience)i(macro)d(de\014ned)j(in)f(terms)e(of)h Fu($POW)p Fz(.)28 b(See)19 b(Sec-)75 1480 y(tion)c(7.2.3.48)e([$PO)o (W],)h(page)h(76.)75 1615 y Fq(7.2.3.57)29 b Fn($STATE)p Fq(:)i(V)-5 b(alue)21 b(of)f(R)n(CS)h(global)f(k)n(eyw)n(ord)i Fn(State)137 1723 y Fz(Equiv)m(alen)o(t)17 b(to)d(`)p Fu($KEYWORD\(State\))p Fz('.)j(See)f(Section)g(7.2.3.30)d([$KEYW)o (ORD],)h(page)h(72.)75 1858 y Fq(7.2.3.58)29 b Fn($STRING)p Fq(:)i(Expand,)22 b(then)e(stringize)137 1966 y Fz(`)p Fu($STRING\()p Fs(s)r Fu(\))p Fz(')d(expands)j(its)f(argumen)o(t)f(if)i (it)f(is)h(a)f(macro,)g(then)g(mak)o(es)g(the)g(expansion)h(in)o(to)f (a)75 2020 y(quoted)c(string.)20 b(If)c(the)f(argumen)o(t)f(is)i (already)f(a)g(quoted)h(string,)e(it)i(is)g(returned)f(unc)o(hanged.)75 2155 y Fq(7.2.3.59)29 b Fn($STUB)p Fq(:)i(T)-5 b(rap)20 b(for)g(missing)h(mo)r(dule)137 2263 y Fz(When)11 b(a)f(missing)h(mo)q (dule)g(is)g(detected,)g Fw(Ft)m(angle)g Fz(inserts)f(the)h(command)f (`)p Fu($STUB\()p Fs(mo)q(dule)p 1760 2263 14 2 v 16 w(name)s Fu(\))p Fz(')p 1919 2272 21 41 v 75 2318 a(in)o(to)20 b(the)g(output)f(co)q(de.)35 b(The)20 b(built-in)i Fu($STUB)d Fz(expands)i(to)e(a)g(function)i(call)g(appropriate)f(to)f(the)75 2373 y(curren)o(t)c(language.)20 b(F)l(or)15 b(example,)h(in)g(C)f(it)g (expands)h(to)f(`)p Fu(missing_mod)p Fz(',)d(in)k Fw(F)o(or)m(tran)g Fz(it)f(expands)75 2427 y(to)g(`)p Fu(call)f(nomod)p Fz('.)75 2562 y Fq(7.2.3.60)29 b Fn($TIME)p Fq(:)i(The)21 b(time)137 2670 y Fz(`)p Fu($TIME)p Fz(')14 b(returns)h(a)g(string)g (consisting)h(of)f(the)g(lo)q(cal)i(time)e(in)h(the)f(form)g Fu("19:59")p Fz(.)p eop %%Page: 78 80 78 79 bop 75 -58 a Fz(Chapter)15 b(7:)k(MA)o(CR)o(OS)d(and)f(PREPR)o (OCESSING)826 b(78)75 183 y Fq(7.2.3.61)29 b Fn($TRANSLIT)p Fq(:)j(T)-5 b(ransliteration)137 291 y Fz(The)11 b(macro)f(`)p Fu($TRANSLIT\()p Fs(s)p Fu(,)j Fs(from)p Fu(,)i Fs(to)r Fu(\))p Fz(')9 b(in)o(terprets)i(eac)o(h)g(of)f(its)h(argumen)o(ts)f (as)g(strings)g(\(without)75 346 y(expanding)j(an)o(ything\).)18 b(Then)12 b Fs(s)h Fz(is)f(mo)q(di\014ed)h(b)o(y)e(replacing)i(an)o(y)e (of)g(the)h(c)o(haracters)e(found)i(in)g Fs(from)f Fz(b)o(y)75 400 y(the)j(corresp)q(onding)h(c)o(haracters)f(in)h Fs(to)p Fz(.)k(If)14 b Fs(to)i Fz(is)f(shorter)e(than)h Fs(from)p Fz(,)f(then)i(the)f(excess)h(c)o(haracters)e(in)75 455 y Fs(from)e Fz(are)h(deleted)h(from)f Fs(s)p Fz(.)18 b(As)12 b(a)g(limiting)i(case,)e(if)h Fs(to)h Fz(is)e(empt)o(y)l(,)g (then)h(all)g(the)f(c)o(haracters)f(in)i Fs(from)e Fz(are)75 510 y(deleted)i(from)e Fs(s)p Fz(.)19 b(F)l(or)11 b(example,)i(`)p Fu($TRANSLIT\(s,)h(aeiou,)g(12345\))p Fz(')c(replaces)j(the)f(v)o(o)o (w)o(els)g(in)g Fs(s)i Fz(b)o(y)e(the)75 565 y(corresp)q(onding)19 b(digits,)f(and)g(`)p Fu($TRANSLIT\(s,)13 b(aeiou,)i(\))p Fz(')i(deletes)i(all)f(the)g(v)o(o)o(w)o(els.)27 b(The)18 b(bac)o(kslash)75 620 y(ma)o(y)13 b(b)q(e)i(used)f(to)g(escap)q(e)g(a)g (c)o(haracter,)f(as)h(in)g(ANSI)h(C.)e(F)l(or)h(example,)g(`)p Fu($TRANSLIT\("a\\\\"\\\\\\\\d",)75 674 y("d\\\\\\\\a\\\\"",)g ("D,A'"\))p Fz(')i(translates)h(in)o(to)h(`)p Fu(A',D)p Fz('.)27 b(Here)18 b(one)g(had)g(to)f(explicitly)k(enclose)e(strings)75 729 y(in)o(v)o(olving)13 b(`)p Fu(\\\\")p Fz(')e(in)h(double)i(quotes)d (in)i(order)f(to)f(a)o(v)o(oid)g(a)h(complain)o(t)g(ab)q(out)g(an)g(un) o(terminated)g(string.)75 864 y Fq(7.2.3.62)29 b Fn($U)p Fq(:)i(Change)21 b(to)f(upp)r(er)g(case)137 972 y Fz(`)p Fu($U\()p Fs(string)t Fu(\))p Fz(')14 b(c)o(hanges)h Fs(string)k Fz(to)c(upp)q(er)h(case.)75 1107 y Fq(7.2.3.63)29 b Fn($UNDEF)p Fq(:)i(Unde\014ne)21 b(a)g(macro)137 1214 y Fz(`)p Fu($UNDEF\()p Fs(macro)r Fu(\))p Fz(')13 b(unde\014nes)k(an)e Fw(Fweb)h Fz(macro.)75 1349 y Fq(7.2.3.64)29 b Fn($UNQUOTE)p Fq(:)i(Remo)n(v)n(e)22 b(quotes)e(from)g(string)137 1457 y Fz(`)p Fu($UNQUOTE\()p Fs(string)t Fu(\))p Fz(')11 b(returns)j Fs(string)j Fz(without)d(its)f(surrounding)i(quotes.)k (\(Ho)o(w)o(ev)o(er,)12 b(the)h(result-)75 1511 y(ing)j(construction)f (is)h(still)h(treated)d(as)h(a)g(string;)g(no)g(macro)f(expansion)i(is) g(done.\))137 1590 y(F)l(or)g(a)h(more)f(detailed)i(discussion)h(and)e (a)f(comparison)h(with)g Fu($UNSTRING)e Fz(\(see)i(Section)g(7.2.3.65) 75 1645 y([$UNSTRING],)e(page)g(78\),)f(see)h(Section)h(7.2.3.1)d ([Strings)i(and)h(quotes],)e(page)h(67.)75 1780 y Fq(7.2.3.65)29 b Fn($UNSTRING)p Fq(:)j(Con)n(v)n(ert)21 b(string)f(in)n(to)h(c)n (haracters)137 1887 y Fz(`)p Fu($UNSTRING\()p Fs(string)t Fu(\))p Fz(')13 b(remo)o(v)o(es)i(quotes)g(from)f(the)i(string,)f(if)h (they)f(are)g(presen)o(t,)g(and)h(treats)e(the)75 1942 y(result)j(as)f(a)h(collection)h(of)e(c)o(haracters.)24 b(No)16 b(tok)o(enization)h(is)h(done,)f(so)f(macro)g(expansion)h(do)q (es)g(not)75 1997 y(op)q(erate)e(on)g(those)g(c)o(haracters.)137 2075 y(F)l(or)j(a)h(more)f(detailed)i(discussion)h(and)d(a)h (comparison)g(with)g Fu($UNQUOTE)e Fz(\(see)i(Section)g(7.2.3.64)75 2130 y([$UNQUOTE],)c(page)g(78\),)e(see)j(Section)g(7.2.3.1)d([Strings) i(and)g(quotes],)g(page)g(67.)75 2265 y Fq(7.2.3.66)29 b Fn($VERBATIM)p Fq(:)j(\(Obsolete\))137 2373 y Fz(This)12 b(w)o(as)f(an)h(old)g(name)f(for)g Fu($UNQUOTE)f Fz(\(see)i(Section)g (7.2.3.64)d([$UNQUOTE],)i(page)h(78\).)17 b(Please)75 2428 y(remo)o(v)o(e)d(all)j(references)e(to)g(this)h(macro)e(from)h (existing)h(co)q(des.)75 2562 y Fq(7.2.3.67)29 b Fn($VERSION)p Fq(:)i(Presen)n(t)21 b Fo(Fweb)g Fq(v)n(ersion)g(n)n(um)n(b)r(er)137 2670 y Fz(`)p Fu($VERSION)p Fz(')14 b(returns)h(a)g(string)g(built)h (out)f(of)g(the)g Fw(Fweb)h Fz(v)o(ersion)g(n)o(um)o(b)q(er,)f(suc)o(h) g(as)g Fu("1.61")p Fz(.)p eop %%Page: 79 81 79 80 bop 75 -58 a Fz(Chapter)15 b(7:)k(MA)o(CR)o(OS)d(and)f(PREPR)o (OCESSING)826 b(79)75 183 y Fq(7.2.4)30 b(Debugging)20 b(with)g(macros)137 286 y Fz(If)13 b(an)g Fw(Fweb)h Fz(macro)e(expands) h(to)g(more)f(than)h(one)f(output)h(line,)i(debugging)e(can)g(b)q(e)h (a)e(bit)i(confus-)75 341 y(ing)h(if)g(the)g(debugger)g(\(e.g.,)e Fu(gdb)p Fz(\))h(displa)o(ys)i(lines)g(in)g(the)f Fu(web)f Fz(source)g(\014le)i(instead)f(of)g(the)f(output)h(\014le)75 396 y(\(as)e(it)i(normally)f(do)q(es)g(for)g(C)g(and)g(C)p Fu(++)p Fz(\).)k(While)e(single-stepping)g(through)e(the)g(co)q(de,)g (the)h(debugger)75 451 y(will)21 b(incorrectly)g(step)f(the)g(screen)g (displa)o(y)h(for)e(eac)o(h)h(output)f(line)i(ev)o(en)f(if)h(the)e (macro)g(call)i(o)q(ccu-)75 506 y(pies)c(just)e(one)h(line)i(in)e(the)g (source)g(\014le.)23 b(T)l(o)16 b(lo)q(calize)i(the)e(debugger's)f (confusion,)i(insert)f(a)g(`)p Fu(@#line)p Fz(')75 560 y(command)f(after)g(the)g(macro)f(call.)21 b(F)l(or)15 b(example,)195 631 y Fu(@c)195 683 y(@)24 b(Example)f(of)g(a)h(macro)f (that)g(expands)g(to)h(several)f(output)g(lines.)195 735 y(@m)h(UPDATE\(i,)e(delta_i\))314 787 y(i)i(+=)g(delta_i;)314 839 y(store\(i\)@;)195 891 y(@a)195 943 y(main\(\))195 995 y({)195 1047 y(UPDATE\(j,)f(5\);)195 1098 y(@#line)195 1150 y(//)h(More)f(code.)47 b(The)23 b(debugger)g(will)g(be)h(in)g (sync)f(from)g(here)h(on.)195 1202 y(})137 1276 y Fz(An)13 b(alternativ)o(e)g(for)f(highly)j(confusing)e(situations)g(is)h(to)e (use)h(the)g(`)p Fu(-#)p Fz(')e(option)i(\(see)g(Section)h(4.2.78)75 1331 y([-#],)g(page)h(36\).)137 1405 y(Another)23 b(p)q(oten)o(tially)h (confusing)f(situation)g(o)q(ccurs)g(when)g(`)p Fu(@\045)p Fz(')f(is)h(used)g(to)f(commen)o(t)g(out)g(a)75 1460 y(line.)34 b Fw(Fweb)20 b Fz(deals)g(with)g(the)g(line-n)o(um)o(b)q(er) h(problem)f(that)f(arises)g(here)h(automatically;)i(see)d(Sec-)75 1515 y(tion)c(4.2.59.6)e([-T#],)h(page)h(31.)137 1589 y Fw(Fwea)l(ve)23 b Fz(mak)o(es)d(a)i(v)m(alian)o(t)g(attempt)f(to)f (prett)o(y-prin)o(t)i(\(see)f(Section)i(10.2)d([Prett)o(y-prin)o (ting],)75 1643 y(page)h(100\))f(the)h(de\014nitions)i(of)e(b)q(oth)g (outer)g(macros)f(and)h Fw(Fweb)i Fz(macros)d(in)i(a)f(reasonable)g(w)o (a)o(y)l(.)75 1698 y(Ho)o(w)o(ev)o(er,)14 b(this)h(can)g(b)q(e)g(a)g (formidable)h(task,)e(b)q(ecause)i(macro)e(syn)o(tax)g(can)h(b)q(e)g (essen)o(tially)i(arbitrary)l(.)75 1753 y(Consider,)e(for)g(example,)h (the)f(follo)o(wing)h(de\014nition:)195 1824 y Fu(@c)195 1876 y(@d)24 b(GET\(type\))e(type)i(get_##type\(\))195 1928 y(@a)195 1980 y(GET\(int\){}@;)e(//)i Fz(Expands)15 b(in)o(to)g(`)p Fu(int get_int\(\){})p Fz('.)75 2054 y(The)22 b(problem)h(is)f(that)f(the)h(iden)o(ti\014er)h(`)p Fu(type)p Fz(')e(is)h(used)g(in)h(t)o(w)o(o)d(di\013eren)o(t)i(w)o(a)o (ys:)32 b(as)22 b(the)g(t)o(yp)q(e)f(of)75 2109 y(a)h(reserv)o(ed)g(w)o (ord)g(\(the)g(second)g(`)p Fu(type)p Fz('\),)g(and)h(as)f(an)g (ordinary)g(expression)h(\(the)f(third)h(`)p Fu(type)p Fz('\).)75 2163 y(The)c(\014rst)f(`)p Fu(type)p Fz(')f(has)i(b)q(oth)f (meanings)h(sim)o(ultaneously)l(.)32 b(Unfortunately)l(,)19 b(within)h(an)o(y)e(particular)75 2218 y(language)d Fw(Fwea)l(ve)h Fz(asso)q(ciates)f(one)h(unique)g(t)o(yp)q(e)g(or)e Fs(ilk)20 b Fz(with)15 b(eac)o(h)g(iden)o(ti\014er.)137 2292 y(One)21 b(solution)f(to)f(this)h(problem)h(is)f(to)f(use)h(the)g(`)p Fu(@R)p Fz(')f(command)g(\(see)h(Section)g(5.5.23)e([A)l(TR)p 1836 2292 14 2 v 17 w(],)75 2347 y(page)d(49\),)f(whic)o(h)i(c)o (hanges)f(the)g(ilk)i(of)e(the)g(v)o(ery)g(next)g(iden)o(ti\014er)i(to) d(in)o(teger-lik)o(e.)22 b(Th)o(us,)195 2418 y Fu(@d)i(GET\(type\))e (@R)i(type)f(get_##type\(\)@;)75 2492 y Fz(will)14 b(format)e (correctly)l(.)19 b(An)13 b(alternativ)o(e)g(solution)h(uses)f(the)g (related)g(command)g(`)p Fu(@E)p Fz(',)e(whic)o(h)j(c)o(hanges)75 2547 y(the)h(ilk)i(of)d(the)i(v)o(ery)f(next)g(iden)o(ti\014er)i(to)d (an)h(ordinary)h(expression.)k(Th)o(us,)195 2618 y Fu(@f)k(type)f(int) 195 2670 y(@d)h(GET\(type\))e(type)i(get_##@Etype\(\)@;)p eop %%Page: 80 82 80 81 bop 75 -58 a Fz(Chapter)15 b(7:)k(MA)o(CR)o(OS)d(and)f(PREPR)o (OCESSING)826 b(80)137 183 y(Other)22 b(t)o(yp)q(es)f(of)g(troublesome) g(situations)h(in)o(v)o(olv)o(e)g(spaces.)38 b(When)22 b Fw(Fweb)g Fz(understands)g(the)75 238 y(syn)o(tax,)13 b(it)g(inserts)h(spaces)f(automatically)h(to)f(mak)o(e)f(the)i(output)f (pleasing.)21 b(Consider,)13 b(ho)o(w)o(ev)o(er,)g(the)75 293 y(\(somewhat)h(con)o(triv)o(ed\))h(example)195 360 y Fu(@c)195 411 y(@d)24 b(A\(x,)f(y\))g(x)h(y)195 463 y(@d)g(B)f(s1;)195 515 y(@d)h(C)f(s2;)195 567 y(@a)195 619 y(A\(B,)g(C\)@;)75 689 y Fz(Here)17 b Fw(Fwea)l(ve)g Fz(will)h(consider)f(`)p Fu(x)p Fz(')e(and)i(`)p Fu(y)p Fz(')e(to)h(b)q(e)h(ordinary)g(iden)o(ti\014ers)h(\(simple)f (expressions\),)g(and)75 743 y(will)i(abut)e(them)g(with)h(no)f(in)o (terv)o(ening)h(spaces,)f(whic)o(h)h(is)g(confusing)g(to)f(read.)26 b(The)17 b(solution)h(is)g(to)75 798 y(insert)e(a)f(space)g(man)o (ually)h(with)f(`)p Fu(@,)p Fz(':)195 865 y Fu(@d)24 b(A\(x,)f(y\))g(x)h(@,)g(y)75 935 y Fz(\(Whether)12 b(one)g(should)h (write)f(macros)f(lik)o(e)i(this)g(at)e(all)i(is)f(a)g(separate)g (issue.\))19 b(F)l(or)11 b(a)h(related)g(example,)75 989 y(see)j(the)h(discussion)h(of)d(Section)j(5.12)c([A)l(Tcomma],)h (page)h(55.)75 1124 y Fy(7.3)33 b(Prepro)r(cessing)137 1223 y Fz(Generally)l(,)19 b(the)e Fw(Fweb)h Fz(prepro)q(cessor)f (commands)g(follo)o(w)h(a)e(syn)o(tax)h(iden)o(tical)i(to)d(their)i (C/C)p Fu(++)75 1277 y Fz(coun)o(terparts.)h(The)14 b(one)g(exception)g (is)h(the)f(`)p Fu(@#line)p Fz(')e(command.)19 b(Whereas)14 b(the)g(C)f(command)h(tak)o(es)75 1332 y(a)19 b(line)h(n)o(um)o(b)q(er) f(and)g(\014le)h(name)f(as)f(argumen)o(ts,)h(the)g Fw(Fweb)h Fz(command)e(tak)o(es)h(no)f(argumen)o(ts;)i(its)75 1387 y(expansion)i(automatically)f(inserts)g(the)g(curren)o(t)g(line)i(n)o (um)o(b)q(er)e(and)g(\014le)h(name.)37 b(This)21 b(command)75 1442 y(should)d(b)q(e)f(necessary)g(only)h(in)f(rare)g(circumstances.) 25 b(One)18 b(of)e(those)h(in)o(v)o(olv)o(es)g(situations)g(in)h(whic)o (h)75 1497 y(an)e Fw(Fweb)h Fz(macro)e(expands)i(to)e(more)h(than)g (one)g(output)g(line;)i(see)e(Section)h(7.2.4)d([Debugging)j(with)75 1551 y(macros],)d(page)h(79.)137 1621 y(The)23 b Fw(Fweb)g Fz(prepro)q(cessor)f(commands)h(ma)o(y)e(app)q(ear)i(in)g(either)g(the) f(de\014nition)i(or)e(the)g(co)q(de)75 1676 y(parts.)28 b(But)18 b Fs(BEW)-5 b(ARE:)18 b(No)f(matter)g(where)i(they)f(app)q (ear,)g(they)g(are)g(expanded)h(during)g(INPUT,)75 1731 y(not)c(output.)21 b Fz(\(This)16 b(is)h(probably)f(a)f(design)i(\015a) o(w.\))j(F)l(or)15 b(more)h(discussion,)h(see)f(Section)g(7.2)f([FWEB) 75 1785 y(macros],)f(page)h(63.)137 1855 y(The)h(syn)o(tax)e(of)h(eac)o (h)g(command)g(is)h(as)f(follo)o(ws:)195 1935 y Fu(@#line)96 b Fz(|)16 b(Insert)f(a)g Fu(#line)f Fz(command.)195 2015 y Fu(@#define)g Fs(iden)o(ti\014er)435 2067 y Fz(|)i(De\014ne)f(an)h (FWEB)e(macro;)g(equiv)m(alen)o(t)j(to)e(`)p Fu(@m)p Fz('.)195 2146 y Fu(@#undef)f Fs(iden)o(ti\014er)435 2198 y Fz(|)i(Unde\014ne)g(an)f(FWEB)g(macro.)195 2277 y Fu(@#ifdef)f Fs(iden)o(ti\014er)435 2329 y Fz(|)d(Is)f(FWEB)g(macro)f (de\014ned?)20 b(Equiv)m(alen)o(t)12 b(to)e(`)p Fu(@#if)k(defined)g (identifier)p Fz(')n(.)p 1959 2338 21 41 v 195 2408 a Fu(@#ifndef)g Fs(iden)o(ti\014er)435 2460 y Fz(|)d(Is)f(FWEB)g(macro)f (not)h(de\014ned?)20 b(Equiv)m(alen)o(t)12 b(to)d(`)p Fu(@#if)15 b(!defined)f(identifier)p Fz(')n(.)p 2058 2469 V 195 2539 a Fu(@#if)h Fs(expression)195 2604 y Fu(@#elif)f Fs(expression)195 2670 y Fu(@#else)p eop %%Page: 81 83 81 82 bop 75 -58 a Fz(Chapter)15 b(7:)k(MA)o(CR)o(OS)d(and)f(PREPR)o (OCESSING)826 b(81)195 183 y Fu(@#endif)137 263 y Fz(In)15 b(the)e(`)p Fu(@#if)p Fz(')g(statemen)o(t,)g(the)g Fs(expression)i Fz(ma)o(y)e(con)o(tain)h Fw(Fweb)h Fz(macros,)e(but)h(m)o(ust)f (ultimately)75 318 y(ev)m(aluate)j(to)f(a)f(n)o(um)o(b)q(er.)21 b(If)15 b(that)g(n)o(um)o(b)q(er)g(is)h(zero,)f(the)g(expression)h(is)g (false;)f(otherwise,)g(it)g(is)h(true.)137 385 y(The)11 b Fs(expression)h Fz(follo)o(wing)f(constructions)g(suc)o(h)g(as)f(`)p Fu(@#if)p Fz(')f(is)i(ev)m(aluated)h(b)o(y)f(a)f(built-in)j(expression) 75 440 y(ev)m(aluator)f(that)g(can)g(also)h(b)q(e)g(used)g(for)e(other) h(purp)q(oses,)h(suc)o(h)g(as)f(in)h(macro)e(expansion.)20 b(Its)12 b(b)q(eha)o(vior)75 495 y(is)22 b(again)g(motiv)m(ated)g(b)o (y)g(expression)g(ev)m(aluation)h(in)g(ANSI)g(C;)e(it)h(is)g(not)f (quite)i(as)e(general,)j(but)75 549 y(should)c(b)q(e)g(more)f(than)g (adequate.)32 b(\(One)19 b(design)h(\015a)o(w)f(that)g(will)h(b)q(e)g (\014xed)g(someda)o(y)f(is)g(that)g(the)75 604 y(order)13 b(of)g(expression)i(ev)m(aluation)f(is)g(not)g(necessarily)h (left-to-righ)o(t,)e(as)g(it)h(is)g(in)g(C.\))f(It)g(supp)q(orts)h(b)q (oth)75 659 y(in)o(teger)19 b(and)g(\015oating-p)q(oin)o(t)g (arithmetic)g(\(with)g(t)o(yp)q(e)f(promotion)h(from)f(in)o(teger)g(to) g(\015oating-p)q(oin)o(t)75 714 y(if)k(necessary\),)h(and)e(the)h(ANSI) g Fu(defined)f Fz(op)q(erator.)38 b(Op)q(erators)21 b(with)h(the)g (highest)g(precedence)75 769 y(\(see)e(table)g(b)q(elo)o(w\))g(are)g (ev)m(aluated)h(\014rst;)h(as)d(usual,)j(paren)o(theses)e(o)o(v)o (erride)g(the)g(natural)g(order)f(of)75 823 y(ev)m(aluation.)30 b(The)18 b(unary)g(op)q(erator)f Fu(defined)g Fz(has)h(the)g(highest)h (precedence;)h(all)f(the)f(other)g(unary)75 878 y(op)q(erators)f(ha)o (v)o(e)g(the)h(next)f(highest)i(\(and)e(equal\))h(precedence;)j(then)d (come)f(the)h(binary)g(op)q(erators.)75 933 y(When)j(the)g(op)q(erator) f(exists)h(in)g(C,)f(the)h(action)g(tak)o(en)f(b)o(y)h Fw(Fweb)h Fz(is)f(precisely)h(that)e(that)g(the)h(C)75 988 y(compiler)15 b(w)o(ould)g(tak)o(e.)k(Arithmetic)c(is)f(done)h(in)g (either)g Fp(long)f Fz(or)g Fp(double)h Fz(v)m(ariables,)g(as)f (implemen)o(ted)75 1043 y(b)o(y)i(the)f(C)h(compiler)h(that)e(compiled) i Fw(Ft)m(angle)p Fz(.)22 b(\(This)16 b(w)o(as)f(the)h(easy)f(c)o (hoice,)h(not)g(necessarily)h(the)75 1097 y(most)d(desirable)j(one.\)) 137 1165 y(The)f(op)q(erators,)e(listed)i(from)f(highest)g(precedence)i (to)e(lo)o(w)o(est,)f(are)h(as)g(follo)o(ws)p eop %%Page: 82 84 82 83 bop 75 -58 a Fz(Chapter)15 b(7:)k(MA)o(CR)o(OS)d(and)f(PREPR)o (OCESSING)826 b(82)75 344 y(Unary)15 b(op)q(erators)226 383 y(\026)400 344 y(:)123 417 y Fu(defined)98 b Fz(|)16 b Fu(defined)d Fz(is)h(a)f(unary)h(op)q(erator)f(that)g(acts)g(on)g (iden)o(ti\014er)i(tok)o(ens.)k(`)p Fu(defined)512 472 y(id)p Fz(')k(or)g(equiv)m(alen)o(tly)j(`)p Fu(defined\(id\))p Fz(')21 b(ev)m(aluates)k(to)e(1)g(\(true\))g(if)h(the)512 527 y(iden)o(ti\014er)30 b(is)f(de\014ned)h(as)e(an)h Fw(Fweb)g Fz(macro;)34 b(to)28 b(0)g(\(false\))g(other-)512 582 y(wise.)41 b(The)23 b(construction)f(`)p Fu(@#if)14 b(defined)g(A)p Fz(')22 b(w)o(orks)f(the)h(same)g(w)o(a)o(y)512 636 y(as)15 b(`)p Fu(@#ifdef)f(A)p Fz(')o(,)h(but)g(one)h(can)f(use)h (`)p Fu(defined)p Fz(')d(in)j(expressions,)g(as)f(in)817 741 y Fu(@#if)f(defined\(A\))g(||)h(defined\(B\))o Fk(:)512 846 y Fz(\(The)k(paren)o(theses)f(around)h(the)g(macro)f(names)g(are)g (optional.\))31 b(With)512 900 y(the)e(adv)o(en)o(t)f(of)h(`)p Fu(defined)p Fz(',)h(the)f Fw(Fweb)g Fz(prepro)q(cessor)g(statemen)o (ts)512 955 y(`)p Fu(@#ifdef)p Fz(')11 b(and)h(`)p Fu(@#ifndef)p Fz(')f(b)q(ecome)i(redundan)o(t,)f(but)h(are)f(often)g(useful)512 1010 y(shorthands.)123 1069 y Fu(-)242 b Fz(|)16 b(Unary)f(min)o(us.) 123 1124 y Fu(!)242 b Fz(|)16 b(Logical)j Fu(NOT)p Fz(.)28 b Fu(!)p Fh(expr)18 b Fz(ev)m(aluates)h(to)e(0)h(if)h Fh(expr)f Fz(is)g(nonzero,)h(and)f(ev)m(aluates)512 1179 y(to)d(1)g(if)g Fh(expr)h Fz(is)g(0.)123 1238 y Fu(~)242 b Fz(|)16 b(One's)g(complemen)o(t)f(of)g(an)g(in)o(teger.)20 b(F)l(or)15 b(example,)g(~)p Fu(0)e Fz(=)g Fx(\000)p Fz(1.)75 1318 y(Binary)j(op)q(erators)232 1358 y(\026)411 1318 y(:)123 1392 y Fu(^^)218 b Fz(|)16 b(Exp)q(onen)o(tiation)g(\(all) g(languages\).)k(2)p Fu(^^)o Fz(3)12 b(=)h(8.)123 1446 y Fu(^)p Fz(,)8 b Fu(**)173 b Fz(|)16 b(Exp)q(onen)o(tiation)g(\()p Fw(F)o(or)m(tran)f Fz(or)g Fw(Ra)m(tf)o(or)p Fz(\).)123 1501 y Fu(*)p Fz(,)8 b Fu(/)p Fz(,)g Fu(\045)152 b Fz(|)16 b(Multiplication,)i(division,)g(and)e(mo)q(dulus:)23 b(`)p Fk(a)h Fu(\045)f Fk(b)p Fz(')15 b(means)h(`)p Fk(a)f Fz(mo)q(d)g Fk(b)p Fz(';)h(for)512 1556 y(example,)g Fu(5)24 b(\045)f(3)h(=)g(2)p Fz(.)123 1615 y Fu(+)p Fz(,)8 b Fu(-)197 b Fz(|)16 b(The)f(usual)h(plus)h(and)e(min)o(us.)123 1670 y Fu(<<)218 b Fz(|)16 b(`)p Fk(a)24 b Fu(<<)f Fk(b)p Fz(')14 b(means)i(shift)f(in)o(teger)g Fk(a)h Fz(left)f Fk(b)g Fz(bits.)20 b(1)12 b Fx(\034)i Fz(3)e(=)h(8.)123 1725 y Fu(>>)218 b Fz(|)16 b(As)f(ab)q(o)o(v)o(e,)g(but)g(righ)o (t-shift.)20 b(7)12 b Fx(\035)i Fz(2)e(=)h(1.)123 1780 y Fu(<)p Fz(,)8 b Fu(<=)p Fz(,)g Fu(>)p Fz(,)g Fu(>=)59 b Fz(|)16 b(Ev)m(aluates)h(to)e(1)h(if)g(the)g(inequalit)o(y)i(holds,)f (to)e(0)h(otherwise.)22 b(E.g.,)15 b(`)p Fu(\(2.0)23 b(<)512 1834 y(3.0\))p Fz(')14 b(ev)m(aluates)i(to)f(1.)123 1894 y Fu(==)p Fz(,)8 b Fu(!=)149 b Fz(|)16 b(`)p Fk(a)p Fu(==)p Fk(b)p Fz(')i(\(`)p Fk(a)p Fu(!=)p Fk(b)p Fu(')p Fz(\))g(ev)m(aluates)j(to)e(1)h(\(0\))f(if)h Fk(a)g Fz(equals)h Fk(b)p Fz(;)g(ev)m(aluates)g(to)e(0)h(\(1\))512 1949 y(otherwise.)123 2008 y Fu(&)242 b Fz(|)16 b(Bit)o(wise)g Fu(AND)p Fz(.)j(The)d(truth)f(table)g(is)h Fu(0b1100)23 b(&)h(0b1010)f(=)h(0b1000)p Fz(.)123 2063 y Fu(^)242 b Fz(|)16 b(Bit)o(wise)g Fu(EXCLUSIVE)23 b(OR)15 b Fz(\(C\).)f(\(F)l (or)g Fw(F)o(or)m(tran)p Fz(,)h(use)h(`)p Fu(.xor.)p Fz('.\))i(The)d(truth)512 2118 y(table)h(is)g Fu(0b1100)e(.xor.)g (0b1010)23 b(=)h(0b0110)p Fz(.)123 2177 y Fu(|)242 b Fz(|)16 b(Bit)o(wise)g Fu(OR)p Fz(.)k(The)15 b(truth)g(table)g(is)h Fu(0b1100)23 b(|)h(0b1010)f(=)h(0b1110)p Fz(.)123 2232 y Fu(&&)218 b Fz(|)16 b(Logical)c Fu(AND)o Fz(.)e(`)p Fk(a)24 b Fu(&&)f Fk(b)p Fz(')10 b(ev)m(aluates)h(to)f(1)g(if)h(b)q (oth)g Fk(a)g Fz(and)f Fk(b)g Fz(are)g(true)h(\(nonzero\).)123 2287 y Fu(||)218 b Fz(|)16 b(Logical)g Fu(OR)p Fz(.)f(`)p Fk(a)23 b Fu(||)h Fk(b)p Fz(')14 b(ev)m(aluates)i(to)f(1)f(if)i(either) g Fk(a)f Fz(or)g Fk(b)g Fz(are)f(true.)75 2388 y(Note)i(in)i (particular)f(the)f(use)h(of)f(the)h(single)h(caret,)e(whic)o(h)h(is)h (language-dep)q(enden)o(t:)24 b(it)17 b(is)g(an)f(exp)q(o-)75 2443 y(nen)o(tiation)i(op)q(erator)e(for)g Fw(F)o(or)m(tran)h Fz(\(just)f(as)h(in)g(T)1006 2453 y(E)1032 2443 y(X\),)f(but)h(is)g (the)g(exclusiv)o(e-or)h(op)q(erator)e(for)h(C.)75 2498 y(Also,)d(note)f(that)g(the)h(bit)o(wise)h(op)q(erators)d(should)j (almost)e(nev)o(er)h(b)q(e)g(used.)20 b(F)l(or)13 b(logic,)i(almost)e (alw)o(a)o(ys)75 2553 y(one)i(will)i(b)q(e)f(using)g(`)p Fu(==)p Fz(',)e(`)p Fu(!=)p Fz(',)g(`)p Fu(&&)p Fz(',)f(and)j(`)p Fu(||)p Fz('.)p eop %%Page: 83 85 83 84 bop 75 -58 a Fz(Chapter)15 b(8:)k(LANGUA)o(GES)1232 b(83)75 183 y Ft(8)41 b(LANGUA)n(GES)137 304 y Fw(Fweb)17 b Fz(has)f(the)f(abilit)o(y)i(to)f(w)o(ork)e(with)i(more)g(than)f(one)h (source)g(language)g(during)h(a)e(single)i(run.)75 359 y(The)k(language)g(in)h(e\013ect)e(at)g(the)h(b)q(eginning)i(of)d(the)h (\014rst)g(section)g(de\014nes)h(the)f Fs(global)g(language)p Fz(.)75 414 y(F)l(urther)15 b(language)g(c)o(hanges)h(within)g(a)f (section)h(ha)o(v)o(e)e(scop)q(e)i(lo)q(cal)h(to)d(that)h(section.)137 482 y(Usually)l(,)g(`language')e(means)h(a)f(compiler)i(language)e(lik) o(e)i Fw(F)o(or)m(tran)f Fz(or)f(C.)g(These)h(languages)f(will)75 537 y(b)q(e)21 b(\\prett)o(y-prin)o(ted")g(b)o(y)f Fw(Fwea)l(ve)p Fz(.)37 b(Prett)o(y-prin)o(ting)21 b(can)g(b)q(e)g(inhibited)j(b)o(y)c (turning)i(on)e(the)h(N)75 592 y(mo)q(de)d(\(globally)l(,)h(with)f(the) g(command-line)h(option)f(`)p Fu(-N)p Fz(';)g(lo)q(cally)l(,)i(with)e (`)p Fu(@N)p Fz('\))e(or)h(b)o(y)h(selecting)h(the)75 647 y Fw(verba)m(tim)14 b Fz(`language';)e(in)j(b)q(oth)e(of)g(these)g (cases,)g(the)h(input)g(text)e(is)i(ec)o(ho)q(ed)g(literally)h(to)e (the)g(output)75 702 y(of)i(b)q(oth)g Fw(Ft)m(angle)h Fz(and)f Fw(Fwea)l(ve)p Fz(.)137 770 y(`Language')21 b(is)g(a)g(stronger)f(concept)i(than)f(`mo)q(de'.)37 b(F)l(or)21 b(example,)i(when)f(a)f(language)g(is)h(se-)75 825 y(lected,)e(the)f(extension)g(of)g(the)f(tangled)h(output)g(\014le) g(is)h(c)o(hanged)e(appropriately|for)i(example,)f(if)75 880 y(`)p Fu(test.web)p Fz(')c(con)o(tains)i(C)f(co)q(de)h(\(that)f (is,)h(con)o(tains)g(the)g(command)f(`)p Fu(@c)p Fz('\),)f(`)p Fu(test.web)p Fz(')g(tangles)i(in)o(to)75 935 y(`)p Fu(test.c)p Fz(')12 b(\(compressing)j(blanks)f(and)h(otherwise)f(\(delib)q (erately\))i(making)e(the)g(tangled)h(output)e(rela-)75 989 y(tiv)o(ely)j(unreadable\))g(and)g Fw(Fwea)l(ve)g Fz(prett)o(y-prin)o(ts)f(using)h(the)g(C)f(syn)o(tax.)k(T)l(urning)e (on)e(the)g(N)h(mo)q(de)75 1044 y(do)q(es)j(not)f(a\013ect)f(the)i (language;)h Fw(Ft)m(angle)f Fz(copies)g(the)g(source)f(co)q(de)h (literally)h(in)o(to)f(`)p Fu(test.c)p Fz(')d(\(no)75 1099 y(blank)g(compression)f(or)f(other)h(mo)q(di\014cations\),)g(and)g Fw(Fwea)l(ve)h Fz(t)o(yp)q(esets)f(the)g(source)g(co)q(de)g(within)h(a) 75 1154 y(v)o(erbatim)g(en)o(vironmen)o(t)g(\(no)f(prett)o(y-prin)o (ting\).)22 b(When)16 b(the)g Fw(verba)m(tim)h Fz(language)f(is)g (selected,)h(the)75 1209 y(N)e(mo)q(de)h(is)g(turned)f(on)h (automatically)l(,)f(but)h Fw(Ft)m(angle)g Fz(writes)f(its)h(output)f (to)f(a)h(\014le)i(with)e(a)g(sp)q(ecial)75 1263 y(default)f(extension) h(that)e(can)h(b)q(e)h(customized)f(in)h(the)f(st)o(yle)g(\014le.)20 b(See)15 b(Section)f(12.3.8)e([Miscellaneous)75 1318 y(params],)i(page)h(118.)75 1450 y Fy(8.1)33 b(Setting)23 b(the)g(language)137 1548 y Fz(The)16 b(most)e(general)i(form)e(of)h(a) g(language)g(command)g(is)195 1613 y Fu(@)p Fs([)6 b Fz(L)p Fs(]ltext)q Fz([)p Fs(options)r Fz(])75 1682 y(where)16 b Fs(l)j Fz(is)d(a)g(language)g(sym)o(b)q(ol,)g Fs(text)h Fz(is)f(con)o(v)o(erted)g(in)o(to)g(the)g(option)g(`)p Fu(-)p Fs(l)r Fu(text)p Fz(',)f(and)h Fs(options)i Fz(ha)o(v)o(e)75 1737 y(the)d(same)g(syn)o(tax)g(as)f(on)i(the)f(command)g(line.)137 1805 y(The)h(language)f(sym)o(b)q(ols)h(m)o(ust)e(b)q(e)i(in)g(lo)o(w)o (er)f(case;)g(they)g(are)195 1871 y(C)339 b Fu(c)195 1923 y Fz(C)p Fu(++)291 b(c++)195 1975 y Fz(F)l(ortran-77)160 b Fu(n)195 2027 y Fz(F)l(ortran-90)g Fu(n9)195 2079 y Fz(Ratfor-77)182 b Fu(r)195 2130 y Fz(Ratfor-90)g Fu(r9)195 2182 y Fz(T)l(eX)289 b Fu(x)195 2234 y Fz(VERBA)l(TIM)121 b Fu(v)137 2303 y Fz(An)19 b(example)g(of)f(a)g(command)h(with)f(the)h (optional)g Fs(text)g Fz(\014eld)g(is)g(`)p Fu(@n/)p Fz('.)28 b(By)19 b(de\014nition,)i(this)d(is)75 2358 y(equiv)m(alen)o(t)13 b(to)d(`)p Fu(@n[-n/])p Fz('.)17 b(Th)o(us,)11 b(it)h(b)q(oth)f(sets)g(the)g(language)g(and)h(in)o(v)o (ok)o(es)f(a)f(command-line)j(option.)137 2426 y(As)21 b(another)e(example,)k(`)p Fu(@n9)p Fz(')c(really)i(means)f(`)p Fu(@n[-n9])p Fz('.)34 b(Th)o(us)20 b(the)g(language)h(is)g(\014rst)f (set)g(to)75 2481 y Fw(F)o(or)m(tran)p Fz(,)15 b(then)h(reset)f(to)f Fw(F)o(or)m(tran)p Fz(-90.)20 b(One)c(do)q(esn't)f(need)h(to)f(w)o (orry)f(ab)q(out)h(this)g(detail.)195 2547 y Fu(@n9[-n&])75 2615 y Fz(means)i(set)g(the)h(language)f(to)g Fw(F)o(or)m(tran)p Fz({90)g(and)g(use)h(free-form)f(syn)o(tax)g(with)g(the)h(amp)q(ersand) f(as)75 2670 y(the)e(con)o(tin)o(uation)h(c)o(haracter.)j(\(This)d (construction)f(is)h(no)o(w)e Fw(Fweb)p Fz('s)i(default.\))p eop %%Page: 84 86 84 85 bop 75 -58 a Fz(Chapter)15 b(8:)k(LANGUA)o(GES)1232 b(84)137 183 y(The)16 b(brac)o(k)o(ets)e(ma)o(y)h(con)o(tain)g(more)g (than)g(one)g(space-delimited)j(option.)137 253 y(A)h(language)f (command)h(should)g(app)q(ear)g(somewhere)f(in)h(lim)o(b)q(o,)h(b)q (efore)f(the)g(start)e(of)h(the)g(\014rst)75 308 y(section.)41 b(The)23 b(language)f(in)h(e\013ect)f(at)f(the)h(b)q(eginning)j(of)c (the)i(\014rst)e(section)i(de\014nes)g(the)f(global)75 363 y(language.)j(F)l(or)17 b(historical)h(reasons,)f(the)g(default)g (language)g(is)h Fw(F)o(or)m(tran)p Fz(-77,)f(but)g Fs(do)g(not)f(rely) i(on)75 417 y(this;)d(alw)o(a)o(ys)g(include)i(a)e(language)h(command)p Fz(.)137 487 y(Language)c(commands)g(ma)o(y)f(b)q(e)i(used)f(within)h (sections,)g(but)f(the)g(new)g(language)g(remains)g(in)h(force)75 542 y(only)18 b(for)e(that)h(section.)26 b(The)17 b(language)g(of)g(a)g (named)g(mo)q(dule)i(is)e(inherited)i(from)e(the)g(language)g(in)75 597 y(e\013ect)12 b(at)f(the)i(time)f(the)g(name)g(is)h(\014rst)f (used.)19 b(Th)o(us,)13 b(in)g(the)f(follo)o(wing)h(example,)g(the)f (global)h(language)75 652 y(is)k Fw(F)o(or)m(tran)p Fz({77,)g(but)g(an) g(arbitrary)f(n)o(um)o(b)q(er)h(of)f(C)h(functions)h(can)f(b)q(e)g (placed)h(in)o(to)f(a)g(C-language)75 707 y(mo)q(dule)f(with)g(just)f (one)g(`)p Fu(@c)p Fz(')f(language-c)o(hanging)i(command.)195 773 y Fu(@n)195 825 y(@)195 877 y(@a)386 929 y(program)23 b(main)386 981 y(end)195 1085 y(@c)195 1137 y(@@;)195 1240 y(@)195 1292 y(@=)195 1344 y(int)g(fcn\(\))195 1396 y({})75 1466 y Fw(Ft)m(angle)16 b Fz(will)g(write)f(t)o(w)o(o)e (output)i(\014les)h(for)e(this)h(example|e.g.,)g(`)p Fu(test.f)p Fz(')e(and)i(`)p Fu(test.c)p Fz('.)j(P)o(artic-)75 1521 y(ularly)d(note)e(that)g(one)g(did)i(not)e(need)i(an)e(`)p Fu(@c)p Fz(')g(command)g(in)h(the)g(last)f(section)i(b)q(ecause)f(the)g (language)75 1576 y(w)o(as)g(C)h(when)h(`)p Fu(@)p Fz(')e(w)o(as)g(\014rst)h(encoun)o(tered.)75 1711 y Fy(8.2)33 b(Sp)r(ecial)23 b(hin)n(ts)h(and)f(considerations)g(for)f(eac)n(h)g (language)137 1810 y Fz(One)17 b(imp)q(ortan)o(t)f(thing)h(to)f(k)o (eep)h(in)g(mind)g(is)g(that)f(in)h Fw(Fweb)g Fz(an)g(iden)o(ti\014er)h (ma)o(y)d(ha)o(v)o(e,)h(for)g(eac)o(h)75 1865 y(language,)i(precisely)i (one)e(meaning)h(throughout)e(the)h(do)q(cumen)o(t.)29 b(This)19 b(restriction)f(is)g(not)g(neces-)75 1919 y(sarily)h(in)g (accord)f(with)g(the)g(syn)o(taxes)g(of)f(the)i(v)m(arious)f(source)g (languages.)29 b(See,)19 b(for)f(example,)h(the)75 1974 y(discussions)e(in)f(Section)g(8.2.2)e([Cpp],)g(page)h(85)g(and)g (Section)h(8.2.3)e([F)l(ortran],)f(page)i(85.)75 2091 y Fq(8.2.1)30 b(Sp)r(ecial)20 b(considerations)h(for)f(C)112 2190 y Fx(\017)30 b Fw(Ft)m(angle)19 b Fz(treats)e(the)h(construction)g (`)p Fu(0b...)p Fz(')e(as)i(a)g(binary)g(notation)g(that)f(it)h (expands)h(to)e(an)165 2245 y(unsigned)23 b(decimal)g(n)o(um)o(b)q(er.) 39 b(Th)o(us,)23 b(`)p Fu(0b101)p Fz(')d(expands)i(to)e(5)i(and)f(`)p Fu(0b1111111111111111)p Fz(')165 2300 y(expands)16 b(to)e(65535.)112 2369 y Fx(\017)30 b Fw(Fwea)l(ve)17 b Fz(pro)q(cesses)f Fp(t)o(yp)q(edef)g Fz(statemen)o(ts)f(during)i(phase)f(one,)g(so)f (they)h(will)i(format)c(prop)q(erly)165 2423 y(ev)o(en)i(if)f(they)g (are)g(used)h(in)g(a)f(do)q(cumen)o(tation)h(part)e(b)q(efore)i(they)f (are)g(de\014ned)h(in)h(a)d(co)q(de)i(part.)112 2492 y Fx(\017)30 b Fz(The)21 b(`)p Fu(-H)p Fz(')g(option)g(helps)i(one)e (to)g(deal)h(with)f(iden)o(ti\014ers)i(de\014ned)g(in)f(header)f (\014les.)39 b(See)22 b(Sec-)165 2547 y(tion)15 b(4.2.17)f([-H)p 455 2547 14 2 v 16 w(],)g(page)h(20.)112 2615 y Fx(\017)30 b Fz(Note)18 b(that)g(in)i(C)e(structure)g(and)h(en)o(um)g(tags)f(do)g (not)g(de\014ne)i(a)e(new)h(t)o(yp)q(e,)g(so)g(the)f(tag)g(name)165 2670 y(do)q(es)d(not)f(get)g(highligh)o(ted)j(in)e(b)q(oldface,)h (underlined)h(in)e(the)g(index,)h(etc.)j(\(That)14 b(is,)h(if)g(one)g (sa)o(ys)p eop %%Page: 85 87 85 86 bop 75 -58 a Fz(Chapter)15 b(8:)k(LANGUA)o(GES)1232 b(85)165 183 y(`)p Fu(struct)14 b(S)h({...};)p Fz(',)g(one)i(can't)g (sa)o(y)f(`)p Fu(S)e(s;)p Fz(',)i(one)h(m)o(ust)f(sa)o(y)h(`)p Fu(struct)c(S)i(s;)p Fz('.\))24 b(This)17 b(is)h(a)e(go)q(o)q(d)165 238 y(reason)f(for)f(using)i(C)p Fu(++)p Fz(,)f(where)g(suc)o(h)h(tags) e(do)h(de\014ne)h(a)f(new)h(t)o(yp)q(e.)137 319 y(\(T)l(o)f(b)q(e)h (completed.\))75 433 y Fq(8.2.2)30 b(Sp)r(ecial)20 b(considerations)h (for)f(C)p Fn(++)112 531 y Fx(\017)30 b Fz(All)16 b(of)f(the)h(items)f (in)h(the)f(previous)h(section)g(\(see)f(Section)h(8.2.1)e([C],)g(page) h(84\))f(still)j(apply)l(.)112 598 y Fx(\017)30 b Fz(The)23 b(`)p Fu(@{)p Fz(')f(command)g(is)h(v)o(ery)g(useful)g(for)g(b)q (eautifying)h(v)o(ery)e(short)g(de\014nitions)j(of)d(mem)o(b)q(er)165 653 y(functions)16 b(suc)o(h)f(as)g(constructors.)k(See)d(Section)g (5.9)e([A)l(Tlb],)h(page)h(53)112 721 y Fx(\017)30 b Fz(Essen)o(tially)l(,)17 b Fw(Fwea)l(ve)g Fz(has)e(only)i(one)f(name)g (space,)g(global)g(to)g(the)g(en)o(tire)g(co)q(de;)g(those)g(names)165 776 y(do)11 b(not)g(ob)q(ey)h(an)o(y)f(concept)g(of)g(scop)q(e.)19 b(In)12 b(v)m(arious)g(situations)g(in)g(C)f(and)g(C)p Fu(++)p Fz(,)g(ho)o(w)o(ev)o(er,)g(m)o(ultiple)165 831 y(namespaces)17 b(are)g(used,)h(or)f(the)g(in)o(terpretation)g(of)g(a)g (name)g(c)o(hanges)g(according)h(to)e(its)i(scop)q(e.)165 885 y(Th)o(us,)h(the)f(design)h(of)f Fw(Fwea)l(ve)h Fz(imp)q(oses)g(a)f (few)g(restrictions)h(on)f(one's)g(programming)f(st)o(yle.)165 940 y(\(Remem)o(b)q(er,)e Fw(Fwea)l(ve)h Fz(do)q(esn't)f(kno)o(w)g (nearly)h(as)f(m)o(uc)o(h)g(as)g(a)g(language)g(compiler.\))165 1008 y(One)h(example)g(in)g(C)p Fu(++)e Fz(has)h(to)g(do)f(with)i (formal)f(t)o(yp)q(es)g(in)h(templates.)j(Consider)d(the)f(follo)o (wing)165 1063 y(example:)285 1127 y Fu(template)23 b() 285 1179 y(class)g(A)285 1231 y({)285 1283 y(private:)476 1335 y(Type)g(*p;)285 1387 y(})165 1455 y Fz(In)14 b(order)g(that)f (the)h(class)g(de\014nition)i(b)q(e)f(t)o(yp)q(eset)e(correctly)l(,)h (`)p Fu(Type)p Fz(')f(m)o(ust)g(b)q(e)i(understo)q(o)q(d)f(to)f(b)q(e) 165 1509 y(a)j(reserv)o(ed)g(w)o(ord)g(lik)o(e)i Fp(in)o(t)p Fz(,)e(and)h(that)e(is)i(correctly)g(\014gured)g(out)f(b)o(y)g(the)g (\014rst)g Fp(class)h Fz(command.)165 1564 y(Ho)o(w)o(ev)o(er,)f (according)i(to)e(C)p Fu(++)p Fz(,)h(the)g(scop)q(e)h(of)f(`)p Fu(Type)p Fz(')e(is)j(lo)q(cal)g(to)f(the)g(class)g(de\014nition;)j (unfor-)165 1619 y(tunately)l(,)15 b Fw(Fwea)l(ve)h Fz(do)q(es)f(not)f (resp)q(ect)i(that)e(lo)q(calit)o(y)i(and)f(will)h(alw)o(a)o(ys)e (treat)g(`)p Fu(Type)p Fz(')f(as)i(an)g Fp(in)o(t)165 1674 y Fz(from)h(the)g(p)q(oin)o(t)h(of)f(the)h(`)p Fu(class)d(Type)p Fz(')i(construction)g(to)g(the)h(end)g(of)f(the)g(source)h(co)q(de.)24 b(Th)o(us,)165 1729 y(one)18 b(should)i(use)e(suc)o(h)h(dumm)o(y)f(v)m (ariables)h(as)f(`)p Fu(Type)p Fz(')f(only)i(as)f(formal)g(template)g (parameters,)165 1783 y(nev)o(er)d(as)g(ordinary)g(v)m(ariables.)75 1898 y Fq(8.2.3)30 b(Sp)r(ecial)20 b(considerations)h(for)f Fo(F)o(or)m(tran)75 2041 y Fq(8.2.3.1)30 b(Items)20 b(for)g(b)r(oth)g Fo(F)o(or)m(tran)p Fq(-77)f(and)i Fo(F)o(or)m(tran)p Fq(-90)112 2138 y Fx(\017)30 b Fw(Ft)m(angle)12 b Fz(will)h(translate)e (in)o(to)h(unsigned)g(decimal)h(n)o(um)o(b)q(ers)f(the)g(binary)g (notation)f(`)p Fu(0b...)p Fz(',)f(the)165 2193 y(o)q(ctal)18 b(notation)g(`)p Fu(0...)p Fz(',)f(and)h(the)g(hexadecimal)h(notation)f (`)p Fu(0x...)p Fz('.)27 b(Th)o(us,)18 b(`)p Fu(0b101)p Fz(')e(expands)165 2248 y(to)f(5,)f(`)p Fu(0101)p Fz(')g(expands)i(to)e (65,)g(and)i(`)p Fu(0x101)p Fz(')e(expands)h(to)g(257.)112 2315 y Fx(\017)30 b Fz(Don't)14 b(use)i(the)f(column)h(1)f(`)p Fu(C)p Fz(')f(commen)o(ting)i(con)o(v)o(en)o(tion.)j(Use)d(`)p Fu(/*)e(...)h(*/)p Fz(')g(or)f(`)p Fu(//)h(...)p Fz('.)112 2383 y Fx(\017)30 b Fz(F)l(or)14 b(compiler)h(directiv)o(es,)h(use)f(`) p Fu(@?)p Fz(')e(\(see)h(Section)i(5.8.4)d([A)l(T?],)h(page)g(53\),)f (not)h(a)g(`)p Fu(C)p Fz(')g(in)h(column)165 2438 y(1.)112 2506 y Fx(\017)30 b Fz(If)22 b(y)o(ou)g(are)g(going)g(to)f(use)h(the)h (recommended)f(`)p Fu(//)15 b(...)p Fz(')21 b(con)o(v)o(en)o(tion)h (for)g(short)f(commen)o(ts,)165 2560 y(y)o(ou)16 b(m)o(ust)g(sa)o(y)g (`)p Fu(@n/)p Fz(')f(\(see)i(Section)g(4.2.40)e([-n/],)g(page)i(27\))e (or)h(`)p Fu(@n9[-n/])p Fz(')f(as)h(y)o(our)g(language)165 2615 y(command.)k(Otherwise,)15 b Fu(\\)p Fz(FWEB)p Fu(\\)g Fz(will)h(treat)f(the)g(`)p Fu(//)p Fz(')f(as)h Fu(\\)p Fw(F)o(or)m(tran's)f Fz(standard)h(tok)o(en)g(for)165 2670 y(concatenation.)20 b(\(Y)l(ou)15 b(ma)o(y)g(alw)o(a)o(ys)f(use)i (`)p Fu(\\/)p Fz(')e(for)g(concatenation.\))p eop %%Page: 86 88 86 87 bop 75 -58 a Fz(Chapter)15 b(8:)k(LANGUA)o(GES)1232 b(86)112 183 y Fx(\017)30 b Fz(If)19 b(y)o(ou)f(w)o(an)o(t)f(to)h (completely)i(commen)o(t)e(out)g(a)g(whole)i(blo)q(c)o(k)f(of)f(co)q (de,)h(use)g(the)g(prepro)q(cessor)165 238 y(construction)j(`)p Fu(@#if)15 b(0...@#endif)p Fz(')20 b(\(see)i(Section)h(7.3)e([Prepro)q (cessing],)j(page)e(80\).)40 b(Don't)165 293 y(put)18 b(a)g(commen)o(t)g(c)o(haracter)f(at)h(the)g(b)q(eginning)i(of)e(eac)o (h)g(line;)j(that)d(prev)o(en)o(ts)g Fw(Fwea)l(ve)h Fz(from)165 348 y(formatting)10 b(the)i(co)q(de)g(sensibly)h(and)e(can)h(b)q(e)g (anno)o(ying)f(to)g(undo.)19 b(With)11 b(the)h(prepro)q(cessor)f(form,) 165 402 y(one)20 b(can)g(also)g(implemen)o(t)h(conditional)h(commen)o (ts)d(b)o(y)h(using)g Fw(Fweb)h Fz(prepro)q(cessor)f(macros:)165 457 y(e.g.,)14 b(`)p Fu(@#if\(DEBUG\)...@#endif)p Fz(')o(.)165 525 y(Pre-)p Fw(Fweb)j Fz(co)q(des)f(ma)o(y)f(ha)o(v)o(e)g(suc)o(h)h (blo)q(c)o(ks)h(commen)o(ted)e(out)h(with)g(a)f(`)p Fu(C)p Fz(')g(in)h(column)h(1.)k(Those)165 580 y(should)12 b(b)q(e)g(con)o(v)o (erted)f(to)g(the)g(prepro)q(cessor)h(construction.)19 b(Ho)o(w)o(ev)o(er,)10 b(if)i(y)o(ou're)f(in)h(a)f(real)g(h)o(urry)l(,) 165 635 y(temp)q(orarily)17 b(use)g(the)g(`)p Fu(-nC)p Fz(')e(option)i(\(see)g(Section)g(4.2.36)e([-nC],)g(page)i(25\))f(to)g (kill)i(those)e(lines)165 689 y(v)o(ery)f(early)g(in)h(the)g(pro)q (cessing,)f(b)q(efore)h(they)f(can)g(giv)o(e)h(y)o(ou)f(all)h(kinds)g (of)f(trouble.)112 757 y Fx(\017)30 b Fz(An)20 b(unfortunate)f(b)o (ypro)q(duct)h(of)g(using)g(`)p Fu(//)p Fz(')f(for)g(short)g(commen)o (ts)g(is)h(that,)g(in)g(general,)h(for-)165 812 y(mat)f(constructions)g (lik)o(e)h Fu(format\(//\))e Fz(w)o(on't)g(w)o(ork.)34 b(\(It)20 b(will)i(w)o(ork)e(if)g(one)h(uses)f(`)p Fu(-nC)p Fz(';)i(see)165 867 y(Section)16 b(4.2.36)d([-nC],)i(page)g(25.\))k (Alternativ)o(ely)l(,)d(one)f(can)h(sa)o(y)e Fu(format\(/)g(/\))p Fz(.)112 934 y Fx(\017)30 b Fz(Consecutiv)o(e)17 b(lines)h(commen)o (ted)f(out)f(with)h(a)g(`)p Fu(C)p Fz(',)e(`)p Fu(c)p Fz(',)h(`)p Fu(*)p Fz(',)g(or)g(`)p Fu(!)p Fz(')g(in)h(column)h(1)e (are)g(con)o(v)o(erted)165 989 y(in)o(to)d(a)g(single)i(commen)o(t)e(b) q(efore)g(pro)q(cessing)i(b)o(y)e Fw(Fweb)p Fz(.)20 b(Large)13 b(blo)q(c)o(ks)h(of)f(suc)o(h)h(lines)h(\(common)165 1044 y(in)22 b(pre-)p Fw(Fweb)h Fz(co)q(de\))f(ma)o(y)e(o)o(v)o (er\015o)o(w)g Fw(Fweb)p Fz('s)i(tables.)39 b(T)l(o)21 b(a)o(v)o(oid)g(that,)h(insert)g(blank)g(lines)165 1099 y(b)q(et)o(w)o(een)17 b(some)g(of)g(the)g(commen)o(ts.)25 b(Better,)17 b(ho)o(w)o(ev)o(er,)f(is)i(to)e(mo)o(v)o(e)g(most)h(suc)o (h)g(blo)q(c)o(ks)h(out)e(of)165 1154 y(the)i(co)q(de)h(part)f(to)g (the)g(T)621 1163 y(E)646 1154 y(X)h(part)e(of)h(the)h(section.)29 b(It's)18 b(most)g(readable)h(to)e(ha)o(v)o(e)h(only)h(a)f(few)165 1208 y(v)o(ery)d(short)f(commen)o(ts)h(in)o(tersp)q(ersed)h(in)g(the)g (co)q(de.)165 1276 y(T)l(o)f(help)i(with)f(con)o(v)o(ersion)g(of)f (existing)i(co)q(des,)f(the)g(command-line)h(option)f(`)p Fu(-nC)p Fz(')e(can)i(b)q(e)g(used)165 1331 y(to)f(completely)h(ignore) g(commen)o(t)e(lines.)112 1399 y Fx(\017)30 b Fz(`)p Fu(@)p Fz(')15 b(commands)h(should,)h(b)o(y)f(and)g(large,)g(start)f (in)i(column)g(1.)22 b(That's)15 b(not)h(necessary)g(for)g(short)165 1453 y(mo)q(dule)f(names)f(that)f(\014t)h(on)g(one)g(line.)22 b(Ho)o(w)o(ev)o(er,)12 b(a)i(long)g(mo)q(dule)i(name)e(that)f(m)o(ust)g (b)q(e)i(brok)o(en)165 1508 y(across)f(lines)j(m)o(ust)e(b)q(egin)h(in) g(column)g(1,)f(as)g(in)285 1573 y Fu(@n)285 1625 y(@)285 1677 y(@a)285 1729 y(@@;)165 1848 y Fz(F)l(ailure)c(to)e(do)h (this)g(results)g(in)g(a)g(spurious)g(semicolon)h(b)q(eing)g(inserted)g (in)f(the)g(middle)i(of)d(the)165 1903 y(name.)43 b(This)23 b(happ)q(ens)h(b)q(ecause)g(the)f Fw(F)o(or)m(tran)p Fz(-77)f(input)i(driv)o(er)f(do)q(es)g(v)m(arious)h(lo)o(w-lev)o(el)165 1958 y(manipulations)g(of)e(the)g(source)g(b)q(efore)h(it)f(presen)o (ts)g(it)h(to)f(the)g(innards)h(of)f Fw(Fweb)p Fz(;)k(it's)c(not)165 2013 y(tok)o(enizing)14 b(the)f(source)g(at)g(that)f(time)i(and)f(do)q (esn't)g(understand)g(all)h(of)f(the)g Fw(Fweb)h Fz(syn)o(tax)f(suc)o (h)165 2068 y(as)i(mo)q(dule)h(names.)112 2135 y Fx(\017)30 b Fz(De\014ne)14 b(sym)o(b)q(olic)h(statemen)o(t)d(lab)q(els)j(with)f (`)p Fu(#:0)p Fz(')e(\(see)h(Section)h(7.2.2)e([T)l(ok)o(ens],)h(page)g (65\).)18 b(Suc)o(h)165 2190 y(names)d(should)h(b)q(e)g(follo)o(w)o(ed) g(b)o(y)f(a)g(colon.)20 b(Th)o(us,)285 2255 y Fu(@n)285 2307 y(@)285 2359 y(@m)k(EXIT)f(#:0)285 2411 y(@m)h(ABORT)f(#:0)285 2462 y(@a)285 2514 y(.)285 2566 y(.)285 2618 y(ABORT:)g(continue)285 2670 y(.)p eop %%Page: 87 89 87 88 bop 75 -58 a Fz(Chapter)15 b(8:)k(LANGUA)o(GES)1232 b(87)285 183 y Fu(.)285 235 y(EXIT:)23 b(continue)285 287 y(.)285 339 y(.)112 411 y Fx(\017)30 b Fz(By)11 b(default,)g (statemen)o(t)e(lab)q(els)j(are)f Fu(\\llap)p Fz('d)e(from)h(the)g(b)q (o)q(dy)h(of)f(the)h(statemen)o(t.)17 b(With)11 b(this)g(con-)165 465 y(v)o(en)o(tion,)i(long)h(lab)q(els)h(can)e(extend)h(to)q(o)f(far)g (in)o(to)g(the)g(left)h(margin.)19 b(Instead,)14 b(try)f(the)g (command-)165 520 y(line)j(option)e(`)p Fu(-n:)p Fz(')e(\(see)i (Section)h(4.2.34)d([-ncolon],)i(page)g(25\),)f(whic)o(h)h(puts)g(them) g(on)g(a)f(separate)165 575 y(line.)27 b(Alternativ)o(ely)l(,)19 b(one)e(can)h(rede\014ne)g(the)f(macro)g Fu(\\Wlbl)p Fz(,)f(found)i(with)f(some)g(discussion)i(in)165 630 y(`)p Fu(fwebmac.sty)p Fz('.)112 701 y Fx(\017)30 b Fz(As)14 b(a)f(suggestion,)g(use)h(upp)q(er)h(case)f(for)f(I/O)h(k)o(eyw)o(ords) f(suc)o(h)h(as)f Fu(IOSTAT)p Fz(.)18 b(Ho)o(w)o(ev)o(er,)13 b(b)o(y)g(default)165 756 y(the)21 b(lo)o(w)o(er-case)g(forms)f(are)h (also)g(recognized.)38 b(T)l(o)21 b(p)q(ermit)g(only)h(upp)q(er)g (case,)g(use)f(`)p Fu(-k)p Fz(')f(\(see)165 811 y(Section)j(4.2.23)e ([-k],)i(page)g(22\).)40 b(Note)22 b(that)g(although)h(there)f(is)h(a)g (command)f(`)p Fu(-nk)p Fz(',)h(it)f(is)165 866 y(unfortunately)15 b(not)g(related)h(to)e(`)p Fu(-k)p Fz('.)112 938 y Fx(\017)30 b Fz(One)16 b(ma)o(y)e(use)i(`)p Fu(^)p Fz(')e(as)h(an)g(alternativ)o (e)h(for)e(the)h(exp)q(onen)o(tiation)i(op)q(erator)d(`)p Fu(**)p Fz('.)112 1009 y Fx(\017)30 b Fw(Fweb)19 b Fz(attempts)e(to)h (b)q(e)g(helpful)i(and)f(tries)f(to)f(expand)i(the)f(op)q(erators)f(`)p Fu(++)p Fz(',)h(`)p Fu(--)p Fz(',)f(`)p Fu(+=)p Fz(',)g(`)p Fu(-=)p Fz(',)165 1064 y(`)p Fu(*=)p Fz(',)k(and)g(`)p Fu(/=)p Fz(')f(in)i(a)e(w)o(a)o(y)g(compatible)i(with)g(the)f(usage)f (in)i(C)f(and)g(C)p Fu(++)p Fz(.)37 b(F)l(or)20 b(example,)j(it)165 1119 y(expands)c(`)p Fu(x)c(+=)g(y)p Fz(')j(in)o(to)h(`)p Fu(x)c(=)g(x)g(+)g(\(y\))p Fz(')o(.)31 b(This)19 b(feature)g(can)g(b)q (e)g(a)g(great)f(time-sa)o(v)o(er)g(and)h(also)165 1174 y(mak)o(es)13 b(the)g(co)q(de)h(substan)o(tially)g(more)e(legible;)k (it)e(is)f(strongly)g(recommended.)20 b(T)l(o)13 b(turn)g(o\013)g(this) 165 1228 y(feature,)i(use)g(the)g(option)h(`)p Fu(-+)p Fz('.)j(See)c(Section)h(4.2.79)e([-plus],)h(page)g(37.)165 1300 y(Notice)c(that)g(in)g Fw(F)o(or)m(tran)p Fz(-90)g(`)p Fu(/=)p Fz(')f(is)i(a)e(tok)o(en)h(for)f(\\not)g(equal,")i(so)f(if)g(y) o(ou)g(w)o(an)o(t)e(to)i(use)g(that)f(y)o(ou)165 1355 y(m)o(ust)16 b(use)h(the)g(`)p Fu(-+)p Fz(')f(option.)25 b(Ho)o(w)o(ev)o(er,)15 b(a)i(b)q(etter)g(solution)g(is)g(to)f(use)i(`)p Fu(!=)p Fz(',)d Fw(Fweb)p Fz('s)j(preferred)165 1410 y(op)q(erator)c(for)h(\\not)f(equal.")112 1481 y Fx(\017)30 b Fz(By)13 b(default,)h(the)f(op)q(erators)f Fu(.true.)g Fz(and)h Fu(.false.)f Fz(will)j(w)o(ea)o(v)o(e)d(as)h(caligraphic)h(T)f (and)g(F.)g(That)165 1536 y(app)q(earance)f(b)q(e)g(c)o(hanged)g(b)o(y) f(rede\014ning)i(the)f(macros)e Fu(\\WTRUE)h Fz(and)h Fu(\\WFALSE)e Fz(in)i(`)p Fu(fwebmac.sty)p Fz(')165 1591 y(or)j(in)h(the)f(lim)o(b)q(o)h(section)g(of)f(y)o(our)f(source)i (\014le.)112 1663 y Fx(\017)30 b Fz(If)20 b Fw(Ft)m(angle)h Fz(messes)f(up)g(and)g(outputs)f(incorrect)i Fw(F)o(or)m(tran)f Fz(co)q(de,)h(try)e(tangling)i(with)f(the)165 1717 y(command-line)c (option)e(`)p Fu(-#)p Fz(')f(\(see)h(Section)g(4.2.78)e([-#],)h(page)h (36\))f(\(and)h(then)g(rep)q(ort)g(the)g(prob-)165 1772 y(lem.\))75 1902 y Fq(8.2.3.2)30 b(Items)20 b(sp)r(eci\014c)h(to)f Fo(F)o(or)m(tran)p Fq(-77)f(and)i(\014xed-form)g Fo(F)o(or)m(tran-90) 112 2007 y Fx(\017)30 b Fz(By)15 b(default,)h(when)g(pro)q(cessing)g (the)f(co)q(de)h(part)f(the)h Fw(F)o(or)m(tran)f Fz(driv)o(er)h (inserts)f(semicolons)i(au-)165 2062 y(tomatically)f(at)e(the)i(end)g (of)f(eac)o(h)g(logical)i(statemen)o(t.)i(Th)o(us,)c(the)g(core)g(of)g Fw(Fweb)i Fz(is)e(presen)o(ted)165 2117 y(with)i(a)g(uniform)h(syn)o (tax.)24 b(Ho)o(w)o(ev)o(er,)16 b(when)i(one)f(escap)q(es)h(in)o(to)f (co)q(de)g(mo)q(de)h(b)o(y)f(using)g(v)o(ertical)165 2172 y(bars,)g(those)g(semicolons)h(aren't)e(inserted,)i(so)f (something)g(that)f(app)q(ears)i(a)e(\014rst)h(glance)h(to)e(b)q(e)165 2227 y(complete)d(statemen)o(t)f(ma)o(y)g(not)g(b)q(e)i(formatted)d(as) i(one)g(migh)o(t)f(exp)q(ect.)20 b(Th)o(us,)13 b(the)g(construction)165 2281 y(`)p Fu(|5:)h(continue|)p Fz(')19 b(do)q(esn't)h(format)e(quite)j (prop)q(erly)g(\(the)f(colon)g(disapp)q(ears\);)j(this)d(problem)165 2336 y(is)g(solv)o(ed)g(b)o(y)f(putting)h(a)f(semicolon)i(after)e(the)g (`)p Fu(continue)p Fz('.)31 b(Also,)21 b(if)e(one)h(is)g(talking)g(ab)q (out)165 2391 y(m)o(ultiple)c(statemen)o(ts)d(\(for)g(example,)h(with)h (a)e(shift)i(in)o(to)f(co)q(de)g(mo)q(de)g(during)h(T)1569 2401 y(E)1595 2391 y(X)f(do)q(cumen)o(ta-)165 2446 y(tion\),)i(there's) f(no)h(c)o(hoice)h(but)f(to)f(insert)i(the)f(semicolon)h(b)q(et)o(w)o (een)f(statemen)o(ts.)21 b(F)l(or)15 b(example,)165 2500 y(`)p Fu(|a)g(=)g(b;)f(c)h(=)g(d;|)p Fz('.)75 2630 y Fq(8.2.3.3)30 b(Items)20 b(sp)r(eci\014c)h(to)f Fo(F)o(or)m(tran)p Fq(-90)p eop %%Page: 88 90 88 89 bop 75 -58 a Fz(Chapter)15 b(8:)k(LANGUA)o(GES)1232 b(88)112 183 y Fx(\017)30 b Fz(If)18 b Fw(F)o(or)m(tran)p Fz(-90)f(is)h(selected)g(\(see)f(Section)i(4.2.31)c([-n9],)i(page)g (24\),)f(the)i(default)g(is)f Fs(free-form)165 238 y Fz(syn)o(tax)11 b(\(lines)i(are)f(con)o(tin)o(ued)h(b)o(y)e(a)h (trailing)h(amp)q(ersand\).)18 b(Ho)o(w)o(ev)o(er,)12 b(automatic)f(line)i(breaking)165 293 y(is)j(done)f(in)h(a)f(w)o(a)o(y) f(compatible)j(with)e(\014xed-form)h(syn)o(tax)e(as)h(w)o(ell.)112 360 y Fx(\017)30 b Fz(With)18 b(free-form)g(syn)o(tax,)f(commen)o(t)h (lines)h(in)g(the)f(tangled)g(output)g(\014le)h(b)q(egin)g(with)g(`)p Fu(!)p Fz('.)27 b(But)165 415 y(suc)o(h)20 b(lines)g(are)f(not)g (recognized)i(on)e(input)h(unless)g(`)p Fu(-n!)p Fz(')e(is)i(used.)33 b(See)20 b(Section)g(4.2.41)d([-n!],)165 470 y(page)e(27.)112 537 y Fx(\017)30 b Fz(Beginning)14 b(with)f(V)l(ersion)g(1.61,)e(b)o(y) h(default)h(\(pseudo-\)semicolons)g(are)f(automatically)h(inserted)165 592 y(in)22 b(free-form)f Fu(\\)p Fz(F)l(ortran-90)e(co)q(de,)k(as)e (one)g(w)o(ould)h(exp)q(ect.)38 b(F)l(or)21 b(more)g(discussion,)j(see) d(Sec-)165 647 y(tion)15 b(4.2.32)f([-nA)l(T;],)g(page)h(24)g(and)g (Section)h(4.2.33)d([-n;],)h(page)i(24.)137 726 y(\(T)l(o)f(b)q(e)h (completed.\))75 838 y Fq(8.2.4)30 b(Sp)r(ecial)20 b(considerations)h (for)f Fo(Ra)m(tf)o(or)137 935 y Fz(F)l(or)15 b(some)g(w)o(arnings)g (ab)q(out)g Fw(Ra)m(tf)o(or)p Fz(,)g(see)h(Section)g(9.3)e([Ca)o(v)o (eats],)f(page)i(90.)75 1047 y Fq(8.2.5)30 b(Sp)r(ecial)20 b(considerations)h(for)f(T)-5 b(eX)137 1143 y Fz(`)p Fu(@Lx)p Fz(')13 b(is)i(supp)q(orted)f(only)h(to)e(the)h(exten)o(t)g (that)f Fu(fwebmac.sty)g Fz(can)h(b)q(e)g(generated)h(correctly)f(from) 75 1198 y Fu(fwebmac.web)p Fz(.)24 b(Y)l(ou)17 b(are)g(w)o(elcome)g(to) g(exp)q(erimen)o(t,)h(but)f(y)o(ou)g(ma)o(y)f(encoun)o(ter)h (di\016culties)i(\(whic)o(h)75 1253 y(y)o(ou)c(should)h(rep)q(ort;)f (see)g(Chapter)g(15)g([Supp)q(ort],)f(page)h(131\).)137 1320 y(\(T)l(o)g(b)q(e)h(completed.\))75 1432 y Fq(8.2.6)30 b(Sp)r(ecial)20 b(considerations)h(for)f(the)g Fo(verba)m(tim)g Fq(language)137 1528 y Fz(Unfortunately)l(,)g(the)f Fw(VERBA)l(TIM)h Fz(language)f(is)h(not)e(fully)j(debugged.)32 b(Therefore,)19 b(it)h(is)f(not)75 1583 y(recommended)d(for)f(general)g(use.)20 b(\(T)l(o)15 b(b)q(e)h(completed.\))p eop %%Page: 89 91 89 90 bop 75 -58 a Fz(Chapter)15 b(9:)k Fw(Ra)m(tf)o(or)1356 b Fz(89)75 183 y Ft(9)41 b Fv(Ra)-5 b(tf)n(or)137 320 y Fz(\\)p Fw(Ra)m(tf)o(or)p Fz(")15 b(stands)f(for)g(\\)p Fw(RA)l(Tional)g(F)o(OR)l(tran)p Fz(.")21 b(It)14 b(endo)o(ws)h Fw(F)o(or)m(tran)g Fz(with)g(a)f(C-lik)o(e)i(syn-)75 375 y(tax.)k(Certain)c(lo)q(op)g(and)g(other)f(constructions)h(\(suc)o (h)g(as)f(`)p Fu(switch)p Fz(')f(or)h(`)p Fu(i++)p Fz('\))f(that)h(are) g(not)h(allo)o(w)o(ed)75 429 y(in)g Fw(F)o(or)m(tran)f Fz(are)g(allo)o(w)o(ed)h(in)g Fw(Ra)m(tf)o(or)p Fz(;)f Fw(Fweb)i Fz(translates)d(those)h(in)o(to)h(prop)q(er)f Fw(F)o(or)m(tran)p Fz(.)137 503 y(Although)i Fw(Ra)m(tf)o(or)f Fz(is)h(a)f(de\014nite)h(impro)o(v)o(emen)o(t)f(o)o(v)o(er)f Fw(F)o(or)m(tran)p Fz(,)h(it)g(certainly)h(do)q(es)g(not)e(ha)o(v)o(e) 75 558 y(the)20 b(p)q(o)o(w)o(er)g(of)f(C)h(\(e.g.,)f(elegan)o(t)i(p)q (oin)o(ter)f(notation\))f(or)h(C)p Fu(++)f Fz(\(e.g.,)h(classes\).)34 b(Man)o(y)20 b(adv)m(an)o(tages)75 613 y(accrue)12 b(b)o(y)g(taking)h (the)f(time)g(to)g(learn)g(C.)g Fw(Ra)m(tf)o(or)h Fz(o\013ers)e(a)h (gen)o(tle)g(transition.)19 b(\(It)12 b(is)h(not)e(supp)q(orted)75 668 y(v)o(ery)k(activ)o(ely)h(an)o(y)f(more.\))75 813 y Fy(9.1)33 b Fr(Ra)l(tf)o(or)21 b Fy(syn)n(tax)137 915 y Fz(A)16 b(sample)f Fw(Ra)m(tf)o(or)h Fz(program)e(is)195 986 y Fu(@r)195 1038 y(@)195 1090 y(@a)195 1142 y(program)23 b(main)195 1194 y({)195 1246 y(integer)g(k;)195 1298 y(real)g(fcn,)h(x;)195 1401 y(for\(k=0;)f(k<10;)g(k++\))386 1453 y({)386 1505 y(x)h(=)f(fcn\(k\);)386 1609 y(if\(x)g(<)h(0.0\))577 1661 y({)577 1713 y(x)g(=)f(0.0;)577 1765 y(break;)577 1816 y(})386 1868 y(})195 1920 y(})75 1994 y Fz(The)17 b(concluding)i(brace)e(of)f(a)h(function)g(is)g(translated)g(in)o(to)g (an)g Fp(END)e Fz(statemen)o(t.)24 b(Note)16 b(the)h(use)g(of)75 2049 y(semicolons)f(to)f(terminate)g(statemen)o(ts,)f(braces)h(to)g (delimit)i(comp)q(ound)f(statemen)o(ts,)e(`)p Fu(<)p Fz(')g(instead)i(of)75 2104 y(`)p Fu(.LT.)p Fz(',)d(the)j(C-lik)o(e)g Fp(for)f Fz(construction,)g(and)h(the)f(`)p Fu(k++)p Fz(')f(expression.)137 2177 y(Constructions)19 b(lik)o(e)g(`)p Fu(k++)p Fz(')f(or)g(`)p Fu(k)d(-=)f(l)h(+)g(1)p Fz(')j(m)o(ust)h(b)q (e)g(used)g(with)g(great)f(care.)30 b(They)18 b(translate)75 2232 y(to)h(statemen)o(ts)f(in)o(v)o(olving)j(`)p Fu(=)p Fz(')e(signs,)i(so)e(they)h(can)f(b)q(e)i(used)f(only)g(where)g(simple) h(statemen)o(ts)d(are)75 2287 y(allo)o(w)o(ed,)i(not)f(essen)o(tially)h (an)o(ywhere)f(as)g(in)g(C)g(\(for)f(example,)i(they)g(cannot)e(b)q(e)i (used)g(as)e(function)75 2342 y(argumen)o(ts\).)75 2487 y Fy(9.2)33 b Fr(Ra)l(tf)o(or)21 b Fy(commands)75 2641 y Fq(9.2.1)30 b Fo(Ra)m(tf)o(or)p Fq({77)18 b(commands)p eop %%Page: 90 92 90 91 bop 75 -58 a Fz(Chapter)15 b(9:)k Fw(Ra)m(tf)o(or)1356 b Fz(90)219 183 y Fu(break;)23 b(//)g Fz(Used)16 b(with)g Fu(case)e Fz(or)h(to)f(break)i(out)e(of)h(lo)q(ops,)h(as)e(in)i(C.)219 235 y Fu(case)23 b(i:)h(//)f Fz(Used)16 b(with)g Fu(switch)p Fz(.)219 287 y Fu(default:)23 b(//)g Fz(Used)16 b(with)f Fu(case)p Fz(,)g(as)f(in)i(C.)219 339 y Fu(do)23 b(...;)h({...})f(//)h Fz(Note)9 b(the)i(semicolon)g(\(unnecessary)f(if)h(follo)o(w)o(ed)f(b)o (y)h(a)e(comp)q(ound)i(stm)o(t\).)219 391 y Fu(else)23 b({...})g(//)h Fz(Used)16 b(after)e Fu(if)h Fz(as)g(in)h(C.)219 443 y Fu(for\(a;b;c\))22 b({...})i(//)f Fz(As)15 b(in)h(C.)219 495 y Fu(if\(condition\))22 b({...})219 546 y(next;)h(//)h Fz(Equiv)m(alen)o(t)16 b(to)f(C's)f Fu(|)p Fz(con)o(tin)o(ue)p Fu(|)i Fz(statemen)o(t;)e(go)g(to)h(b)q(ottom)f(of)h(lo)q(op.)219 598 y Fu(repeat)23 b({...})g(until\(condition\);)f(//)h Fz(Equiv)m(alen)o(t)17 b(to)d(C's)h Fu(do {...} while\(\);)219 650 y(return)23 b(expression;)f(//)i Fz(As)15 b(in)h(C.)219 702 y Fu(switch\(expression\))21 b({...})i(//)h Fz(As)15 b(in)h(C.)219 754 y Fu(while\(condition\))22 b({...})h(//)g Fz(Lik)o(e)16 b(C's)f Fu(while)p Fz(.)75 866 y Fq(9.2.2)30 b(Additional)20 b Fo(Ra)m(tf)o(or)p Fq({90)f(commands)219 959 y Fu(contains:)219 1011 y(interface)j(name)i({...})219 1063 y(interface)e(operator\(op\))h({...})219 1115 y(interface)f (assignment\(assgnmnt\))g({...})219 1167 y(module)h(name)g({...})219 1219 y(private:)219 1271 y(sequence:)219 1323 y(type)g(name)g({...})219 1375 y(where\(expression\))e({...})75 1503 y Fy(9.3)33 b(Ca)n(v)n(eats)21 b(ab)r(out)h Fr(Ra)l(tf)o(or)137 1600 y Fz(The)16 b(v)o(ersion)f(of)g Fw(Ra)m(tf)o(or)h Fz(built)g(in)o(to)f Fw(Fweb)i Fz(di\013ers)e(sligh)o(tly)i(from)d(its)h Fw(unix)g Fz(coun)o(terpart:)220 1664 y(1.)29 b(Numeric)14 b(statemen)o(t)f(lab)q (els)i(m)o(ust)d(b)q(e)i(follo)o(w)o(ed)g(b)o(y)f(a)g(colon;)i(they)e (should)h(b)q(e)g(\014rst)285 1716 y(on)g(their)h(line.)21 b(\(Use)15 b(sym)o(b)q(olic)g(statemen)o(t)e(lab)q(els)j(instead;)f (see)g(the)f(discussion)i(of)285 1768 y(`)p Fu(#:0)p Fz(')e(in)i(Section)g(7.2.2)e([T)l(ok)o(ens],)g(page)h(65.\))220 1832 y(2.)29 b(The)13 b(quoting)f(con)o(v)o(en)o(tion)h(for)e(c)o (haracters)h(and)g(strings)h(follo)o(ws)f(that)g(of)f(C:)h(Single-)285 1884 y(quote)j(single)i(c)o(haracters,)d(double-quote)i(strings.)220 1948 y(3.)29 b(In)15 b(a)e Fp(switc)o(h)p Fz(,)i(cases)e(fall)i (through)f(to)f(the)h(next)h(case)f(unless)h(terminated)f(b)o(y)g Fp(break)285 2000 y Fz(\(just)h(as)f(in)i(C\).)220 2065 y(4.)29 b(The)22 b Fp(do)h Fz(statemen)o(t)e(m)o(ust)g(b)q(e)i (terminated)g(b)o(y)f(a)g(semicolon)h(if)g(follo)o(w)o(ed)f(b)o(y)g(a) 285 2116 y(simple)17 b(statemen)o(t.)k(\(It's)15 b(unnecessary)h(if)g (follo)o(w)o(ed)h(b)o(y)e(a)h(left)g(brace)g(that)f(b)q(egins)285 2168 y(a)g(comp)q(ound)h(statemen)o(t.\))220 2233 y(5.)29 b(Use)15 b Fu(&&)g Fz(and)h Fu(||)f Fz(for)f(the)h(logical)i(AND)e(and) g(OR.)220 2297 y(6.)29 b(Do)15 b(not)h(use)g(an)g Fp(end)g Fz(statemen)o(t)f(at)g(the)h(v)o(ery)g(end)g(of)g(a)f Fw(Ra)m(tf)o(or)i Fz(program)e(unit;)285 2349 y(it)g(is)h(added)g (automatically)g(b)o(y)f Fw(Fweb)h Fz(when)g(the)f(closing)h(brace)g (is)f(sensed.)p eop %%Page: 91 93 91 92 bop 75 -58 a Fz(Chapter)15 b(10:)k(DOCUMENT)l(A)l(TION)1079 b(91)75 183 y Ft(10)41 b(DOCUMENT)-7 b(A)g(TION)137 298 y Fw(Fweb)17 b Fz(uses)e(LaT)447 308 y(E)473 298 y(X)g(to)f(pro)q(duce) j(its)e(do)q(cumen)o(tation.)20 b(Plain)c(T)1286 308 y(E)1312 298 y(X)f(is)h(no)f(longer)h(supp)q(orted.)137 365 y(It)11 b(is)g(not)f(necessary)h(to)f(b)q(e)h(v)o(ery)f(familiar)i (with)f(LaT)1038 375 y(E)1064 365 y(X)f(in)i(order)e(to)g(use)h Fw(Fweb)g Fz(e\013ectiv)o(ely)l(.)20 b Fw(Fweb)75 420 y Fz(do)q(es)d(complicated)g(things)g(b)q(ehind)h(the)f(scenes,)f (relieving)j(the)d(programmer)f(of)h(man)o(y)g(burdens.)24 b(If)75 475 y(y)o(ou)16 b(don't)g(need)i(complicated)g(mathematics,)e (one)h(needs)g(to)f(kno)o(w)g(virtually)i(no)e(LaT)1639 484 y(E)1665 475 y(X)h(at)f(all)h(in)75 529 y(order)h(to)f(do)q(cumen)o (t)h(a)g(section)g(of)g(co)q(de.)29 b(And)18 b(if)h(y)o(ou)e(do)h(need) h(to)e(t)o(yp)q(eset)h(math,)g(consider)h(that)75 584 y(LaT)151 594 y(E)177 584 y(X)c(mak)o(es)f(this)i(daun)o(ting)g(task)e (ab)q(out)h(as)g(simple)i(as)e(one)g(could)h(hop)q(e.)137 651 y(If)e(y)o(ou're)e(an)h Fw(Fweb)i Fz(b)q(eginner,)f(don't)f(b)q (other)g(diving)i(in)o(to)e(the)h(details)g(of)f(this)g(section)h(un)o (til)g(y)o(ou)75 706 y(really)i(need)g(to.)75 833 y Fy(10.1)32 b(T)n(yp)r(esetting)137 929 y Fw(Fweb)p Fz('s)15 b(\\new)f(lo)q(ok")g (\(b)q(eginning)i(with)f(v)o(ersion)f(1.40\))f(is)h(designed)i(to)d(w)o (ork)g(only)i(with)g(LaT)1803 939 y(E)1828 929 y(X.)75 984 y(The)k(new)h(lo)q(ok)f(is)h(more)e(b)q(o)q(ok-lik)o(e,)j(follo)o (wing)f(ideas)g(from)e(Briggs')h Fu(nuweb)p Fz(.)31 b(By)19 b(default,)h(it)g(uses)75 1039 y(default)f(LaT)307 1048 y(E)333 1039 y(X)f(section)h(n)o(um)o(b)q(ers)g(suc)o(h)g(as)f(1.5.32;) g(ho)o(w)o(ev)o(er,)g(sections)h(ma)o(y)f(b)q(e)h(n)o(um)o(b)q(ered)h (with)75 1093 y(consecutiv)o(e)15 b(in)o(tegers)g(b)o(y)f(sp)q (ecifying)j(the)d(LaT)908 1103 y(E)934 1093 y(X2e)g(pac)o(k)m(age)h Fu(fwebnum)p Fz(;)e(see)i(Section)g(10.1.6)e([Num-)75 1148 y(b)q(ering],)j(page)f(98.)75 1259 y Fq(10.1.1)29 b Fo(Fwea)l(ve)p Fq('s)20 b(OUTPUT)137 1355 y Fz(When)i(one)g(sa)o(ys)e (`)p Fu(fweave)14 b(test)p Fz(',)22 b(the)f(\014le)i(`)p Fu(test.tex)p Fz(')c(is)j(created.)39 b(Some)21 b(T)1584 1365 y(E)1610 1355 y(X)g(commands)75 1410 y(con)o(tained)16 b(in)g(this)g(\014le)h(are)e(created)g(automatically;)h(others)f(are)g (copied)h(from)f(the)g(w)o(eb)h(source)f(\014le.)75 1465 y(They)g(are)g(organized)h(in)o(to)f(sev)o(eral)h(sequen)o(tial)g (groups,)e(as)h(follo)o(ws.)220 1528 y(1.)29 b Fu(\\input)14 b Fz(command)h(to)g(read)g(in)h Fw(Fwea)l(ve)p Fz('s)g(macro)e(pac)o(k) m(age.)285 1592 y(By)j(default,)h(the)f(initial)i(input)f(command)f(is) g(`)p Fu(\\input)d(fwebmac.sty)p Fz(')h(\(see)i(Sec-)285 1644 y(tion)h(10.1.2)d([fw)o(ebmac.st)o(y],)h(page)h(92\).)25 b(The)18 b(name)f(of)g(the)h(macro)e(pac)o(k)m(age)i(can)285 1696 y(b)q(e)e(c)o(hanged)f(with)h(the)f(`)p Fu(-w)p Fz(')f(command-line)j(option,)e(but)h(that)e(is)i(dangerous)f(and)285 1748 y(useful)h(only)g(for)f(v)o(ery)f(sp)q(ecial)j(e\013ects.)j(See)c (Section)g(4.2.66)d([-w],)h(page)h(34.)220 1812 y(2.)29 b Fu(\\Wbegin)14 b Fz(command.)285 1876 y(The)d Fu(\\Wbegin)f Fz(macro)g(sets)h(up)g(certain)g(defaults)h(\(whic)o(h)f(can)g(b)q(e)h (o)o(v)o(erridden)f(in)h(the)285 1928 y(lim)o(b)q(o)18 b(section\).)26 b(In)18 b(LaT)741 1938 y(E)767 1928 y(X,)f(it)g(also)h (issues)g(the)f(`)p Fu(\\documentclass{article})o Fz(')285 1980 y(and)e(`)p Fu(\\begin{document})p Fz(')e(commands.)220 2044 y(3.)29 b(Lim)o(b)q(o)11 b(text)f(from)f(the)h(st)o(yle-\014le)i (parameter)d Fu(limbo.begin)p Fz(.)17 b(See)11 b(Section)g(12.3.8.11)p 1892 2054 21 42 v 285 2095 a([S)p 326 2095 14 2 v 16 w(lim)o(b)q(o],)16 b(page)f(120.)220 2159 y(4.)29 b(Lim)o(b)q(o)16 b(text)f(from)f(`)p Fu(@l)p Fz(')g(commands.)20 b(See)c(Section)g (5.5.14)d([A)l(Tl],)i(page)g(45.)220 2223 y(5.)29 b(User's)15 b(lim)o(b)q(o)h(section.)220 2287 y(6.)29 b(Lim)o(b)q(o)15 b(text)e(from)g(the)h(st)o(yle-\014le)h(parameter)e Fu(limbo.end)p Fz(.)19 b(See)14 b(Section)h(12.3.8.11)285 2339 y([S)p 326 2339 V 16 w(lim)o(b)q(o],)h(page)f(120.)220 2403 y(7.)29 b(T)310 2413 y(E)336 2403 y(X)15 b(commands)g(for)f(individual) 19 b(WEB)c(sections.)220 2467 y(8.)29 b Fu(\\input)14 b Fz(command)h(to)g(read)g(in)h(the)f(index)i(data)d(\014le.)220 2531 y(9.)29 b Fu(\\input)14 b Fz(command)h(to)g(read)g(in)h(the)f(mo)q (dule-list)j(data)c(\014le.)197 2595 y(10.)29 b Fu(\\Winfo)14 b Fz(command)h(\(summarizes)h(some)f(status)f(information\).)197 2659 y(11.)29 b Fu(\\Wcon)14 b Fz(command)i(\(generates)e(the)h(T)l (able)h(of)f(Con)o(ten)o(ts,)f(and)h(ends)h(the)f(run\).)p eop %%Page: 92 94 92 93 bop 75 -58 a Fz(Chapter)15 b(10:)k(DOCUMENT)l(A)l(TION)1079 b(92)75 183 y Fq(10.1.2)29 b(The)21 b(macro)f(pac)n(k)m(age)h(`)p Fn(fwebmac.sty)p Fq(')137 284 y Fw(Fwea)l(ve)c Fz(w)o(orks)f(in)h (conjunction)g(with)g(the)f(macro)g(pac)o(k)m(age)g(`)p Fu(fwebmac.sty)p Fz(',)e(whic)o(h)j(is)g(alw)o(a)o(ys)75 338 y(read)c(in)o(to)g(the)h(`)p Fu(.tex)p Fz(')e(\014le)i(b)o(y)f (default.)20 b(This)14 b(\014le)g(is)g(\(o)o(v)o(erly\))e(complicated,) j(so)e(one)g(should)h(not)f(mess)75 393 y(with)i(it)h(unless)g(in)g (dire)g(emergency)l(.)k(Most)14 b(of)h(its)g(commands)g(are)g(in)o (tended)h(for)f(b)q(ehind-the-scenes)75 448 y(pro)q(cessing.)26 b(Ho)o(w)o(ev)o(er,)16 b(some)h(features)g(ma)o(y)f(b)q(e)i(of)e (general)i(in)o(terest;)f(these)g(are)g(describ)q(ed)i(in)f(the)75 503 y(items)d(b)q(elo)o(w.)137 574 y(F)l(or)j(the)h(most)f(part,)g (macros)g(used)h(in)o(ternally)h(b)o(y)e(`)p Fu(fwebmac.sty)p Fz(')f(b)q(egin)j(with)e(an)h(upp)q(ercase)75 629 y(`)p Fu(W)p Fz('.)28 b(If)19 b(y)o(ou)e(are)h(w)o(orried)h(ab)q(out)f(macro) f(con\015icts,)j(a)e(complete)g(list)i(of)d(the)i(macros)e(app)q (earing)i(in)75 684 y(`)p Fu(fwebmac.sty)p Fz(')13 b(can)i(b)q(e)h (found)g(in)g(the)f(Index)h(pro)q(duced)h(b)o(y)e(w)o(ea)o(ving)g(`)p Fu(fwebmac.web)p Fz('.)75 804 y Fq(10.1.2.1)29 b(User)21 b(macros)137 905 y Fz(F)l(or)c(the)h(user's)f(con)o(v)o(enience,)i(`)p Fu(fwebmac.sty)p Fz(')c(de\014nes)k(a)e(v)m(ariet)o(y)g(of)g(macros)g (suc)o(h)h(as)f(`)p Fu(\\FWEB)p Fz(',)75 959 y(`)p Fu(\\Fortran)p Fz(',)c(etc.)20 b(Refer)c(to)e(`)p Fu(fwebmac.web)p Fz(')f(for)i(a)f (complete)i(list.)137 1031 y Fw(Fwea)l(ve)j Fz(usurps)f(v)m(arious)g (common)g(single-c)o(haracter)g(macros)f(suc)o(h)h(as)g(`)p Fu(\\.)p Fz(')e(for)h(its)h(o)o(wn)g(pur-)75 1086 y(p)q(oses.)43 b(So)22 b(the)h(user)g(can)f(still)j(access)d(their)i(original)f (de\014nitions,)j(those)d(are)f(`)p Fu(\\let)p Fz(')f(equal)j(to)75 1140 y(alternativ)o(e)13 b(commands)g(suc)o(h)h(as)f(`)p Fu(\\period)p Fz('.)k(F)l(or)c(example,)h(commands)f(suc)o(h)g(as)g (the)g(follo)o(wing)h(are)75 1195 y(executed)i(in)g Fu(fwebmac.sty)p Fz(:)195 1264 y Fu(\\let\\amp\\&)195 1316 y(\\let\\at\\@@)195 1367 y(\\let\\bslash\\\\)195 1419 y(\\let\\caret\\^)195 1471 y(\\let\\dollar\\$)195 1523 y(\\let\\dstar\\*)195 1575 y(\\let\\equals\\=)195 1627 y(\\let\\leftbrace\\{)195 1679 y(\\let\\period\\.)195 1731 y(\\let\\rightbrace\\})195 1783 y(\\let\\vertbar|)195 1834 y(\\let\\PM\\#)195 1886 y(\\let\\PC\\\045)75 1958 y Fz(\(Some)f(of)g(the)g(more)g(inscrutable)h (synon)o(yms)f(are)g(for)g(historical)h(reasons.\))137 2029 y(F)l(or)f(the)g(most)f(up-to-date)i(and)f(detailed)i (information,)e(refer)g(to)f(`)p Fu(fwebmac.web)p Fz('.)75 2150 y Fq(10.1.2.2)29 b(F)-5 b(on)n(ts)137 2250 y Fz(Sev)o(eral)16 b(fon)o(ts)e(ha)o(v)o(e)h(b)q(een)h(declared.)22 b(Those)15 b(include)232 2318 y Fx(\017)30 b Fz(`)p Fu(\\titlefont)p Fz(')13 b(\(large)i(sans)g(serif)t(\),)232 2385 y Fx(\017)30 b Fz(`)p Fu(\\ttitlefont)p Fz(')13 b(\(large)i(t)o(yp)q(ewriter\),)232 2451 y Fx(\017)30 b Fz(`)p Fu(\\SC)p Fz(')14 b(\(small)i(caps\),)232 2518 y Fx(\017)30 b Fz(`)p Fu(\\Csc)p Fz(')14 b(\(Caps/small)h(caps\),) g(and)232 2584 y Fx(\017)30 b Fz(`)p Fu(\\tentex)p Fz(')13 b(\(T)535 2594 y(E)561 2584 y(X's)h(extended)j(c)o(haracter)d(set\).)75 2670 y(F)l(or)h(illustrations)h(and)g(further)f(details,)g(see)h(`)p Fu(fwebmac.web)p Fz('.)p eop %%Page: 93 95 93 94 bop 75 -58 a Fz(Chapter)15 b(10:)k(DOCUMENT)l(A)l(TION)1079 b(93)137 183 y(T)l(o)14 b(t)o(yp)q(eset)g(a)g(string)h(of)f(c)o (haracters)f(in)i(t)o(yp)q(ewriter)g(t)o(yp)q(e,)f(one)g(ma)o(y)g(use)g (the)h(`)p Fu(\\.)p Fz(')e(macro.)19 b(\(More)75 238 y(precisely)l(,)13 b(the)e(name)g(of)f(this)h(macro)f(is)h(the)g(v)m (alue)h(of)e(the)h(st)o(yle-\014le)h(parameter)e Fu(format.typewriter)p Fz(.)75 293 y(F)l(or)20 b(more)f(information,)i(see)g(Section)g (12.3.5.1)d([S)p 1001 293 14 2 v 16 w(format],)h(page)h(115.\))34 b(When)20 b(using)h(this,)h(one)75 348 y(m)o(ust)f(escap)q(e)g(the)h (sp)q(ecial)h(c)o(haracters)d(`)15 b Fu(\\#\045$^_{}~&)p Fz(',)20 b(as)h(in)h(`)p Fu(\\.{\\\\alpha})p Fz('.)35 b(\()p Fw(Fwea)l(ve)22 b Fz(do)q(es)75 402 y(that)e(escaping)i (automatically)f(when)g(t)o(yp)q(esetting)g(strings)g(in)h(co)q(de)f (mo)q(de.\))37 b(Y)l(ou)21 b(ma)o(y)f(wish)i(to)75 457 y(surround)f(`)p Fu(\\.{...})p Fz(')e(with)i(an)g(`)p Fu(\\hbox)p Fz(';)g(that)f(is)h(not)g(done)g(b)o(y)f(default)i(b)q (ecause)f Fw(Fwea)l(ve)h Fz(uses)75 512 y(sp)q(ecial)16 b(tric)o(k)o(ery)f(to)f(break)g(long)h(strings)g(in)g(co)q(de)h(mo)q (de)f(automatically)l(,)g(and)f(that)g(breaking)i(w)o(ould)75 567 y(b)q(e)g(inhibited)i(b)o(y)d(an)g(`)p Fu(\\hbox)p Fz('.)75 676 y Fq(10.1.3)29 b(LaT)362 688 y(E)394 676 y(X)21 b(supp)r(ort)137 772 y Fz(Original)i(LaT)396 782 y(E)422 772 y(X)f(supp)q(ort)f(\(through)g(v)o(ersion)g(1.30\))f(w)o (as)h(substan)o(tially)h(incomplete)h(in)g(that)75 827 y(LaT)151 836 y(E)177 827 y(X's)17 b Fu(\\output)f Fz(routine)i(w)o(as) e(usurp)q(ed)j(b)o(y)e(the)h(relativ)o(ely)g(simple)h(one)f(used)g(for) e Fw(Fweb)p Fz('s)i(T)1815 836 y(E)1841 827 y(X)75 881 y(supp)q(ort.)i(Ho)o(w)o(ev)o(er,)14 b(b)q(eginning)k(with)d(v)o (ersion)h(1.40,)e(full)i(LaT)1188 891 y(E)1214 881 y(X)f(supp)q(ort)h (is)g(pro)o(vided)g(\(and)f(Plain)75 936 y(T)100 946 y(E)126 936 y(X)h(is)g Fs(not)h Fz(supp)q(orted\);)f(v)o(ersion)h(1.50) e(supp)q(orts)h(LaT)1066 946 y(E)1091 936 y(X2e.)23 b(LaT)1280 946 y(E)1306 936 y(X's)15 b Fu(\\output)h Fz(routine)g(is)h(used,)75 991 y(as)e(are)g(its)g(sectioning)h(commands)f(\(with)h(minor)f(c)o (hanges\),)g(T)l(able-of-Con)o(ten)o(ts)g(facilities,)h(etc.)137 1057 y(The)d(follo)o(wing)h(discussion)g(is)g(based)f(on)f(LaT)932 1067 y(E)958 1057 y(X2e.)19 b(If)13 b(LaT)1186 1067 y(E)1212 1057 y(X2e)g(is)g(not)f(installed,)j Fw(Fwea)l(ve)f Fz(rec-)75 1112 y(ognizes)i(that)e(fact)h(and)g(issues)h(the)f(`)p Fu(\\documentstyle)p Fz(')e(command)i(instead)g(of)g(`)p Fu(\\documentclass)p Fz('.)137 1233 y(Users)20 b(are)f(strongly)g (encouraged)h(to)e(upgrade)i(to)f(LaT)1141 1243 y(E)1166 1233 y(X2e.)33 b(A)19 b(useful)i(b)q(o)q(ok)f(that)e(describ)q(es)75 1288 y(the)d(presen)o(t)g(state)g(of)g(LaT)551 1298 y(E)576 1288 y(X)g(is)h(Go)q(ossens,)f(Mittelbac)o(h,)g(and)g(Samarin,)g Fs(The)h(LaT)1573 1298 y(E)1598 1288 y(X)g(Companion)75 1343 y Fz(\(Addison{W)l(esley)l(,)g(Reading,)g(MA,)f(1994\).)75 1452 y Fq(10.1.3.1)29 b(LaT)410 1464 y(E)442 1452 y(X's)21 b(do)r(cumen)n(t)g(class)137 1548 y Fz(An)12 b Fw(Fweb)p Fz(/LaT)428 1558 y(E)455 1548 y(X)f(do)q(cumen)o(t)h(is)g(set)g(up)g (with)g(the)f(`)p Fu(\\Wbegin)p Fz(')f(command,)i(issued)h (automatically)75 1603 y(b)o(y)d Fw(Fwea)l(ve)p Fz(.)19 b(See)11 b(the)g(summary)e(at)h(the)h(end)g(of)e(this)i(section)g(for)f (the)g(essence)i(of)d(what)h(the)h(`)p Fu(\\Wbegin)p Fz(')75 1657 y(command)k(accomplishes.)137 1724 y Fw(Fwea)l(ve)j Fz(uses)f Fu(\\documentclass{article})d Fz(b)o(y)j(default.)26 b(In)17 b(principle,)j(the)d(do)q(cumen)o(t)h(class)75 1779 y(can)j(b)q(e)g(c)o(hanged)f(b)o(y)h(the)f Fw(Fweb)i Fz(st)o(yle-\014le)g(option)e(`)p Fu(LaTeX.class)p Fz(';)h(see)g (Section)g(12.3.5)e([Fw)o(eb-)75 1833 y(mac)c(params],)e(page)i(115.)k (Ho)o(w)o(ev)o(er,)14 b Fw(Fwea)l(ve)h Fs(has)g(not)g(b)q(een)h(tested) f(with)g(most)f(other)h(do)q(cumen)o(t)75 1888 y(classes)p Fz(.)31 b(It)19 b(will)h(probably)f(not)g(w)o(ork)e(with)i(most)f(do)q (cumen)o(t)h(classes)h(that)e(rede\014ne)h(the)g(section-)75 1943 y(ing)e(commands)f(from)g(those)h(of)f Fu (\\documentclass{article})p Fz(.)k(Ho)o(w)o(ev)o(er,)c(it)h Fs(ma)o(y)i Fz(w)o(ork)d(with)h(the)75 1998 y Fu(revtex)d Fz(scien)o(ti\014c)j(macro)e(pac)o(k)m(age.)20 b(See)15 b(Section)h(10.1.3.2)d([REVT)l(eX],)i(page)g(94.)137 2064 y(T)l(o)10 b(incorp)q(orate)g(class)h(options|i.e.,)g(to)f(obtain) g(the)h(e\013ect)e(of)h(`)p Fu(\\documentclass[myoptions])o({articl)o (e})p Fz('|)p 2115 2074 21 42 v 75 2119 a(use)16 b(the)f(st)o (yle-\014le)h(parameter)f Fu(LaTeX.class.options)p Fz(,)d(as)j(in)195 2182 y Fu(LaTeX.class.options)21 b("myoptions")75 2249 y Fz(T)l(o)15 b(get)g(t)o(w)o(o-sided)g(prin)o(ting,)h(for)e(example,)i (one)f(w)o(ould)h(sa)o(y)195 2312 y Fu(LaTeX.class.options)21 b("twoside")137 2379 y Fz(T)l(o)10 b(sp)q(ecify)i(user)e(pac)o(k)m (ages|i.e.,)h(to)f(obtain)g(the)g(e\013ect)g(of)g(`)p Fu(\\usepackage[pkgoptions)o(]{pkgnam)o(e})p Fz('|)p 1994 2389 V 75 2433 a(use)16 b(the)f(st)o(yle-\014le)h(parameters)f Fu(LaTeX.package)e Fz(and)i Fu(LaTeX.package.options)p Fz(,)d(as)j(in)195 2497 y Fu(LaTeX.package)22 b("pkgname")195 2549 y(LaTeX.package.options)f("pkgoptions")75 2615 y Fz(F)l(or)13 b(example,)i(to)f(inden)o(t)h(the)f(\014rst)f(line)j(of)e (ev)o(ery)g(section)g(and)h(to)e(p)q(ermit)i(the)f(use)g(of)g(the)g Fu(multicol)75 2670 y Fz(pac)o(k)m(age)h(\(the)g(latter)g(is)h(a)f (useful)h(w)o(a)o(y)e(of)h(substan)o(tially)h(cutting)g(do)o(wn)f(on)g (white)g(space\),)g(sa)o(y)p eop %%Page: 94 96 94 95 bop 75 -58 a Fz(Chapter)15 b(10:)k(DOCUMENT)l(A)l(TION)1079 b(94)195 183 y Fu(LaTeX.package)22 b("indentfirst,multicol")137 254 y Fz(Note)14 b(that)f(sp)q(ecifying)i Fu(LaTeX.package)d Fz(and)i Fu(LaTeX.package.options)d Fz(results)j(in)h(the)f(execu-)75 309 y(tion)h(\(b)o(y)g(the)h Fu(\\Wbegin)e Fz(macro\))g(of)h(precisely) i Fs(one)h Fz(line)e(of)f(the)g(form)195 377 y Fu (\\usepackage[myoptions]{myp)o(ackages)o(})75 448 y Fz(Sometimes)h(one) f(instead)h(needs)g(to)e(ha)o(v)o(e)h(m)o(ultiple)i Fu(\\usepackage)d Fz(lines,)i(suc)o(h)g(as)195 517 y Fu(\\usepackage[option1]{packa)o (ge1})195 568 y(\\usepackage[option2]{packa)o(ge2})75 640 y Fz(T)l(o)22 b(get)g(this)h(e\013ect,)h(one)e(can)h(put)f(these)h (commands)f(explicitly)j(in)o(to)d(the)h(st)o(yle-\014le)h(parameter)75 694 y Fu(doc.preamble)14 b Fz(\(see)h(discussion)i(t)o(w)o(o)c (paragraphs)i(b)q(elo)o(w\),)g(as)g(in)195 763 y Fu(doc.preamble)22 b(=)i("\\\\usepackage[option1]{pac)o(kage1}\\)577 814 y(\\\\usepackage[option2]{pac)o(kage2}")137 886 y Fz(T)162 895 y(E)188 886 y(X)15 b(commands)g(in)i(the)e(user's)g(lim)o(b)q(o)i (section)f(of)f(the)g Fu(web)g Fz(source)h(\014le)g(will)h(b)q(e)g(pro) q(cessed)f Fs(after)75 940 y Fz(the)k Fu(\\begin{document})e Fz(command.)35 b(Lim)o(b)q(o)21 b(commands)f(from)g(the)g(st)o(yle)g (\014le)i(can)e(b)q(e)h(inserted)75 995 y(b)q(efore)h(and/or)f(after)g (those)g(in)h(the)g(lim)o(b)q(o)g(section)h(with)e(the)h(aid)g(of)f (the)h(st)o(yle-\014le)h(parameters)75 1050 y(`)p Fu(limbo.begin)p Fz(')13 b(and)i(`)p Fu(limbo.end)p Fz(';)e(see)j(Section)g(12.3.8.11)c ([S)p 1197 1050 14 2 v 16 w(lim)o(b)q(o],)k(page)f(120.)137 1121 y(If)25 b(there)f(is)h(a)f(comp)q(elling)i(reason)e(to)f(insert)i (one's)f(o)o(wn)g(LaT)1310 1131 y(E)1335 1121 y(X)g(commands)g(b)q(et)o (w)o(een)h(the)75 1176 y(`)p Fu(\\usepackage)p Fz(')16 b(and)i(`)p Fu(\\begin{document})p Fz(')e(commands,)i(one)h(ma)o(y)e (use)i(the)f(st)o(yle-\014le)i(parameter)75 1231 y(`)p Fu(doc.preamble)p Fz(',)g(whose)i(v)m(alue)h(is)f(a)f(string)h (consisting)g(of)f(LaT)1269 1240 y(E)1295 1231 y(X)h(commands)f(\(empt) o(y)g(b)o(y)g(de-)75 1285 y(fault\).)k(Those)17 b(commands)g(are)g(pro) q(cessed)g(immediately)i(b)q(efore)e(`)p Fu(\\begin{document})p Fz('.)23 b(One)18 b(use)75 1340 y(of)f(`)p Fu(doc.preamble)p Fz(')e(is)k(to)e(inhibit)j Fw(Fweb)p Fz('s)e(tendency)h(to)e(k)o(eep)h (a)f(section)h(together)f(on)h(one)f(page.)75 1395 y(T)l(o)12 b(mak)o(e)h(it)g(break)f(more)h(readily)g(in)h(the)f(middle)h(of)f (sections)g(\(particularly)g(useful)h(for)e(m)o(ulticolumn)75 1450 y(output\),)i(sa)o(y)195 1518 y Fu(doc.preamble)22 b("\\\\secpenalty=0")137 1589 y Fz(In)15 b(summary)l(,)f(the)g(b)q (eginning)i(of)d(the)i(\014le)g(output)f(b)o(y)g Fw(Fwea)l(ve)g Fz(lo)q(oks)h(lik)o(e)g(the)f(follo)o(wing,)h(where)75 1644 y(`)p Fu()p Fz(')e(means)i(the)g(con)o(ten)o(ts)g(of)g (the)g(st)o(yle-\014le)h(string)g(called)g(`)p Fu(parameter)p Fz(':)195 1712 y Fu(\\input)23 b(fwebmac.sty)195 1764 y(\\Wbegin{many)f(obscure)h(arguments})195 1816 y()195 1868 y(Optional)g(TeX)g(commands)g(copied)g(from)g(user's)g(limbo)h (section)195 1920 y()75 1991 y Fz(The)15 b(`)p Fu(\\Wbegin)p Fz(')f(command)h(essen)o(tially)i(do)q(es)e(the)g(follo)o (wing:)195 2059 y Fu(\\documentclass[]{})195 2111 y(\\usepackage[]{})195 2163 y()195 2215 y(\\begin{document})75 2286 y Fz(F)l(or)10 b(precise)i (information)f(ab)q(out)g(ho)o(w)f(`)p Fu(\\Wbegin)p Fz(')f(w)o(orks,)h(see)h Fu(fwebmac.web)p Fz(.)17 b(If)11 b(y)o(ou)g(feel)h(that)e(macro)75 2340 y(absolutely)22 b(needs)f(to)f(b)q(e)h(c)o(hanged,)h(please)g(inform)e(the)h(dev)o (elop)q(er)h(\(see)e(Chapter)h(15)f([Supp)q(ort],)75 2395 y(page)15 b(131\).)75 2515 y Fq(10.1.3.2)29 b(Using)21 b(REVT)649 2527 y(E)681 2515 y(X)137 2615 y Fz(REVT)260 2625 y(E)286 2615 y(X)15 b(is)f(the)h(standard)e(macro)h(pac)o(k)m(age) g(used)h(for)f(formatting)f(scien)o(ti\014c)j(pap)q(ers)e(submitted)75 2670 y(to)i(the)h(American)h(Ph)o(ysical)g(So)q(ciet)o(y)l(,)g(the)f (American)h(Institute)g(of)e(Ph)o(ysics,)i(and)f(some)g(Europ)q(ean)p eop %%Page: 95 97 95 96 bop 75 -58 a Fz(Chapter)15 b(10:)k(DOCUMENT)l(A)l(TION)1079 b(95)75 183 y(journals.)20 b(It)15 b(mo)q(di\014es)h(the)f(sectioning)h (commands)e(of)h Fu(\\documentclass{article})c Fz(and)k(pro)o(vides)75 238 y(v)m(arious)h(other)e(useful)j(macros.)137 304 y(Unfortunately)l (,)i(as)e(of)h(August,)g(1998,)f(REVT)976 314 y(E)1002 304 y(X)h(is)h(not)e(fully)j(compatible)f(with)f(LaT)1710 314 y(E)1736 304 y(X2e;)h(it)75 359 y(m)o(ust)d(b)q(e)h(in)o(v)o(ok)o (ed)g(with)g Fu(\\documentstyle{revtex})p Fz(,)c(not)j Fu(\\documentclass)p Fz(.)22 b(This)17 b(is)g(anno)o(ying,)75 414 y(b)q(ecause)d Fw(Fweb)p Fz('s)f(macros)f(in)h(`)p Fu(fwebmac.sty)p Fz(')d(default)k(to)e Fu(\\documentclass)e Fz(if)j(they)g(recognize)h(that)75 468 y(LaT)151 478 y(E)177 468 y(X2e)h(is)h(loaded.)137 535 y(T)l(o)11 b(use)g(REVT)397 544 y(E)423 535 y(X,)f(uncommen)o(t)h(the)g(line)i(in)e(`)p Fu(fwebmac.sty)p Fz(')e(that)h(sa)o(ys)g Fu(\\useREVTeXtrue)p Fz(.)17 b(\(One)75 589 y(cannot)11 b(sa)o(y)f(`)p Fu(\\useREVTeXtrue)p Fz(')e(in)j(the)g(lim)o(b)q(o)h(section)f(of)g(one's)f Fu(web)h Fz(source,)g(b)q(ecause)h(the)f(do)q(cumen)o(t)75 644 y(class)h(has)g(already)g(b)q(een)h(selected)g(b)o(y)f(that)f (time.\))19 b(Y)l(ou)12 b(ma)o(y)f(wish)i(to)e(rename)h(the)g (resulting)g(\014le,)i(sa)o(y)75 699 y(to)h(`)p Fu(rwebmac.sty)p Fz(',)d(so)j(it)h(can)g(b)q(e)g(loaded)g(in)g(place)g(of)f(the)h (standard)f(`)p Fu(fwebmac.sty)p Fz('.)j(T)l(o)d(do)g(that,)75 754 y(one)e(w)o(ould)h(use)g(the)f(command-line)i(option)f(`)p Fu(-wrwebmac.sty)p Fz(')d(\(see)i(Section)h(4.2.66)e([-w],)g(page)h (34\).)137 820 y(Sa)o(ying)k Fu(\\useREVTeXtrue)d Fz(selects)j Fu(\\documentstyle)d Fz(rather)h(than)h Fu(\\documentclass)p Fz(.)21 b(T)l(o)15 b(im-)75 875 y(plemen)o(t)f(a)e(standard)h(command)f (suc)o(h)h(as)g Fu(\\documentstyle[aps,my_mac)o(ros]{re)o(vtex})p Fz(,)d(use)j(the)75 929 y(st)o(yle-\014le)k(\(`)p Fu(fweb.sty)p Fz('\))12 b(parameters)j Fu(LaTeX.style)e Fz(and)j Fu(LaTeX.options)p Fz(,)d(as)h(in)195 993 y Fu(LaTeX.style)22 b("revtex")195 1044 y(LaTeX.options)g("aps,my_macros")75 1110 y Fz(Here)g(`)p Fu(my_macros.sty)p Fz(')e(w)o(ould)i(b)q(e)h(a)f(user's)g(macro)f(pac)o (k)m(age)h(loaded)h(in)g(addition)g(to)f(those)f(of)75 1165 y(REVT)198 1175 y(E)224 1165 y(X)15 b(and)h Fw(Fweb)p Fz(.)137 1231 y(REVT)260 1241 y(E)286 1231 y(X)g(supp)q(ort)g(is)g (extremely)g(recen)o(t.)21 b(There)16 b(ma)o(y)f(b)q(e)h(glitc)o(hes;)g (please)h(rep)q(ort)e(those.)21 b(In)16 b(a)75 1286 y(pinc)o(h,)f(if)g (LaT)326 1296 y(E)352 1286 y(X)f(stops)g(while)i(pro)q(cessing)f(a)f (REVT)1012 1296 y(E)1038 1286 y(X)g(\014le)h(pro)q(duced)h(b)o(y)e Fw(Fwea)l(ve)p Fz(,)h(try)e(t)o(yping)i(`s')75 1341 y(\(scroll)h(mo)q (de\))f(to)f(force)h(it)h(to)e(con)o(tin)o(ue;)i(y)o(ou)f(migh)o(t)g (get)g(usable)h(output.)75 1449 y Fq(10.1.3.3)29 b(LaT)410 1462 y(E)442 1449 y(X)21 b(pac)n(k)m(ages)f(related)h(to)f Fo(Fweb)137 1545 y Fz(The)h(follo)o(wing)g(pac)o(k)m(ages)f(are)g (supplied)i(with)f(the)f Fw(Fweb)h Fz(distribution)h(and)f(can)f(b)q(e) h(used)g(to)75 1599 y(ac)o(hiev)o(e)f(sp)q(ecial)h(e\013ects.)33 b(P)o(ac)o(k)m(ages)18 b(are)i(in)o(v)o(ok)o(ed)f(b)o(y)h(giving)g (their)g(names)f(as)g(argumen)o(ts)g(to)g(the)75 1654 y Fu(LaTeX.package)13 b Fz(command;)i(see)h(Section)g(12.3.5.3)c([S)p 1060 1654 14 2 v 17 w(LaT)l(eX],)i(page)h(116.)112 1720 y Fx(\017)30 b Fu(fwebinsert)19 b Fz(|)i(Enables)h(insertion)f(of)f(w)o (o)o(v)o(en)g(co)q(de)h(in)o(to)g(a)f(LaT)1384 1730 y(E)1410 1720 y(X)h(do)q(cumen)o(t.)36 b(See)21 b(Sec-)165 1775 y(tion)15 b(10.1.6.1)e([Inserting)j(w)o(o)o(v)o(en)e(co)q(de],)h(page)g (99.)112 1841 y Fx(\017)30 b Fu(fwebnum)14 b Fz(|)h(Num)o(b)q(er)g(eac) o(h)g(section)g(in)g(ascending)h(in)o(teger)f(order.)k(See)d(Section)f (10.1.6)e([Num-)165 1896 y(b)q(ering],)j(page)f(98.)112 1962 y Fx(\017)30 b Fu(idxmerge)17 b Fz(|)i(Merge)f(sev)o(eral)g (stand-alone)h(indexes.)31 b(See)19 b(Section)g(11.3)e([Merging)h (indexes],)165 2017 y(page)d(105.)75 2125 y Fq(10.1.3.4)29 b(Sections)21 b(in)g(LaT)722 2137 y(E)753 2125 y(X)137 2220 y Fw(Fweb)p Fz('s)f(sectioning)g(commands)e(`)p Fu(@*)p Fz(')g(and)h(`)p Fu(@*)p Fs(n)p Fz(')f(are)g(con)o(v)o(erted)h (in)o(to)g(LaT)1515 2230 y(E)1540 2220 y(X's)g(section)g(com-)75 2275 y(mands)14 b(suc)o(h)h(as)f Fu(\\section)g Fz(\()p Fs(n)p Fz(=0\),)f Fu(\\subsection)g Fz(\()p Fs(n)p Fz(=1\),)h(and)h Fu(\\subsubsection)d Fz(\()p Fs(n)p Fz(=2\).)20 b(During)75 2330 y(LaT)151 2340 y(E)177 2330 y(X's)12 b(pro)q(cessing)h(of)g(the)f Fu(.tex)g Fz(\014le,)i(it)f(k)o(eeps)g(trac)o(k)e(of)i(the)f(maxim)o (um)h(depth)g(ac)o(hiev)o(ed)h(b)o(y)e(`)p Fu(@*)p Fs(n)p Fz('.)75 2385 y(This)k(n)o(um)o(b)q(er)g(is)g(written)f(as)g(the)g (last)h(item)f(in)i(the)e(`)p Fu(aux)p Fz(')f(\014le.)22 b(During)15 b(the)h(next)f(LaT)1620 2395 y(E)1646 2385 y(X)g(run,)h(that)75 2440 y(n)o(um)o(b)q(er)e(is)h(used)f(to)f(map)h (the)g(un)o(titled)h(`)p Fu(@ )p Fz('commands)e(to)g(the)h(next)g(most) f(insigni\014can)o(t)j(sectioning)75 2494 y(command.)k(That)13 b(lev)o(el)j(of)e(sectioning)i(command)e(is)h(sligh)o(tly)h (rede\014ned)g(from)e(LaT)1565 2504 y(E)1590 2494 y(X's)g(default,)h (so)75 2549 y(don't)g(try)f(to)h(rede\014ne)h(it.)137 2615 y(The)i(previous)h(sc)o(heme)f(means)f(that)g(it)h(ma)o(y)f(b)q(e) h(necessary)g(to)f(run)h(LaT)1454 2625 y(E)1480 2615 y(X)f(as)g(man)o(y)h(as)f(three)75 2670 y(times)12 b(in)h(order)f(to)f (resolv)o(e)h(all)h(sectioning)h(and)e(cross-reference)g(information)g (correctly)l(.)20 b(Y)l(ou)12 b(should)p eop %%Page: 96 98 96 97 bop 75 -58 a Fz(Chapter)15 b(10:)k(DOCUMENT)l(A)l(TION)1079 b(96)75 183 y(b)q(e)17 b(w)o(arned)g(in)g(suc)o(h)g(cases.)24 b(If)16 b(not,)h(y)o(ou)f(will)i(recognize)g(di\016culties)g(b)o(y)f (noting)g(that)e(the)i(T)l(able)g(of)75 238 y(Con)o(ten)o(ts)d(or)h (section)h(n)o(um)o(b)q(ering)g(is)f(incomplete.)137 306 y(The)e(`)p Fu(aux)p Fz(')e(\014le)j(is)e(also)h(used)g(b)o(y)f(b)q (oth)h(pro)q(cessors)f(to)g(generate)g(appropriate)g(error)g(messages)g (that)75 360 y(refer)j(to)g(the)g(LaT)390 370 y(E)416 360 y(X)g(section)h(n)o(um)o(b)q(er)f(instead)h(of)f(the)g(in)o(ternal) h(one.)137 428 y(A)h(discussion)h(of)d(alternativ)o(e)i(section-n)o(um) o(b)q(ering)h(sc)o(hemes)f(is)f(giv)o(en)h(in)g(Section)h(10.1.6)c ([Num-)75 483 y(b)q(ering],)i(page)f(98.)75 595 y Fq(10.1.3.5)29 b(LaT)410 608 y(E)442 595 y(X's)21 b(index.)137 692 y Fz(The)15 b(Index)g(should)g(b)q(e)g(the)g(last)f(section)h(of)f(the)g (co)q(de,)h(and)f(should)h(b)q(e)g(b)q(egun)h(b)o(y)e(the)g(command)75 747 y(`)p Fu(@*)h(\\INDEX.)p Fz('.)j(F)l(or)d(more)f(information,)h (see)h(Section)g(12.3.1.1)d([S)p 1258 747 14 2 v 16 w(index],)j(page)f (113.)137 814 y(The)20 b(c)o(hallenge)g(of)f(t)o(yp)q(esetting)h(the)f (Index)h(is)g(to)e(get)h(it)h(in)o(to)f(t)o(w)o(o-column)g(mo)q(de)g (in)h(the)g(b)q(est)75 869 y(p)q(ossible)g(w)o(a)o(y)l(.)27 b(In)19 b(the)f(original)h(Plain-T)814 879 y(E)841 869 y(X)f Fw(Fweb)p Fz(,)i(sp)q(ecial)g(co)q(de)e(w)o(as)g(pro)o(vided)g (for)g(this.)29 b(With)75 924 y(LaT)151 934 y(E)177 924 y(X,)15 b(ho)o(w)o(ev)o(er,)f(one)h(w)o(an)o(ts)f(to)g(use)i(standard)f (features.)137 991 y(The)f(b)q(est)g(solution)h(is)f(to)f(use)h(the)g (user)g(pac)o(k)m(age)g Fu(multicol)p Fz(.)k(If)c(that)f(is)i(loaded)f (b)o(y)g(means)g(of)f(the)75 1046 y(st)o(yle-\014le)g(statemen)o(t)e(`) p Fu(LaTeX.package)i("multicol")p Fz(',)d(then)i(an)o(y)g(text)f(t)o (yp)q(ed)h(b)o(y)g(the)f(user)h(follo)o(wing)75 1101 y(the)j(`)p Fu(@*)g(\\INDEX.)p Fz(')e(command)i(will)i(b)q(e)e(t)o(yp)q (eset)g(in)h(single-column)h(mo)q(de,)e(after)f(whic)o(h)i(t)o(w)o (o-column)75 1156 y(mo)q(de)i(is)h(en)o(tered.)29 b(If)19 b(it)f(is)h(not)e(loaded,)j(a)d(`)p Fu(\\twocolumn)p Fz(')f(command)i(is)h(issued)g Fs(b)q(efore)i Fz(the)e(index)75 1211 y(section)d(is)f(b)q(egun)i(\(in)e(order)g(to)g(get)g(the)g(Index) h(started)f(on)g(a)g(new)g(page\).)137 1278 y(More)f(precisely)l(,)i (what)e(happ)q(ens)i(is)f(the)g(follo)o(wing.)20 b(When)15 b(the)g(`)p Fu(@*)f(\\INDEX.)p Fz(')f(command)i(is)g(rec-)75 1333 y(ognized,)g(essen)o(tially)g(the)f(follo)o(wing)h(op)q(erations)f (are)g(p)q(erformed,)g(where)g(the)g(results)h(are)e(brac)o(k)o(eted)75 1388 y(in)j(the)f(form)g(`)p Fu([multicol)e(:)i(nomulticol])p Fz(':)195 1452 y Fu(\\beforeindex)22 b([\\newpage)h(:)h(\\twocolumn]) 195 1504 y([print)f(INDEX)g(section)g(heading])195 1556 y(\\startindex)46 b([\\begin{multicols}{2})21 b(:)j(\\medskip])195 1608 y(\\Wfin)190 b([\\end{multicols})22 b(:)i(\\relax])75 1676 y Fz(\(Use)15 b(of)g(the)g(asymmetrical)h(name)f(`)p Fu(\\Wfin)p Fz(')e(is)j(for)f(historical)h(reasons.\))137 1743 y(The)11 b(p)q(ositioning)i(of)e(`)p Fu(\\beforeindex)p Fz(')d(suggests)i(a)h(w)o(a)o(y)f(of)h(prin)o(ting)g(the)h(en)o(tire)f (do)q(cumen)o(t)g(in)h(t)o(w)o(o-)75 1798 y(column)k(mo)q(de.)k(If)c (one)f(en)o(ters)g(m)o(ulti-column)i(mo)q(de)f(in)g(the)f(lim)o(b)q(o)h (section,)g(then)f(`)p Fu(\\beforeindex)p Fz(')75 1853 y(can)g(b)q(e)h(used)f(to)g(terminate)g(it.)20 b(It)15 b(is)g(b)q(est)g(to)g(do)g(this)g(at)f(the)h Fs(end)j Fz(of)c(the)h(lim)o(b)q(o)i(section;)e(otherwise)75 1908 y(user)d(macro)f(de\014nitions)j(in)f(the)f(lim)o(b)q(o)h(section)f(m)o (ust)f(b)q(e)i(made)f Fu(\\global)f Fz(in)i(order)e(that)h(they)g (remain)75 1962 y(de\014ned)17 b(in)f(the)f(Index.)21 b(The)15 b(relev)m(an)o(t)h(commands)f(can)g(b)q(e)h(placed)h(in)f(the) f(st)o(yle)g(\014le:)195 2027 y Fu(LaTeX.package)22 b("multicol")195 2131 y(doc.preamble)g("\\\\secpenalty=0")195 2235 y(limbo.end)h ("\\\\def\\\\beforeindex{\\\\e)o(nd{multi)o(cols}\\\\)o(newpage)o (}\\n\\)195 2286 y(\\\\begin{multicols}{2}\\n\\)195 2338 y(\\\\raggedcolumns")75 2406 y Fz(Just)d(to)f(rep)q(eat,)h(use)g(only)h (the)e(\014rst)h(command)f(to)g(get)g(just)h(the)g(Index)g(prin)o(ted)h (in)f(t)o(w)o(o-column)75 2461 y(format;)13 b(use)j(the)f(second)h(and) f(third)h(ones)f(to)g(mak)o(e)g(the)g(en)o(tire)h(do)q(cumen)o(t)f(t)o (w)o(o-column.)75 2573 y Fq(10.1.3.6)29 b(LaT)410 2586 y(E)442 2573 y(X's)21 b(T)-5 b(able)20 b(of)g(Con)n(ten)n(ts)137 2670 y Fz(LaT)213 2680 y(E)239 2670 y(X)15 b(uses)h(the)f(`)p Fu(aux)p Fz(')f(\014le)i(to)f(accum)o(ulate)g(the)h(information)f(for)g (the)g(T)l(able)h(of)f(Con)o(ten)o(ts.)p eop %%Page: 97 99 97 98 bop 75 -58 a Fz(Chapter)15 b(10:)k(DOCUMENT)l(A)l(TION)1079 b(97)137 183 y(When)23 b(LaT)353 193 y(E)379 183 y(X)g(is)g(used,)i (the)e(T)l(able)g(of)f(Con)o(ten)o(ts)g(app)q(ears)h(at)f(the)h(fron)o (t)e(of)i(the)g(do)q(cumen)o(t)75 238 y(b)o(y)g(default)h(\(b)q (eginning)h(with)f(v)o(ersion)f(1.61\).)43 b(This)24 b(is)f(accomplished)j(b)o(y)d(setting)g(the)g(default)75 293 y(v)m(alue)e(of)f(the)g(st)o(yle-\014le)i(parameter)d Fu(limbo.end)g Fz(to)g Fu("\\\\FWEBtoc")p Fz(,)h(where)g Fu(\\FWEBtoc)f Fz(is)i(de\014ned)75 348 y(in)e(`)p Fu(fwebmac.sty)p Fz('.)28 b(If)19 b(y)o(ou)f(initialize)k Fu(limbo.end)17 b Fz(y)o(ourself)h(in)i(`)p Fu(fweb.sty)p Fz(',)d(y)o(ou)h(should)i (include)75 402 y Fu("\\\\FWEBtoc")14 b Fz(at)i(the)g(end)g(of)g(that)f (initialization)k(if)d(y)o(ou)g(w)o(an)o(t)e(the)i(T)l(able)h(of)f(Con) o(ten)o(ts)f(to)g(app)q(ear)75 457 y(in)h(the)f(b)q(eginning.)22 b(Otherwise,)16 b(it)f(will)i(app)q(ear)f(at)e(the)i(end.)137 527 y(In)g(essence,)g(the)f(T)l(able)h(of)f(Con)o(ten)o(ts)f(is)i(pro)q (duced)g(b)o(y)f(the)g(LaT)1272 537 y(E)1298 527 y(X)g(commands)195 594 y Fu(\\pagenumbering{roman})195 646 y(\\maketitle)195 697 y(\\topofcontents)195 749 y(\\tableofcontents)195 801 y(\\botofcontents)195 853 y(\\newpage)75 923 y Fz(By)k(default,)g (the)g Fw(Fweb)g Fz(ho)q(oks)g Fu(\\topofcontents)d Fz(and)j Fu(\\botofcontents)d Fz(are)i(empt)o(y)l(,)h(but)g(they)75 978 y(ma)o(y)i(b)q(e)h(used)g(in)g(sp)q(ecial)i(circumstances)e(to)f(o) o(v)o(erride)g(the)h(usual)g(b)q(eha)o(vior.)40 b(One)22 b(can)g(set)f(the)75 1032 y(parameters)15 b(for)h Fu(\\maketitle)e Fz(in)j(the)f(lim)o(b)q(o)h(section)g(in)g(the)f(usual)h(LaT)1378 1042 y(E)1403 1032 y(X)f(w)o(a)o(y)l(,)f(except)i(that)e(it)h(is)75 1087 y(b)q(etter)f(to)g(use)g Fw(Fweb)p Fz('s)h Fu(\\Title)e Fz(macro)h(instead)h(of)f Fu(\\title)p Fz(:)195 1154 y Fu(\\Title{MYCODE.WEB})195 1206 y(\\author{My)22 b(name})195 1258 y(\\date{January)g(1,)i(2001})137 1327 y Fz(By)16 b(default,)h(the)e(argumen)o(t)h(of)f(the)h Fu(\\Title)f Fz(macro)g(is)i(prin)o(ted)f(b)q(oth)g(on)g(the)g(title)h(page)e(and)h (as)75 1382 y(a)i(running)i(headline)g(in)f(the)g(do)q(cumen)o(t.)29 b(The)19 b(default)g(fon)o(t)e(for)h(the)h(title)g(is)g Fu(\\ttitlefont)p Fz(;)f(that)75 1437 y(for)f(the)g(running)h(headline) h(is)f Fu(\\large\\tt)p Fz(.)25 b(Ho)o(w)o(ev)o(er,)16 b Fu(\\Title)g Fz(has)h(one)h(optional)f(argumen)o(t)g(that)75 1492 y(allo)o(ws)e(one)h(to)e(o)o(v)o(erride)h(the)h(running)g (headline,)h(p)q(erhaps)f(b)o(y)f(sp)q(ecifying)i(a)e(shorter)f(form.) 20 b(Sa)o(y)195 1559 y Fu(\\Title[)p Fs(Short)14 b(title)s Fu(]{)p Fs(Long)h(title)s Fu(})75 1628 y Fz(to)28 b(mak)o(e)g(the)h (running)h(headline)g(b)q(e)g(`)p Fu(\\large\\tt)13 b Fs(Short)i(title)s Fz(')29 b(and)g(the)f(title-page)i(title)f(b)q(e)75 1683 y(`)p Fu(\\ttitlefont)13 b Fs(Long)j(title)s Fz('.)137 1753 y(The)h Fu(\\)p Fw(Fweb)f Fu(\\Title)g Fz(macro)f(calls)i(LaT)868 1763 y(E)894 1753 y(X's)e Fu(\\title)h Fz(macro)f(with)h(the)g(long)h (title)f(as)g(its)g(argu-)75 1808 y(men)o(t.)k(By)15 b(default,)g Fw(Fwea)l(ve)h Fz(uses)g(\(in)f(the)h(`)p Fu(\\Wbegin)p Fz(')d(macro\))195 1874 y Fu(\\title{}\045)195 1926 y(\\author{}\045)195 1978 y(\\date{\\today\\\\[3pt]\\Time}\045)137 2048 y Fz(Section)e(n)o(um)o(b)q(ers)g(in)g(the)f(T)l(able)h(of)f(Con)o (ten)o(ts)f(are)h(pro)q(duced)h(b)o(y)f(the)g(LaT)1416 2058 y(E)1442 2048 y(X)g(macro)f Fu(\\numberline)p Fz(.)p 1894 2058 21 42 v 75 2103 a(LaT)151 2113 y(E)177 2103 y(X's)14 b(default)i(de\014nition)h(is)e(inadequate)h(when)g(section)g (n)o(um)o(b)q(ers)f(are)g(v)o(ery)f(large;)h(they)g(extend)75 2158 y(to)d(the)h(righ)o(t)f(and)h(can)g(o)o(v)o(erwrite)f(the)h (section)g(name.)19 b(The)13 b(macro)f(is)h(rede\014ned)h(more)e (appropriately)75 2212 y(when)k(the)f(pac)o(k)m(age)g Fu(fwebnum)f Fz(\(see)i(Section)g(10.1.6)d([Num)o(b)q(ering],)i(page)g (98\))f(is)i(used.)75 2329 y Fq(10.1.3.7)29 b(Customizing)21 b(LaT)765 2341 y(E)797 2329 y(X's)g(output)137 2428 y Fz(Sev)o(eral)13 b(\(T)334 2438 y(E)360 2428 y(X\))f(\015ags)g(are)h (pro)o(vided)g(to)f(c)o(hange)h(the)g(app)q(earance)g(of)f(the)h (\014nal)h(LaT)1596 2438 y(E)1621 2428 y(X)f(do)q(cumen)o(t.)75 2483 y(\(This)19 b(app)q(earance)g(is)h(a)e(bit)h(exp)q(erimen)o(tal,)i (and)e(it)g(is)g(fair)g(to)f(sa)o(y)g(that)g(not)g(ev)o(erything)h(ma)o (y)f(b)q(e)75 2538 y(fully)f(debugged;)e(please)h(rep)q(ort)f (problems.\))20 b(These)c(are)f(\(`)p Fu(...)p Fz(')e(means)j(either)g (`)p Fu(true)p Fz(')d(or)i(`)p Fu(false)p Fz('\))232 2604 y Fx(\017)30 b Fu(\\pagerefs...)14 b Fz(\(index)i(references)g(b)o (y)f(pages)g(or)f(section)i(n)o(um)o(b)q(ers\);)232 2670 y Fx(\017)30 b Fu(\\numberTeX...)13 b Fz(\(n)o(um)o(b)q(er)j(the)f(b)q (eginning)i(of)e(unnamed)h(T)l(eX)f(parts\);)p eop %%Page: 98 100 98 99 bop 75 -58 a Fz(Chapter)15 b(10:)k(DOCUMENT)l(A)l(TION)1079 b(98)232 183 y Fx(\017)30 b Fu(\\numberdefs...)13 b Fz(\(n)o(um)o(b)q (er)i(the)h(b)q(eginning)h(of)e(the)g(de\014nition)i(part\);)232 248 y Fx(\017)30 b Fu(\\numbercode...)13 b Fz(\(n)o(um)o(b)q(er)i(the)h (b)q(eginning)h(of)e(the)g(co)q(de)h(part\).)75 330 y(The)f(defaults)h (for)f(these)g(\015ags)g(are)195 396 y Fu(\\pagerefsfalse)195 448 y(\\numberTeXfalse)195 500 y(\\numberdefstrue)195 552 y(\\numbercodetrue)75 621 y Fz(If)e(desired,)h(one)g(ma)o(y)e(o)o (v)o(erride)h(these)g(in)h(the)f(lim)o(b)q(o)h(section.)19 b(\(They)13 b(are)g(de\014ned)h(using)g(Plain)g(T)1785 630 y(E)1810 621 y(X's)75 675 y(`)p Fu(\\newif)p Fz(')f(rather)h(than)g (the)h(equiv)m(alen)o(t)h(LaT)868 685 y(E)894 675 y(X)f(command)f(b)q (ecause)i(they)f(ma)o(y)e(also)i(b)q(e)g(used)g(when)75 730 y(LaT)151 740 y(E)177 730 y(X)g(is)h(not)e(presen)o(t.\))137 799 y Fu(\\numberTeX)d Fz(is)i(on)g(the)f(v)o(erge)h(of)f (obsolescence.)20 b(T)l(ry)12 b(to)g(not)g(use)h(it;)g(nev)o(er)g(use)g (it)g(in)g(conjunction)75 854 y(with)j(the)f(pac)o(k)m(age)g Fu(fwebnum)p Fz(.)k(See)d(Section)g(10.1.6)d([Num)o(b)q(ering],)i(page) g(98)75 969 y Fq(10.1.4)29 b(P)n(age)21 b(references)137 1067 y Fz(When)14 b(one)f(sa)o(ys)g(`)p Fu(\\pagerefstrue)p Fz(')d(\(LaT)886 1076 y(E)912 1067 y(X)j(only\),)g(index)i(references)e (are)g(made)h(b)o(y)f(page)g(n)o(um-)75 1121 y(b)q(ers)19 b(rather)g(than)g(mo)q(dule)h(n)o(um)o(b)q(ers)f(or)g(LaT)914 1131 y(E)939 1121 y(X)g(section)h(n)o(um)o(b)q(ers.)31 b(If)20 b(there)f(is)g(more)g(than)g(one)75 1176 y(section)d(p)q(er)f (page,)g(they)g(are)g(iden)o(ti\014ed)i(b)o(y)e(`)p Fu(a)p Fz(',)f(`)p Fu(b)p Fz(',)g(`)p Fu(c)p Fz(',)g(etc.,)g(suc)o(h)i(as)e(`) p Fu(section)g(17b)p Fz('.)19 b(\(Presen)o(tly)l(,)75 1231 y(this)d(will)g(not)f(w)o(ork)g(correctly)g(when)h Fu(multicol)e Fz(is)h(used)h(for)f(the)g(b)q(o)q(dy)h(of)f(the)g(do)q (cumen)o(t.\))137 1300 y(The)e(information)g(necessary)f(to)g(pro)q (cess)h(page)f(references)h(in)g(this)g(w)o(a)o(y)f(is)h(written)f(in)o (to)h(the)f(`)p Fu(aux)p Fz(')75 1355 y(\014le.)31 b(As)18 b(is)h(usual)g(with)g(LaT)600 1364 y(E)626 1355 y(X,)f(sev)o(eral)g (runs)h(ma)o(y)f(b)q(e)h(required)g(for)f(the)h(references)g(to)f(b)q (e)h(fully)75 1409 y(consisten)o(t)c(with)h(the)f(source)g(\014le.)75 1525 y Fq(10.1.5)29 b(P)n(age)21 b(headers)137 1622 y Fz(The)16 b(v)o(ery)g(top)f(\(header\))h(line)h(on)f(eac)o(h)g(page)g (of)f Fw(Fwea)l(ve)p Fz('s)i(output)e(con)o(tains)h(sev)o(eral)g (pieces)h(of)75 1677 y(information:)112 1746 y Fx(\017)30 b Fz(the)15 b(curren)o(t)g(section)h(name)f(or)g(do)q(cumen)o(t)h (title;)112 1814 y Fx(\017)30 b Fz(the)15 b(page)g(n)o(um)o(b)q(er;)112 1882 y Fx(\017)30 b Fz(the)14 b(range)f(of)g(LaT)490 1892 y(E)516 1882 y(X)g(section)h(n)o(um)o(b)q(ers)g(on)g(the)f(page)h (\(these)f(are)h(preceded)g(b)o(y)g(the)g Fx(x)f Fz(sym)o(b)q(ol\);)165 1937 y(and)112 2005 y Fx(\017)30 b Fz(the)17 b(range)g(of)g(in)o(teger) g(section)h(n)o(um)o(b)q(ers)f(as)g(understo)q(o)q(d)h(in)o(ternally)h (b)o(y)e Fw(Fwea)l(ve)h Fz(\(those)e(are)165 2060 y(in)g(square)f(brac) o(k)o(ets)f(and)i(preceded)g(b)o(y)g(the)f(`)p Fu(#)p Fz(')f(sign\).)75 2175 y Fq(10.1.6)29 b(Section)21 b(n)n(um)n(b)r (ering)g(sc)n(hemes)137 2272 y Fz(The)12 b Fw(Fweb)h Fz(commands)e(`)p Fu(@*)p Fz(')f(and)i(`)p Fu(@ )o Fz('are)f (translated)g(b)o(y)h(complicated)h(magic)e(in)o(to)h(LaT)1708 2282 y(E)1733 2272 y(X)g(com-)75 2327 y(mands)h(suc)o(h)h(as)e Fu(\\section)p Fz(,)g Fu(\\subsection)p Fz(,)g(etc.)19 b(By)13 b(default,)h(use)f(of)g Fu(\\documentclass{article})75 2382 y Fz(then)18 b(pro)q(duces)h(Dew)o(ey-decimal)g(section)g(n)o(um)o (b)q(ers)f(suc)o(h)g(as)g(2.13.4)e(\(subsubsection)j(4)f(of)f(subsec-) 75 2437 y(tion)d(13)e(of)h(section)h(2\).)19 b(When)14 b(the)f(section)h(tree)f(is)h(v)o(ery)f(deep,)h(these)g(n)o(um)o(b)q (ers)g(can)f(lo)q(ok)h(somewhat)75 2492 y(obtrusiv)o(e.)137 2560 y(An)19 b(alternativ)o(e)f(sc)o(heme)g(\(that)g(of)f(the)h (original)i Fw(web)p Fz(\))e(is)h(to)e(merely)i(n)o(um)o(b)q(er)f(eac)o (h)g(section)h(in)75 2615 y(ascending)j(in)o(teger)e(order,)h(b)q (eginning)i(with)d(1.)36 b(This)20 b(can)h(b)q(e)g(done)g(b)o(y)f(sp)q (ecifying)i(the)f(pac)o(k)m(age)75 2670 y Fu(fwebnum)p Fz(,)14 b(as)h(in)p eop %%Page: 99 101 99 100 bop 75 -58 a Fz(Chapter)15 b(10:)k(DOCUMENT)l(A)l(TION)1079 b(99)195 183 y Fu(LaTeX.package)22 b(=)i("fwebnum")75 251 y Fz(This)16 b(pac)o(k)m(age)f(is)h(supplied)h(with)f(the)f Fw(Fweb)h Fz(distribution;)h(it)e(is)h(still)h(somewhat)d(exp)q(erimen) o(tal.)137 319 y(By)k(default,)h Fu(fwebnum)d Fz(n)o(um)o(b)q(ers)i (all)h(sections,)f(including)j(unnamed)d(ones.)27 b(T)l(o)18 b(prohibit)h(n)o(um-)75 374 y(b)q(ering)d(of)f(unnamed)h(sections,)f (use)h(the)f(pac)o(k)m(age)g(option)h Fu(dontnumberunnamed)p Fz(,)c(as)j(in)195 439 y Fu(LaTeX.package.options)21 b(=)j("dontnumberunnamed")75 507 y Fz(This)15 b(option)g(will)i(ev)o (en)o(tually)f(mak)o(e)e Fu(\\numberTeX)f Fz(obsolete;)i(do)g(not)f (use)h Fu(\\numberTeX)e Fz(in)j(conjunc-)75 562 y(tion)f(with)h Fu(fwebnum)p Fz(.)75 656 y Fq(10.1.6.1)29 b(P)n(ac)n(k)m(age)21 b Fn(fwebinsert)p Fq(:)31 b(Inserting)21 b Fo(Fwea)l(ve)p Fq('s)e(output)h(in)n(to)g(a)310 718 y(LaT)410 730 y(E)442 718 y(X)h(do)r(cumen)n(t)137 815 y Fz(Beginning)e(with)f(v)o(ersion)f (1.61,)f(it)i(is)f(\(barely\))h(p)q(ossible)g(to)f(insert)h(the)f(T) 1461 825 y(E)1486 815 y(X)h(output)f(w)o(o)o(v)o(en)f(b)o(y)75 870 y Fw(Fwea)l(ve)i Fz(in)o(to)f(a)f(LaT)474 880 y(E)500 870 y(X)h(do)q(cumen)o(t.)26 b(F)l(or)16 b(example,)i(a)f(co)q(de)g (listing)i(could)f(b)q(e)f(an)g(app)q(endix)i(to)d(a)75 925 y(dissertation,)d(or)g(a)f(handb)q(o)q(ok)i(on)e(n)o(umerical)j (metho)q(ds)e(could)g(insert)h(fragmen)o(ts)d(of)i(co)q(de)g(formatted) 75 980 y(b)o(y)i Fw(Fwea)l(ve)p Fz(.)137 1048 y(Supp)q(ose)j(one)f(has) g(the)f(\014le)i(`)p Fu(test.web)p Fz(')d(and)i(used)g Fw(Fwea)l(ve)h Fz(to)e(create)h(`)p Fu(test.tex)p Fz('.)22 b(Unfortu-)75 1102 y(nately)l(,)c(it)g(do)q(es)f Fs(not)h Fz(w)o(ork)e(to)h(simply)h Fu(\\input)d(test.tex)h Fz(in)o(to)h(a)g (LaT)1355 1112 y(E)1381 1102 y(X)g(do)q(cumen)o(t,)h(b)q(ecause)g(b)o (y)75 1157 y(default)12 b(`)p Fu(test.tex)p Fz(')e(op)q(erates)i(in)h (a)e(\\stand-alone")h(mo)q(de)g(and)g(tries)g(to)f(issue)i(a)e Fu(\\begin{document})75 1212 y Fz(command.)137 1280 y(Instead,)g(one)g (m)o(ust)e(use)i(the)f(pac)o(k)m(age)g Fu(fwebinsert)f Fz(and)h(the)g(sp)q(ecial)i(input)g(command)e Fu(\\FWEBinput)p Fz(,)p 1923 1290 21 42 v 75 1335 a(as)15 b(in)h(the)f(follo)o(wing)h (example.)21 b(There)15 b(are)g(t)o(w)o(o)f(imp)q(ortan)o(t)h(steps.) 220 1400 y(1.)29 b(Use)14 b Fw(Fwea)l(ve)h Fz(to)e(create)h(`)p Fu(test.tex)p Fz('.)k([Y)l(ou)c(ma)o(y)f(wish)i(to)e(use)h(the)g(`)p Fu(-x)p Fz(')f(\015ag)h(\(see)285 1452 y(Section)k(4.2.67)d([-x],)i (page)g(34\))f(to)g(prev)o(en)o(t)h(some)g(of)f(the)h(lists)h(at)f(the) g(end,)h(suc)o(h)285 1504 y(as)d(the)g(index)i(or)d(mo)q(dule)j(list,)e (from)g(b)q(eing)h(prin)o(ted.])220 1568 y(2.)29 b(No)o(w)17 b(`)p Fu(latex)d(test)p Fz(')i(un)o(til)j(all)f(of)f(the)g(section)h(n) o(um)o(b)q(ering)g(is)g(up-to-date.)27 b(\(This)285 1620 y(step)14 b(is)h(necessary)g(b)q(ecause)g(information)f(in)h(the)g(`)p Fu(aux)p Fz(')e(\014le)i(is)g(used)g(in)g(pro)q(cessing)285 1672 y(the)g(section)h(headings.\))75 1753 y(No)o(w)f(`)p Fu(test.tex)p Fz(')e(is)j(ready)f(to)f(b)q(e)i(inserted)g(in)g(a)f(co)q (de)h(lik)o(e)g(the)g(follo)o(wing:)195 1818 y Fu (\\documentclass{article})195 1870 y(\\usepackage{fwebinsert})195 1974 y(\\begin{document})195 2077 y(\\section{Body})195 2181 y(The)23 b(body)h(of)f(the)h(document.)195 2285 y(\\appendix)195 2389 y(\\FWEBinput{test})195 2492 y(\\end{document}) 137 2560 y Fz(Note)17 b(that)f(the)h(`)p Fu(@*)p Fz(')f(commands)h(in)g (`)p Fu(test.web)p Fz(')e(are)i(con)o(v)o(erted)g(in)o(to)f(LaT)1488 2570 y(E)1514 2560 y(X)h(sectioning)h(com-)75 2615 y(mands)j(suc)o(h)h (as)e Fu(\\section)p Fz(.)37 b(The)22 b(ab)q(o)o(v)o(e)e(example)i(w)o (orks)e(correctly)i(b)q(ecause)g(the)f(\014rst)g(`)p Fu(@*)p Fz(')f(in)75 2670 y(`)p Fu(test.web)p Fz(')9 b(is)i(equiv)m(alen)o(t)i(to)d(a)h Fu(\\section)f Fz(\(lev)o(el)i(0\))e (command,)h(whic)o(h)h(should)g(indeed)g(immediately)p eop %%Page: 100 102 100 101 bop 75 -58 a Fz(Chapter)15 b(10:)k(DOCUMENT)l(A)l(TION)1056 b(100)75 183 y(follo)o(w)14 b(an)f Fu(\\appendix)g Fz(command.)19 b(Supp)q(ose,)c(ho)o(w)o(ev)o(er,)d(that)h(y)o(ou)h(w)o(an)o(ted)f(to)g (input)i(`)p Fu(test.web)p Fz(')c(as)75 238 y(part)16 b(of)g(the)h(b)q(o)q(dy)h(of)e(the)h(ab)q(o)o(v)o(e)f(example,)i(and)f (w)o(an)o(ted)f(the)g(`)p Fu(@*)p Fz('s)g(to)g(b)q(e)h(treated)g(as)f (subsections)75 293 y(\(lev)o(el)f(1\))f(rather)f(than)h(sections.)20 b(T)l(o)14 b(tell)h Fu(fwebinsert)e Fz(what)g(lev)o(el)j(n)o(um)o(b)q (er)e(to)g(assign)g(to)f(the)h(`)p Fu(@*)p Fz('s,)75 348 y(pro)o(vide)i(that)e(n)o(um)o(b)q(er)h(as)g(an)g(optional)h (argumen)o(t)e(to)h Fu(\\FWEBinput)p Fz(,)e(as)i(in)h(the)f(follo)o (wing)g(example:)195 408 y Fu(\\documentclass{article})195 460 y(\\usepackage{fwebinsert})195 564 y(\\begin{document})195 667 y(\\section{Body})195 771 y(The)23 b(body)h(of)f(the)h(document.) 195 875 y(\\FWEBinput[1]{test})195 979 y(\\end{document})75 1042 y Fz(Alternativ)o(ely)l(,)e(sa)o(y)d Fu(\\FWEBlevel{1})f Fz(b)q(efore)i(the)g Fu(\\FWEBinput)p Fz(.)32 b(\(The)19 b(optional)i(argumen)o(t)e(con-)75 1097 y(struction)c(merely)h(calls)g Fu(\\FWEBlevel)p Fz(.\))137 1160 y(Here)g(are)f(some)f(ca)o(v)o(eats)h (ab)q(out)g Fu(fwebinsert)p Fz(:)112 1223 y Fx(\017)30 b Fz(Implemen)o(ting)18 b(this)f(pac)o(k)m(age)f(w)o(as)f(tric)o(ky)l (.)24 b(It)16 b(ma)o(y)f(w)o(ork)h(in)h(simple)h(circumstances,)f(but)f (it)g(is)165 1278 y(not)f(fully)h(debugged.)112 1341 y Fx(\017)30 b Fz(The)10 b Fu(\\FWEBinput)f Fz(command)h(surrounds)g (the)h(included)h(T)1184 1350 y(E)1210 1341 y(X)e(co)q(de)h(with)f Fu(\\begingroup)p Fz(...)p Fu(\\endgroup)p Fz(,)p 1983 1351 21 42 v 165 1395 a(in)28 b(an)g(attempt)f(to)g(prev)o(en)o(t)g(v)m (arious)h(macro)f(con\015icts.)58 b(As)27 b(it)h(stands,)i(the)e (command)165 1450 y Fu(\\fwebinput)12 b Fz(is)i Fu(\\let)g Fz(equal)g(to)f Fu(\\FWEBinput)p Fz(.)18 b(If)c(necessary)l(,)g(one)g (could)h(rede\014ne)f Fu(\\fwebinput)165 1505 y Fz(to)h(not)f(include)k (the)d(enclosing)i Fu(\\begingroup)p Fz(...)p Fu(\\endgr)o(oup)p Fz(.)112 1568 y Fx(\017)30 b Fz(F)l(or)13 b(an)o(ything)h(except)g(lev) o(el-0)h(inclusions,)h(one)e(should)g(ha)o(v)o(e)g(just)f(one)h Fu(\\FWEBinput)e Fz(command)165 1623 y(follo)o(wing)k(eac)o(h)f (sectioning)i(command.)i(\(This)d(is)f(a)g(bug.\))112 1686 y Fx(\017)30 b Fz(One)13 b(is)f(supp)q(osed)h(to)e(b)q(e)i(able)g (to)e(use)h(the)g(pac)o(k)m(age)g Fu(fwebnum)f Fz(\(see)h(Section)h (10.1.6)d([Num)o(b)q(ering],)165 1741 y(page)16 b(98\))g(in)h (conjunction)h(with)f Fu(fwebinsert)p Fz(.)22 b(One)17 b(can)g(apply)g(that)f(to)g(either)h(the)f(included)165 1796 y(\014le)h(\(via)f(a)f Fu(LaTeX.package)f Fz(en)o(try)h(in)i(`)p Fu(fweb.sty)p Fz('\),)c(the)j(including)j(\014le)d(\(via)g(a)g Fu(\\usepackage)165 1850 y Fz(command\),)e(or)h(b)q(oth.)20 b(T)l(ry)15 b(out)g(these)g(v)m(arious)h(com)o(binations)g(to)e(see)i (what)e(emerges.)75 1967 y Fy(10.2)32 b(Prett)n(y-prin)o(tin)q(g)137 2059 y Fs(Prett)o(y-prin)o(ting)18 b Fz(refers)13 b(to)g Fw(Fwea)l(ve)p Fz('s)h(attempt)f(to)g(t)o(yp)q(eset)g(and)h(highligh)o (t)h(the)f(co)q(de)g(in)h(a)e(read-)75 2114 y(able)g(w)o(a)o(y)l(.)18 b(This)13 b(is)f(usually)i(done)e(automatically)h(for)e(all)i(of)f(the) g(compiler-lik)o(e)j(languages)d(suc)o(h)h(as)f(C.)75 2169 y(Ho)o(w)o(ev)o(er,)g(it)i(can)g(b)q(e)g(inhibited)i(b)o(y)d (turning)h(on)f(the)h(N)f(mo)q(de)h(with)g(`)p Fu(@N)p Fz(')e(or)h(b)o(y)g(using)h(the)g Fw(verba)m(tim)75 2223 y Fz(language)h(\(selected)i(with)e(`)p Fu(@Lv)p Fz('\).)137 2286 y(Prett)o(y-prin)o(ting)d(is)g(one)g(of)f(those)h(topics)g(that)f (can)h(arouse)f(strong)g(passions:)18 b(y)o(our)11 b(idea)i(of)e (what's)75 2341 y(esthetic)16 b(ma)o(y)e(not)h(b)q(e)h(mine.)21 b(Unfortunately)l(,)15 b Fw(Fweb)p Fz('s)h(formatting)e(rules)i(are)e (mostly)h(hard-co)q(ded,)75 2396 y(so)10 b(if,)h(for)f(example,)i(y)o (ou)e(don't)g(lik)o(e)h(the)g(w)o(a)o(y)e(braces)i(are)f(arranged)f(in) j(t)o(yp)q(eset)e(C)g(co)q(de,)i(y)o(ou're)d(mostly)75 2451 y(stuc)o(k.)19 b(Most)14 b(directly)l(,)i(this)f(p)q(ossibly)i (undesirable)g(c)o(hoice)e(comes)g(from)f(design)i(decisions)g(made)f (b)o(y)75 2506 y(previous)i(authors.)k(It)16 b(also)g(mak)o(es)g Fw(Fwea)l(ve)g Fz(v)o(ery)g(fast,)f(and)h(enables)h(certain)g (complicated)g(tric)o(ks)75 2560 y(that)g(seem)g(di\016cult)i(or)e(imp) q(ossible)j(to)d(accomplish)h(with)g(a)f(completely)i(customizable)g (approac)o(h.)75 2615 y(The)d(latter)f(seems)h(quite)g(formidable,)h (and)f(has)f(not)h(b)q(een)g(attempted|a)g(go)q(o)q(d)f(thesis)i(pro)s (ject)e(for)75 2670 y(the)g(21st)f(cen)o(tury)l(.)p eop %%Page: 101 103 101 102 bop 75 -58 a Fz(Chapter)15 b(10:)k(DOCUMENT)l(A)l(TION)1056 b(101)75 183 y Fq(10.2.1)29 b(Pseudo-op)r(erators)137 282 y Fz(Pseudo-op)q(erators)16 b(b)q(eha)o(v)o(e)g(lik)o(e)h(a)f (particular)h(part)e(of)h(sp)q(eec)o(h)h(for)e(the)h(purp)q(oses)h(of)f Fw(Fwea)l(ve)p Fz('s)75 337 y(formatting,)25 b(but)f(are)f(in)o (visible)k(on)d(output;)k(they)c(are)g(ignored)g(b)o(y)g Fw(Ft)m(angle)p Fz(.)47 b(The)24 b(pseudo-)75 392 y(op)q(erators)14 b(are)195 459 y Fu(@e)24 b Fz(|)15 b(pseudo-expression.)32 b(See)16 b(Section)g(5.13)e([A)l(T)l(e],)g(page)h(57.)195 511 y Fu(@;)24 b Fz(|)15 b(pseudo-semicolon.)32 b(See)16 b(Section)g(5.13.2)d([A)l(T;],)h(page)h(58.)195 563 y Fu(@:)24 b Fz(|)15 b(pseudo-colon.)31 b(See)16 b(Section)g(5.13.3)e([A) l(Tcolon],)g(page)h(59.)75 680 y Fq(10.2.2)29 b(Alternativ)n(es)22 b(for)e(v)m(arious)g(input)h(tok)n(ens)137 779 y Fw(Fwea)l(ve)c Fz(translates)e(v)m(arious)i(input)g(constructions)f(in)o(to)g (allegedly)i(more)d(readable)i(sym)o(b)q(ols|)75 834 y(for)e(example,)g(in)h Fw(F)o(or)m(tran)g Fz(it)f(translates)g(`)p Fu(.LT.)p Fz(')f(in)o(to)h(`)p Fu(<)p Fz('.)137 904 y(Here)f(is)h(a)e (table)i(of)e(what)g(one)h(can)g(t)o(yp)q(e)g(on)g(input,)h(and)f(what) f Fw(Fwea)l(ve)h Fz(will)i(t)o(yp)q(eset.)j(The)14 b(\014rst)75 959 y(en)o(try)j(is)i(standard)e Fw(F)o(or)m(tran)p Fz(;)i(the)f(paren) o(thesized)h(material)f(is)g(an)g(allo)o(w)o(able)g(input)h(alternativ) o(e.)75 1013 y(\(In)c(most)g(cases,)g(the)g(prett)o(y)f(input)j (alternativ)o(es)e(follo)o(w)g(C's)g(con)o(v)o(en)o(tion.\))291 1122 y Fu(.lt.)20 b Fz(\()p Fu(<)p Fz(\))110 b Fx(!)13 b Fk(<)291 1177 y Fu(.le.)20 b Fz(\()p Fu(<=)p Fz(\))86 b Fx(!)13 b(\024)291 1232 y Fu(.eq.)20 b Fz(\()p Fu(==)p Fz(\))86 b Fx(!)13 b(\021)291 1286 y Fu(.ne.)20 b Fz(\()p Fu(!=,<>)p Fz(\))14 b Fx(!)f(6)p Fz(=)291 1341 y Fu(.gt.)20 b Fz(\()p Fu(>)p Fz(\))110 b Fx(!)13 b Fk(>)291 1396 y Fu(.ge.)20 b Fz(\()p Fu(>=)p Fz(\))86 b Fx(!)13 b(\025)291 1451 y Fu(.and.)20 b Fz(\()p Fu(&&)p Fz(\))62 b Fx(!)13 b(^)852 1122 y Fu(.or.)20 b Fz(\()p Fu(||)p Fz(\))f Fx(!)13 b(_)852 1177 y Fu(.neqv.)75 b Fx(!)13 b(6\021)852 1232 y Fu(.xor.)99 b Fx(!)13 b(6\021)852 1286 y Fu(.eqv.)99 b Fx(!)13 b Fz(?=)852 1341 y Fu(.not.)19 b Fz(\()p Fu(!)p Fz(\))h Fx(!)13 b(:)852 1408 y Fu(**)i Fz(\()p Fu(^)p Fz(\))96 b Fx(!)13 b Fu(\(a+b\)^\(c+d\))h Fx(!)f Fz(\()p Fk(a)c Fz(+)i Fk(b)p Fz(\))1600 1392 y Fj(c)p Fi(+)p Fj(d)852 1463 y Fu(//)k Fz(\()p Fu(\\/)p Fz(\))72 b Fx(!)13 b(k)75 1565 y Fz(These)g(same)f(con)o(v)o(en)o(tions)h(are)f(allo)o(w)o (ed)i(in)f Fw(Ra)m(tf)o(or)g Fz(mo)q(de.)20 b(Note)12 b(that)g(in)i Fw(F)o(or)m(tran)e Fz(and)h Fw(Ra)m(tf)o(or)75 1619 y Fz(`)p Fu(//)p Fz(')e(is)i(in)o(terpreted)g(b)o(y)f(default)h (as)f(the)g(concatenation)g(sym)o(b)q(ol,)h(not)f(the)g(start)f(of)h(a) g(short)g(commen)o(t.)75 1674 y(T)l(o)i(o)o(v)o(erride)h(that)e (default,)i(use)g(one)g(of)f(the)g(command-line)j(options)d(`)p Fu(-n/)p Fz(',)f(`)p Fu(-r/)p Fz(',)g(or)h(`)p Fu(-/)p Fz(',)f(or)h(use)h(a)75 1729 y(language-c)o(hanging)h(command)f(of)g (the)g(form)g(`)p Fu(@n/)p Fz('.)75 1846 y Fq(10.2.3)29 b(Ov)n(erloading)21 b(op)r(erators)f(and)g(iden)n(ti\014ers)137 1945 y Fz(F)l(or)g(sp)q(ecial)i(e\013ects)e(in)h(the)g(w)o(o)o(v)o(en)e (output,)i(there)g(are)f(commands)g(to)f(help)j(one)e(c)o(hange)h(the) 75 2000 y(app)q(earance)16 b(of)f(op)q(erators)f(and)h(iden)o (ti\014ers.)75 2118 y Fq(10.2.3.1)29 b(Ov)n(erloading)21 b(op)r(erators)137 2217 y Fz(A)e(feature)f(common)g(to)g(b)q(oth)h(C)p Fu(++)f Fz(and)h Fw(F)o(or)m(tran)p Fz({90)f(is)h Fs(op)q(erator)f(o)o (v)o(erloading)p Fz(,)h(the)g(abilit)o(y)75 2271 y(to)d(extend)h(or)f (rede\014ne)h(the)g(de\014nition)h(of)e(an)h(op)q(erator)e(suc)o(h)i (as)f(`)p Fu(.FALSE.)p Fz(')f(or)h(`)p Fu(=)p Fz('.)22 b Fw(F)o(or)m(tran{90)75 2326 y Fz(ev)o(en)c(allo)o(ws)g(one)g(to)f (de\014ne)i(new)f Fs(dot)f(op)q(erators)p Fz(|for)g(example,)i(one)f (migh)o(t)f(de\014ne)i(the)f(op)q(erator)75 2381 y(`)p Fu(.IN.)p Fz(')11 b(to)h(test)g(for)g(inclusion)j(in)e(a)f(set.)19 b(In)13 b(a)f(non)o(trivial)i(extension)f(of)f(the)h(original)h (design,)f Fw(Fwea)l(ve)75 2436 y Fz(allo)o(ws)18 b(one)g(to)f (de\014ne)h(ho)o(w)g(o)o(v)o(erloaded)f(op)q(erators)g(should)i(app)q (ear)f(on)f(output.)27 b(F)l(or)17 b(example,)i(in)75 2490 y(the)g(opinion)h(of)e(the)h(author)f(it)h(is)g(m)o(uc)o(h)g(more) g(readable)g(to)f(read)h(`)p Fp(if)5 b Fz(\()p Fk(x)18 b Fx(2)h Fh(set)6 b Fz(\)')18 b(than)h(`)p Fp(if)p Fu(\()p Fz(x)g Fu(.IN.)75 2545 y Fh(set)6 b Fu(\))p Fz(.')32 b(Indeed,)21 b(this)f(feature)f(can)g(b)q(e)h(used)g(ev)o(en)g(when)f (the)h(compiler)g(language)g(itself)g(do)q(es)f(not)75 2600 y(p)q(ermit)d(o)o(v)o(erloading)f(in)h(order)f(to)g(customize)h (the)f(app)q(earance)h(of)e(the)i(w)o(o)o(v)o(en)e(output.)137 2670 y(The)i(`)p Fu(@v)p Fz(')e(con)o(trol)h(co)q(de)h(is)f(used)h(to)f (c)o(hange)g(the)g(app)q(earance)h(of)f(an)g(op)q(erator.)k(The)c (format)f(is)p eop %%Page: 102 104 102 103 bop 75 -58 a Fz(Chapter)15 b(10:)k(DOCUMENT)l(A)l(TION)1056 b(102)195 183 y Fu(@v)24 b(new_operator_symbol_or_)o(name)d("TeX)i (material")g(old_operator)75 250 y Fz(This)16 b(means)f(\\Displa)o(y)g (the)g(new)h(op)q(erator)e(according)i(to)e(the)h Fs(T)1222 260 y(E)1248 250 y(X)g(material)p Fz(,)g(but)g(treat)f(it)i(lik)o(e)g (the)75 305 y(old)g(op)q(erator|e.g.,)d(unary)j(or)e(binary|for)i (formatting)e(purp)q(oses.)21 b(The)15 b(quoted)g(T)1590 315 y(E)1616 305 y(X)g(material)g(is)75 360 y(treated)g(just)g(lik)o(e) i(a)e(C)h(string,)f(so)g(if)h(one)g(w)o(an)o(ts)f(to)f(include)k(a)e (bac)o(kslash)g(one)f(m)o(ust)g(escap)q(e)i(it)f(with)75 415 y(another)f(bac)o(kslash.)21 b(F)l(or)15 b(example,)h(one)f(can)h (mak)o(e)f(an)g(equals)i(sign)e(displa)o(y)i(on)e(output)h(as)f(a)g (large)75 470 y(left)h(arro)o(w)d(b)o(y)i(sa)o(ying)195 534 y Fu(@v)24 b(=)f("\\\\Leftarrow")f(=)75 601 y Fz(Tw)o(o)14 b Fw(F)o(or)m(tran)i Fz(examples)g(are)195 666 y Fu(@v)24 b(.FALSE.)e("\\\\.{.FALSE.}")g(.FALSE.)195 717 y(@v)i(.IN.)f("\\\\in")g (+)137 785 y Fz(This)13 b(feature)e(can)i(go)e(a)h(long)g(w)o(a)o(y)f (to)o(w)o(ard)f(enhancing)k(readabilit)o(y)f(of)e(the)h(w)o(o)o(v)o(en) g(output,)g(partic-)75 840 y(ularly)k(when)g(op)q(erators)f(are)g (actually)h(b)q(eing)h(o)o(v)o(erloaded.)k(It)15 b(can)h(also)f(lead)h (to)f(arbitrarily)h(bizarre)75 894 y(output)f(that)f(no-one)i(else)g (will)h(understand.)j(As)c(usual,)f(restrain)o(t)g(is)g(advised.)75 1006 y Fq(10.2.3.2)29 b(Ov)n(erloading)21 b(iden)n(ti\014ers)137 1103 y Fz(Although)d(op)q(erator)f(o)o(v)o(erloading)g(is)h(quite)g (useful,)h(it)f(do)q(es)g(not)f(allo)o(w)g(one)h(to)f(c)o(hange)g(the)h (ap-)75 1158 y(p)q(earance)d(of)e(iden)o(ti\014ers.)21 b(In)15 b(its)f(most)g(general)g(form,)f(suc)o(h)i(a)e(facilit)o(y)j(b) q(ecomes)e(quite)h(complicated;)75 1212 y(one)h(m)o(ust)g(endo)o(w)g Fw(Fwea)l(ve)h Fz(with)f(a)g(macro-pro)q(cessing)g(facilit)o(y)h (analogous)f(to)g(that)f(of)h Fw(Ft)m(angle)p Fz(.)75 1267 y(This)k(has)g(not)f(b)q(een)i(done)f(y)o(et)g(\(ma)o(yb)q(e)f(it) h(will)h(b)q(e)g(someda)o(y\).)33 b(In)20 b(the)g(mean)o(time,)g(one)g (has)g(the)75 1322 y(command)14 b(`)p Fu(@W)p Fz(',)f(whic)o(h)i(pro)o (vides)f(a)g(restricted)g(form)g(of)f(suc)o(h)i(a)f(facilit)o(y)l(.)20 b Fs(This)15 b(command)f(is)h(exp)q(eri-)75 1377 y(men)o(tal,)e(and)h (not)e(\014rmly)i(established.)21 b(Changes)13 b(in)h(usage)f(and/or)g (syn)o(tax)f(ma)o(y)h(b)q(e)h(made)f(in)h(future)75 1431 y(v)o(ersions.)137 1499 y Fz(The)i(most)e(general)i(form)e(of)h(the)g (`)p Fu(@W)p Fz(')f(command)h(is)195 1563 y Fu(@W)24 b(identifier)e("replacement)g(text")75 1630 y Fz(This)15 b(means:)k(Replace)d(an)o(y)e(references)h(to)e Fs(iden)o(ti\014er)20 b Fz(in)15 b(the)f(w)o(o)o(v)o(en)f(output)h(with)h(the)f Fs(replacemen)o(t)75 1685 y(text)p Fz(.)137 1752 y(A)i(more)e (restrictiv)o(e)i(form)e(is)195 1817 y Fu(@W)24 b(identifier)e (\\newmacro)75 1884 y Fz(whic)o(h)d(replaces)g(references)f(to)g Fs(iden)o(ti\014er)23 b Fz(with)18 b(a)g(call)h(to)e Fu(\\newmacro)p Fz(.)28 b(\(Note)17 b(that)g(there)h(are)g(no)75 1939 y(quotes)d(in)h(this)g(form.\))137 2006 y(The)g(shortest)e(form)g (is)195 2070 y Fu(@W)24 b(identifier)e(.)75 2138 y Fz(whic)o(h)17 b(replaces)g(references)g(to)e Fs(iden)o(ti\014er)21 b Fz(with)c(a)f(call)h(to)f Fu(\\identifier)p Fz(.)21 b(F)l(or)15 b(example,)i(the)g(iden-)75 2192 y(ti\014er)f Fs(x)i Fz(normally)e(app)q(ears)f(in)h(w)o(o)o(v)o(en)e(output)h(as)g (`)p Fu(\\.{\\Wshort\\{x\\}})p Fz('.)i(If)f(one)f(sa)o(ys)195 2257 y Fu(@W)24 b(x)f(.)75 2324 y Fz(one)18 b(will)i(instead)f(get)f (the)g(macro)f(reference)i(`)p Fu(\\x)p Fz(',)f(whic)o(h)h(could)g(b)q (e)g(de\014ned)g(to)f(giv)o(e)g(a)g(v)m(ariet)o(y)g(of)75 2379 y(sp)q(ecial)g(e\013ects.)k(\(Ho)o(w)o(ev)o(er,)14 b(one)i(ma)o(y)g(need)g(some)g(rather)g(in)o(timate)g(understanding)h (of)f Fw(Fwea)l(ve)p Fz('s)75 2434 y(output)f(in)h(order)f(to)g(ensure) g(that)g(things)g(alw)o(a)o(ys)g(w)o(ork)f(correctly)l(.\))137 2501 y(One)23 b(of)f(the)g(imp)q(ortan)o(t)g(uses)g(of)g(this)g (facilit)o(y)i(is)e(to)g(exp)q(edite)i(sp)q(ecial)f(formatting)f(of)f (arra)o(y)75 2556 y(references.)41 b(This)22 b(sub)s(ject)g(is)h (discussed)g(separately)f(b)q(elo)o(w)h(in)g(the)f(section)g(on)g(\\Sp) q(ecial)i(arra)o(y)75 2610 y(formatting")14 b(\(sorry)l(,)g(that)g (isn't)i(here)f(y)o(et\),)f(where)i(an)f(example)h(is)g(giv)o(en.)p eop %%Page: 103 105 103 104 bop 75 -58 a Fz(Chapter)15 b(11:)k Fw(Fweb)p Fz('s)d(INDEX.)1146 b(103)75 183 y Ft(11)41 b Fv(Fweb)p Ft('s)27 b(INDEX.)137 342 y Fw(Fweb)17 b Fz(has)e(sev)o(eral)g(p)q(o)o (w)o(erful)g(indexing)i(facilities:)220 421 y(1.)29 b(It)15 b(sorts)f(and)h(writes)g(its)g(o)o(wn)f(self-con)o(tained)i(\()p Fs(in)o(ternal)r Fz(\))f(index,)h(including)h(cross-)285 473 y(references)f(to)e(all)j(the)e(v)m(ariables)h(as)f(w)o(ell)h(as)f (items)h(inserted)g(b)o(y)f(the)g(user.)220 544 y(2.)29 b(It)18 b(can)g(write)h(its)f(cross-reference)g(information)h(to)e(a)h (\014le)h(formatted)e(for)h(use)g(b)o(y)285 596 y(the)g Fu(makeindex)e Fz(utilit)o(y)l(.)28 b(This)18 b(feature)g(facilitates)g (creation)g(of)f(a)g(master)g(index)285 648 y(that)d(con)o(tains)i (information)f(ab)q(out)g(sev)o(eral)h Fu(web)e Fz(\014les.)75 812 y Fy(11.1)32 b Fr(Fweb)p Fy('s)21 b(self-generated)h(index)137 922 y Fz(One)17 b(of)e(the)h(most)f(useful)i(features)e(of)g Fw(Fweb)i Fz(is)f(that)f(it)h(automatically)h(generates)e(an)h(Index)g (of)75 977 y(all)g(v)m(ariable)h(usage.)i(One)d(can)g(also)f(insert)g (one's)g(o)o(wn)g(index)i(en)o(tries)e(b)o(y)g(using)h(the)f(commands) 112 1058 y Fx(\017)30 b Fz(`)p Fu(@^)p Fz(')14 b(\(en)o(try)h(in)h (Roman)f(t)o(yp)q(e;)g(see)g(Section)h(5.10.4)e([A)l(T)p Fu(^)p Fz(],)g(page)h(54\),)112 1132 y Fx(\017)30 b Fz(`)p Fu(@.)p Fz(')14 b(\(en)o(try)h(in)h(t)o(yp)q(ewriter)f(t)o(yp)q(e;)g (see)g(Section)h(5.10.5)e([A)l(Tdot],)f(page)j(54\),)d(and)112 1207 y Fx(\017)30 b Fz(`)p Fu(@9)p Fz(')14 b(\(user-de\014ned)j (format;)c(see)j(Section)g(5.10.6)d([A)l(T9],)h(page)h(54\).)137 1307 y(\(More)f(discussion)j(to)e(b)q(e)h(completed.\))75 1471 y Fy(11.2)32 b(Creating)23 b(a)f(stand-alone)h(index)h(with)f Fg(makeindex)137 1582 y Fz(In)f(addition)h(to)e(the)g(in)o(ternal)h (index)h(describ)q(ed)h(in)e(the)f(previous)h(section)g(\(see)g (Section)g(11.1)75 1636 y([In)o(ternal)16 b(index],)g(page)f(103\),)f Fw(Fwea)l(ve)j Fz(can)e(write)h(the)g(index)h(data)d(to)h(a)h(\014le)g (formatted)e(for)h(later,)75 1691 y(stand-alone)23 b(pro)q(cessing)g(b) o(y)f(the)g Fu(makeindex)f Fz(utilit)o(y)l(.)42 b(\(Sev)o(eral)22 b(suc)o(h)g(indexes)i(can)e(b)q(e)h(merged)75 1746 y(together;)14 b(see)h(Section)h(11.3)e([Merging)h(indexes],)h(page)f(105.\))j(The)e (pro)q(cedure)g(is)g(simple,)g(although)75 1801 y(the)f(follo)o(wing)h (discussion)h(go)q(es)e(in)o(to)g(some)g(rather)g(arcane)g(details.)75 1941 y Fq(11.2.1)29 b(Creating)21 b(a)f(stand-alone)h(index:)31 b(Summary)137 2051 y Fz(As)15 b(a)g(quic)o(k)h(reference)f(for)g(those) g(who)f(ha)o(v)o(e)h(already)g(read)g(the)g(details)h(in)g(the)f(next)g (subsection,)75 2106 y(the)j(pro)q(cedure)g(to)f(prin)o(t)h(a)g (stand-alone)g(index)h(with)f Fu(makeindex)e Fz(is)j(as)e(follo)o(ws.) 27 b(First,)18 b(create,)f(if)75 2161 y(necessary)l(,)j(a)f(\014le)h(`) p Fu(index.tex)p Fz(')d(that)h Fu(\\input)p Fz(s)g(`)p Fu(index.ind)p Fz('.)30 b(\(A)19 b(sk)o(eleton)g(is)h(illustrated)g(in) g(the)75 2216 y(next)15 b(subsection.\))21 b(Then:)195 2294 y Fu(fweave)i(-XI)g(test.web)g Fz(\045)15 b(Creates)g(test.idx)g (and)g(test.st)o(y)l(.)195 2346 y Fu(makeindex)23 b(-s)g(test.sty)g(-o) h(index.ind)e(test.idx)h Fz(\045)15 b(Creates)g(index.ind.)195 2398 y Fu(latex)23 b(index)75 2479 y Fz(If)d(y)o(ou're)f(not)g(happ)o (y)h(with)g(the)g Fu(\\pg)f Fz(macro)h(supplied)i(in)e(`)p Fu(fwebmac.sty)p Fz(',)e(de\014ne)j(it)f(y)o(ourself)g(in)75 2534 y(`)p Fu(index.tex)p Fz('.)137 2615 y(In)d(this)f(pro)q(cedure,)g (note)g(the)g(use)g(of)f(the)h(`)p Fu(-XI)p Fz(')e(option)i(and)g(the)g (use)g(of)g(a)f(di\013eren)o(t)h(ro)q(ot)f(name)75 2670 y(\(`)p Fu(index)p Fz(')e(here\))j(for)e(the)i(output)f(\014le.)p eop %%Page: 104 106 104 105 bop 75 -58 a Fz(Chapter)15 b(11:)k Fw(Fweb)p Fz('s)d(INDEX.)1146 b(104)75 183 y Fq(11.2.2)29 b(Creating)21 b(a)f(stand-alone)h(index:)31 b(Details)137 285 y Fz(T)l(o)14 b(create)g(an)f(index)j(\014le)f(in)f(a)g(form)f(suitable)i(for)f (later)g(stand-alone)g(pro)q(cessing)h(b)o(y)f Fu(makeindex)p Fz(,)75 340 y(use)20 b(the)g(`)p Fu(-XI)p Fz(')f(option)i(to)e Fw(Fwea)l(ve)p Fz(.)35 b(If)20 b(the)g Fu(web)g Fz(\014le)h(is)g(`)p Fu(test.web)p Fz(',)e(the)h(default)g(name)g(of)g(the)75 395 y Fu(makeindex)12 b Fz(output)i(\014le)g(is)g(`)p Fu(test.idx)p Fz('.)j(\(This)d(name)g(can)f(b)q(e)i(o)o(v)o(erridden)f (b)o(y)f(the)h(st)o(yle-\014le)g(param-)75 450 y(eter)g Fu(makeindex.out)p Fz(.\))k(Run)d Fu(makeindex)e Fz(on)i(`)p Fu(test.idx)p Fz(')e(to)g(create)i(the)f(LaT)1488 459 y(E)1514 450 y(X)g(\014le)i(`)p Fu(index.ind)p Fz(')75 504 y(\(see)g(follo)o(wing)g(discussion)h(for)e(details\).)22 b(A)16 b(stand-alone)g(index)h(can)e(then)h(b)q(e)h(pro)q(duced)f(b)o (y)g(sa)o(ying)75 559 y(`)p Fu(latex)e(index)p Fz(',)g(where)h(a)g(sk)o (eleton)h(v)o(ersion)f(of)g(`)p Fu(index.tex)p Fz(')e(w)o(ould)j(b)q(e) 195 629 y Fu(\045)24 b(index.tex)e(---)i(skeleton)f(for)g(printing)g(a) h(stand-alone)e(index.)195 681 y(\\documentclass{article})195 733 y(\\usepackage{fwebmac})195 837 y(\\begin{document})195 941 y(\\input{\\jobname.ind})195 1044 y(\\end{document})75 1117 y Fz(\(In)15 b(practice,)h(a)f(more)g(in)o(v)o(olv)o(ed)h(pro)q (cedure)g(will)h(probably)e(b)q(e)h(follo)o(w)o(ed;)f(see)h(b)q(elo)o (w.\))137 1190 y(Usually)f Fu(makeindex)d Fz(w)o(orks)g(in)j (conjunction)f(with)g(a)f(st)o(yle)g(\014le.)21 b([In)13 b(fact,)g(the)h(syn)o(tax)e(of)h Fw(Fweb)p Fz('s)75 1245 y(st)o(yle)e(\014le)i(\(see)e(Section)h(12.3)f([St)o(yle],)g(page)g (112\))f(w)o(as)h(motiv)m(ated)g(b)o(y)h(that)e(of)h Fu(makeindex)p Fz(.])17 b(When)12 b(the)75 1300 y(`)p Fu(-XI)p Fz(')i(option)h(\(see)g(Section)h(4.2.68)d([-X)p 774 1300 14 2 v 16 w(],)h(page)h(34\))f(is)h(used,)h Fw(Fwea)l(ve)f Fz(will)i Fs(create)g Fz(an)e(appropriate)75 1355 y(st)o(yle)d(\014le)i(for)d Fu(makeindex)p Fz(.)18 b(\(The)12 b(default)h(name)f(of)g(`)p Fu(test.sty)p Fz(')e(can)i(b)q(e)h(o)o(v)o(erridden)g(b)o(y)f(the)h(st)o(yle-\014le) 75 1410 y(parameter)e Fu(makeindex.sty)p Fz(.\))17 b(T)l(o)12 b(run)h Fu(makeindex)d Fz(on)j(the)f(index)h(data)f(for)f(`)p Fu(test.web)p Fz(')g(and)h(create)75 1464 y(the)j(output)g(\014le)i(`)p Fu(index.ind)p Fz(',)12 b(one)k(w)o(ould)f(th)o(us)g(sa)o(y)195 1534 y Fu(makeindex)23 b(-s)g(test.sty)g(-o)h(index.ind)e(test[.idx])75 1607 y Fz(It's)e(imp)q(ortan)o(t)g(to)g(use)h(the)g(`)p Fu(-o)p Fz(')e(option)i(with)g(a)f(name)h(di\013eren)o(t)g(than)f(the)h (original)h(\014le)f(name,)75 1662 y(b)q(ecause)15 b(it)f(simpli\014es) j(the)d(construction)g(of)g(the)g(sk)o(eleton)h(\014le)g(`)p Fu(index.tex)p Fz(')d(that)h(prin)o(ts)i(the)f(stand-)75 1717 y(alone)i(index.)137 1790 y Fw(Fwea)l(ve)h Fz(writes)g(`)p Fu(test.sty)p Fz(')d(b)q(ecause)j(the)g(con)o(ten)o(ts)e(of)h(that)g (\014le)h(ma)o(y)f(dep)q(end)i(on)e(parameter)75 1845 y(settings)h(in)g Fw(Fweb)p Fz('s)g(st)o(yle)g(\014le)h(`)p Fu(fweb.sty)p Fz('.)k Fw(Fweb)p Fz('s)c(st)o(yle)e(v)o(o)q(cabulary)h (includes)i(all)f(parameters)75 1900 y(understo)q(o)q(d)h(b)o(y)g Fu(makeindex)p Fz(.)30 b(If)19 b(a)f Fu(makeindex)g Fz(parameter)g(is)h (called)h(`)p Fu(param)p Fz(',)e(one)h(references)h(it)75 1954 y(in)15 b(`)p Fu(fweb.sty)p Fz(')e(b)o(y)i(`)p Fu(makeindex.param) p Fz('.)i(Th)o(us,)d(to)g(c)o(hange)h(the)f(`)p Fu(headings_flag)p Fz(')e(of)j Fu(makeindex)p Fz(,)75 2009 y(one)k(w)o(ould)f(put)h(in)o (to)g(`)p Fu(fweb.sty)p Fz(')d(a)i(line)j(lik)o(e)e(`)p Fu(makeindex.headings_flag)12 b(=)j(1)p Fz('.)29 b(T)l(o)18 b(see)h(a)f(list)75 2064 y(of)h(all)h Fu(makeindex)p Fz(-related)e(parameters,)h(sa)o(y)g(`)p Fu(fweave)14 b(-Zmakeindex)p Fz(')j(\(see)i(Section)i(4.2.70)c([-Z)p 1837 2064 V 16 w(],)75 2119 y(page)f(35\).)23 b(Remem)o(b)q(er,)17 b Fs(do)f(all)h Fu(makeindex)e Fs(customizations)i(in)g(`)p Fu(fweb.sty)p Fs(';)e(the)h(actual)g(st)o(yle)h(\014le)75 2173 y(`)p Fu(test.sty)p Fs(')c(that)i(will)i(b)q(e)f(read)f(b)o(y)g Fu(makeindex)f Fs(is)h(written)h(automatically)f(b)o(y)g Fw(Fwea)l(ve)p Fs(.)137 2246 y Fz(The)c(`)p Fu(.idx)p Fz(')f(\014le)i(will)g(con)o(tain)f(a)g(list)h(of)e(en)o(tries)h(that)f (b)q(egin)i(with)g(`)p Fu(\\indexentry)p Fz(')c(\(more)i(precisely)l(,) 75 2301 y(the)15 b(v)m(alue)i(of)d(the)i(parameter)e(`)p Fu(makeindex.keyword)p Fz('\).)j(The)e(general)h(form)e(is)195 2371 y Fu(\\indexentry{sort)22 b(key:identifier)g (expression|macro}{page)e(number})75 2444 y Fz(T)o(ypical)c(en)o(tries) g(are)195 2514 y Fu(\\indexentry{istream:"\\>{is)o(tream}|)o(pg{}{}}{)o (1})195 2566 y(\\indexentry{main:"\\>{main})o(|pg{}\\u)o(nderline)o (}{1})195 2618 y(\\indexentry{pow:"\\@{pow}|p)o(g{}{}}{)o(2})195 2670 y(\\indexentry{z:"\\"|z|pg{}\\u)o(nderlin)o(e}{2})p eop %%Page: 105 107 105 106 bop 75 -58 a Fz(Chapter)15 b(11:)k Fw(Fweb)p Fz('s)d(INDEX.)1146 b(105)75 183 y(Here)19 b(the)g(colon)h(is)f(the)h (v)m(alue)g(of)e(`)p Fu(makeindex.actual)p Fz(';)g(it)h(separates)g (the)g(sort)f(k)o(ey)h(\(b)q(efore)g(the)75 238 y(colon\))j(from)g(the) g(actual)h(expression)g(to)f(b)q(e)h(prin)o(ted.)42 b(The)22 b(macros)g(suc)o(h)g(as)g(`)p Fu(\\>)p Fz(')g(t)o(yp)q(eset)g(the)75 293 y(iden)o(ti\014ers)i(in)f(the)g(appropriate)g(w)o(a)o(y)l(,)g(dep)q (ending)i(on)d(their)h(use)g(in)h(the)e(co)q(de.)43 b(Note)22 b(that)g(the)75 348 y(bac)o(kslashes)13 b(are)g(quoted)g(with)g(the)g (v)m(alue)h(of)e(`)p Fu(makeindex.quote)p Fz(',)e(whic)o(h)k(is)g(b)o (y)e(default)i(the)f(double)75 402 y(quote.)137 467 y(Although)j(one)g (migh)o(t)f(guess)g(that)g(the)g(t)o(yp)q(esetting)g(macros)g(suc)o(h)h (as)f(`)p Fu(\\>)p Fz(')f(w)o(ould)h(b)q(e)h(de\014ned)h(in)75 522 y(`)p Fu(fwebmac.sty)p Fz(',)d(that)h(is)i(not)f(true.)23 b(Rather,)16 b(for)g(v)m(arious)g(tec)o(hnical)i(reasons)e(they)g(are)g (equated)h(to)75 577 y(macros)e(in)i(`)p Fu(fwebmac.sty)p Fz(')c(as)i(one)h(of)g(the)g(op)q(erations)f(of)h(the)g(`)p Fu(\\Wbegin)p Fz(')e(macro)h(that)g(is)h(executed)75 631 y(at)i(the)i(b)q(eginning)h(of)d(ev)o(ery)h Fu(tex)g Fz(\014le)h(output)f(b)o(y)g Fw(Fwea)l(ve)p Fz(.)32 b(F)l(or)19 b(example,)h(`)p Fu(\\Wbegin)p Fz(')d(do)q(es)j(the)75 686 y(equiv)m(alen)o(t)e(of)d(`)p Fu(\\let\\>\\Wid)p Fz('.)21 b(Unfortunately)l(,)16 b(without)g(further)g(action)g(that)f (equating)i(w)o(ould)f(b)q(e)75 741 y(forgotten)d(b)o(y)g(a)h(LaT)444 751 y(E)470 741 y(X)g(run)g(made)g(on)g(the)g(output)g(`)p Fu(index.ind)p Fz(')d(of)j Fu(makeindex)p Fz(.)k(F)l(or)13 b(that)h(reason,)75 796 y Fw(Fwea)l(ve)i Fz(app)q(ends)h(the)f (appropriate)f(`)p Fu(\\Wequate)p Fz(')f(macro)h(to)g(the)g(end)h(of)g (`)p Fu(makeindex.preamble)p Fz(')o(.)75 851 y(This)g(is)f(one)h(sp)q (eci\014c)h(instance)f(that)e(necessitates)i(that)f Fw(Fwea)l(ve)h Fz(write)f(the)g Fu(makeindex)f Fz(st)o(yle)h(\014le.)137 915 y(Eac)o(h)26 b(of)g(the)g(`)p Fu(\\indexentry)p Fz('s)d(con)o (tains)j(the)h(encapsulation)g(c)o(haracter)e(`)p Fu(|)p Fz(')g(\(the)h(v)m(alue)h(of)75 970 y(`)p Fu(makeindex.encap)p Fz('\).)16 b(By)f(the)f(con)o(v)o(en)o(tions)g(of)g Fu(makeindex)p Fz(,)f(ev)o(erything)i(b)q(et)o(w)o(een)f(the)h(encapsula-)75 1025 y(tion)g(c)o(haracter)f(and)h(the)g(closing)h(righ)o(t)e(brace)h (de\014nes)h(a)e(macro)h(expression)g(that)f(acts)h(on)f(the)h(page)75 1080 y(n)o(um)o(b)q(er.)38 b(E.g.,)21 b(the)g(general)g(form)f(ab)q(o)o (v)o(e)h(generates)g(the)g(command)g(`)p Fu(\\macro{)p Fs(page)13 b(n)o(um)o(b)q(er)s Fu(})p Fz('.)75 1134 y(The)i(sp)q (eci\014c)j(macro)c(construction)h(output)g(b)o(y)h Fw(Fwea)l(ve)g Fz(is)195 1196 y Fu(\\pg{}{)p Fs(p)q(ossible)g(action)g(macro)r Fu(}{)p Fs(page)e(n)o(um)o(b)q(er)s Fu(})75 1261 y Fz(Here)j(the)f (name)h(`)p Fu(pg)p Fz(')e(is)i(the)f(v)m(alue)i(of)e(`)p Fu(makeindex.page)p Fz('.)21 b(The)c Fs(action)f(macro)i Fz(is)f(something)g(lik)o(e)75 1315 y(`)p Fu(\\underline)p Fz(',)d(whic)o(h)j(w)o(ould)f(b)q(e)h(used)g(b)o(y)f Fw(Fwea)l(ve)g Fz(to)g(underline)i(the)f(page)f(n)o(um)o(b)q(er)g(to)f (indicate)75 1370 y(where)i(a)f(v)m(ariable)h(is)g(de\014ned.)25 b(A)17 b(default)g(de\014nition)h(of)e(`)p Fu(\\pg)p Fz(')f(is)i(giv)o(en)g(is)g(`)p Fu(fwebmac.sty)p Fz('.)k(It)16 b(is)h(a)75 1425 y(three-argumen)o(t)e(macro,)f(`)p Fu (\\def\\pg#1#2#3{...})p Fz(',)d(where)16 b(the)f(argumen)o(ts)f(are)h (as)g(follo)o(ws:)195 1487 y Fu(#1)24 b Fz(|)15 b(In)o(teger)g(\014le)i (iden)o(ti\014cation)g(n)o(um)o(b)q(er)195 1539 y Fu(#2)24 b Fz(|)15 b(Action)h(macro.)195 1590 y Fu(#3)24 b Fz(|)15 b(P)o(age)g(n)o(um)o(b)q(er.)75 1655 y(The)e(de\014nition)i(should)f (con)o(tain)f(the)g(construction)h(`)p Fu(#2{#3})p Fz('|i.e.,)e(the)h (page)f(n)o(um)o(b)q(er)i(m)o(ust)e(b)q(e)i(the)75 1710 y(argumen)o(t)j(of)f(the)i(action)f(macro.)26 b(The)18 b(\014rst)f(argumen)o(t)f(is)i(left)g(empt)o(y)f(in)h(the)g(`)p Fu(.idx)p Fz(')e(\014le)i(written)75 1765 y(b)o(y)d Fw(Fwea)l(ve)p Fz(.)22 b(This)16 b(can)g(b)q(e)g(\014lled)i(in)e(later)g(b)o(y)f(the)h (utilit)o(y)h Fu(idxmerge)d Fz(\(see)i(Section)g(11.3)e([Merging)75 1819 y(indexes],)h(page)e(105\))g(that)g(merges)g(the)h(indices)i(from) d(sev)o(eral)h Fu(web)f Fz(\014les.)20 b(F)l(or)13 b(example,)i(in)f(a) g(master)75 1874 y(index)j(one)g(migh)o(t)f(ultimately)h(prin)o(t)g (page)f(n)o(um)o(b)q(ers)g(lik)o(e)i(`)p Fu(II.5)p Fz(',)c(where)j(`)p Fu(II)p Fz(')e(refers)h(to)g(a)f(\014le)j(suc)o(h)75 1929 y(as)e(`)p Fu(test2.web)p Fz('.)22 b(T)l(o)16 b(aid)h(this)g (merging)f(pro)q(cess,)h(the)g(ro)q(ot)e(name)i(of)f(the)g Fu(web)g Fz(\014le)i(is)f(written)f(as)g(a)75 1984 y(commen)o(t)f(at)f (the)i(top)e(of)h(the)g(`)p Fu(.idx)p Fz(')f(\014le)i(output)f(b)o(y)h Fw(Fwea)l(ve)p Fz(.)75 2105 y Fy(11.3)32 b(Using)22 b(the)h Fg(idxmerge)e Fy(utilit)n(y)k(to)d(merge)g(indexes)137 2198 y Fz(In)14 b(a)f(large)g(pro)s(ject,)f(one)h(ma)o(y)g(main)o(tain) g(and)h(w)o(ork)e(with)h(sev)o(eral)g Fw(Fweb)h Fz(\014les.)21 b(It)13 b(ma)o(y)f(b)q(e)i(useful)75 2253 y(to)j(pro)q(duce)i(a)f (global)h(index)g(that)e(spans)i(all)g(of)e(those)h(\014les.)29 b(T)l(o)18 b(this)h(end,)g(the)f(utilit)o(y)h Fu(idxmerge)75 2308 y Fz(and)c(asso)q(ciated)h(LaT)456 2318 y(E)481 2308 y(X)g(pac)o(k)m(age)f Fu(idxmerge)f Fz(are)h(supplied)i(with)f (the)f Fw(Fweb)h Fz(distribution.)75 2412 y Fq(11.3.1)29 b(Using)21 b Fn(idxmerge)p Fq(:)31 b(Summary)137 2506 y Fz(As)14 b(quic)o(k)g(reference)g(for)e(those)h(who)h(ha)o(v)o(e)f (already)g(plo)o(w)o(ed)h(through)f(the)g(follo)o(wing)h(details,)h (here)75 2560 y(is)h(a)g(summary)f(of)g(the)h(pro)q(cedure.)22 b(T)l(o)15 b(prin)o(t)h(a)f(stand-alone)i(index)f(b)o(y)g(merging)g (the)g(indexes)h(from)75 2615 y(sev)o(eral)j Fu(web)f Fz(sources,)h(do)g(the)g(follo)o(wing.)34 b(First,)20 b(create,)g(if)g(necessary)l(,)h(a)e(\014le)i(`)p Fu(index.tex)p Fz(')d(that)75 2670 y Fu(\\input)p Fz(s)c(`)p Fu(index.ind)p Fz('.)k(Then:)p eop %%Page: 106 108 106 107 bop 75 -58 a Fz(Chapter)15 b(11:)k Fw(Fweb)p Fz('s)d(INDEX.)1146 b(106)195 183 y Fu(fweave)23 b(-XI)g(test1.web)195 235 y(fweave)g(-XI)g(test2.web)195 287 y(fweave)g(-XI)g(test3.web)195 391 y(idxmerge)g(-oindex)g(test1.idx)f(test2.idx)h(test3.idx)386 443 y(\045)h(Creates)f(index.ind)f(and)i(index-names.tex.)195 495 y(makeindex)f(-s)g(test1.sty)g(index)195 546 y(latex)g(index)137 614 y Fz(Note)e(the)h(use)g(of)f(the)g(`)p Fu(-XI)p Fz(')g(option.)39 b(F)l(or)20 b(further)i(bac)o(kground,)g(see)g(the)g(previous)g (section,)75 669 y(Section)16 b(11.2)e([Using)h(mak)o(eindex],)h(page)f (103.)75 781 y Fq(11.3.2)29 b(Using)21 b Fn(idxmerge)p Fq(:)31 b(Details)137 877 y Fz(Supp)q(ose)d(one)f(has)g(three)g (\014les,)j(`)p Fu(test1.web)p Fz(',)d(`)p Fu(test2.web)p Fz(',)g(and)g(`)p Fu(test3.web)p Fz('.)53 b(T)l(o)27 b(use)75 932 y Fu(idxmerge)p Fz(,)16 b(w)o(ea)o(v)o(e)g(eac)o(h)g(of)h (the)g(\014les)g(separately)l(,)g(using)h(the)f(`)p Fu(-XI)p Fz(')e(option)i(to)f(create)h(`)p Fu(test*.idx)p Fz(')75 986 y(and)e(`)p Fu(test*.sty)p Fz('.)j(Then)e(sa)o(y)195 1051 y Fu(idxmerge)23 b(-oindex)g(test1.idx)f(test2.idx)h(test3.idx)75 1118 y Fz(This)18 b(creates)g(t)o(w)o(o)e(output)i(\014les:)26 b(`)p Fu(index.idx)p Fz(',)16 b(and)i(`)p Fu(index-names.tex)p Fz('.)25 b Fu(idxmerge)17 b Fz(\014rst)g(sorts)75 1173 y(the)f(list)h(of)e(\014le)i(names.)22 b(It)15 b(then)i(writes)e(one)h (en)o(try)g(in)o(to)g(`)p Fu(index-names.tex)p Fz(')d(for)i(eac)o(h)h (\014le,)g(of)g(the)75 1228 y(form)195 1292 y Fu(\\idxname{)p Fs(n)p Fu(}{file_name)p Fs(n)p Fu(})75 1359 y Fz(This)h(\014le)h(can)f (b)q(e)g Fu(\\input)f Fz(b)o(y)h(the)g Fu(\\topofindex)e Fz(command)h(\(for)g(an)h(example,)h(see)f(the)f(LaT)1772 1369 y(E)1798 1359 y(X2e)75 1414 y(pac)o(k)m(age)g Fu(idxmerge)p Fz(\))f(\(supplied)j(with)f(the)f Fw(Fweb)i Fz(distribution\))f(and)g (used)f(to)g(create)g(a)g(list)h(of)f(the)75 1469 y(merged)f(\014les.) 137 1536 y(Then)d(it)f(merges)f(the)h Fu(\\indexentry)f Fz(commands)g(from)g(eac)o(h)h(of)g(the)g(input)h(\014les)g(in)o(to)e (`)p Fu(index.idx)p Fz(',)75 1591 y(\014lling)18 b(in)e(the)f(in)o (teger)h(\014le)g(iden)o(ti\014er)h Fs(n)f Fz(\(the)f(p)q(osition)i(of) e(the)g(\014le)i(in)f(the)g(sorted)e(list\))i(in)o(to)g(the)f(\014rst) 75 1646 y(argumen)o(t)f(of)h(the)g Fu(\\pg)g Fz(macro.)k(One)d(can)g (no)o(w)e(sa)o(y)195 1710 y Fu(makeindex)23 b(-s)g(test1.sty)g(index)75 1777 y Fz(This)15 b(creates)f(`)p Fu(index.ind)p Fz(',)e(whic)o(h)j (can)f(b)q(e)h(pro)q(cessed)g(b)o(y)l(,)f(for)g(example,)g(a)g(simple)i (mo)q(di\014cation)f(of)75 1832 y(the)h(simple)h(LaT)372 1842 y(E)398 1832 y(X)e(template)h(giv)o(en)g(ab)q(o)o(v)o(e)g(in)g (Section)h(11.2)d([Using)i(mak)o(eindex],)g(page)f(103.)21 b(The)75 1887 y(only)13 b(di\013erence)h(is)f(that)e(the)i(pac)o(k)m (age)f Fu(idxmerge)g Fz(w)o(as)f(used;)j(in)f(that)f(\014le,)h(the)g (macros)f Fu(\\topofindex)75 1942 y Fz(and)j Fu(\\idxname)f Fz(are)h(appropriately)g(de\014ned)i(to)d(prin)o(t)h(out)g(a)f(n)o(um)o (b)q(ered)i(list)g(of)f(the)g(merged)g(\014les)h(to)75 1996 y(cross-reference)i(in)o(to)f(the)h(n)o(umerical)g(\014le-)h(and)e (page-n)o(um)o(b)q(er)h(en)o(tries)g(in)g(the)g(b)q(o)q(dy)g(of)f(the)g (index.)75 2051 y(Here)e(is)h(an)f(example)h(\(pro)o(vided)g(in)g(the)f Fw(Fweb)i Fz(distribution\):)195 2116 y Fu(\045)24 b(index.tex)e(---)i (skeleton)f(for)g(printing)g(a)h(stand-alone)e(index.)195 2167 y(\\documentclass{article})195 2219 y(\\usepackage{fwebmac,idxmer) o(ge})195 2323 y(\\begin{document})195 2427 y(\\input{\\jobname.ind}) 195 2531 y(\\end{document})p eop %%Page: 107 109 107 108 bop 75 -58 a Fz(Chapter)15 b(12:)f(CUSTOMIZA)l(TION)1088 b(107)75 183 y Ft(12)41 b(CUSTOMIZA)-7 b(TION)137 302 y Fz(The)16 b(default)f(b)q(eha)o(vior)h(of)f Fw(Fweb)h Fz(can)g(b)q(e)f(c)o(hanged)h(in)g(a)f(v)m(ariet)o(y)g(of)g(w)o(a)o (ys.)220 367 y(1.)29 b Fw(unix)18 b Fz(en)o(vironmen)o(t)g(v)m (ariables)i(\(logical)f(v)m(ariables)g(in)h(VMS\))d(a\013ect)h(path)g (or)g(\014le)285 419 y(names.)220 484 y(2.)29 b(An)15 b(initializati)q(on)j(\014le)e(resides)g(in)g(the)f(home)g(directory)l (.)220 549 y(3.)29 b(A)15 b(st)o(yle)h(\014le)g(resides)g(in)g(the)f (curren)o(t)g(directory)l(.)137 630 y(The)j(initialization)i(\014le)e (\(usually)h(called)g(`)p Fu(.fweb)p Fz('\))c(is)j(in)o(tended)h(to)d (con)o(tain)i(command-line)h(op-)75 684 y(tions)j(\(one)f(p)q(er)h (line\))h(that)e(are)g(to)g(b)q(e)h(used)g(in)g(ev)o(ery)g(run.)39 b(See)22 b(Section)g(12.2)e([Initialization],)75 739 y(page)15 b(108.)137 807 y(The)d(st)o(yle)g(\014le)h(\(called)g(`)p Fu(fweb.sty)p Fz(')d(b)o(y)h(default;)j(see)e(Section)g(4.2.71)e([-z],) i(page)f(35\))g(is)h(in)o(tended)i(to)75 862 y(pro)o(vide)h(more)f(lo)q (cal)h(customization,)f(p)q(erhaps)h(di\013ering)g(for)f(eac)o(h)g (source)h(\014le)g(and)f(group)g(of)g(source)75 917 y(\014les.)28 b(The)18 b(st)o(yle)f(\014le)i(do)q(es)f(not)f(con)o(tain)g (command-line)j(options;)e(rather,)f(it)h(con)o(tains)g(parameter)75 971 y(settings)g(that)f(o)o(v)o(erride)g Fw(Fweb)p Fz('s)i(defaults.)27 b(The)18 b(`)p Fu(-p)p Fz(')f(option)h(\(see)f(Section)i(4.2.46)d ([-p],)h(page)h(28\))75 1026 y(ma)o(y)e(b)q(e)h(used)g(to)f(sp)q(ecify) i(a)e(st)o(yle-\014le)i(en)o(try)e(in)h(`)p Fu(.fweb)p Fz(')e(\(i.e.,)h(a)h(global)g(v)m(alue)g(for)f(all)i(source)e (\014les\))75 1081 y(or)f(on)g(the)g(command)g(line)i(\(i.e.,)e(a)f(v)m (alue)j(used)f(for)e(a)h(single)i(run\).)137 1149 y(The)f(order)f(of)f (pro)q(cessing)i(is:)220 1214 y(1.)29 b(Ev)m(aluate)15 b(en)o(vironmen)o(t)f(v)m(ariables.)21 b(See)15 b(Section)g(12.1)e([En) o(vironmen)o(t)h(v)m(ariables],)285 1266 y(page)h(107.)220 1331 y(2.)29 b(Read)23 b(`)p Fu(.fweb)p Fz(')e(and)h(remem)o(b)q(er)h (its)f(con)o(ten)o(ts;)j(sort)c(those)h(in)o(to)g(three)h(groups:)285 1382 y(options)14 b(b)q(eginning)j(with)d(`)p Fu(-)p Fz(',)f(b)q(eginning)j(with)f(`)p Fu(&)p Fz(',)e(and)h(b)q(eginning)j (with)d(a)g(letter)285 1434 y(\(\014le)i(names\))f(.)20 b(See)15 b(Section)h(12.2)e([Initialization],)j(page)e(108.)220 1499 y(3.)29 b(Pro)q(cess)16 b(`)p Fu(.fweb)p Fz(')f(options)i(b)q (eginning)i(with)e(`)p Fu(-)p Fz(')e(\(or)h(`)p Fu(+)p Fz(',)f(for)h(bac)o(kw)o(ard)g(compati-)285 1551 y(bilit)o(y\),)g (except)g(for)e(`)p Fu(-p)p Fz('.)220 1616 y(4.)29 b(Read)18 b(and)f(pro)q(cess)h(command-line)h(options,)e(except)h(for)f(`)p Fu(-p)p Fz('.)25 b(See)18 b(Section)g(4.2)285 1668 y([Options],)d(page) g(15.)220 1732 y(5.)29 b(Pro)q(cess)15 b(remaining)g(`)p Fu(.fweb)p Fz(')e(options)i(\(either)g(\014le)h(names,)e(or)g(options)h (b)q(eginning)285 1784 y(with)h(`)p Fu(&)p Fz('\).)220 1849 y(6.)29 b(Pro)q(cess)15 b(an)o(y)g(`)p Fu(-p)p Fz(')f(options)h (from)g(`)p Fu(.fweb)p Fz('.)j(See)e(Section)g(4.2.46)e([-p],)g(page)h (28.)220 1914 y(7.)29 b(Pro)q(cess)15 b(the)g(st)o(yle)h(\014le.)21 b(See)15 b(Section)i(12.3)d([St)o(yle],)g(page)h(112.)220 1978 y(8.)29 b(Pro)q(cess)15 b(an)o(y)g(`)p Fu(-p)p Fz(')f(options)h (from)g(the)g(command)g(line.)137 2059 y(Unfortunately)l(,)k(b)q (ecause)f(not)g(all)h(options)e(are)h(pro)q(cessed)g(immediately)i (when)e(they)g(are)f(read,)75 2114 y(errors)12 b(ma)o(y)g(not)g(sho)o (w)g(up)h(when)g(one)g(exp)q(ects.)20 b(F)l(or)12 b(example,)h(nothing) h(is)f(actually)g(pro)q(cessed)g(while)75 2169 y(`)p Fu(.fweb)p Fz(')i(is)j(b)q(eing)g(read;)f(its)g(con)o(ten)o(ts)g(are)f (just)h(b)q(eing)h(stored.)25 b(It)17 b(could)g(therefore)g(happ)q(en)h (that)e(a)75 2223 y(syn)o(tax)g(error)g(in)i(en)o(tering)f(a)f(`)p Fu(-p)p Fz(')g(option)h(in)h(`)p Fu(.fweb)p Fz(')d(ma)o(y)h(not)h(b)q (e)g(rep)q(orted)g(un)o(til)h(after)e(the)h(st)o(yle)75 2278 y(\014le)f(has)f(b)q(een)i(read,)d(p)q(ossibly)j(confusing)f(the)f (user)h(as)f(to)f(the)h(source)h(of)e(the)i(error.)75 2409 y Fy(12.1)32 b(En)n(vironmen)n(t)25 b(v)l(ariables)137 2506 y Fu(FWEB_HDR_INCLUDES)12 b Fz(|)i(Colon-delimited)j(list)d(of)g (directories)h(for)e(the)h(C)g(prepro)q(cessor)f(\(in)i(the)75 2560 y(form)e(of)h Fu(gcc)p Fz(\))f(to)g(searc)o(h)g(for)h(`)p Fu(#include)p Fz(')e(header)i(\014les.)20 b(This)15 b(is)f(used)g(in)h (conjunction)g(with)f(the)g(`)p Fu(-H)p Fz(')75 2615 y(option;)h(see)g(Section)h(4.2.17)d([-H)p 657 2615 14 2 v 16 w(],)i(page)f(20.)20 b(\(One)15 b(can)g(app)q(end)h(to)e(this)i (list)g(b)o(y)f(means)f(of)h(the)g(`)p Fu(-I)p Fz(')75 2670 y(option,)g(pro)o(vided)h(that)f(option)g(comes)g Fs(after)j Fz(the)d(`)p Fu(-H)p Fz(';)f(see)h(Section)h(4.2.19)e([-I)p 1491 2670 V 16 w(],)h(page)g(21.\))p eop %%Page: 108 110 108 109 bop 75 -58 a Fz(Chapter)15 b(12:)k(CUSTOMIZA)l(TION)1083 b(108)137 183 y Fu(FWEB_INCLUDES)10 b Fz(|)i(Colon-delimited)i(list)e (of)f(directories)i(to)e(searc)o(h)g(for)g(`)p Fu(@i)p Fz(')f(include)k(\014les.)20 b(\(One)75 238 y(can)15 b(app)q(end)h(to)e(this)h(list)g(b)o(y)g(means)f(of)g(the)h(`)p Fu(-I)p Fz(')f(option,)g(pro)o(vided)i(that)d(option)i(comes)g Fs(b)q(efore)i Fz(an)o(y)75 293 y(use)f(of)e(`)p Fu(-H)p Fz(';)g(see)i(Section)g(4.2.19)d([-I)p 717 293 14 2 v 17 w(],)h(page)h(21.\))137 357 y Fu(FWEB_INI)f Fz(|)i(Name)f(of)f(the)i (initialization)i(\014le.)j(If)15 b(not)g(de\014ned,)h(either)g(`)p Fu(.fweb)p Fz(')d(or)i(`)p Fu(fweb.ini)p Fz(')75 412 y(is)h(c)o(hosen,)f(dep)q(ending)i(on)e(the)h(mac)o(hine.)k(The)c (initialization)i(\014le)e(alw)o(a)o(ys)f(resides)h(in)g Fu($HOME)p Fz(.)137 476 y Fu(FWEB_STYLE_DIR)e Fz(|)h(Directory)h(in)g (whic)o(h)g(the)f(st)o(yle)h(\014le)g(resides.)22 b(If)15 b(not)g(de\014ned,)i(the)e(curren)o(t)75 531 y(directory)g(is)h(used.) 75 650 y Fy(12.2)32 b(Initializati)q(on)137 743 y Fz(Although)12 b(some)f(asp)q(ects)g(of)g Fw(Fweb)p Fz('s)h(b)q(eha)o(vior)g(are)f (hard-co)q(ded,)i(man)o(y)e(can)g(b)q(e)h(c)o(hanged)g(and/or)75 798 y(initialized)19 b(b)o(y)c(the)g(user.)75 900 y Fq(12.2.1)29 b(The)21 b(initialization)f(\014le)137 993 y Fz(On)h(startup,)f Fw(Fweb)h Fz(attempts)e(to)g(read)h(an)g(initialization)j(\014le.)35 b(This)20 b(alw)o(a)o(ys)f(resides)i(in)g(the)75 1048 y(user's)13 b(home)g(directory)l(.)20 b(It)13 b(is)h(usually)g(called)h (`)p Fu(.fweb)p Fz(')d(\(`)p Fu(fweb.ini)p Fz(')f(on)i(p)q(ersonal)h (computers\).)19 b(The)75 1103 y(default)d(\014le)g(name)f(can)h(b)q(e) f(o)o(v)o(erridden)h(b)o(y)f(the)h(en)o(vironmen)o(t)f(v)m(ariable)i Fu(FWEB_INI)p Fz(.)137 1167 y(One)k(ma)o(y)d(put)i(in)o(to)g(`)p Fu(.fweb)p Fz(')e(an)o(y)h(option)h(that)f(migh)o(t)g(b)q(e)h(used)g (as)g(a)f(command-line)i(option.)75 1222 y(\(Presen)o(tly)l(,)16 b(there)g(m)o(ust)g(b)q(e)h(just)e(one)h(en)o(try)g(p)q(er)h(line.\))24 b(If)16 b(the)g(option)g(b)q(egins)i(with)e(a)g(`)p Fu(-)p Fz(')f(\(or)g(a)h(`)p Fu(+)p Fz(')75 1277 y(for)h(bac)o(kw)o(ard)g (compatibilit)o(y\),)j(it)e(is)g(pro)q(cessed)g Fs(b)q(efore)j Fz(the)d(actual)g(command-line)i(options;)e(if)h(it)75 1331 y(b)q(egins)h(with)f(`)p Fu(&)p Fz(')f(or)g(is)h(a)g(\014le)h (name,)f(it)g(is)g(pro)q(cessed)h(after.)29 b(Generally)l(,)21 b(`)p Fu(.fweb)p Fz(')c(options)i(should)75 1386 y(b)q(egin)e(with)f(`) p Fu(-)p Fz(')f(so)h(that)f(one)h(ma)o(y)f(o)o(v)o(erride)h(them)f (from)g(the)h(command)g(line.)23 b(The)17 b(`)p Fu(\045)p Fz(')d(sign)j(b)q(egins)75 1441 y(a)e(commen)o(t)g(terminated)g(b)o(y)g (the)g(end-of-line.)75 1544 y Fq(12.2.2)29 b(Memory)21 b(allo)r(cation)137 1637 y Fz(The)e(command-line)h(option)f(`)p Fu(-y)p Fz(')e(\(see)h(Section)i(4.2.69)c([-y],)i(page)g(35\))g(is)h (used)g(to)e(c)o(hange)i(the)75 1692 y(default)12 b(allo)q(cation)h (for)e(a)g(dynamic)h(arra)o(y)l(.)18 b(The)12 b(arra)o(ys)e(ha)o(v)o(e) h(a)h(one-)f(or)g(t)o(w)o(o-c)o(haracter)f(abbreviation)75 1746 y(denoted)18 b(b)o(y)g Fs(aa)p Fz(.)27 b(Some)18 b(error)f(messages)g(will)j(use)e(this)g(abbreviation)h(when)f (suggesting)g(that)f(one)75 1801 y(increase)c(a)f(default)h(allo)q (cation.)20 b(T)l(o)12 b(query)g(the)g(presen)o(t)g(allo)q(cations)i (of)d(v)m(ariable)j Fs(aa)p Fz(,)e(just)f(sa)o(y)h(`)p Fu(-y)p Fs(aa)p Fz('.)75 1856 y(T)l(o)j(query)g(ev)o(erything,)h(sa)o (y)e(`)p Fu(-y)p Fz('.)137 1920 y(This)21 b(whole)g(sc)o(heme)g(is)g (somewhat)e(anno)o(ying.)36 b(In)21 b(most)e(cases,)j(dynamic)f(arra)o (ys)e(should)i(b)q(e)75 1975 y(reallo)q(cated)12 b(automatically)l(.)19 b(That)11 b(can)h(b)q(e)f(done)h(without)f(to)q(o)g(m)o(uc)o(h)g (di\016cult)o(y)l(,)i(but)f(I)f(w)o(as)g(reluctan)o(t)75 2030 y(to)k(try)f(it)i(for)e(V)l(ersion)i(1.61)e(in)i(fear)f(of)g (breaking)g(something.)21 b(Please)15 b(w)o(ait)g(for)g(the)g(y)o(ear)g (2000.)137 2094 y(If)g(one)f(uses)g(`)p Fu(-y)p Fz(')f(to)g(examine)i (the)f(maxim)o(um)g(p)q(ermitted)h(v)m(alues)g(of)f(these)g (parameters,)f(one)h(will)75 2148 y(note)e(the)h(magic)g(n)o(um)o(b)q (er)g(10239)e(app)q(earing)i(o)q(ccasionally)l(.)21 b(This)13 b(n)o(um)o(b)q(er)g(is)g(a)f(bit)h(less)h(than)e(64K/5;)75 2203 y(it)i(is)g(a)f(signature)h(of)f(an)g(inheren)o(tly)i(32-bit)f (design)g(that)f(go)q(es)h(bac)o(k)f(to)g(Kn)o(uth.)20 b(Unfortunately)l(,)14 b(this)75 2258 y(n)o(um)o(b)q(er)i(can't)e(b)q (e)i(increased)g(without)g(some)e(radical)j(redesign.)j(W)l(ait)c(for)e (the)h(y)o(ear)g(2100.)75 2350 y Fq(12.2.2.1)29 b(`)p Fn(-yb)p Fq(':)i(Maxim)n(um)22 b(b)n(ytes)f(for)f(iden)n(ti\014ers,)h (index)g(en)n(tries,)g(and)310 2412 y(mo)r(dule)f(names)137 2506 y Fz(Unique)f(iden)o(ti\014ers,)g(index)g(en)o(tries,)f(and)g(mo)q (dule)h(names)e(are)g(stored)g(con)o(tiguously)h(in)h(a)e(large)75 2560 y(memory)12 b(area,)h(the)g(size)h(of)f(whic)o(h)g(is)h(con)o (trolled)g(b)o(y)f(`)p Fu(-yb)p Fz('.)18 b(The)13 b(default)h(ma)o(y)e (need)i(to)e(b)q(e)i(increased)75 2615 y(for)f(v)o(ery)g(large)g (source)g(\014les,)h(or)f(decreased)h(to)f(squeeze)h(things)g(in)o(to)f (a)g(p)q(ersonal)h(computer.)19 b(See)14 b(also)75 2670 y(Section)i(12.2.2.20)c([-yn],)j(page)g(111.)p eop %%Page: 109 111 109 110 bop 75 -58 a Fz(Chapter)15 b(12:)k(CUSTOMIZA)l(TION)1083 b(109)75 183 y Fq(12.2.2.2)29 b(`)p Fn(-ybs)p Fq(':)i(Size)21 b(of)f(the)g(c)n(hange)h(bu\013er,)g(in)f(b)n(ytes)137 279 y Fz(Information)c(from)e(c)o(hange)i(\014les)g(is)g(read)g(in)o (to)f(the)h(c)o(hange)f(bu\013er,)g(whose)g(size)i(is)f(con)o(trolled)g (b)o(y)75 334 y(`)p Fu(-ybs)p Fz('.)22 b(It)17 b(should)g(not)f(b)q(e)h (necessary)g(to)f(c)o(hange)g(this)h(unless)h(an)e(error)g(message)g (sp)q(eci\014cally)j(tells)75 389 y(one)c(to)g(do)g(so.)75 500 y Fq(12.2.2.3)29 b(`)p Fn(-ycb)p Fq(':)i(Size)21 b(of)f(line)h(bu\013er)f(for)g(C)h(output,)f(in)h(b)n(ytes)137 595 y Fw(Ft)m(angle)i Fz(outputs)e(lines)i(of)f(a)f(\014xed)h(maxim)o (um)g(length.)40 b(It)22 b(attempts)e(to)h(split)i(them)f(in)g(a)75 650 y(reasonable)d(w)o(a)o(y)l(,)g(dep)q(enden)o(t)i(on)e(the)g (language.)31 b(When)20 b(it)f(absolutely)h(can't)e(\014gure)h(out)g (ho)o(w)g(to)75 705 y(split)13 b(the)g(line,)h(it)f(will)h(issue)f(a)f (w)o(arning)h(message)e(and)i(split)h(it)e(an)o(yw)o(a)o(y)l(.)18 b(The)13 b(`)p Fu(-ycb)p Fz(')e(option)h(con)o(trols)75 760 y(the)j(maxim)o(um)g(output)g(line)i(length)f(for)f(C)g(and)g(C)p Fu(++)p Fz(.)137 827 y(The)d(analogous)g(command)f(`)p Fu(-yxb)p Fz(')g(con)o(trols)g(the)h(output)g(line)h(length)g(for)e(T) 1467 836 y(E)1492 827 y(X)h(and)g(the)g(v)o(erbatim)75 882 y(mo)q(de.)20 b(See)c(Section)g(12.2.2.29)c([-yxb],)j(page)g(112.) 75 992 y Fq(12.2.2.4)29 b(`)p Fn(-ycf)p Fq(':)i(Size)21 b(of)f(a)g(Ratfor)g(bu\013er,)g(in)h(b)n(ytes)137 1088 y Fz(The)16 b(sizes)g(of)f(bu\013ers)h(used)g(b)o(y)g Fw(Ra)m(tf)o(or)g Fz(for)f(constructing)g(messages)g(ab)q(out)h(the)f (commands)h(it)75 1143 y(is)g(expanding)g(are)f(con)o(trolled)h(b)o(y)f (`)p Fu(-ycf)p Fz(')f(and)h(`)p Fu(-ycg)p Fz('.)75 1254 y Fq(12.2.2.5)29 b(`)p Fn(-ycg)p Fq(':)i(Size)21 b(of)f(another)g (Ratfor)g(bu\013er,)g(in)h(b)n(ytes)137 1350 y Fz(The)16 b(sizes)g(of)f(bu\013ers)h(used)g(b)o(y)g Fw(Ra)m(tf)o(or)g Fz(for)f(constructing)g(messages)g(ab)q(out)h(the)f(commands)h(it)75 1405 y(is)g(expanding)g(are)f(con)o(trolled)h(b)o(y)f(`)p Fu(-ycf)p Fz(')f(and)h(`)p Fu(-ycg)p Fz('.)75 1515 y Fq(12.2.2.6)29 b(`)p Fn(-yd)p Fq(':)i(Incremen)n(t)21 b(for)f(expanding)h(the)f(dots)h(table)137 1611 y Fz(The)c(\\dots")f (table)h(is)g(used)h(for)e Fw(F)o(or)m(tran)h Fz(to)f(hold)i (information)f(relating)g(to)f(\\dot")g(op)q(erators)75 1666 y(suc)o(h)h(as)e(`)p Fu(.NE.)p Fz('.)22 b(In)17 b Fw(F)o(or)m(tran{90)p Fz(,)f(additional)i(suc)o(h)f(op)q(erators)e (can)h(b)q(e)h(added)g(b)o(y)f(the)g(program,)75 1721 y(so)f(the)h(table)g(can)g(gro)o(w)f(dynamically)l(.)24 b(The)16 b(`)p Fu(-yd)p Fz(')e(option)i(con)o(trols)g(ho)o(w)f(man)o(y) g(additional)j(en)o(tries)75 1776 y(are)d(made)g(a)o(v)m(ailable)i(eac) o(h)e(time)h(the)f(table)h(size)g(needs)g(to)e(b)q(e)i(reallo)q(cated.) 75 1887 y Fq(12.2.2.7)29 b(`)p Fn(-ydt)p Fq(':)i(Maxim)n(um)22 b(n)n(um)n(b)r(er)f(of)f(deferred)h(macro)f(tok)n(ens)137 1983 y Fz(Deferred)d Fw(Fweb)h Fz(macros)f(are)g(ones)g(de\014ned)h(in) g(the)f(co)q(de)h(part)e(rather)h(in)h(the)f(de\014nition)i(part.)75 2037 y(\(Their)c(use)f(is)h(normally)f(prohibited;)i(see)f(Section)g (4.2.59.1)c([-TD],)i(page)h(31.\))19 b(`)p Fu(-ydt)p Fz(')13 b(con)o(trols)g(ho)o(w)75 2092 y(man)o(y)g(b)o(ytes)g(are)h (set)f(aside)h(for)f(the)h(storage)e(of)i(these)f(replacemen)o(t)i (text)e(of)g(those)g(macros.)19 b(See)14 b(also)75 2147 y(Section)i(12.2.2.8)d([-ydx],)h(page)h(109.)75 2258 y Fq(12.2.2.8)29 b(`)p Fn(-ydx)p Fq(':)i(Maxim)n(um)22 b(n)n(um)n(b)r(er)f(of)f(deferred)h(macro)f(texts)137 2354 y Fz(`)p Fu(-ydx)p Fz(')11 b(con)o(trols)g(ho)o(w)g(man)o(y)g (deferred)i(macros)e(are)g(p)q(ermitted.)19 b(See)13 b(also)e(Section)i(12.2.2.7)c([-ydt],)75 2408 y(page)15 b(109.)75 2519 y Fq(12.2.2.9)29 b(`)p Fn(-yid)p Fq(':)i(Maxim)n(um)22 b(depth)e(of)g(\014le)h(inclusion)137 2615 y Fz(Files)13 b(included)g(b)o(y)f(`)p Fu(@i)p Fz(')e(can)h(themselv)o(es)h(con)o (tain)f(`)p Fu(@i)p Fz(')g(commands,)g(to)g(a)g(nesting)h(lev)o(el)g (con)o(trolled)75 2670 y(b)o(y)j(`)p Fu(-yid)p Fz('.)p eop %%Page: 110 112 110 111 bop 75 -58 a Fz(Chapter)15 b(12:)k(CUSTOMIZA)l(TION)1083 b(110)75 183 y Fq(12.2.2.10)29 b(`)p Fn(-yif)p Fq(':)i(Maxim)n(um)22 b(n)n(um)n(b)r(er)f(of)f(unique)h(include-\014le)h(names)137 276 y Fz(The)16 b(n)o(um)o(b)q(er)f(of)g(unique)i(\014le)f(names)f(app) q(earing)h(in)g(`)p Fu(@i)p Fz(')e(commands)h(is)h(con)o(trolled)g(b)o (y)f(`)p Fu(-yif)p Fz('.)75 379 y Fq(12.2.2.11)29 b(`)p Fn(-ykt)p Fq(':)i(Stac)n(k)21 b(size)g(for)f Fo(Ft)m(angle)137 472 y Fw(Ft)m(angle)15 b Fz(uses)g(a)e(stac)o(k)h(to)f(deal)i(with)g (the)f(w)o(eb)g(of)g(mo)q(dule)h(names|i.e.,)g(a)f(named)g(section)h (can)75 527 y(refer)g(to)g(another)f(mo)q(dule)j(name.)j(The)15 b(size)h(of)f(this)h(stac)o(k)e(is)i(con)o(trolled)g(b)o(y)f(`)p Fu(-ykt)p Fz('.)75 630 y Fq(12.2.2.12)29 b(`)p Fn(-ykw)p Fq(':)i(Stac)n(k)21 b(size)g(for)f Fo(Fwea)l(ve)137 723 y Fw(Fwea)l(ve)p Fz('s)15 b(stac)o(k)f(handles)i(the)f(p)q (ossibilities)j(that)c(co)q(de)h(mo)q(de)g(can)g(b)q(e)h(em)o(b)q (edded)g(in)f(a)g(mo)q(dule)75 778 y(name,)k(or)f(vice)h(v)o(ersa.)28 b(The)19 b(maxim)o(um)f(nesting)h(lev)o(el)h(for)e(suc)o(h)g(mo)q(de)h (c)o(hanges)f(is)h(con)o(trolled)g(b)o(y)75 833 y(`)p Fu(-ykw)p Fz('.)75 935 y Fq(12.2.2.13)29 b(`)p Fn(-yll)p Fq(':)i(Line)20 b(length)h(for)f Fo(Fwea)l(ve)p Fq('s)f(output,)h(in)g (b)n(ytes)137 1029 y Fz(`)p Fu(-yll)p Fz(')14 b(con)o(trols)h(the)g (length)h(of)f(eac)o(h)g(line)i(in)f(the)f Fu(.tex)g Fz(\014le)h(output)f(b)o(y)g Fw(Fwea)l(ve)p Fz(.)75 1122 y Fq(12.2.2.14)29 b(`)p Fn(-yln)p Fq(':)i(Maxim)n(um)22 b(length)e(of)g(mo)r(dule)g(names)h(or)f(strings,)g(in)341 1185 y(b)n(ytes)137 1278 y Fz(When)d(eac)o(h)f(mo)q(dule)i(name)e(or)g (string)h(is)g(parsed,)f(it)h(is)g(stored)e(temp)q(orarily)i(in)h(a)e (bu\013er)g(whose)75 1332 y(length)g(is)g(con)o(trolled)g(b)o(y)f(`)p Fu(-yln)p Fz('.)75 1435 y Fq(12.2.2.15)29 b(`)p Fn(-ylb)p Fq(':)i(Maxim)n(um)22 b(n)n(um)n(b)r(er)f(of)f(nested)g(lo)r(ops)g(in)h Fo(Ra)m(tf)o(or)137 1528 y Fz(In)13 b Fw(Ra)m(tf)o(or)p Fz(,)g(v)m(arious)f(lo)q(ops)g(suc)o(h)h(as)e(`)p Fu(while)p Fz(')g(are)g(translated)h(in)o(to)g(their)h Fw(F)o(or)m(tran)f Fz(equiv)m(alen)o(ts.)75 1583 y(`)p Fu(-ylb)p Fz(')i(con)o(trols)h(the) g(maxim)o(um)g(nesting)h(lev)o(el)g(of)f(suc)o(h)h(expandable)g (constructions.)75 1677 y Fq(12.2.2.16)29 b(`)p Fn(-ylx)p Fq(':)i(Maxim)n(um)22 b(length)e(of)g(expressions)h(that)f(can)h(b)r(e) 341 1739 y(expanded)g(with)g(the)f(p)r(ost-incremen)n(t)h(op)r(erators) f(of)g Fo(F)o(or)m(tran)341 1801 y Fq(or)g Fo(Ra)m(tf)o(or)137 1895 y Fw(F)o(or)m(tran)12 b Fz(and)h Fw(Ra)m(tf)o(or)f Fz(can)g(expand)h(expressions)f(suc)o(h)h(as)e(`)p Fu(x\(i\))j(+=)h(dx) p Fz(')c(in)o(to)h(their)h Fw(F)o(or)m(tran)75 1949 y Fz(coun)o(terparts)22 b(suc)o(h)h(as)f(`)p Fu(x\(i\))14 b(=)h(x\(i\))g(+)g(dx)p Fz('.)41 b(It)22 b(do)q(es)h(so)g(in)g(a)f(v)o (ery)g(straigh)o(tforw)o(ard)f(w)o(a)o(y)l(,)i(b)o(y)75 2004 y(cop)o(ying)17 b(the)g(expression)g(to)f(the)h(left)g(of)f(the)h (equals)g(sign.)24 b(`)p Fu(-ylx)p Fz(')16 b(con)o(trols)g(the)g(maxim) o(um)h(size)g(of)75 2059 y(that)d(expression.)75 2162 y Fq(12.2.2.17)29 b(`)p Fn(-ym)p Fq(':)i(Maxim)n(um)22 b(n)n(um)n(b)r(er)f(of)f(sections)137 2255 y Fz(`)p Fu(-ym)p Fz(')e(limits)j(the)e(maxim)o(um)g(n)o(um)o(b)q(er)g(of)g(sections,)h (b)q(oth)g(named)f(and)g(unnamed.)33 b(\(Eac)o(h)18 b(un-)75 2310 y(named)d(section)g(is)g(coun)o(ted)g(separately)l(.\))20 b(The)15 b(absolute)g(maxim)o(um)f(n)o(um)o(b)q(er)h(of)f(sections)i (is)f(10239,)75 2364 y(probably)f(one)f(of)g(the)g(most)f(stringen)o(t) h(restrictions)h(in)g Fw(Fweb)p Fz('s)f(design.)20 b(\(This)14 b(n)o(um)o(b)q(er)f(is)h(a)f(bit)g(less)75 2419 y(than)i(1/5)f(of)h (64K.\))75 2522 y Fq(12.2.2.18)29 b(`)p Fn(-yma)p Fq(':)i(Maxim)n(um)22 b(n)n(um)n(b)r(er)f(of)f(argumen)n(ts)g(to)g Fo(Fweb)h Fq(macros)137 2615 y Fz(The)f(maxim)o(um)f(n)o(um)o(b)q(er)h(of)f (argumen)o(ts)g(to)g Fw(Fweb)h Fz(macros)f(\(de\014ned)h(b)o(y)g(`)p Fu(@m)p Fz('\))e(is)i(limited)h(b)o(y)75 2670 y(`)p Fu(-yma)p Fz('.)p eop %%Page: 111 113 111 112 bop 75 -58 a Fz(Chapter)15 b(12:)k(CUSTOMIZA)l(TION)1083 b(111)75 183 y Fq(12.2.2.19)29 b(`)p Fn(-ymb)p Fq(':)i(Size)21 b(of)f(the)g(bu\013er)h(for)f(expanding)g Fo(Fweb)h Fq(macros)137 282 y Fz(The)13 b(expansion)g(of)f(eac)o(h)h Fw(Fweb)h Fz(macro)d(is)i(done)g(in)h(a)e(bu\013er)g(whose)h(size)g(is)g(con)o (trolled)g(b)o(y)g(`)p Fu(-ymb)p Fz('.)75 337 y(\(In)e(some)f (situations,)h(particularly)h(in)f Fw(Ra)m(tf)o(or)p Fz(,)h(more)e(than)h(one)f(suc)o(h)h(bu\013er)g(can)f(b)q(e)h(op)q(en)g (at)f(once.\))75 447 y Fq(12.2.2.20)29 b(`)p Fn(-yn)p Fq(':)i(Maxim)n(um)22 b(n)n(um)n(b)r(er)f(of)f(iden)n(ti\014ers)h(and)f (mo)r(dule)341 509 y(names)137 608 y Fz(A)c(structure)g(is)g(asso)q (ciated)g(with)g(eac)o(h)g(unique)i(iden)o(ti\014er)f(and)f(mo)q(dule)h (name.)22 b(The)16 b(maxim)o(um)75 663 y(n)o(um)o(b)q(er)g(of)e(suc)o (h)i(structures)f(is)g(con)o(trolled)h(b)o(y)g(`)p Fu(-yn)p Fz('.)i(See)e(also)f(Section)h(12.2.2.1)d([-yb],)h(page)h(108.)75 780 y Fq(12.2.2.21)29 b(`)p Fn(-ynf)p Fq(':)i(Maxim)n(um)22 b(n)n(um)n(b)r(er)f(of)f(op)r(en)g(output)g(\014les)137 879 y Fz(In)11 b(addition)h(to)e Fw(Ft)m(angle)p Fz('s)g(usual)h (output)g(\014le|e.g.,)g Fu(test.c)p Fz(|additional)h(\014les)f(ma)o(y) f(b)q(e)h(op)q(ened)75 934 y(b)o(y)k(means)g(of)g(the)g(`)p Fu(@O)p Fz(')g(\(see)g(Section)h(5.5.20)d([A)l(TO)p 991 934 14 2 v 17 w(],)h(page)h(47\))g(or)f(`)p Fu(@o)p Fz(')g(\(see)i (Section)g(5.5.21)d([A)l(T)l(o],)75 989 y(page)21 b(47\))e(commands.)36 b(Dep)q(ending)23 b(on)d(the)h(situation,)h(some)f(of)f(these)h (\014les)g(ma)o(y)f(remain)h(op)q(en)75 1043 y(sim)o(ultaneously)l(.)g (The)16 b(maxim)o(um)f(n)o(um)o(b)q(er)h(of)e(suc)o(h)i(\014les)g(is)g (con)o(trolled)g(b)o(y)f(`)p Fu(-ynf)p Fz('.)75 1152 y Fq(12.2.2.22)29 b(`)p Fn(-yop)p Fq(':)i(Maxim)n(um)22 b(n)n(um)n(b)r(er)f(of)f(en)n(tries)h(in)f(the)h(table)f(for)341 1214 y(op)r(erator)f(o)n(v)n(erloading.)137 1313 y Fz(In)g Fw(Fwea)l(ve)p Fz(,)h(the)e(app)q(earance)h(of)f(an)g(op)q(erator)g (can)h(b)q(e)g(c)o(hanged)f(\()p Fs(o)o(v)o(erloaded)r Fz(\))g(b)o(y)g(means)g(of)75 1368 y(the)f(`)p Fu(@v)p Fz(')e(command)h(\(see)h(Section)g(5.5.27)e([A)l(Tv],)g(page)i(49\).)23 b(Eac)o(h)16 b(suc)o(h)h(op)q(erator)e(is)i(en)o(tered)g(in)o(to)75 1423 y(a)e(table,)g(the)g(maxim)o(um)h(size)g(of)e(whic)o(h)i(is)g(con) o(trolled)g(b)o(y)f(`)p Fu(-yop)p Fz('.)75 1540 y Fq(12.2.2.23)29 b(`)p Fn(-yr)p Fq(':)i(Maxim)n(um)22 b(n)n(um)n(b)r(er)f(of)f (cross-references)137 1639 y Fz(The)11 b(Index)g(cross-reference)g (information)f(\(in)h(whic)o(h)g(sections)g(eac)o(h)g(iden)o(ti\014er)g (is)g(used)g(or)f(de\014ned\))75 1694 y(is)20 b(main)o(tained)h(in)g(a) e(large)h(arra)o(y)f(of)g(structures,)i(one)f(structure)f(for)g(eac)o (h)h(cross-reference.)35 b(The)75 1749 y(maxim)o(um)15 b(n)o(um)o(b)q(er)h(of)e(cross-references)i(is)g(con)o(trolled)g(b)o(y) f(`)p Fu(-yr)p Fz('.)75 1866 y Fq(12.2.2.24)29 b(`)p Fn(-ys)p Fq(':)i(Maxim)n(um)22 b(n)n(um)n(b)r(er)f(of)f(scraps)137 1965 y Fz(The)e(maxim)o(um)f(n)o(um)o(b)q(er)h(of)f(scraps)g(is)h(con)o (trolled)g(b)o(y)g(`)p Fu(-ys)p Fz('.)25 b(F)l(or)17 b(a)g(discussion)i(of)e(scraps,)h(see)75 2020 y(Section)e(4.2.2)e ([-1],)g(page)h(16.)75 2137 y Fq(12.2.2.25)29 b(`)p Fn(-ysb)p Fq(':)i(Size)21 b(of)f(st)n(yle-\014le)i(input-line)f(bu\013er)137 2236 y Fz(The)d(maxim)o(um)g(length)g(of)f(eac)o(h)h(input)g(line)i(of) d(the)h(st)o(yle)f(\014le)i(\()p Fu(fweb.sty)d Fz(b)o(y)i(default\))g (is)g(con-)75 2291 y(trolled)e(b)o(y)f(`)p Fu(-ysb)p Fz('.)75 2399 y Fq(12.2.2.26)29 b(`)p Fn(-ytt)p Fq(':)i(Maxim)n(um)22 b(n)n(um)n(b)r(er)f(of)f(tok)n(ens)h(that)f Fo(Ft)m(angle)f Fq(can)341 2461 y(pro)r(cess)137 2560 y Fz(A)e Fs(tok)o(en)e Fz(is)i(an)f(iden)o(ti\014er,)i(n)o(umerical)f(constan)o(t,)f(op)q (erator,)f(etc.)23 b Fw(Ft)m(angle)17 b Fz(m)o(ust)f(read)g(in)h(and)75 2615 y(store)h(all)i(tok)o(ens)f(in)g(the)g(en)o(tire)h(source)f (\014le,)h(b)q(ecause)g(they)f(can)g(b)q(e)h(output)f(in)g(a)g (di\013eren)o(t)g(order)75 2670 y(than)c(they)g(are)g(input.)21 b(The)16 b(maxim)o(um)f(n)o(um)o(b)q(er)g(of)g(tok)o(ens)g(is)g(con)o (trolled)h(b)o(y)f(`)p Fu(-ytt)p Fz('.)p eop %%Page: 112 114 112 113 bop 75 -58 a Fz(Chapter)15 b(12:)k(CUSTOMIZA)l(TION)1083 b(112)75 121 y Fq(12.2.2.27)29 b(`)p Fn(-ytw)p Fq(':)i(Maxim)n(um)22 b(tok)n(ens)f(in)f(the)h(curren)n(t)g(section)f(b)r(eing)341 183 y(pro)r(cessed)h(b)n(y)g Fo(Fwea)l(ve)p Fq(.)137 281 y Fz(Unlik)o(e)i Fw(Ft)m(angle)p Fz(,)g Fw(Fwea)l(ve)f Fz(need)f(only)h(read)f(in)h(one)f(section)h(at)e(a)h(time.)38 b(The)21 b(maxim)o(um)75 336 y(n)o(um)o(b)q(er)16 b(of)e(tok)o(ens)h (in)h(an)o(y)f(section)h(is)f(con)o(trolled)h(b)o(y)f(`)p Fu(-ytw)p Fz('.)75 451 y Fq(12.2.2.28)29 b(`)p Fn(-yx)p Fq(':)i(Maxim)n(um)22 b(n)n(um)n(b)r(er)f(of)f(texts)137 548 y Fz(F)l(or)f Fw(Ft)m(angle)p Fz(,)j(a)d Fs(text)i Fz(is)f(either)h(the)f(replacemen)o(t)g(text)g(of)f(a)g(macro,)h(or)g (the)g(con)o(ten)o(ts)f(of)g(a)75 603 y(named)c(section.)21 b(The)15 b(maxim)o(um)g(n)o(um)o(b)q(er)h(of)f(suc)o(h)g(texts)g(is)h (con)o(trolled)g(b)o(y)f(`)p Fu(-yx)p Fz('.)137 672 y(F)l(or)g Fw(Fwea)l(ve)p Fz(,)h(a)g Fs(text)g Fz(is)g(a)f(phrase)h(that)f(arises) h(from)f(com)o(bining)i(primitiv)o(e)g(scraps)e(during)i(the)75 726 y(translation)e(stage)g(of)f(phase)i(2.)137 795 y(F)l(or)f(b)q(oth) g(pro)q(cessors,)g(the)g(absolute)h(maxim)o(um)f(n)o(um)o(b)q(er)g(of)g (texts)g(is)g(10239.)75 910 y Fq(12.2.2.29)29 b(`)p Fn(-yxb)p Fq(':)i(Size)21 b(of)f(line)g(bu\013er)h(for)f(T)1154 922 y(E)1186 910 y(X)h(and)f(v)n(erbatim)h(output)137 1008 y Fz(This)16 b(option)f(is)h(lik)o(e)g(`)p Fu(-ycb)p Fz(')e(\(see)h(Section)h(12.2.2.3)c([-ycb],)j(page)g(109\),)e(but)j (con)o(trols)e(the)h(size)h(of)75 1062 y(the)f(output)g(line)i(for)e (the)g(T)561 1072 y(E)586 1062 y(X)h(\(`)p Fu(@Lx)p Fz('\))d(and)i(v)o (erbatim)h(\(`)p Fu(@Lv)p Fz('\))d(languages.)75 1195 y Fy(12.3)32 b(The)22 b(St)n(yle)i(\014le)137 1292 y Fz(A)15 b Fs(st)o(yle)g(\014le)j Fz(\(default)d(name)f(`)p Fu(fweb.sty)p Fz('\))f(ma)o(y)h(reside)h(in)h(the)e(user's)h(curren)o (t)f(directory)h(\(or)f(the)75 1347 y(directory)k(sp)q(eci\014ed)i(b)o (y)d(the)h(en)o(vironmen)o(t)g(v)m(ariable)h Fu(FWEB_STYLE_DIR)p Fz(\).)25 b(The)18 b(default)g(name)g(can)75 1402 y(b)q(e)e(c)o(hanged) f(b)o(y)h(the)f(command-line)i(option)e(`)p Fu(-z)p Fz(')f(\(see)h (Section)i(4.2.71)c([-z],)h(page)h(35\).)137 1470 y(The)k(st)o(yle)f (\014le)h(is)g(pro)q(cessed)g(after)e(all)i(command-line)h(options)e (ha)o(v)o(e)g(b)q(een)h(pro)q(cessed,)g(except)75 1525 y(that)14 b(the)g(command-line)j(option)d(`)p Fu(-p)p Fz(')g(\(see)g(Section)i(4.2.46)c([-p],)i(page)h(28\))e(gets)h(sp)q (ecial)j(treatmen)o(t.)75 1580 y(Note)j(that)f(that)g(option)h (bu\013ers)g(up)h(st)o(yle-\014le)g(en)o(tries)f(\(i.e.,)h(one)f(ma)o (y)f(use)i(more)e(than)h(one)g(`)p Fu(-p)p Fz(')75 1635 y(option\).)28 b(`)p Fu(-p)p Fz(')17 b(options)h(placed)i(in)e(`)p Fu(.fweb)p Fz(')f(are)h(treated)f(as)h(residing)h(in)g(a)f(temp)q (orary)f(\014le)i(that)e(is)75 1690 y(read)e(just)g Fs(b)q(efore)j Fz(the)d(lo)q(cal)i(st)o(yle)e(\014le;)h(th)o(us,)e(those)h(b)q(eha)o (v)o(e)h(as)f(`global')g(st)o(yle-\014le)h(en)o(tries)g(that)e(will)75 1744 y(b)q(e)21 b(o)o(v)o(erridden)f(b)o(y)g(a)f(matc)o(hing)h(en)o (try)g(in)g(the)g(lo)q(cal)h(st)o(yle)f(\014le.)35 b(`)p Fu(-p)p Fz(')19 b(options)h(on)g(the)g(command)75 1799 y(line)c(will)f(b)q(e)g(pro)q(cessed)f Fs(after)j Fz(the)d(lo)q(cal)h (st)o(yle)f(\014le,)h(th)o(us)f(o)o(v)o(erride)g(corresp)q(onding)g (options)g(in)h(either)75 1854 y(`)p Fu(.fweb)p Fz(')f(or)g(the)i(lo)q (cal)g(st)o(yle)f(\014le.)137 1923 y(T)l(o)g(summarize)g(the)g (previous)g(discussion,)h(the)f(lo)q(cal)h(st)o(yle)f(\014le)h(is)f(in) o(tended)h(to)e(con)o(tain)h(settings)75 1977 y(that)f(are)g(common)h (to)f(a)g(particular)h(source)g(\014le.)21 b(Settings)15 b(common)f(to)g(all)h(source)g(\014les)h(can)f(b)q(e)g(put)75 2032 y(in)o(to)h(`)p Fu(.fweb)p Fz(')f(b)o(y)h(means)g(of)g(the)h(`)p Fu(-p)p Fz(')e(option.)23 b(T)l(o)16 b(o)o(v)o(erride)h(a)e(setting)i (for)e(a)h(single)i(run,)e(use)h(a)f(`)p Fu(-p)p Fz(')75 2087 y(option)f(on)h(the)f(command)g(line.)137 2156 y(St)o(yle-\014le)i (en)o(tries)f(ha)o(v)o(e)f(the)g(form)386 2221 y Fs(k)o(eyw)o(ord)25 b([)6 b Fu(=)p Fs(])24 b(v)m(alue)75 2290 y Fz(The)15 b(equals)g(sign)g(is)g(alw)o(a)o(ys)f(optional.)20 b(The)15 b(`)p Fu(value)p Fz(')e(is)i(usually)h(a)f(double-quoted)h(string,)e (but)h(ma)o(y)75 2345 y(sometimes)g(b)q(e)h(an)f(in)o(teger)h(or)e(a)h (single-quoted)i(c)o(haracter.)i(F)l(or)c(example,)386 2411 y Fu(LaTeX.class.options)21 b(=)j("twoside")386 2462 y(LaTeX.package)e("indentfirst,multicol")386 2514 y(mark_defined.fcn_name)f(0)386 2566 y(line_char.N)h('C')386 2618 y(color.error)g(=)i("red")386 2670 y(Color.red)f(=)g("\\e[01;31m") p eop %%Page: 113 115 113 114 bop 75 -58 a Fz(Chapter)15 b(12:)k(CUSTOMIZA)l(TION)1083 b(113)75 183 y(The)20 b(syn)o(tax)e(is)i(completely)h(free-form.)32 b(P)o(erio)q(ds)20 b(within)h(k)o(eyw)o(ords)d(are)h(precisely)i(equiv) m(alen)o(t)h(to)75 238 y(underscores,)c(but)g(are)f(useful)h (heuristically)i(for)d(asso)q(ciating)h(a)f(structure-lik)o(e)i (hierarc)o(h)o(y)e(to)g(some)75 293 y(of)g(the)h(commands.)28 b(Non-prin)o(table)19 b(c)o(haracters)e(in)i(strings)f(can)g(b)q(e)g (sp)q(eci\014ed)i(as)e(o)q(ctal)g(constan)o(ts)75 348 y(\(e.g.,)h(`)p Fu(\\033)p Fz('\),)f(hexadecimal)j(constan)o(ts)d (\(e.g.,)h(`)p Fu(\\x1B)p Fz('\),)f(or)g(one)i(of)f(the)g(ANSI)h(escap) q(e)g(sequences)75 402 y(`)p Fu(\\a)p Fz(',)e(`)p Fu(\\b)p Fz(',)h(`)p Fu(\\f)p Fz(',)f(`)p Fu(\\n)p Fz(',)h(`)p Fu(\\r)p Fz(',)f(`)p Fu(\\t)p Fz(',)h(and)g(`)p Fu(\\v)p Fz('.)30 b(The)19 b(non-ANSI)i(escap)q(e)e(sequence)h(`)p Fu(\\e)p Fz(')e(\(escap)q(e\))h(is)75 457 y(also)f(supp)q(orted;)h (that)e(is)i(particularly)g(useful)g(for)e(color)h(pro)q(cessing)h (\(see)f(Section)g(12.3.7)e([Color],)75 512 y(page)f(117\).)137 577 y(V)l(arious)h(of)f(the)g(st)o(yle-\014le)h(parameters)f(tak)o(e)f (a)h(language)g(subscript.)21 b(Those)15 b(are)195 650 y Fu(C)216 b Fz(C)195 722 y Fu(Cpp)168 b Fz(C)p Fu(++)195 795 y(N)216 b Fw(F)o(or)m(tran)p Fz(-77)195 868 y Fu(N90)168 b Fw(F)o(or)m(tran)p Fz(-90)195 940 y Fu(R)216 b Fw(Ra)m(tF)o(or)p Fz(-77)195 1013 y Fu(R90)168 b Fw(Ra)m(tF)o(or)p Fz(-90)195 1085 y Fu(V)216 b Fz(V)l(erbatim)195 1158 y Fu(X)g Fz(T)460 1168 y(E)486 1158 y(X)75 1233 y(Th)o(us,)22 b Fu(line_char.N)d Fz(is)j(the)e(commen)o(t)h(c)o(haracter)f(for)g Fw(Ft)m(angle)p Fz('s)h Fu(line)g Fz(commands)f(\(see)h(Sec-)75 1288 y(tion)15 b(12.3.8.4)e([line)p 420 1288 14 2 v 18 w(c)o(har],)h(page)h (119\),)f(for)g Fw(F)o(or)m(tran)p Fz(-77)h(co)q(de.)137 1353 y(Unfortunately)l(,)f(the)f(descriptions)i(of)e(the)g(parameters)g (aren't)f(all)i(completed)h(y)o(et.)j(T)l(o)13 b(query)h(the)75 1408 y(default)i(v)m(alues,)g(sa)o(y)e(`)p Fu(ftangle)g(-Z)p Fz(')h(\(see)g(Section)h(4.2.70)d([-Z)p 1165 1408 V 16 w(],)i(page)g(35\).)75 1514 y Fq(12.3.1)29 b(Customizing)21 b Fo(Fwea)l(ve)p Fq('s)e(index)137 1608 y Fz(In)d(the)f(follo)o(wing,)h (`)p Fu(???)p Fz(')e(denotes)h(the)h(name)f(of)g(v)m(arious)g (subparameters.)75 1714 y Fq(12.3.1.1)29 b Fn(index.)p Fl(???)137 1808 y Fu(index.name)12 b Fz(is)i(the)g(name)f(of)g(the)h (index)g(section.)20 b(This)14 b(string)f(is)h(used)g(in)h Fu(\\Wbegin)d Fz(to)h(initialize)75 1863 y(the)h(T)177 1873 y(E)203 1863 y(X)g(macro)g Fu(\\INDEX)p Fz(.)19 b(The)14 b(index)i(section)f(is)f(recognized)i(b)o(y)e(matc)o(hing,)g (for)g(a)g(starred)g(section,)75 1918 y(the)f(actual)h(section)g(name)f (against)g(the)h(con)o(ten)o(ts)f(of)f Fu(\\INDEX)p Fz(.)19 b(When)14 b(they)f(matc)o(h,)g(a)g(new)h(page)f(and)75 1972 y(t)o(w)o(o-column)g(mo)q(de)h(are)f(b)q(egun.)20 b(These)14 b(rules)g(imply)h(that)e(the)g(last)h(section)g(of)f(one's)g (source)g(\014le)i(can)75 2027 y(b)q(e)h(titled)g(`)p Fu(\\INDEX)p Fz(',)d(as)i(in)195 2089 y Fu(@*)24 b(\\INDEX.)137 2155 y(index.tex)15 b Fz(is)i(the)g(name)g(of)f(the)g(\014le)i(in)o(to) e(whic)o(h)i(the)e(Index)i(is)f(written.)23 b(The)17 b(c)o(haracter)f(`)p Fu(#)p Fz(')f(is)75 2209 y(translated)g(in)o(to)g (the)g(ro)q(ot)g(name)g(of)g(the)g(w)o(eb)g(\014le,)h(as)f(for)g (example)h(`)p Fu(#.ndx)p Fz('.)137 2275 y Fu(index.preamble)e Fz(are)g(T)587 2284 y(E)613 2275 y(X)h(commands)g(that)g(b)q(egin)h (the)f(Index.)137 2340 y Fu(index.postamble)e Fz(are)i(T)611 2350 y(E)637 2340 y(X)g(commands)g(that)f(end)i(the)g(Index.)137 2405 y Fu(index.collate)e Fz(sp)q(eci\014es)j(the)e(collating)h (sequence)h(for)d(the)i(Index.)75 2511 y Fq(12.3.1.2)29 b Fn(delim_)p Fl(?)137 2605 y Fu(delim_0)14 b Fz(is)i(the)f(string)h (to)e(insert)i(after)e(the)i(iden)o(ti\014er)g(in)g(an)f(index)i(en)o (try)l(.)137 2670 y Fu(delim_n)d Fz(is)i(the)f(string)h(to)e(insert)i (b)q(et)o(w)o(een)f(t)o(w)o(o)f(section)i(n)o(um)o(b)q(ers)f(in)h(an)g (index)g(en)o(try)l(.)p eop %%Page: 114 116 114 115 bop 75 -58 a Fz(Chapter)15 b(12:)k(CUSTOMIZA)l(TION)1083 b(114)75 183 y Fq(12.3.1.3)29 b Fn(group_skip)137 281 y Fu(group_skip)14 b Fz(is)i(a)f(string)g(of)g(T)681 291 y(E)706 281 y(X)g(commands)g(to)g(insert)h(b)q(et)o(w)o(een)f (letter)g(groups.)75 395 y Fq(12.3.1.4)29 b Fn(item_0)137 493 y Fu(item_0)15 b Fz(is)g(the)h(T)445 503 y(E)470 493 y(X)f(command)g(to)g(b)q(egin)h(an)g(index)g(en)o(try)l(.)75 608 y Fq(12.3.1.5)29 b Fn(language.)p Fl(???)137 705 y Fu(language.prefix)13 b Fz(b)q(egins)k(a)e(language)g(en)o(try)l(.;)f Fu(language.suffix)f Fz(ends)j(one.)75 820 y Fq(12.3.1.6)29 b Fn(lethead.)p Fl(???)137 917 y Fu(lethead.prefix)8 b Fz(b)q(egins)k(a)e(letter)g(group;)h Fu(lethead.suffix)d Fz(ends)j(one.)18 b(The)11 b(\015ag)f Fu(lethead.flag)p 1904 927 21 42 v 75 972 a Fz(con)o(trols)15 b(the)h(format)e(of)h(the)g (letter)h(group:)k(if)c(it)f(is)h(zero,)f(nothing)h(is)g(inserted;)g (if)g(it)g(is)g(p)q(ositiv)o(e,)g(an)75 1027 y(upp)q(er-case)g(letter)g (is)f(inserted;)h(if)g(it)f(is)h(negativ)o(e,)f(a)g(lo)o(w)o(er-case)g (letter)g(is)h(inserted.)75 1141 y Fq(12.3.1.7)29 b Fn(underline.)p Fl(???)137 1239 y Fu(underline.prefix)13 b Fz(is)j(the)f(T)683 1249 y(E)709 1239 y(X)g(command)g(to)g(b)q(egin)h(an)f(underlined)j (index)f(en)o(try)l(.)137 1307 y Fu(underline.suffix)c Fz(is)j(the)f(T)683 1317 y(E)709 1307 y(X)g(command)g(to)g(end)g(an)h (underlined)h(index)g(en)o(try)l(.)75 1422 y Fq(12.3.2)29 b(Customizing)21 b(the)g(mo)r(dule)f(list)137 1520 y Fu(modules.tex)14 b Fz(is)i(the)f(name)g(of)g(the)g(\014le)h(in)o(to)g (whic)o(h)g(the)f(mo)q(dule)h(names)f(are)g(written.)137 1588 y Fu(modules.preamble)e Fz(is)j(a)f(string)g(of)g(T)824 1598 y(E)849 1588 y(X)g(commands)g(to)g(b)q(egin)i(the)e(list)h(of)f (mo)q(dules.)137 1657 y Fu(modules.postamble)e Fz(is)j(a)f(string)g(of) g(T)848 1666 y(E)873 1657 y(X)g(commands)g(to)g(end)h(the)f(list)h(of)f (mo)q(dules.)137 1725 y Fu(modules.info)c Fz(is)i(the)g(name)g(of)f (the)h(T)824 1735 y(E)849 1725 y(X)g(macro)f(that)g(formats)f(the)i (command)f(line)j(and)e(related)75 1780 y(information.)75 1895 y Fq(12.3.3)29 b(Customizing)21 b(the)g(T)-5 b(able)20 b(of)g(Con)n(ten)n(ts)137 1992 y Fu(contents.tex)14 b Fz(is)h(the)h(name)f(of)g(the)g(\014le)h(in)o(to)f(whic)o(h)h(the)g(T)l (able)g(of)f(Con)o(ten)o(ts)f(is)h(written.)137 2061 y Fu(contents.preamble)e Fz(is)j(the)f(T)707 2070 y(E)733 2061 y(X)g(string)g(that)f(b)q(egins)j(prin)o(ting)f(the)f(T)l(able)h (of)f(Con)o(ten)o(ts.)137 2129 y Fu(contents.postamble)e Fz(is)j(the)f(T)731 2139 y(E)756 2129 y(X)h(string)f(that)f(ends)i(the) f(T)l(able)h(of)f(Con)o(ten)o(ts.)75 2244 y Fq(12.3.4)29 b(Customizing)21 b(cross-reference)h(subscripts)137 2341 y Fz(When)f Fw(Fwea)l(ve)g Fz(prett)o(y-prin)o(ts)f(co)q(de,)i(it)e (can)h(attac)o(h)e(cross-reference)i(subscripts)g(to)e(v)m(arious)75 2396 y(kinds)d(of)e(iden)o(ti\014ers)i(suc)o(h)f(as)g(function)g(or)f (macro)g(names.)20 b([A)14 b(bullet)j(\()p Fx(\017)p Fz(\))c(for)i(a)f(subscript)i(indicates)75 2451 y(that)c(the)g(name)h (w)o(as)f(de\014ned)h(in)h(the)e(curren)o(t)h(section.])19 b(The)12 b(actual)h(marking)g(of)f(the)g(cross)g(reference)75 2506 y(is)g(done)f(b)o(y)h(the)f(command)g(`)p Fu(@[)p Fz(')f(\(see)i(Section)g(5.7)e([A)l(T[],)h(page)g(51\).)17 b(This)12 b(is)g(usually)h(done)e(implicitly;)75 2560 y(for)j(example,)h(the)f(commands)g(`)p Fu(@a)p Fz(',)f(`)p Fu(@d)p Fz(',)g(and)i(`)p Fu(@m)p Fz(')e(issue)i(an)f(implicit)j(`)p Fu(@[)p Fz('.)h(\(See)d(the)f(discussion)i(of)75 2615 y(`)p Fu(@a)p Fz(')g(in)i(Section)g(5.4.4)d([A)l(T)l(a],)i(page)g (40.\))24 b(In)18 b(C,)e(v)m(arious)i(declarations)g(of)e(v)m(ariables) j(also)e(result)g(in)75 2670 y(suc)o(h)f(an)f(implicit)i(mark.)p eop %%Page: 115 117 115 116 bop 75 -58 a Fz(Chapter)15 b(12:)k(CUSTOMIZA)l(TION)1083 b(115)137 183 y(V)l(arious)12 b(n)o(uances)g(in)g(the)f(t)o(yp)q(e)h (\(p)q(ossibly)g(underlined\))i(used)e(for)f(the)g(subscript)i(giv)o(e) e(a)g(hin)o(t)h(ab)q(out)75 238 y(what)j(kind)i(of)f(iden)o(ti\014er)i Fw(Fwea)l(ve)e Fz(thinks)h(it's)f(w)o(orking)f(with.)23 b(F)l(or)15 b(more)h(information)g(ab)q(out)g(the)75 293 y(t)o(yp)q(esetting)c(con)o(v)o(en)o(tions,)g(see)h(the)f (de\014nition)h(of)f(the)g(primitiv)o(e)h(macro)f(`)p Fu(\\W@IN)p Fz(')e(in)j(`)p Fu(fwebmac.web)p Fz('.])75 348 y(The)i(follo)o(wing)h(\015ags)f(select)h(whic)o(h)g(iden)o (ti\014ers)h(are)e(so)g(subscripted.)137 416 y(T)l(o)10 b(see)h(the)f(default)h(v)m(alues)g(of)f(these)g(parameters,)g(sa)o(y)g (`)p Fu(ftangle)k(-Zmark_defined)p Fz('.)i(T)l(o)10 b(turn)g(o\013)75 471 y(the)j(subscripting)i(op)q(erations)e(completely)l(,)h(use)g(the)f (`)p Fu(-f)p Fz(')e(option)j(\(see)f(Section)g(4.2.16)f([-f)t(],)f (page)i(20\).)137 539 y(\(Discussion)j(to)f(b)q(e)h(completed.\))75 653 y Fq(12.3.5)29 b(Customizing)21 b(the)g(b)r(eha)n(vior)f(of)g(`)p Fn(fwebmac.sty)p Fq(')i(macros)137 751 y Fz(T)l(o)16 b(some)f(exten)o(t,)h(the)g(b)q(eha)o(vior)g(of)f Fw(Fweb)p Fz('s)i(macro)e(pac)o(k)m(age)h(`)p Fu(fwebmac.sty)p Fz(')d(can)j(b)q(e)h(c)o(hanged)75 805 y(b)o(y)d(means)f(of)g(the)h (follo)o(wing)g(parameters.)19 b(\(Please)13 b(try)g(not)h(to)f (actually)h(edit)g(`)p Fu(fwebmac.sty)p Fz(')d(itself;)75 860 y(it)k(is)h(pro)q(duced)h(automatically)e(from)g(`)p Fu(fwebmac.web)p Fz('.)i(And)f(please)g(don't)f(edit)h(that)e(\014le)i (either!\))75 974 y Fq(12.3.5.1)29 b Fn(format.)p Fl(???)137 1072 y Fz(The)13 b Fu(format)e Fz(parameters)h(are)g(strings)g(that)g (sp)q(ecify)i(the)e(macro)g(to)g(b)q(e)h(used)g(to)f(prett)o(y-prin)o (t)g(v)m(ar-)75 1126 y(ious)h(kinds)h(of)f(iden)o(ti\014ers.)21 b(These)13 b(macro)f(names)h(are)g(usually)h(written)f(automatically)h (b)o(y)f Fw(Fwea)l(ve)p Fz(,)75 1181 y(but)19 b(they)f(ma)o(y)g(also)g (b)q(e)h(used)h(directly)f(b)o(y)g(the)f(user)h(in)g(the)g(T)1215 1191 y(E)1240 1181 y(X)g(do)q(cumen)o(tation.)30 b(One)19 b(can)g(see)75 1236 y(their)i(default)g(v)m(alues)g(b)o(y)g(t)o(yping)f (`)p Fu(ftangle)14 b(-Zformat.)p Fz('.)34 b(F)l(or)19 b(example,)k(the)d(default)h(v)m(alue)h(for)75 1291 y Fu(format.typewriter)13 b Fz(is)j Fu("\\\\.")p Fz(.)137 1359 y(The)g(macro)f(names)g(de\014ned)i(b)o(y)f(the)g Fu(format)e Fz(\014elds)j(are)e Fs(not)i Fz(de\014ned)g(in)f(`)p Fu(fwebmac.sty)p Fz('.)j(They)75 1414 y(are)i Fs(dumm)o(y)g(names)p Fz(,)h(and)f(can)h(b)q(e)g(c)o(hanged)f(to)g(an)o(y)f(other)h(name)g (not)g(already)g(in)h(use)g(without)75 1469 y(a\013ecting)c(the)h(op)q (eration)g(of)f Fw(Fweb)p Fz(.)31 b(This)19 b(abilit)o(y)h(is)f (necessary)g(b)q(ecause)g(other)g(pac)o(k)m(ages)f(migh)o(t)75 1524 y(usurp)e(macros)e(lik)o(e)i Fu(\\.)f Fz(for)g(their)h(o)o(wn)e (purp)q(oses.)137 1592 y(Th)o(us,)g Fw(Fwea)l(ve)g Fz(normally)f (writes)h(out)f(the)g(macro)g Fu(\\.)g Fz(to)f(t)o(yp)q(eset)i(a)f (string.)19 b(Supp)q(ose,)14 b(ho)o(w)o(ev)o(er,)75 1647 y(that)i(some)g(user)h(pac)o(k)m(age)g(uses)f Fu(\\.)h Fz(for)f(something)g(else.)25 b(\(One)17 b(migh)o(t)g(realize)h(this)f (when)g Fw(LaTeX)75 1701 y Fz(crashes)f(when)g(it)g(encoun)o(teres)g(a) f Fu(\\.)h Fz(that)f(w)o(as)g(written)g(automatically)i(b)o(y)e Fw(Fwea)l(ve)p Fz(.\))22 b(T)l(o)16 b(\014x)g(this)75 1756 y(problem,)g(put)f(in)o(to)g(`)p Fu(fweb.sty)p Fz(')e(the)j(lines) 195 1822 y Fu(format_KEYWORD)22 b(=)i("\\\\WTT")195 1873 y(format_keyword)e(=)i("\\\\WTT")195 1925 y(format_typewriter)e(=)h ("\\\\WTT")75 1994 y Fz(Here)f Fu(\\WTT)e Fz(can)i(b)q(e)f(an)o(y)g (name)h(not)f(already)g(in)h(use;)i Fs(y)o(ou)d(need)h(not)f(\(and)g (should)i(not\))e Fz(giv)o(e)g(a)75 2048 y(de\014nition)c(for)e Fu(\\WTT)p Fz(.)137 2117 y(Macros)d(lik)o(e)j Fu(\\.)e Fz(or)f Fu(\\WTT)h Fz(are)g(giv)o(en)g(their)h(v)m(alues)g(during)g (the)f(execution)i(of)d(the)i Fu(\\Wbegin)e Fz(macro)75 2172 y(that)18 b(b)q(egins)j(the)e(output)g(from)g Fw(Fwea)l(ve)p Fz(.)32 b(The)20 b(st)o(yle-\014le)g(v)m(alues)g(are)f(written)g(as)g (argumen)o(ts)g(to)75 2226 y(that)e(macro,)h(and)g(essen)o(tially)i(a)d (command)h(lik)o(e)h Fu(\\let\\.\\Wtypewriter)d Fz(is)i(executed,)i (where)e(the)75 2281 y(in)o(ternal)f(macro)e Fu(\\Wtypewriter)g Fz(is)i(de\014ned)g(in)g(`)p Fu(fwebmac.sty)p Fz('.)k(If)16 b(y)o(ou)g(w)o(an)o(t)f(to)h(c)o(hange)g(the)g(w)o(a)o(y)75 2336 y Fw(Fweb)h Fz(t)o(yp)q(esets)f(a)f(particular)i(kind)g(of)f(iden) o(ti\014er,)h(y)o(ou)f(m)o(ust)f(rede\014ne)i(the)f Fs(in)o(ternal)j Fz(macro)c(name,)75 2391 y(not)g(the)g(one)g(used)h(in)g(the)g Fu(format)e Fz(parameters.)137 2459 y(Here)22 b(are)f(the)g(in)o (ternal)h(macros)f(used)h(b)o(y)f(`)p Fu(fwebmac.sty)p Fz(')e(to)i(t)o(yp)q(eset)g(the)g(v)m(arious)h(kinds)g(of)75 2514 y(iden)o(ti\014ers.)f(The)16 b(asso)q(ciated)f(st)o(yle-\014le)i (parameters)d(are)h(sho)o(wn)g(in)h(paren)o(theses.)195 2592 y Fu(\\Wid)144 b Fz(ordinary)15 b(iden)o(ti\014ers)i(\()p Fu(format.id)p Fz(\))195 2670 y Fu(\\WID)144 b Fz(completely)17 b(upp)q(er-case)f(ordinary)f(iden)o(ti\014ers)i(\()p Fu(format.ID)p Fz(\))p eop %%Page: 116 118 116 117 bop 75 -58 a Fz(Chapter)15 b(12:)k(CUSTOMIZA)l(TION)1083 b(116)195 183 y Fu(\\Wshort)72 b Fz(single-c)o(haracter)16 b(ordinary)f(iden)o(ti\014ers)i(\()p Fu(format.short_id)p Fz(\))195 260 y Fu(\\WidD)120 b Fz(outer)15 b(macros)f(\()p Fu(format.outer_macro)p Fz(\))195 337 y Fu(\\WIDD)120 b Fz(completely)17 b(upp)q(er-case)f(outer)f(macros)f(\()p Fu(format.outer_macro)p Fz(\))195 415 y Fu(\\WidM)120 b Fz(FWEB)15 b(macros)f(\()p Fu(format.WEB_macro)p Fz(\))195 492 y Fu(\\WIDM)120 b Fz(completely)17 b(upp)q(er-case)f(FWEB)f(macros) f(\()p Fu(format.WEB_macro)p Fz(\))195 569 y Fu(\\Wreserved)435 621 y Fz(reserv)o(ed)h(w)o(ords)g(\()p Fu(format.reserved)p Fz(\))195 698 y Fu(\\WRESERVED)435 750 y Fz(completely)i(upp)q(er-case) f(reserv)o(ed)f(w)o(ords)g(\()p Fu(format.RESERVED)p Fz(\))195 827 y Fu(\\Wintrinsic)435 879 y Fz(library/in)o(trinsic)i (function)f(names)g(\()p Fu(format.intrinsic)p Fz(\))195 956 y Fu(\\Wkeyword)435 1008 y Fz(certain)g(F)l(ortran)e(k)o(eyw)o (ords)g(\()p Fu(format.keyword)p Fz(\))195 1085 y Fu(\\WKEYWORD)435 1137 y Fz(completely)j(upp)q(er-case)f(k)o(eyw)o(ords)e(\()p Fu(format.KEYWORD)p Fz(\))195 1214 y Fu(\\Wtypewriter)435 1266 y Fz(c)o(haracter)g(strings)i(\()p Fu(format.typewriter)p Fz(\))75 1378 y Fq(12.3.5.2)29 b Fn(indent.)p Fl(???)137 1475 y Fu(indent.TeX)14 b Fz(sp)q(eci\014es)j(paragraph)d(inden)o (tation)j(for)d(the)i(T)1199 1485 y(E)1224 1475 y(X)f(part.)137 1543 y Fu(indent.code)f Fz(sp)q(eci\014es)j(similar)f(inden)o(tation)g (for)f(the)g(co)q(de)h(part.)75 1655 y Fq(12.3.5.3)29 b Fn(LaTeX.)p Fl(???)137 1752 y Fz(F)l(or)22 b(LaT)302 1762 y(E)328 1752 y(X2e,)i(the)e(default)h(do)q(cumen)o(t)g(class)g (can)g(b)q(e)g(o)o(v)o(erridden)g(b)o(y)f Fu(LaTeX.class)p Fz(.)41 b(The)75 1807 y(default)23 b(class)g(is)g Fu(article)p Fz(,)g(and)g Fw(Fweb)g Fz(has)g(not)f(b)q(een)h(tested)g(with)g(other)f (do)q(cumen)o(t)h(classes,)75 1862 y(except)16 b(minimally)h(with)f Fu(revtex)e Fz(\(see)h(Section)h(10.1.3.2)d([REVT)l(eX],)i(page)g (94\).)137 1929 y(Options)h(to)f(the)g(do)q(cumen)o(t)h(class)f(can)h (b)q(e)f(sp)q(eci\014ed)j(b)o(y)d Fu(LaTeX.class.options)p Fz(.)137 1997 y(User)g(pac)o(k)m(ages)h(can)f(b)q(e)h(giv)o(en)f(b)o(y) h Fu(LaTeX.package)p Fz(.)137 2064 y(Options)i(to)f(user)g(pac)o(k)m (ages)g(can)g(b)q(e)h(sp)q(eci\014ed)h(b)o(y)e Fu (LaTeX.package.options)p Fz(.)23 b(There)17 b(ma)o(y)f(b)q(e)75 2119 y(just)g(one)h Fu(LaTeX.package)e Fz(command)h(and)h(just)f(one)h Fu(LaTeX.package.options)c Fz(command.)24 b(If)17 b(it)75 2174 y(is)f(necessary)h(to)e(issue)i(m)o(ultiple)h(suc)o(h)e(commands,) g(then)g(put)g(them)g(in)o(to)g Fu(doc.preamble)p Fz(.)k(See)d(the)75 2229 y(discussion)g(in)f(Section)g(10.1.3.1)d([Do)q(cumen)o(t)h (class],)h(page)g(93.)137 2296 y(When)j(running)g(under)g(LaT)650 2306 y(E)676 2296 y(X)f(prior)h(to)e(LaT)974 2306 y(E)1000 2296 y(X2e)h(\(or)g(with)g(REVT)l(eX;)h(see)f(Section)h(10.1.3.2)75 2351 y([REVT)l(eX],)10 b(page)g(94\),)g(the)g(do)q(cumen)o(t)g(is)h (\(e\013ectiv)o(ely\))g(b)q(egun)g(b)o(y)f(the)g(command)g Fu(\\documentstyle[options]{st)o(yle})p Fz(.)p 2248 2362 21 46 v 75 2406 a(The)15 b(options)h(\014eld)g(can)g(b)q(e)f(sp)q (eci\014ed)j(b)o(y)d Fu(LaTeX.options)p Fz(;)e(the)i(st)o(yle)h (\014eld)g(b)o(y)f Fu(LaTeX.style)p Fz(.)75 2519 y Fq(12.3.6)29 b(Remapping)21 b(con)n(trol)f(co)r(des)137 2615 y Fz(Con)o(trol-co)q (de)f(remappings)g(are)f(sophisticated)i(and)f(un)o(wise.)30 b(They)19 b(are)f(mostly)h(in)o(tended)h(for)75 2670 y(the)15 b(dev)o(elop)q(er,)h(so)f(are)g(not)g(explained)i(here.)p eop %%Page: 117 119 117 118 bop 75 -58 a Fz(Chapter)15 b(12:)k(CUSTOMIZA)l(TION)1083 b(117)75 183 y Fq(12.3.7)29 b(Color)21 b(output)137 280 y Fz(In)15 b(the)e(design)i(of)e Fw(Fweb)p Fz(,)i(pro)o(vision)f(has)g (b)q(een)h(made)f(for)f(writing)h(v)m(arious)g(messages)f(to)g(the)h (ter-)75 335 y(minal)f(in)f(color|e.g.,)g(serious)g(error)f(messages)g (migh)o(t)h(app)q(ear)g(in)g(red.)19 b(This)12 b(feature)g(w)o(as)f (motiv)m(ated)75 390 y(b)o(y)k(the)g(color)h Fu(ls)f Fz(of)f(Lin)o(ux.)21 b(It)16 b(is)f(installed)i(automatically)f(if)g (the)f Fu(termcap)f Fz(library)i(is)g(presen)o(t.)137 457 y(Messages)j(output)g(from)f Fw(Fweb)i Fz(are)f(rank)o(ed)g (according)g(to)g(an)g(in)o(ternal)h(message-t)o(yp)q(e)f(table;)75 512 y(eac)o(h)e(t)o(yp)q(e)h(can)f(b)q(e)h(asso)q(ciated)g(with)g(a)f (color)g(that)g(can)g(b)q(e)h(c)o(hanged)g(in)g(the)g(st)o(yle)f (\014le.)28 b(Presen)o(tly)l(,)75 567 y(the)15 b(message)g(t)o(yp)q(es) g(\(hop)q(efully)i(self-explanatory\))f(are)315 632 y Fu(ordinary)315 684 y(program_name)315 735 y(mod_name)315 787 y(info)315 839 y(warning)315 891 y(error)315 943 y(fatal)315 995 y(mod_num)315 1047 y(line_num)315 1099 y(in_file)315 1151 y(include_file)315 1202 y(out_file)315 1254 y(timing)75 1322 y Fz(The)27 b(asso)q(ciated)g(st)o(yle-\014le)h (parameters)e(are)g(the)h(ab)q(o)o(v)o(e)f(names)h(prefaced)g(b)o(y)f (`)p Fu(color.)p Fz('|e.g.,)75 1377 y Fu(color.warning)p Fz(.)d(Eac)o(h)17 b(of)f(those)h(has)f(a)h(default)g(v)m(alue,)i(suc)o (h)e(as)f Fu(color.error)e(=)h("red")p Fz(.)24 b(Those)75 1432 y(defaults)16 b(can)f(b)q(e)h(displa)o(y)o(ed)g(b)o(y)g(sa)o(ying) f(`)p Fu(ftangle)e(-Zcolor)p Fz('.)137 1499 y(What)k(the)h(color)f (actually)h(means)g(in)g(practice)g(dep)q(ends)h(on)f(the)f Fs(color)h(mo)q(de)p Fz(,)g(set)f(b)o(y)g(the)h(`)p Fu(-C)p Fz(')75 1554 y(option)f(\(see)f(Section)i(4.2.8)d([-C)p 645 1554 14 2 v 16 w(],)h(page)g(18\).)24 b(That)16 b(selects)h(one)g (of)f(sev)o(eral)h(primitiv)o(e)h(palettes,)e(as)75 1609 y(follo)o(ws:)195 1686 y Fm(0)216 b Fp(No)11 b(color)p Fz(;)h(ordinary)g(blac)o(k-and-white)h(output.)18 b(This)12 b(is)g(the)f(default)h(\(and)435 1738 y(the)j(mo)q(de)h(used)g(when)f (the)h Fu(termcap)e Fz(library)i(is)f(not)g(presen)o(t\).)195 1816 y Fm(1)216 b Fp(ANSI)19 b(color)p Fz(.)30 b(With)18 b(a)g(color)h(terminal)g(that)f(supp)q(orts)g(ANSI)h(color)g(es-)435 1867 y(cap)q(e)i(sequences,)h(one)f(has)f(a)o(v)m(ailable)i(the)f (follo)o(wing)g(colors:)30 b Fu("black")p Fz(,)435 1919 y Fu("red")p Fz(,)13 b Fu("green")p Fz(,)g Fu("yellow")p Fz(,)g Fu("blue")p Fz(,)g Fu("magenta")p Fz(,)g Fu("cyan")p Fz(,)g Fu("white")p Fz(,)435 1971 y(and)k Fu("default")p Fz(.)25 b(These)17 b(are)g(displa)o(y)o(ed)h(with)g(b)q(old)g (attribute)f(\(that)f(is,)435 2023 y(brigh)o(t,)g(not)g(dim\).)23 b(`)p Fu("default")p Fz(')14 b(stands)h(for)h(the)g(usual)h(blac)o(k)f (on)g(white)435 2075 y(bac)o(kground,)f(or)f(vice)j(v)o(ersa.)195 2152 y Fm(2)216 b Fp(Bilev)o(el)p Fz(.)37 b(This)20 b(is)h(for)e (terminals)i(that)e(don't)h(supp)q(ort)g(true)g(color,)h(but)435 2204 y(do)g(supp)q(ort)g(a)g(double-brigh)o(t)i(mo)q(de)e(and)h(rev)o (erse)f(video.)38 b(Colors)21 b(are)435 2256 y(mapp)q(ed)15 b(on)o(to)f(v)m(arious)h(com)o(binations)g(of)f(those)g(t)o(w)o(o)f (displa)o(y)j(attributes,)435 2308 y(according)i(to)f(an)g(in)o (ternally)i(de\014ned)g(sc)o(heme.)27 b(F)l(or)16 b(example,)j Fu("red")d Fz(is)435 2360 y(mapp)q(ed)g(on)o(to)e(the)h(pair)h(of)e (escap)q(e)i(sequences)g(`)p Fu(md)p Fz(',)e(`)p Fu(mr)p Fz(')g(\(double-brigh)o(t)435 2412 y(mo)q(de)h(in)i(rev)o(erse)e (video\).)195 2489 y Fm(3)216 b Fp(T)l(rilev)o(el)p Fz(.)22 b(As)15 b(ab)q(o)o(v)o(e,)g(but)g(adds)g(underlining)j(capabilit)o(y)l (.)195 2566 y Fm(4)216 b Fp(User-de\014ned)17 b(colors)p Fz(.)k(This)15 b(implemen)o(ts)i(a)d(minimal)j(set)e(of)g(defaults.)20 b(It)435 2618 y(is)14 b(in)o(tended)h(that)e(the)h(user)g(add)g (de\014nitions)i(in)e(the)g(st)o(yle)g(\014le)h(to)e(o)o(v)o(erride)435 2670 y(those)i(defaults.)p eop %%Page: 118 120 118 119 bop 75 -58 a Fz(Chapter)15 b(12:)k(CUSTOMIZA)l(TION)1083 b(118)137 183 y(The)22 b(mec)o(hanism)f(is)h(in)o(tended)h(to)d(w)o (ork)g(with)i(systems)e(that)h(supp)q(ort)g(the)g Fu(termcap)f Fz(library)l(.)75 238 y(The)h(terminal)g(is)h(con)o(trolled)f(b)o(y)g (writing)g(appropriate)g(escap)q(e)g(sequences)h(to)e(it.)37 b(The)21 b(st)o(yle-\014le)75 293 y(parameters)14 b(that)h(store)g(the) g(escap)q(e)h(sequences)g(are)f(the)g(color)h(name)f(preceded)i(b)o(y)e (`)p Fu(Color.)p Fz(')e(\(note)75 348 y(the)22 b(upp)q(er)i(case)e(`)p Fu(C)p Fz('\)|e.g.,)g(`)p Fu(Color.red)p Fz('.)39 b(F)l(or)22 b(cases)g(lik)o(e)i(rev)o(erse)e(video)h(\(standard)e(termcap)75 402 y(abbreviation)16 b(`)p Fu(mr)p Fz('\),)d(the)i(escap)q(e)h (sequences)g(are)e(determined)i(b)o(y)f(querying)h(the)f(termcap)g (database)75 457 y(\(usually)21 b(`)p Fu(/etc/termcap)p Fz('\))c(through)j(the)g Fu(termcap)f Fz(library)h(functions.)35 b(F)l(or)20 b(ANSI)g(color)g(\(color)75 512 y(mo)q(de)g(=)f(1\),)g (ANSI)i(escap)q(e)f(sequences)g(are)f(hard-co)q(ded)h(in)o(to)g Fw(Fweb)p Fz(.)33 b(One)20 b(can)f(see)h(the)f(escap)q(e)75 567 y(sequences)d Fw(Fweb)h Fz(assigns)e(to)f(colors)i(b)o(y)f(sa)o (ying)g(`)p Fu(ftangle)f(-ZColor)p Fz('.)137 642 y(F)l(or)k(an)o(y)g (non-zero)h(color)g(mo)q(de,)g(one)g(can)f(o)o(v)o(erride)h Fw(Fweb)p Fz('s)g(default)g(c)o(hoices)h(for)d(color)i(map-)75 697 y(pings)d(and)f(escap)q(e)g(sequences)h(b)o(y)f(rede\014ning)i(one) e(or)f(more)g(of)h(the)g Fu(Color)f Fz(parameters)g(in)i(the)f(st)o (yle)75 751 y(\014le.)29 b(The)18 b(escap)q(e)h(sequences)g(can)f (either)g(b)q(e)h(sp)q(eci\014ed)h(in)e(ra)o(w)f(form|e.g.,)g(for)g (color)h(mo)q(de)g(=)h(1,)75 806 y(a)d(default)h(is)g Fu(Color.red)d(=)h("\\e[01;31m")p Fz(|or)g(in)i(the)g(form)e(of)h(a)h (sequence)g(of)f(t)o(w)o(o-c)o(haracter)f(ab-)75 861 y(breviations)k(that)e(are)h(de\014ned)i(in)f(the)f(termcap)g(do)q (cumen)o(tation|e.g.,)h(for)e(mo)q(des)h(2)g(and)h(3,)f(the)75 916 y(default)f(is)g Fu(Color.red)d(=)h("mdmr")p Fz(.)24 b(\(When)16 b(one)h(displa)o(ys)h(that)e(with)h(the)f(`)p Fu(-Z)p Fz(')g(option,)h Fw(Fweb)g Fz(will)75 971 y(displa)o(y)f(the)f (actual)h(escap)q(e)g(sequences)g(that)e(it)h(determines)i(from)d(the)h (termcap)g(database,)f(not)h(the)75 1025 y(abbreviations.)33 b(F)l(or)18 b(b)q(oth)i(input)g(and)f(output,)h(note)f(that)f(one)i(ma) o(y)e(use)i(the)f(non-ANSI)h(escap)q(e)75 1080 y(sequence)c(`)p Fu(\\e)p Fz(')f(to)f(represen)o(t)h(the)h(escap)q(e)f(c)o(haracter)g(`) p Fu(\\033)p Fz('.\))137 1155 y(When)d(one)f(sa)o(ys)f(`)p Fu(-ZColor)p Fz(',)f(for)i(color)f(mo)q(des)i(1{3)e(all)h(of)g(the)g (parameters)f(are)g(listed)i(as)f(mo)q(di\014ed,)75 1210 y(ev)o(en)k(if)f(the)h(user)f(rede\014nes)h(none.)20 b(That)14 b(o)q(ccurs)h(b)q(ecause)g(the)f(defaults)h(are)f(o)o(v)o (erwritten)f(in)o(ternally)75 1265 y(when)j(the)f(color)g(mo)q(de)h(is) f(set.)137 1340 y Fw(Fweb)p Fz('s)26 b(con\014guration)f(script)h (attempts)e(to)h(determine)h(whether)f(the)h(termcap)e(library)i(is)75 1395 y(presen)o(t;)j(if)c(not,)h(they)f(link)h(in)f(dumm)o(y)g(termcap) f(routines)h(\(`)p Fu(termcap0.web)p Fz('\).)45 b(T)l(o)24 b(o)o(v)o(erride)75 1449 y(this)19 b(b)q(eha)o(vior,)g(c)o(hange)f(the) h(appropriate)f(lines)i(in)f(`)p Fu(defaults.mk)p Fz(',)d(pro)q(duced)k (b)o(y)e(the)g(command)75 1504 y Fu(./configure)p Fz(.)137 1579 y(Color)c(message)f(output)h(is)h(not)e(fully)j(debugged)f(\(it's) e(a)h(frill,)h(after)e(all\),)i(so)e(some)h(messages)g(that)75 1634 y(should)i(reasonably)g(b)q(e)f(colored)h(ma)o(y)f(not)f(b)q(e)i (so)f(in)h(the)f(presen)o(t)h(release.)75 1761 y Fq(12.3.8)29 b(Miscellaneous)22 b(st)n(yle-\014le)g(parameters)137 1866 y Fz(There)16 b(are)f(a)f(v)m(ariet)o(y)i(of)f(miscellaneous)i (parameters.)75 1993 y Fq(12.3.8.1)29 b Fn(ASCII_Fcn)137 2097 y Fz(See)16 b(Section)g(5.6.2)e([A)l(Tdquote],)g(page)h(51.)75 2225 y Fq(12.3.8.2)29 b Fn(cchar)137 2329 y Fz(Con)o(tin)o(uation)16 b(c)o(haracter)e(for)h Fw(F)o(or)m(tran)g Fz(co)q(de)h(output.)75 2456 y Fq(12.3.8.3)29 b Fn(cdir_start)137 2560 y Fz(This)18 b(parameter)f(has)h(the)f(form)g Fu(cdir_start.)p Fs(l)r Fz(,)g(where)h Fs(l)h Fz(is)g(one)e(of)g(`)p Fu(C)p Fz(',)g(`)p Fu(Cpp)p Fz(',)g(`)p Fu(N)p Fz(',)g(`)p Fu(N90)p Fz(',)f(`)p Fu(R)p Fz(',)75 2615 y(`)p Fu(R90)p Fz(',)e(`)p Fu(X)p Fz(',)h(or)g(`)p Fu(V)p Fz('.)21 b(The)15 b(con)o(ten)o(ts)h(of)f(this) h(parameter)f(is)h(written)g(immediately)h(after)e(the)h(`)p Fu(@?)p Fz(')f(that)75 2670 y(b)q(egins)h(a)f(compiler)i(directiv)o(e.) p eop %%Page: 119 121 119 120 bop 75 -58 a Fz(Chapter)15 b(12:)k(CUSTOMIZA)l(TION)1083 b(119)75 183 y Fq(12.3.8.4)29 b Fn(line_char.)p Fl(l)24 b Fq(\()p Fo(Ft)m(angle)p Fq(\))137 282 y Fz(By)c(default,)g Fw(Ft)m(angle)g Fz(outputs)f(commen)o(ts)g(indicating)i(line)g(n)o(um)o (b)q(ers)f(in)g(the)f Fu(web)g Fz(\014le)i(from)75 337 y(whic)o(h)d(the)g(tangled)g(output)g(comes.)27 b(\(This)18 b(information)f(can)h(b)q(e)g(used)h(b)o(y)e(debuggers,)h(esp)q (ecially)75 392 y(those)k(for)g(C)g(and)h(C)p Fu(++)p Fz(,)g(to)f(correlate)g(error)g(messages)f(to)h(the)h Fu(web)e Fz(source.\))42 b(The)22 b Fu(line_char)75 447 y Fz(parameter)14 b(sets)h(the)h(commen)o(t)e(c)o(haracter)h(that)f(b)q (egins)j(the)e(line)i(commen)o(t.)75 564 y Fq(12.3.8.5)29 b Fn(line_length.)p Fl(l)24 b Fq(\()p Fo(Ft)m(angle)p Fq(\))137 664 y Fz(This)f(parameter)e(is)h(used)g(b)o(y)g(the)g Fw(F)o(or)m(tran)p Fz(-lik)o(e)h(languages)f(to)f(con)o(trol)g(the)h (length)h(of)e(the)75 718 y(output)e(line)h(in)g(the)f(`)p Fu(.f)p Fz(')f(\014le)i(pro)q(duced)g(b)o(y)f Fw(Ft)m(angle)p Fz(.)31 b(F)l(or)18 b Fw(F)o(or)m(tran)p Fz(-77,)i(its)f(default)g(v)m (alue)h(is)75 773 y(the)15 b(v)o(enerable)h(72.)k(F)l(or)14 b Fw(F)o(or)m(tran)p Fz(-90,)h(its)g(default)h(is)g(73.)j(Using)d(that) e(v)m(alue)j(mak)o(es)d(it)i(p)q(ossible)h(to)75 828 y(generate)c(co)q(de)h(that)f(is)h(compatible)h(with)f(b)q(oth)f (\014xed-)i(and)e(free-form)g(format)g(\(b)o(y)g(con)o(tin)o(uing)h (lines)75 883 y(with)j(an)f(trailing)h(amp)q(ersand)g(in)g(column)g(73) f(and)g(another)g(amp)q(ersand)g(in)i(column)f(6)f(of)g(the)g(next)75 938 y(line\).)75 1055 y Fq(12.3.8.6)29 b Fn(meta.)p Fl(???.?)5 b Fq(,)20 b Fn(meta.)p Fl(???)p Fn(.hdr.)p Fl(?)25 b Fq(\()p Fo(Ft)m(angle)p Fq(\))137 1154 y Fz(These)20 b(parameters)e(customize)i(the)f(treatmen)o(t)f(of)h(meta-commen)o(ts.) 31 b(F)l(undamen)o(tally)l(,)21 b(meta-)75 1209 y(commen)o(ts)10 b(consist)h(of)f(material)h(enclosed)h(b)o(y)e(`)p Fu(@\(...@\))p Fz('.)17 b(The)10 b(header)h(information)g(usually)h(written)75 1264 y(at)g(the)h(top)g(of)f(the)h(\014le)h(output)e(b)o(y)h Fw(Ft)m(angle)h Fz(\(see)f(Section)g(4.2.59.4)e([-Tv],)h(page)g(31\))g (is)i(also)e(treated)75 1319 y(as)18 b(a)h(meta-commen)o(t.)30 b(F)l(or)18 b(that)g(header)h(material,)h(a)e(separate)g(set)h(of)f (parameters)g(is)i(pro)o(vided,)75 1373 y(suc)o(h)c(as)e Fu(meta.top.hdr)p Fz(.)137 1444 y Fu(meta.top.)p Fs(l)i Fz(sp)q(eci\014es)g(text)e(that)g(precedes)i(material)f(enclosed)g(b)o (y)g(`)p Fu(@\(...@\))p Fz('.)j(Here)d Fs(l)i Fz(is)e(one)f(of)75 1498 y(the)h(standard)g(language)g(subscripts)h(\(see)g(Section)g(12.3) e([St)o(yle],)g(page)h(112\))f(suc)o(h)i(as)f Fu(N90)p Fz(.)137 1568 y Fu(meta.prefix.)p Fs(l)h Fz(b)q(egins)h(eac)o(h)e(line) i(of)d(the)i(meta-commen)o(t.)137 1638 y Fu(meta.bottom.)p Fs(l)g Fz(sp)q(eci\014es)h(text)e(that)f(follo)o(ws)i(the)f (meta-commen)o(t.)75 1756 y Fq(12.3.8.7)29 b Fn(outer.)p Fl(???)137 1855 y Fw(Ft)m(angle)19 b Fz(con)o(v)o(erts)d(`)p Fu(@d)p Fz(')h(\(see)g(Section)i(5.5.6)c([A)l(Td],)j(page)f(42\))g(to)f Fu(outer.def)p Fz(,)h(and)h(`)p Fu(@u)p Fz(')e(\(see)75 1910 y(Section)g(5.5.26)d([A)l(T)l(u],)i(page)g(49\))f(to)h Fu(outer.undef)p Fz(.)75 2028 y Fq(12.3.8.8)29 b Fn(protect.?)137 2127 y Fz(The)16 b(strings)f Fu(protect.)p Fs(l)h Fz(sp)q(ecify)h(the)e (protection)g(c)o(haracter\(s\))f(to)h(end)h(a)e(con)o(tin)o(ued)i (line.)75 2245 y Fq(12.3.8.9)29 b Fn(suffix.?)137 2344 y Fz(The)16 b(extension)g(for)e(the)i(\014les)g(output)f(b)o(y)g Fw(Ft)m(angle)h Fz(is)g(sp)q(eci\014ed)h(b)o(y)e Fu(suffix.)p Fs(l)r Fz(.)75 2461 y Fq(12.3.8.10)29 b Fn(macros)137 2560 y Fz(The)18 b(default)g(name)g(of)f(the)h(macro)f(pac)o(k)m(age)h (to)f(b)q(e)h(read)g(in.)28 b([This)18 b(is)g(usually)h(`)p Fu(fwebmac.sty)p Fz(')75 2615 y(\(see)h(Section)g(10.1.2)e([fw)o (ebmac.st)o(y],)g(page)h(92\),)g(but)h(can)g(b)q(e)g(o)o(v)o(erridden)g (b)o(y)g(the)f(command-line)75 2670 y(option)c(`)p Fu(-w)p Fz(';)f(see)i(Section)g(4.2.66)d([-w],)h(page)h(34.])p eop %%Page: 120 122 120 121 bop 75 -58 a Fz(Chapter)15 b(12:)k(CUSTOMIZA)l(TION)1083 b(120)75 183 y Fq(12.3.8.11)29 b Fn(limbo.begin)p Fq(,)21 b Fn(limbo.end)137 280 y Fz(`)p Fu(limbo.begin)p Fz(')13 b(is)i(T)510 289 y(E)536 280 y(X)g(material)g(to)f(b)q(e)i(prin)o(ted)g (at)e(the)h(b)q(eginning)i(of)e(the)g(lim)o(b)q(o)h(section,)f(just)75 334 y(b)q(efore)k(the)f(text)g(from)g(`)p Fu(@l)p Fz(')f(commands.)29 b(See)19 b(Section)g(5.5.14)e([A)l(Tl],)h(page)h(45.)28 b(\(This)19 b(command)75 389 y(w)o(as)14 b(previous)i(called)h(just)e (`)p Fu(limbo)p Fz(',)e(and)j(that)e(still)j(w)o(orks.\))137 456 y(Similarly)l(,)g(`)p Fu(limbo.end)p Fz(')d(is)h(prin)o(ted)h(at)f (the)g(end)h(of)f(the)g(lim)o(b)q(o)h(section.)137 524 y(Th)o(us,)f(the)g(b)q(eginning)j(of)c(the)i(\014le)g(output)f(b)o(y)g Fw(Fwea)l(ve)h Fz(lo)q(oks)f(lik)o(e)i(this:)195 588 y Fu(\\input)23 b(fwebmac.sty)195 692 y(\\Wbegin{...})267 744 y([contains)f(\\documentclass,)g(\\usepackage,)g(,)g (\\begin{document}])p 1987 754 21 42 v 195 847 a()195 899 y([contents)h(of)g(any)h(@l)f(commands])195 951 y([user's)g(TeX)g (commands)g(from)g(the)h(limbo)f(section])195 1003 y()137 1070 y Fz(The)f(`)p Fu(limbo.end)p Fz(')d(command)i(is)g(useful)i(for)d (prin)o(ting)i(the)f(en)o(tire)h(do)q(cumen)o(t)f(in)h(t)o(w)o (o-column)75 1125 y(format.)d(F)l(or)14 b(more)h(discussion,)h(see)g (Section)g(10.1.3.5)d([LIndex],)i(page)g(96.)75 1237 y Fq(12.3.8.12)29 b Fn(meta.)p Fl(???)c Fq(\()p Fo(Fwea)l(ve)p Fq(\))137 1334 y Fz(\(T)l(o)15 b(b)q(e)h(\014nished.\))75 1446 y Fq(12.3.8.13)29 b Fn(preamble.)p Fl(???)137 1542 y Fz(Additional)c(T)396 1552 y(E)421 1542 y(X)e(material)g(can)g(b)q(e) g(inserted)g(at)f(the)h(b)q(eginning)i(of)d(a)g(named)h(section)h(with) 75 1597 y Fu(preamble.named)13 b Fz(and)j(at)e(the)h(b)q(eginning)j(of) d(an)g(unnamed)h(one)f(with)h Fu(preamble.unnamed)p Fz(.)75 1709 y Fq(12.3.8.14)29 b Fn(dot_constant.)p Fl(???.?)137 1805 y Fz(In)e Fw(F)o(or)m(tran)p Fz(,)i(`dot')c(constan)o(ts)h(suc)o (h)h(as)e Fu(.LT.)h Fz(are)g(b)q(egun)h(and)g(ended)g(b)o(y)g(p)q(erio) q(ds.)54 b(In)75 1860 y(sp)q(ecial)26 b(circumstances,)i(the)d(b)q (eginning)h(and)f(ending)h(c)o(haracters)e(ma)o(y)g(b)q(e)h(mo)q (di\014ed)h(b)o(y)f Fu(dot_)75 1915 y(constant.begin.)p Fs(l)16 b Fz(and)f Fu(dot_constant.end.)p Fs(l)r Fz(.)75 2027 y Fq(12.3.8.15)29 b Fn(null_file)137 2123 y Fz(The)17 b(name)f(of)f(the)h(n)o(ull)i(\014le)f(or)e(device.)24 b(F)l(or)16 b(more)f(discussion,)j(see)e(Section)h(3.3)e([Change)h (\014les],)75 2178 y(page)f(13.)75 2290 y Fq(12.3.9)29 b(Automatic)21 b(\014le)g(name)f(completion)137 2386 y Fz(F)l(or)15 b(more)g(information,)g(see)g(Section)h(4.2.14)d([-e],)i (page)g(19.)p eop %%Page: 121 123 121 122 bop 75 -58 a Fz(Chapter)15 b(13:)k(USA)o(GE)c(TIPS)h(and)f (SUGGESTIONS)764 b(121)75 183 y Ft(13)41 b(USA)n(GE)27 b(TIPS)g(and)g(SUGGESTIONS)137 306 y Fz(In)20 b(this)f(section)h(are)e (collected)j(v)m(arious)e(tips)h(and)f(suggestions)g(to)f(help)i(one)f (mak)o(e)g(full)h(use)f(of)75 361 y Fw(Fweb)p Fz(.)25 b(Additional)18 b(hin)o(ts)f(brok)o(en)f(do)o(wn)g(b)o(y)h(eac)o(h)f (supp)q(orted)h(source)g(language)g(can)f(b)q(e)h(found)g(in)75 416 y(Chapter)e(8)g([Languages],)f(page)h(83.)75 549 y Fy(13.1)32 b(Con)n(v)n(erting)24 b(an)e(existing)i(co)r(de)e(to)g Fr(Fweb)137 648 y Fz(T)l(o)12 b(con)o(v)o(ert)g(an)g(existing)h(co)q (de)g(to)e Fw(Fweb)p Fz(,)j(one)e(should)h(do)g(the)f(follo)o(wing.)19 b(\(The)13 b(follo)o(wing)f(simple)75 702 y(pro)q(cedure)18 b(assumes)e(that)g(one)h(puts)f(all)i(the)f(subroutines)g(in)o(to)g (the)g(unnamed)g(mo)q(dule.)25 b(Ho)o(w)o(ev)o(er,)75 757 y(other)15 b(more)g(elab)q(orate)g(sc)o(hemes)g(are)g(p)q (ossible.\))100 826 y(1.)29 b(Place)21 b(in)o(visible)h(commen)o(tary)d (ab)q(out)h(the)g(author,)g(v)o(ersion,)h(etc.)34 b(at)19 b(the)h(b)q(eginning)i(of)e(the)165 881 y(source)d(\014le)g(b)o(y)g (brac)o(k)o(eting)g(it)g(with)g(`)p Fu(@z...@x)p Fz('.)22 b(The)17 b(`)p Fu(@z)p Fz(')f(m)o(ust)g(b)q(e)h(the)g(\014rst)f(t)o(w)o (o)g(c)o(haracters)165 936 y(of)f(the)g(\014le.)100 1004 y(2.)29 b(Next,)15 b(set)g(the)g(language)g(b)o(y)h(including)h(a)e (command)g(suc)o(h)h(as)f(`)p Fu(@n)p Fz(')f(or)h(`)p Fu(@c++)p Fz('.)100 1073 y(3.)29 b(Place)20 b(an)e(`)p Fu(@a)p Fz(')g(command)h(\(switc)o(h)g(in)o(to)g(unnamed)h(co)q(de\))f (b)q(efore)g(eac)o(h)g(program)f(unit)i(\(e.g.,)165 1127 y(main)c Fp(program)p Fz(,)f Fp(subroutine)p Fz(,)h(or)f Fp(function)p Fz(\).)100 1196 y(4.)29 b(Before)14 b(eac)o(h)g(`)p Fu(@a)p Fz(',)f(place)h(an)g(`)p Fu(@*)p Fz(')f(or)h(`)p Fu(@ )o Fz('command,)f(follo)o(w)o(ed)h(b)o(y)g(T)1377 1205 y(E)1403 1196 y(X)g(do)q(cumen)o(tation)g(ab)q(out)165 1250 y(that)g(particular)i(section)g(of)f(co)q(de.)100 1319 y(5.)29 b(If)17 b(y)o(ou)g(ha)o(v)o(e)f(program)g(units)i(longer)f (than)g(ab)q(out)g(t)o(w)o(elv)o(e)f(lines,)j(either)f(mak)o(e)e(them)h (function)165 1373 y(calls,)24 b(if)f(y)o(ou)f(can)g(a\013ord)f(the)h (o)o(v)o(erhead)f(and)i(can)f(impart)g(su\016cien)o(t)g(information)h (via)f(the)165 1428 y(function)g(name,)h(or)d(break)i(them)f(up)h(in)o (to)f(shorter)f(fragmen)o(ts)g(b)o(y)i(using)g(named)f(mo)q(dules.)165 1483 y(Insert)d(the)f(command)g(`)p Fu(@)p Fz(')h(in)i(place)h(of)e(the)g(fragmen)o(t)f(y)o(ou're)h(replacing,)165 1538 y(then)f(put)f(that)f(fragmen)o(t)g(somewhere)i(else,)f(prefaced)h (b)o(y)f(`)p Fu(@ )o Fz('and)g(`)p Fu(@=)p Fz('.)100 1606 y(6.)29 b(Mak)o(e)15 b(sure)h(y)o(our)f(commen)o(ts)g (are)g(v)m(alid)j(T)915 1616 y(E)940 1606 y(X.)d(\(One)i(can't)e(ha)o (v)o(e)g(things)h(lik)o(e)h(ra)o(w)d(underscores)165 1661 y(or)h(dollar)h(signs)f(in)h(commen)o(ts,)f(since)h(those)f(cause) g(T)1117 1671 y(E)1143 1661 y(X)g(to)g(tak)o(e)f(sp)q(ecial)j (actions.\))100 1729 y(7.)29 b(Beautify)16 b(and)f(clarify)h(y)o(our)f (do)q(cumen)o(tation)g(b)o(y)h(using)f(co)q(de)h(mo)q(de)g(\(enclosing) g(stu\013)f(b)q(et)o(w)o(een)165 1784 y(v)o(ertical)h(bars\))e(lib)q (erally)k(within)f(y)o(our)d(T)890 1794 y(E)916 1784 y(X.)100 1852 y(8.)29 b(After)13 b(y)o(ou'v)o(e)g(seen)i(the)f(w)o(o)o (v)o(en)f(output,)g(y)o(ou)h(ma)o(y)f(need)i(to)e(go)g(bac)o(k)h(and)g (format)e(a)i(few)f(iden)o(ti-)165 1907 y(\014ers)h(or)e(section)i (names)g(so)f(that)g Fw(Fwea)l(ve)h Fz(understands)g(them)f(prop)q (erly)l(,)i(or)d(y)o(ou)i(ma)o(y)e(need)j(to)165 1962 y(insert)e(some)f(pseudo-semicolons)i(\(`)p Fu(@;)p Fz('\),)d (pseudo-expressions)j(\(`)p Fu(@e)p Fz('\),)d(or)h(pseudo-colons)i(\(`) p Fu(@:)p Fz('\))165 2016 y(\(see)h(Section)h(10.2.1)e([Pseudo-op)q (erators],)f(page)i(101\).)100 2085 y(9.)29 b(Consider)16 b(using)g Fw(Fweb)p Fz('s)g(built-in)i(macro)c(prepro)q(cessor)i(\(see) f(Chapter)g(7)g([Macros],)f(page)h(62\))165 2139 y(to)j(mak)o(e)h(y)o (our)f(co)q(de)i(more)e(readable|for)i(example,)g(replace)g(ra)o(w)e(n) o(umerical)i(constan)o(ts)e(b)o(y)165 2194 y(sym)o(b)q(olic)e(names.)77 2262 y(10.)29 b(Scien)o(ti\014c)23 b(programmers)e(ma)o(y)f(b)q (ene\014t)j(from)e(built-in)j(macro-lik)o(e)e(functions)g(lik)o(e)h Fu($PI)p Fz(;)h(see)165 2317 y(Section)16 b(7.2.3)e([Built-in)j (functions],)e(page)g(66.)77 2385 y(11.)29 b(If)18 b(y)o(ou)g(are)f(a)h Fw(F)o(or)m(tran)g Fz(user,)h(for)e(ultimate)i(readabilit)o(y)g (consider)g(con)o(v)o(erting)e(to)h Fw(Ra)m(tf)o(or)p Fz(.)165 2440 y(The)d(initial)h(anno)o(y)o(ance)e(is)h(getting)g(rid)g (of)f(column-6)h(con)o(tin)o(uations.)20 b(With)14 b(the)h(aid)g(of)f (a)g(go)q(o)q(d)165 2495 y(editor,)20 b(this)g(can)f(b)q(e)h(done)g (simply)l(.)33 b(F)l(or)19 b(example,)h(in)g Fu(emacs)f Fz(one)g(can)g(replace)i(the)e(regular)165 2550 y(expression)f ([carriage)e(return,)h(\014v)o(e)g(spaces,)g(something)g(not)g(equal)g (to)f(space,)i(tab,)e(or)g(0])h(with)165 2605 y([bac)o(kslash,)e (carriage)g(return,)g(six)g(spaces]:)285 2670 y Fu(M-x)23 b(replace-regexp)f(RET)p eop %%Page: 122 124 122 123 bop 75 -58 a Fz(Chapter)15 b(13:)k(USA)o(GE)c(TIPS)h(and)f (SUGGESTIONS)764 b(122)285 183 y Fu(C-q)23 b(C-j)h(\\.{\\)f(\\)h(\\)g (\\)f(\\)h(}[\\^\\.\\)f(tab)g(0]RET)285 235 y(\\\\\\\\)g(C-q)h(C-j)f (\\.{\\)h(\\)f(\\)h(\\)g(\\)f(\\)h(}RET)165 303 y Fz(Get)13 b(rid)h(of)f(the)g(k)o(eyw)o(ords)f(suc)o(h)i(as)f Fp(then)h Fz(or)e Fp(end)i(if)g Fz(in)g(fa)o(v)o(or)e(of)h(braces.)19 b(Change)14 b(singly-quoted)165 358 y(c)o(haracter)k(strings)h(to)g (doubly-quoted)h(ones.)31 b(The)20 b(`)p Fu(-nC)p Fz(')e(option)h (\(see)g(Section)h(4.2.36)d([-nC],)165 413 y(page)e(25\))f(ma)o(y)h(b)q (e)h(helpful.)75 560 y Fy(13.2)32 b(Programming)23 b(tips)g(and)g (other)g(suggestions)100 658 y Fz(1.)29 b(Learn)16 b(ho)o(w)e(to)h(use) g(the)h(GNU)f Fu(info)f Fz(bro)o(wser)h(to)f(access)i(the)f(on-line)i (do)q(cumen)o(tation.)100 727 y(2.)29 b(Read)16 b(the)f(list)h(of)e (new)h(features)g(and)g(c)o(hanges)g(for)g(the)g(last)g(sev)o(eral)g (releases.)20 b(See)c(Chapter)f(14)165 781 y([New)g(features],)f(page)h (124.)100 850 y(3.)29 b(P)o(erio)q(dically)15 b(c)o(hec)o(k)d Fu(ftp.pppl.gov:/pub/fweb/READ_)o(ME)d Fz(for)j(bug)h(rep)q(orts)f(and) g(other)g(news.)165 904 y(Mak)o(e)i(bug)i(rep)q(orts!)j(See)d(Chapter)f (15)g([Supp)q(ort],)f(page)h(131.)100 973 y(4.)29 b(If)16 b(y)o(ou)g(ha)o(v)o(e)f(a)g(color)h(terminal,)h(try)e(the)h(option)g(`) p Fu(-C1)p Fz(')e(\(see)i(Section)h(4.2.8)d([-C)p 1582 973 14 2 v 16 w(],)h(page)h(18,)f(see)165 1027 y(Section)h(12.3.7)d ([Color],)h(page)h(117\).)100 1096 y(5.)29 b(An)o(y)14 b(option)g(in)g(`)p Fu(.fweb)p Fz(')f(that)g(is)h(in)o(tended)h(to)e(b) q(e)i(pro)q(cessed)f Fs(after)i Fz(the)e(command-line)i(options)165 1150 y(should)22 b(b)q(egin)g(with)g(`)p Fu(&)p Fz(')e(rather)g(than)h (`)p Fu(-)p Fz('.)37 b(\(This)21 b(is)h(rarely)f(necessary)l(.\))38 b(See)21 b(Section)h(12.2)165 1205 y([Initialization],)17 b(page)e(108)100 1273 y(6.)29 b(Put)d(standard)f(command-line)i (options)f(in)o(to)g(`)p Fu(.fweb)p Fz('.)50 b(Also)26 b(put)g(there)g(standard)f(st)o(yle)165 1328 y(parameters|e.g.,)285 1394 y Fu(-pindex.tex)d("#.ndx")285 1445 y(-pmodules.tex)g("#.mds")285 1497 y(-pcontents.tex)g("#.cts")100 1566 y Fz(7.)29 b(Learn)16 b(ho)o(w)e(to)h(use)g(the)h(st)o(yle)f(\014le.)21 b(See)16 b(Section)g(12.3)e([St)o(yle],)g(page)h(112.)100 1634 y(8.)29 b(Use)16 b(the)g(info)h(options)f(`)p Fu(-@)p Fz(',)f(`)p Fu(-D)p Fz(',)g(`)p Fu(-y)p Fz(',)g(and)h(`)p Fu(-Z)p Fz(')f(to)g(\014nd)i(out)f(ab)q(out)f(v)m(arious)i(in)o(ternal) g Fw(Fweb)165 1689 y Fz(tables)h(\(con)o(trol)e(co)q(des,)i(reserv)o (ed)f(w)o(ords,)g(memory)f(allo)q(cations,)j(and)e(st)o(yle-\014le)h (parameters\).)165 1743 y(See)e(Section)g(4.2.82)d([Info)i(options],)g (page)g(37.)100 1812 y(9.)29 b(Begin)18 b(all)h Fw(Fweb)f Fz(sources)f(with)h(in)o(visible)i(commen)o(tary)c(brac)o(k)o(eted)h(b) o(y)h(`)p Fu(@z...@x)p Fz('.)24 b(See)18 b(Sec-)165 1866 y(tion)d(5.5.31)f([A)l(Tz],)g(page)h(50.)77 1935 y(10.)29 b(Alw)o(a)o(ys)21 b(include)j(an)e(explicit)i(language-setting)e (command)f(in)i(the)f(lim)o(b)q(o)h(section.)39 b(Under)165 1990 y(normal)15 b(circumstances,)g(do)f(not)h(set)f(the)h(language)f (from)g(the)h(command)f(line.)22 b(See)15 b(Chapter)f(8)165 2044 y([Languages],)g(page)h(83.)77 2113 y(11.)29 b(Keep)16 b(sections)g(quite)g(short.)k(Kn)o(uth)c(suggests)f(a)g(dozen)h(lines.) 22 b(That's)14 b(quite)i(hard)g(to)e(ac)o(hiev)o(e)165 2167 y(sometimes,)i(but)f(almost)h(nev)o(er)g(should)g(a)g(section)g(b) q(e)h(more)e(than)h(a)f(page)h(long.)21 b(If)16 b(a)g(blo)q(c)o(k)g(of) 165 2222 y(co)q(de)g(is)g(longer)f(than)g(that,)f(split)i(it)g(up)g (using)f(named)h(mo)q(dules.)77 2290 y(12.)29 b(It's)11 b(easy)h(to)f(de\014ne)i(macros)e(from)g(the)g(command)h(line)h(to)e (exp)q(edite)j(conditional)f(prepro)q(cessing.)165 2345 y(See)j(Section)g(4.2.27)d([-m],)h(page)h(23.)77 2413 y(13.)29 b(Use)12 b(the)g(prepro)q(cessor)f(construction)h(`)p Fu(@#if)i(0...@#endif)p Fz(')c(to)h(commen)o(t)g(out)g(un)o(w)o(an)o (ted)h(co)q(de.)165 2468 y(See)k(Section)g(7.3)e([Prepro)q(cessing],)h (page)g(80.)77 2536 y(14.)29 b(F)l(or)15 b(logical)h(op)q(erations)f (with)h(the)f(prepro)q(cessor,)g(use)h(`)p Fu(||)p Fz(',)d(not)i(`)p Fu(|)p Fz('.)77 2605 y(15.)29 b(It's)15 b(con)o(v)o(en)o(tional)g(to)g (iden)o(tify)h(the)g(ends)f(of)g(long)h(prepro)q(cessor)f (constructions)g(as)g(follo)o(ws:)285 2670 y Fu(@#if)23 b(A)p eop %%Page: 123 125 123 124 bop 75 -58 a Fz(Chapter)15 b(13:)k(USA)o(GE)c(TIPS)h(and)f (SUGGESTIONS)764 b(123)285 183 y Fu(.)285 235 y(.)285 287 y(@#endif)23 b(//)g(|A|)77 354 y Fz(16.)29 b(T)l(o)23 b(debug)h(an)g(erran)o(t)e Fw(Fweb)j Fz(macro,)f(use)g(the)f(built-in)j (function)e(`)p Fu($DUMPDEF)p Fz('.)43 b(See)24 b(Sec-)165 409 y(tion)15 b(7.2.3.14)e([$DUMPDEF],)g(page)i(70.)77 476 y(17.)29 b(Use)22 b(`)p Fu(@?)p Fz(')f(for)h(compiler)h(directiv)o (es.)41 b(See)23 b(Section)g(5.8.4)d([A)l(T?],)k(page)e(53.)39 b(Use)23 b(the)f(st)o(yle-)165 531 y(\014le)g(parameters)d(`)p Fu(cdir_start)p Fz(')g(to)h(sp)q(ecify)i(information)f(that)e(will)k(b) q(e)e(written)g(out)f(at)g(the)165 586 y(b)q(eginning)d(of)e(the)g (line.)22 b(See)16 b(Section)g(12.3.8.3)c([cdir)p 1104 586 14 2 v 17 w(start],)i(page)h(118.)77 653 y(18.)29 b(Stic)o(k)17 b(to)f(the)h(standard)f Fw(Fweb)h Fz(commen)o(ting)g(st)o (yle)g(`)p Fu(/*...*/)p Fz(')e(or)h(`)p Fu(//...)p Fz('.)22 b(Don't)16 b(use)h(alter-)165 708 y(nativ)o(es)g(suc)o(h)h(as)f Fw(F)o(or)m(tran)p Fz('s)g(column)i(1)e(con)o(v)o(en)o(tion;)h(these)g (ma)o(y)e(not)h(w)o(ork)g(or)g(ma)o(y)f(not)h(b)q(e)165 763 y(supp)q(orted)f(someda)o(y)l(.)j(See)d(Chapter)f(6)g([Commen)o (ts],)e(page)i(60.)77 830 y(19.)29 b(The)14 b(meta-commen)o(t)f (feature)h(`)p Fu(@\(...@\))p Fz(')f(pro)o(vides)h(a)g(p)q(o)q(or-p)q (erson's)g(alignmen)o(t)h(feature.)k(But)165 885 y(it)e(do)q(esn't)h(w) o(ork)e(v)o(ery)h(w)o(ell,)h(and)g(it's)f(not)f(in)i(the)g(spirit)g(of) f(T)1282 895 y(E)1307 885 y(X;)g(learn)h(to)e(use)i(`)p Fu(\\halign)p Fz(')d(or)165 940 y(the)g(LaT)319 949 y(E)345 940 y(X)g(alternativ)o(es.)77 1007 y(20.)29 b(In)24 b Fw(F)o(or)m(tran)p Fz(,)i(use)d(`)p Fu(#:0)p Fz(')g(to)f(declare)j (readable)f(alphab)q(etic)h(statemen)o(t)e(lab)q(els.)46 b(See)24 b(Sec-)165 1062 y(tion)15 b(7.2.2)f([T)l(ok)o(ens],)g(page)h (65)g(and)g(Section)h(4.2.75)d([-colon],)i(page)g(36.)77 1129 y(21.)29 b(When)13 b(mixing)g(languages,)g(de\014ne)g(the)f (language)h(of)f(a)g(mo)q(dule)h(at)f(the)g(highest)h(p)q(ossible)h (lev)o(el|)165 1184 y(e.g.,)g(in)i(the)f(unamed)h(mo)q(dule,)g(not)f (after)f(`)p Fu(@<...@>=)p Fz('.)77 1251 y(22.)29 b(Use)12 b(LaT)325 1261 y(E)350 1251 y(X.)g(Plain)g(T)549 1261 y(E)575 1251 y(X)f(is)h(no)g(longer)f(supp)q(orted.)20 b(Upgrade)11 b(to)g(LaT)1392 1261 y(E)1418 1251 y(X2e.)18 b(See)12 b(Section)h(10.1.3)165 1306 y([LaT)l(eX],)i(page)g(93.)77 1373 y(23.)29 b(If)15 b(y)o(ou)f(are)g(reading)h(this)g(do)q(cumen)o (tation)g(from)f(prin)o(ted)h(pages,)f(mak)o(e)g(sure)g(it's)h(also)f (installed)165 1428 y(as)g(an)g(Info)h(pac)o(k)m(age)f(on)g(y)o(our)g (system)g(so)f(it)i(can)f(b)q(e)h(read)g(in)o(teractiv)o(ely)g(with)f Fu(emacs)p Fz(.)19 b(Y)l(ou)c(can)165 1483 y(also)j(read)g(it)h (through)e(a)h(W)l(orld-Wide)h(W)l(eb)g(bro)o(wser)e(suc)o(h)i(as)e (Netscap)q(e.)30 b(F)l(or)17 b(the)h(address,)165 1537 y(see)d(Chapter)g(15)g([Supp)q(ort],)f(page)i(131.)75 1678 y Fy(13.3)32 b(F)-6 b(eatures)23 b(for)f(scien)n(ti\014c)i (programming)137 1775 y Fw(Fweb)17 b Fz(con)o(tains)e(a)g(few)g (features)g(particularly)h(in)o(tended)h(for)d(scien)o(ti\014c)j (programming.)100 1842 y(1.)29 b(Sev)o(eral)22 b(built-in)h(functions)f (generate)f(n)o(umerical)h(constan)o(ts.)37 b(See)22 b(`)p Fu($PI)p Fz(')e(\(Section)h(7.2.3.47)165 1897 y([$PI],)14 b(page)h(76\))f(and)i(`)p Fu($E)p Fz(')e(\(Section)i(7.2.3.15)c([$E],)i (page)h(70\).)100 1964 y(2.)29 b(Sev)o(eral)e(built-in)h(functions)f(p) q(erform)f(mathematical)h(manipulations.)54 b(See)27 b(`)p Fu($EXP)p Fz(')e(\(Sec-)165 2019 y(tion)d(7.2.3.18)d([$EXP],)h (page)h(71\),)h(`)p Fu($POW)p Fz(')e(\(Section)i(7.2.3.48)d([$PO)o(W],) h(page)i(76\),)f(`)p Fu($SQRT)p Fz(')165 2074 y(\(Section)11 b(7.2.3.56)d([$SQR)l(T],)i(page)h(77\),)f(`)p Fu($LOG)p Fz(')f(\(Section)i(7.2.3.37)d([$LOG],)i(page)g(75\),)h(`)p Fu($LOG10)p Fz(')165 2128 y(\(Section)17 b(7.2.3.38)d([$LOG10],)h(page) h(75\),)g(`)p Fu($MAX)p Fz(')f(\(Section)i(7.2.3.40)c([$MAX],)i(page)h (75\),)g(and)165 2183 y(`)p Fu($MIN)p Fz(')e(\(Section)i(7.2.3.41)c ([$MIN],)i(page)h(75\).)100 2250 y(3.)29 b(The)15 b(do-lo)q(op)h(macro) f(`)p Fu($DO)p Fz(')f(ma)o(y)g(b)q(e)i(useful.)21 b(See)16 b(Section)g(7.2.3.13)d([$DO],)h(page)h(69.)100 2318 y(4.)29 b(C-st)o(yle)13 b(arra)o(y)f(indices)j(can)e(b)q(e)g(used)h(b)o(y)f (means)g(of)f(the)h(`)p Fu(-n\))p Fz(')f(option.)20 b(See)13 b(Section)h(4.2.42)d([-n\)],)165 2373 y(page)k(27.)100 2440 y(5.)29 b(An)16 b(activ)o(e)h(brac)o(k)o(et)e(feature)h(helps)i (impro)o(v)o(e)e(the)g(app)q(earance)h(of)e(w)o(o)o(v)o(en)h(co)q(de)g (that)g(uses)g(sub-)165 2495 y(scripts)g(and/or)e(sup)q(erscripts)i (hea)o(vily)l(.)22 b(See)15 b(Section)i(4.2.65.3)12 b([-W[],)i(page)h (33.)p eop %%Page: 124 126 124 125 bop 75 -58 a Fz(Chapter)15 b(14:)k(NEW)c(FEA)l(TURES)1103 b(124)75 183 y Ft(14)41 b(NEW)27 b(FEA)-7 b(TURES)137 280 y Fz(This)22 b(info)g(do)q(cumen)o(tation)g(is)g(no)o(w)f (accessible)i(on)f(the)f(W)l(orld-Wide)i(W)l(eb;)i(see)c(Chapter)h(15) 75 335 y([Supp)q(ort],)15 b(page)g(131.)137 398 y(Some)20 b(things)f(that)g(ha)o(v)o(e)g(b)q(een)h(added)g(or)f(c)o(hanged)h(in)g (recen)o(t)f(releases)h(are)f(describ)q(ed)j(in)e(the)75 453 y(follo)o(wing.)75 570 y Fy(14.1)32 b(V)-6 b(ersion)23 b(1.61)75 699 y Fq(14.1.1)29 b(Up)r(dates)21 b(to)f(do)r(cumen)n (tation)g(\(v1.61\))220 788 y Fz(1.)29 b Fw(Fweb)15 b Fz(supp)q(orts)f(color)g(mo)q(des)g(in)g(whic)o(h)h(messages)e(to)g (the)h(terminal)h(can)f(app)q(ear)285 840 y(in)f(colors)g(c)o(hosen)g (b)o(y)g(the)f(user;)i(see)e(Section)i(12.3.7)d([Color],)g(page)i(117.) 18 b(The)13 b(color)285 892 y(mo)q(de)k(is)f(set)g(b)o(y)g(the)h(new)f (command-line)i(option)f(`)p Fu(-C)p Fz(')e(\(see)h(Section)h(4.2.8)e ([-C)p 1717 892 14 2 v 16 w(],)285 944 y(page)g(18\).)220 1004 y(2.)29 b(A)15 b(previously)i(undo)q(cumen)o(ted)f(feature)f(is)h (that)e(for)h(the)g(C-lik)o(e)h(and)g(F)l(ortran-lik)o(e)285 1056 y(languages,)h Fw(Ft)m(angle)g Fz(expands)g(the)g(binary)g (notation)g(`)p Fu(0b...)p Fz(')e(to)h(an)h(unsigned)285 1108 y(decimal)g(n)o(um)o(b)q(er.)j(See)c(Section)g(2.4)e([Phases],)g (page)h(10.)75 1208 y Fq(14.1.2)29 b(Rede\014ned)21 b(commands)g (\(v1.61\))137 1301 y Fz(A)c(few)f(obscure)h(commands)f(ha)o(v)o(e)g(b) q(een)i(sligh)o(tly)f(rede\014ned.)25 b(Sorry)16 b(ab)q(out)h(that,)e (but)i(it)g(mak)o(es)75 1355 y(for)e(more)f(symmetry)h(and)g(ease)g(of) g(recall,)h(and/or)f(solv)o(es)g(some)g(tec)o(hnical)i(problems.)220 1416 y(1.)29 b(Although)24 b(it)g(w)o(as)f(nev)o(er)h(do)q(cumen)o (ted,)i(previous)e(v)o(ersions)g(p)q(ermitted)g(either)285 1468 y(lo)o(w)o(er)e(or)h(upp)q(er)h(case)e(for)h(the)f(`)p Fu(@)p Fz(')g(commands)h(that)f(set)h(the)f(language|e.g.,)285 1519 y(b)q(oth)f(`)p Fu(@c)p Fz(')e(and)h(`)p Fu(@C)p Fz(')g(w)o(ork)o(ed.)35 b(No)o(w)19 b(only)i(the)g(lo)o(w)o(er-case)f (forms)g(w)o(ork.)34 b(\(The)285 1571 y(upp)q(er-case)16 b(forms)f(ma)o(y)f(ha)o(v)o(e)h(other)g(meanings.\))220 1632 y(2.)29 b(The)17 b(st)o(yle-\014le)i(parameter)d(`)p Fu(Ext_delimiter)p Fz(')f(no)o(w)i(b)q(egins)h(with)g(an)f(upp)q (er-case)285 1684 y(`)p Fu(E)p Fz(';)d(formerly)h(it)g(w)o(as)g(lo)o(w) o(er-case.)220 1744 y(3.)29 b(The)23 b(b)q(eha)o(vior)g(of)f(the)h (optional)g(argumen)o(t)f(of)h(the)f Fu(\\Title)g Fz(macro)g(has)h(b)q (een)285 1796 y(sligh)o(tly)16 b(rede\014ned.)22 b(The)15 b(new,)g(more)g(symmetrical)h(form)e(is)405 1856 y Fu(\\Title[Short)22 b(title]{Long)h(title})285 1917 y Fz(where)14 b Fu(Long)h(title)e Fz(is)i(prin)o(ted)f(on)g(the)g(title)h(page)f(and)g Fu(Short)g(title)g Fz(is)g(used)h(for)285 1968 y(the)k(running)i (header)e(within)i(the)e(do)q(cumen)o(t.)32 b(See)20 b(Section)g(10.1.3.6)d([T)l(able)i(of)285 2020 y(Con)o(ten)o(ts],)13 b(page)i(96.)220 2081 y(4.)29 b(The)20 b(line-break)i(commands)e(`)p Fu(@/)p Fz(')f(and)i(`)p Fu(@\\)p Fz(')e(\(formerly)g(iden)o(tical\))j (no)o(w)e(b)q(eha)o(v)o(e)285 2133 y(sligh)o(tly)i(di\013eren)o(tly)l (.)37 b(`)p Fu(@/)p Fz(')20 b(breaks)h(the)f(line)j(just)d(as)g(it)h(w) o(ould)g(if)h(the)e(line)j(had)285 2184 y(b)q(een)c(to)q(o)e(long)h (and)h(b)q(een)g(sp)q(on)o(taneously)f(brok)o(en.)28 b(See)18 b(Section)h(5.12.2)d([A)l(T/],)285 2236 y(page)i(55.)29 b(`)p Fu(@\\)p Fz(')17 b(bac)o(kspaces)h(one)h(unit)g(of)f(inden)o (tation)h(after)e(breaking)i(the)g(line.)285 2288 y(See)f(Section)f (5.12.3)e([A)l(Tbs],)i(page)g(56.)24 b(Usually)l(,)18 b(one)f(should)h(use)f(`)p Fu(@/)p Fz(')f(\(sorry;)h(I)285 2340 y(w)o(as)f(previously)h(recommending)h(`)p Fu(@\\)p Fz('.)k(F)l(or)16 b(an)g(example)h(in)g(whic)o(h)g(it)g(is)g(natural) 285 2392 y(to)e(use)g(`)p Fu(@\\)p Fz(',)f(see)h(Section)h(5.12.3)e([A) l(Tbs],)g(page)h(56.)220 2452 y(5.)29 b(The)18 b(names)g(of)f(some)h (of)f(the)h(co)q(de-t)o(yp)q(esetting)h(macros)e(in)h Fu(fwebmac.sty)e Fz(ha)o(v)o(e)285 2504 y(b)q(een)f(c)o(hanged)g(to)f (conform)f(to)h(the)h(con)o(v)o(en)o(tion)f(that)g(they)g(should)h(all) h(start)d(with)285 2556 y(`)p Fu(W)p Fz('.)28 b(This)19 b(c)o(hange)f(will)i(b)q(e)f(in)o(visible)i(to)d(y)o(ou)g(unless)h(y)o (ou)f(happ)q(en)h(to)f(ha)o(v)o(e)g(user)285 2608 y(macros)e(of)g(y)o (our)g(o)o(wn)g(that)f(start)h(that)f(w)o(a)o(y)h(or)g(\(p)q(erish)h (the)g(though)o(t\))e(y)o(ou)h(ha)o(v)o(e)285 2660 y(rede\014ned)h(lo)o (w-lev)o(el)f(and)g(obscure)f(co)q(de)h(in)g(`)p Fu(fwebmac.sty)p Fz('.)p eop %%Page: 125 127 125 126 bop 75 -58 a Fz(Chapter)15 b(14:)k(NEW)c(FEA)l(TURES)1103 b(125)75 183 y Fq(14.1.3)29 b(New)21 b(features)g(\(v1.61\))137 283 y Fz(This)15 b(release)h(adds)e(some)h(features)f(for)g(managing)g (large)h(pro)s(jects,)f(including)j(\(i\))d(the)h Fu(idxmerge)75 337 y Fz(utilit)o(y)i(that)d(merges)i(indexes)h(pro)q(duced)f(b)o(y)g (sev)o(eral)f Fw(Fweb)i Fz(\014les,)f(\(ii\))g(a)f(mec)o(hanism)h(for)f (accessing)75 392 y(R)o(CS-lik)o(e)g(information)f(in)g(the)g (ignorable)h(commen)o(tary)d(at)h(the)h(b)q(eginning)i(of)d(the)h (\014le,)g(and)g(\(iii\))h(the)75 447 y(abilit)o(y)j(to)d(include)k Fw(Fwea)l(ve)p Fz(-formatted)d(co)q(de)h(in)o(to)g(a)f(standard)g(LaT) 1338 457 y(E)1363 447 y(X)h(do)q(cumen)o(t.)24 b(It)16 b(also)h(\014xes)75 502 y(a)e(v)m(ariet)o(y)g(of)g(miscellaneous)i (bugs.)220 569 y(1.)29 b(A)16 b(stand-alone)g(index)h(\014le)f (suitable)h(for)e(pro)q(cessing)i(b)o(y)f Fu(makeindex)e Fz(can)i(b)q(e)g(pro-)285 621 y(duced)g(b)o(y)f(the)h(`)p Fu(-XI)p Fz(')e(option.)20 b(See)c(Section)g(11.2)e([Using)h(mak)o (eindex],)g(page)g(103.)220 687 y(2.)29 b(Stand-alone)17 b(indexes)g(pro)q(duced)h(b)o(y)e(`)p Fu(-XI)p Fz(')e(can)j(b)q(e)f (merged)h(with)f(the)g Fu(idxmerge)285 739 y Fz(utilit)o(y)l(.)21 b(See)16 b(Section)g(11.3)e([Merging)h(indexes],)h(page)f(105.)220 804 y(3.)29 b Fw(Fwea)l(ve)p Fz(-formatted)12 b(co)q(de)g(can)g(b)q(e)h (included)h(in)f(a)f(standard)f(LaT)1446 814 y(E)1472 804 y(X2e)h(do)q(cumen)o(t)285 856 y(b)o(y)f(means)h(of)f(the)h Fu(fwebinsert)e Fz(pac)o(k)m(age.)18 b(See)12 b(Section)h(10.1.6.1)c ([Inserting)j(w)o(o)o(v)o(en)285 908 y(co)q(de],)j(page)g(99.)220 974 y(4.)29 b(Revision-con)o(trol-system)f(\(R)o(CS\))f(information)f (that)g(app)q(ears)h(in)h(the)f(ignor-)285 1026 y(able)17 b(commen)o(tary)e(b)q(et)o(w)o(een)i(the)f(optional)h(`)p Fu(@z)p Fz(')f(and)g(`)p Fu(@x)p Fz(')f(that)h(b)q(egin)i(an)e Fw(Fweb)285 1078 y Fz(\014le)22 b(\(see)g(Section)g(5.5.31)e([A)l(Tz],) i(page)f(50\))g(is)h(accessible)h(in)f(the)g(b)q(o)q(dy)g(of)f(the)285 1130 y(\014le)f(through)e(the)h(built-in)j(function)d Fu($KEYWORD)f Fz(\(see)h(Section)h(7.2.3.30)c([$KEY-)285 1182 y(W)o(ORD],)d(page)h(72\))g(and)g(the)g(new)h(commands)f(`)p Fu(@K)p Fz(')f(\(see)h(Section)h(5.5.11)d([A)l(TK)p 1716 1182 14 2 v 17 w(],)285 1233 y(page)k(44\))f(and)i(`)p Fu(@k)p Fz(')e(\(see)h(Section)h(5.5.12)e([A)l(Tk],)g(page)h(44\).)22 b(These)17 b(features)f(can)285 1285 y(access)d(R)o(CS-lik)o(e)h(k)o (eyw)o(ords)e(that)g(are)h(not)f(kno)o(wn)h(to)f(R)o(CS)h(itself,)h(as) e(long)h(as)g(they)285 1337 y(\014t)i(the)g(prop)q(er)h(syn)o(tax)e (\(see)h(Section)i(5.5.31)c([A)l(Tz],)h(page)h(50\).)220 1403 y(5.)29 b(The)16 b(`)p Fu(-h)p Fz(')e(option)i(no)o(w)e(p)q (ermits)i(easy)g(access)f(to)g(the)g(GNU)h Fu(info)e Fz(bro)o(wser)h(if)h(it)f(is)285 1455 y(installed.)22 b(See)16 b(Section)g(4.2.18)d([-h],)h(page)h(21.)220 1521 y(6.)29 b(Underscored)18 b(v)o(ersions)f(of)f(built-in)k (functions)e(ha)o(v)o(e)e(b)q(een)j(remo)o(v)o(ed!!!)24 b(E.g.,)16 b(use)285 1573 y Fu($IF)p Fz(,)e(not)h Fu(_IF)p Fz(.)20 b(This)15 b(c)o(hange)h(w)o(as)e(w)o(arned)h(ab)q(out)g(in)h (the)f(last)g(release.)220 1638 y(7.)29 b(Single-c)o(haracter)16 b(iden)o(ti\014ers)g(can)e(no)o(w)h(b)q(e)g(completely)h (cross-referenced)f(via)g(the)285 1690 y(`)p Fu(-W1)p Fz(')f(option.)20 b(See)c(Section)g(4.2.65.2)d([-W1],)g(page)i(33.)220 1756 y(8.)29 b(Some)17 b(mo)q(dule)i(w)o(arning)e(messages)g(can)h(b)q (e)g(eliminated)i(with)d(the)h(`)p Fu(-W@)p Fz(')e(option.)285 1808 y(See)g(Section)g(4.2.65.1)d([-W)-5 b(A)l(T],)14 b(page)h(32.)220 1874 y(9.)29 b(The)17 b(`)p Fu(@q)p Fz(')e(command)i(\(still)g(exp)q(erimen)o(tal\))h(has)e(b)q(een)i (added)f(to)f(lo)q(cally)j(turn)d(on)285 1926 y(or)g(o\013)g(the)h(the) g(line)h(and)f(mo)q(dule)h(commen)o(ts)f(in)g(the)g(tangled)g(output.) 25 b(See)17 b(Sec-)285 1978 y(tion)e(5.5.22)f([A)l(Tq],)g(page)h(48.) 197 2043 y(10.)29 b(The)14 b(lev)o(el)i(of)e(v)o(erb)q(osit)o(y)g(of)g Fw(Fweb)p Fz('s)h(informational)f(messages)g(can)g(b)q(e)h(con)o (trolled)285 2095 y(with)h(the)f(`)p Fu(-M)p Fz(')f(option.)20 b(See)c(Section)g(4.2.26)d([-M)p 1158 2095 V 16 w(],)h(page)i(23.)197 2161 y(11.)29 b(C/C)p Fu(++)17 b Fz(programmers)g(ma)o(y)g(\014nd)i (the)f(command)g(`)p Fu(@{)p Fz(')f(useful.)29 b(See)19 b(Section)g(5.9)285 2213 y([A)l(Tlb],)c(page)g(53.)197 2279 y(12.)29 b(The)18 b(`)p Fu(-nC)p Fz(')e(option)i(has)g(b)q(een)h (added)f(for)f Fw(F)o(or)m(tran)h Fz(users;)h(it)f(kills)h(commen)o (ted)285 2331 y(lines)k(at)e(a)g(v)o(ery)g(early)h(stage)e(in)i(the)g (pro)q(cessing.)39 b(This)22 b(can)g(b)q(e)g(useful)g(when)285 2383 y(con)o(v)o(erting)15 b(existing)h(co)q(des)g(to)f Fw(Fweb)p Fz(.)20 b(See)c(Section)g(4.2.36)e([-nC],)g(page)h(25)197 2449 y(13.)29 b Fw(F)o(or)m(tran)p Fz(-90)17 b(\(see)g(Section)g (4.2.31)e([-n9],)i(page)f(24\))g(no)o(w)h(defaults)g(to)f(free-form)285 2500 y(syn)o(tax.)197 2566 y(14.)29 b(As)16 b(of)f(the)g(non-b)q(eta)h (V)l(ersion)h(1.61,)d(free-form)h Fw(F)o(or)m(tran)p Fz(-90)g(no)o(w)g(inserts)h(semi-)285 2618 y(colons)e(automatically)f (in)i(the)e(co)q(de)h(part.)19 b(Th)o(us,)13 b(textb)q(o)q(ok)g Fw(F)o(or)m(tran)p Fz(-90)g(exam-)285 2670 y(ples)19 b(will)g(w)o(ea)o(v)o(e)e(correctly)h(without)g(the)g(anno)o(y)o(ance)g (of)f(explicitly)k(terminating)p eop %%Page: 126 128 126 127 bop 75 -58 a Fz(Chapter)15 b(14:)k(NEW)c(FEA)l(TURES)1103 b(126)285 183 y(eac)o(h)17 b(statemen)o(t)g(with)g(a)h(semicolon.)27 b(\(If)17 b(y)o(ou)g(prefer)h(to)f(put)g(in)h(the)g(semicolons)285 235 y(explicitly)l(,)d(use)d(`)p Fu(--n;)p Fz(')e(to)h(turn)g(o\013)g (the)g(auto-insertion.\))19 b(See)12 b(Section)h(4.2.33)c([-n;],)285 287 y(page)15 b(24)197 349 y(15.)29 b(The)23 b(default)g(meaning)g(of)g (the)f(`)p Fu(-k)p Fz(')g(option)h(w)o(as)f(c)o(hanged;)k(no)o(w)c(b)q (oth)h(lo)o(w)o(er-)285 401 y(and)16 b(upp)q(er-case)g(forms)f(of)g Fw(F)o(or)m(tran)h Fz(I/O)g(k)o(eyw)o(ords)f(are)g(recognized.)22 b(See)16 b(Sec-)285 453 y(tion)f(4.2.23)f([-k],)g(page)h(22.)197 515 y(16.)29 b(V)l(arious)13 b(c)o(hanges)g(w)o(ere)f(made)h(to)f(in)o (ternal)h(co)q(de)g(in)h(`)p Fu(fwebmac.sty)p Fz('.)j(This)c(should)285 567 y(not)j(a\013ect)g(an)o(y)o(one)g Fs(unless)j Fz(y)o(ou)d(ha)o(v)o (e)g(rede\014ned)i Fu(fwebmac)d Fz(macros.)23 b(If)16 b(so,)g(y)o(ou'll)285 618 y(ha)o(v)o(e)f(to)f(compare)h(y)o(our)g(v)o (ersions)g(with)g(the)g(presen)o(t)h(ones.)j(F)l(or)c(example,)h (colons)285 670 y(as)f(argumen)o(t)f(delimiters)j(in)f Fu(\\def)p Fz(s)f(ha)o(v)o(e)g(b)q(een)h(remo)o(v)o(ed.)197 732 y(17.)29 b(It)23 b(is)g(no)o(w)g(\(barely\))f(p)q(ossible)j(to)d (use)h Fu(\\documentstyle{revtex})d Fz(instead)j(of)285 784 y(the)c(default)h Fu(\\documentclass{article})p Fz(.)28 b(See)20 b(Section)g(10.1.3.2)c([REVT)l(eX],)285 836 y(page)f(94.)75 941 y Fq(14.1.4)29 b(Signi\014can)n(t)21 b(bugs)g(\(v1.61\))220 1032 y Fz(1.)29 b(P)o(erhaps)18 b(the)g(most)f(signi\014can)o(t)i(bug)f(is)h(that)e(some)h(high-order)g (\()p Fu(>)p Fz(=)g(128\))f(c)o(har-)285 1084 y(acters)g(in)h(strings)f (ma)o(y)f(not)h(t)o(yp)q(eset)g(or)g(b)q(e)h(pro)q(cessed)g(correctly)l (.)26 b(This)18 b(ma)o(y)e(b)q(e)285 1136 y(an)g(issue)h(for)f(some)g (users)g(of)g(foreign-language)g(pac)o(k)m(ages.)23 b(The)16 b(di\016cult)o(y)i(arises)285 1188 y(from)13 b(a)g(design)h(decision)i (made)d(b)o(y)h(a)f(previous)h(author.)19 b(This)14 b(has)f(at)g(least) h(partly)285 1240 y(b)q(een)g(\014xed,)g(but)g(I)f(esc)o(hew)o(ed)h(a)f (substan)o(tial)h(o)o(v)o(erhaul)f(for)g(fear)g(of)g(breaking)g(other) 285 1291 y(things.)75 1413 y Fy(14.2)32 b(V)-6 b(ersion)23 b(1.53)137 1507 y Fz(This)16 b(release)h(\014xes)e(a)h(relativ)o(ely)g (small)h(n)o(um)o(b)q(er)f(of)f(obscure)h(bugs)f(in)i Fu(fweb-1.52-beta)p Fz(.)h(A)e(few)75 1562 y(minor)f(enhancemen)o(ts)h (w)o(ere)f(also)g(made.)20 b(They)c(include)220 1624 y(1.)29 b(Sections)22 b(can)g(b)q(e)g(n)o(um)o(b)q(ered)h(b)o(y)e (consecutiv)o(e)i(in)o(tegers)f(rather)f(than)g(LaT)l(eX's)285 1676 y(default)16 b(Dew)o(ey-decimal)g(form)f(b)o(y)g(sa)o(ying)405 1738 y Fu(LaTeX.package)22 b(=)i("fwebnum")285 1800 y Fz(See)16 b(Section)g(10.1.3.4)d([Sections],)h(page)i(95.)220 1861 y(2.)29 b(The)22 b(`)p Fu(-H)p Fz(')f(option)h(\(exp)q(erimen)o (tal)h(and)f(incomplete\))h(w)o(as)e(added.)41 b(F)l(or)21 b(C)h(and)285 1913 y(C)p Fu(++)p Fz(,)13 b(this)h(option)f(tells)i Fw(Fwea)l(ve)f Fz(to)e(scan)i Fu(#include)e Fz(\014les)i(for)f(`)p Fu(typedef)p Fz(')f(and/or)285 1965 y(`)p Fu(class)p Fz(')i(de\014nitions.)21 b(See)16 b(Section)g(4.2.17)e([-H)p 1119 1965 14 2 v 16 w(],)g(page)h(20.)220 2027 y(3.)29 b(The)11 b(`)p Fu(-k)p Fz(')e(option)h(w)o(as)g(added.)19 b(This)10 b(tells)i Fw(F)o(or)m(tran)e Fz(and)h Fw(Ra)m(tf)o(or)g Fz(to)e(understand)285 2079 y(the)14 b(lo)o(w)o(er-case)f(forms)g(of)g (I/O)h(k)o(eyw)o(ords)f(suc)o(h)h(as)f(`)p Fu(iostat)p Fz(')f(\(with)i(the)g(exception)285 2131 y(of)h(`)p Fu(read)p Fz(',)e(`)p Fu(write)p Fz(',)h(and)h(`)p Fu(end)p Fz('\).)j(See)e (Section)g(4.2.23)e([-k],)g(page)h(22.)220 2193 y(4.)29 b(The)13 b(`)p Fu(-n:)p Fz(')f(option)i(w)o(as)e(added.)20 b(This)14 b(tells)g Fw(F)o(or)m(tran)g Fz(to)e(place)i(statemen)o(t)e (lab)q(els)285 2245 y(on)j(a)f(separate)h(line,)h(whic)o(h)g(is)f (useful)h(when)f(the)g(lab)q(els)i(are)d(relativ)o(ely)i(long.)k(\(By) 285 2297 y(default,)15 b Fw(F)o(or)m(tran)g Fz(lab)q(els)h(are)e (placed)i(on)f(the)g(same)f(line)i(as)f(the)f(thing)i(they)e(are)285 2349 y(lab)q(eling,)20 b(whic)o(h)e(lo)q(oks)g(go)q(o)q(d)f(for)g (short)g(lab)q(els.\))27 b(See)18 b(Section)h(4.2.34)c([-ncolon],)285 2400 y(page)g(25)220 2462 y(5.)29 b(The)20 b(prepro)q(cessor)g(command) g(`)p Fu(@#line)p Fz(')e(w)o(as)h(added.)35 b(F)l(or)19 b(C)h(co)q(de,)h(this)g(adds)285 2514 y(an)h(explicit)h(`)p Fu(#line)p Fz(')e(command)g(to)g(the)h(tangled)g(output)f(\014le.)41 b(This)22 b(helps)h(to)285 2566 y(k)o(eep)18 b(the)f(line)i(n)o(um)o(b) q(ers)f(b)q(et)o(w)o(een)f(debugger)h(and)g(source)f(\014le)h(in)h (sync)e(when)h(an)285 2618 y Fw(Fweb)g Fz(prepro)q(cessor)g(statemen)o (t)e(expands)i(to)f(sev)o(eral)g(lines.)28 b(See)18 b(Section)h(7.2.4) 285 2670 y([Debugging)c(with)h(macros],)d(page)j(79.)p eop %%Page: 127 129 127 128 bop 75 -58 a Fz(Chapter)15 b(14:)k(NEW)c(FEA)l(TURES)1103 b(127)285 183 y(An)17 b(implicit)i(`)p Fu(@#line)p Fz(')c(command)i(is) g(added)h(after)e(eac)o(h)h(`)p Fu(@\045)p Fz(')e(\(see)i(Section)h (5.8.3)285 235 y([A)l(T\045],)13 b(page)i(52\))e(that)h(b)q(egins)h(a)f (line)i(\(this)f(k)o(eeps)f(line)i(n)o(um)o(b)q(ering)f(correct\).)k(T) l(o)285 287 y(o)o(v)o(erride)c(this,)g(use)h(the)f(option)h(`)p Fu(-T#)p Fz('.)i(See)e(Section)g(4.2.59.6)d([-T#],)h(page)h(31.)220 350 y(6.)29 b(`)p Fu(-p)p Fz(')15 b(\(st)o(yle-\014le\))j(options)e (\(see)h(Section)g(4.2.46)e([-p],)h(page)g(28\))g(on)g(the)h(command) 285 402 y(line)j(are)e(no)o(w)g(pro)q(cessed)h Fs(after)i Fz(the)d(lo)q(cal)i(st)o(yle)e(\014le.)30 b(See)19 b(Section)h(12.3)d ([St)o(yle],)285 453 y(page)e(112.)220 516 y(7.)29 b(The)18 b(functionalit)o(y)h(of)e(the)h(`)p Fu(-D)p Fz(')e(command)i(w)o(as)e (enhanced)j(to)e(include)j(optional)285 568 y(argumen)o(ts)12 b(that)g(limit)i(the)f(information)g(that)f(will)j(b)q(e)e(listed.)21 b(See)13 b(Section)h(4.2.11)285 620 y([-D)p 351 620 14 2 v 16 w(],)g(page)h(18.)75 744 y Fy(14.3)32 b(V)-6 b(ersion)23 b(1.52)137 838 y Fz(This)15 b(release)h(w)o(as)d(issued)j(only)f(as)g (a)f(b)q(eta)h(v)o(ersion.)k(It)c(consists)g(mostly)f(of)h(bug)f (\014xes.)20 b(Ho)o(w)o(ev)o(er,)75 893 y(there)15 b(are)g(a)g(few)g (other)g(in)o(teresting)h(p)q(oin)o(ts.)220 956 y(1.)29 b Fu(fwebmac.sty)11 b Fz(w)o(as)h(enhanced)i(to)e(w)o(arn)g(the)h(user) g(to)f(run)h(LaT)1385 965 y(E)1410 956 y(X)g(again)g(when)g(the)285 1008 y(section)18 b(n)o(um)o(b)q(ering)g(hasn't)f(y)o(et)g(b)q(een)i (brough)o(t)d(up)i(to)f(date.)26 b(I'm)17 b(not)g(sure)h(I'v)o(e)285 1059 y(co)o(v)o(ered)d(all)h(the)f(bases,)g(but)h(b)q(efore)f(it)h (didn't)f(complain)i(at)d(all.)220 1122 y(2.)29 b(C)p Fu(++)18 b Fz(classes)g(are)g(no)o(w)f(formatted)g(\(iden)o(ti\014ed)j (as)d(reserv)o(ed)h(w)o(ords\))f(on)h(the)g(\014rst)285 1174 y(pass,)d(so)f(forw)o(ard)g(references)i(suc)o(h)g(as)405 1237 y Fu(@)24 b(The)f(class)g(|C|...)405 1289 y(@a)405 1340 y(class)g(C)453 1392 y({})285 1455 y Fz(will)15 b(no)o(w)e(w)o(ork.)19 b(Note)13 b(that)g Fp(t)o(yp)q(edef)h Fz(has)g(done)g(this)g(for)f(a)g(while,)i(although)f(there)285 1507 y(are)h(still)i(a)d(few)h(glitc)o(hes.)220 1570 y(3.)29 b(F)l(or)16 b(t)o(w)o(o)g(y)o(ears,)h(the)g(do)q(cumen)o (tation)g(has)g(describ)q(ed)i(t)o(w)o(o)d(con)o(trol)g(co)q(des)i(as)f (fol-)285 1621 y(lo)o(ws:)405 1684 y Fu(@~)24 b(---)f(inhibit)g(line)g (break.)405 1736 y(@+)h(---)f(force)g(an)h(index)f(entry.)285 1799 y Fz(Apparen)o(tly)11 b(the)g(co)q(de)g(had)g(these)g (de\014nitions)h(in)o(v)o(erted;)g(it)f(has)g(no)o(w)f(b)q(een)i (brough)o(t)285 1851 y(up)k(to)e(date)i(with)f(the)h(do)q(cumen)o (tation.)k(F)l(ortunately)15 b(these)h(commands)f(are)g(evi-)285 1902 y(den)o(tly)h(not)f(hea)o(vily)h(used,)f(since)i(no)e(one)g (complained.)220 1965 y(4.)29 b Fu(fwebmac.sty)11 b Fz(w)o(as)g (further)h(rew)o(ork)o(ed)f(to)g(in)o(teract)h(prop)q(erly)h(with)g (the)f(user)g(pac)o(k-)285 2017 y(age)f Fu(multicol)p Fz(.)18 b(If)12 b(in)h Fu(fweb.sty)d Fz(one)i(sa)o(ys)f(`)p Fu(LaTeX.package)i("multicol")p Fz(',)e(then)285 2069 y(the)17 b(t)o(w)o(o-column)g(index)h(is)g(done)f(with)g Fu(multicol)p Fz(;)g(this)g(giv)o(es)g(v)m(arious)h(impro)o(v)o(e-)285 2121 y(men)o(ts)12 b(o)o(v)o(er)g(the)g Fu(\\twocolumn)g Fz(format)f(that)h(w)o(as)f(used)i(previously)l(.)21 b(F)l(urthermore,)285 2173 y(it's)15 b(p)q(ossible)j(to)d(use)h(`)p Fu(multicol)p Fz(')e(to)h(do)g(one's)h(en)o(tire)g(do)q(cumen)o(t)g(in) g(t)o(w)o(o-column)285 2225 y(format.)22 b(This)17 b(turned)g(out)f(to) g(b)q(e)h(relativ)o(ely)g(simple,)h(but)e(one)h(needs)g(to)f(get)g(the) 285 2276 y(commands)g(in)h(the)f(prop)q(er)g(order.)22 b(See)17 b(Section)g(10.1.3.5)d([LIndex],)i(page)g(96)g(for)285 2328 y(more)c(details.)20 b(Tw)o(o-column)13 b(format)f(substan)o (tially)i(cuts)e(do)o(wn)h(the)g(white)g(space;)285 2380 y(I)j(sa)o(v)o(ed)e(ab)q(out)h(50\045)g(on)g(a)g(200-page)f(co)q(de.) 285 2443 y(One)g(kno)o(wn)g(glitc)o(h)g(with)g Fw(Fweb)p Fz(/)p Fu(multicol)f Fz(is)h(that)f(if)h(one)f(selects)i(page-n)o(um)o (b)q(er)285 2495 y(cross-references)f(instead)g(of)f(LaT)885 2505 y(E)910 2495 y(X)h(section)g(n)o(um)o(b)q(ers,)f(page)h (references)g(suc)o(h)f(as)285 2547 y(98c)k(don't)h(get)f(the)h('c')f (correct.)27 b(This)18 b(is)g(presumably)h(not)e(a)h(big)g(deal.)28 b(A)o(t)18 b(this)285 2598 y(p)q(oin)o(t,)d(assume)g(that)g(the)g(use)h (of)e Fu(multicol)h Fz(is)g(highly)i(exp)q(erimen)o(tal.)220 2661 y(5.)29 b(F)l(urther)15 b(bugs)g(in)h(the)g(C)f(and)g(C)p Fu(++)g Fz(pro)q(duction)h(rules)g(w)o(ere)f(\014xed.)p eop %%Page: 128 130 128 129 bop 75 -58 a Fz(Chapter)15 b(14:)k(NEW)c(FEA)l(TURES)1103 b(128)75 183 y Fy(14.4)32 b(V)-6 b(ersion)23 b(1.50)220 275 y Fz(1.)29 b(The)20 b(syn)o(tax)g(for)g(en)o(tries)g(in)h(the)g (initialization)i(\014le)e(`)p Fu(.fweb)p Fz(')e(\(see)h(Section)h (12.2)285 327 y([Initialization],)15 b(page)f(108\))e(has)h(b)q(een)h (mo)q(di\014ed)h(\(in)f(a)f(w)o(a)o(y)f(that)h(is)h(as)f(bac)o(kw)o (ard-)285 379 y(compatible)20 b(as)f(p)q(ossible\).)32 b(Previously)l(,)21 b(`)p Fu(+)p Fz(')d(mean)o(t)g(pro)q(cess)h(the)h (option)f(b)q(efore)285 431 y(the)14 b(command-line)j(options,)d(`)p Fu(-)p Fz(')f(mean)o(t)h(pro)q(cess)h(it)f(after.)19 b(This)c(con)o(v)o(en)o(tion)g(w)o(as)285 483 y(somewhat)f(hard)i(to)e (remem)o(b)q(er,)h(giv)o(en)h(the)g(statemen)o(t)e(that)g(an)o(y)h (command-line)285 535 y(option)20 b(could)h(b)q(e)g(put)f(in)o(to)g(`)p Fu(.fweb)p Fz(';)h(furthermore,)f(just)g(ab)q(out)g(ev)o(erything)g(in) 285 586 y(`)p Fu(.fweb)p Fz(')14 b(should,)h(in)h(fact,)f(b)q(e)h(pro)q (cessed)f(b)q(efore)h(the)f(command-line)i(options.)j(So)285 638 y(no)o(w)g(b)q(oth)g(`)p Fu(+)p Fz(')g(and)g(`)p Fu(-)p Fz(')g(mean)g(the)g(same)g(thing,)i(namely)f(pro)q(cess)f(b)q (efore)h(\(and)285 690 y(the)16 b(`)p Fu(+)p Fz(')f(notation)g(should)i (fade)f(a)o(w)o(a)o(y)e(as)h(time)h(go)q(es)g(on\).)21 b(If)16 b(y)o(ou)g(explicitly)i(w)o(an)o(t)285 742 y(something)e(to)g (b)q(e)h(pro)q(cessed)g(after)e(all)i(command-line)h(options)f(for)e (some)h(tric)o(ky)285 794 y(reason,)e(b)q(egin)j(it)e(with)h(`)p Fu(&)p Fz('.)j(I.e.,)c(scan)g(y)o(our)g(`)p Fu(.fweb)p Fz(')e(\014le)j(for)f(an)o(y)g(line)i(b)q(eginning)285 846 y(with)f(`)p Fu(-)p Fz(')e(and)h(replace)h(that)f(with)g(`)p Fu(&)p Fz('.)220 909 y(2.)29 b(The)15 b(LaT)454 918 y(E)480 909 y(X)g(pro)q(cessor)g(\(`)p Fu(-PL)p Fz('\))f(is)h(no)o(w)g(the)g (default.)220 971 y(3.)29 b(The)23 b(exp)q(erimen)o(tal)g(`)p Fu(fwebmacL.sty)p Fz(')d(macro)i(pac)o(k)m(age)g(supplied)j(with)e(v)o (ersion)285 1023 y(1.40)10 b(has)i(b)q(een)g(substan)o(tially)h(rew)o (ork)o(ed)e(and)h(is)g(no)o(w)f(the)g(default)i(`)p Fu(fwebmac.sty)p Fz('.)285 1075 y(Remo)o(v)o(e)i(an)o(y)g(reference)h(to)e(`)p Fu(fwebmacL.sty)p Fz(')f(from)i(y)o(our)f(`)p Fu(.fweb)p Fz(')g(\014le.)220 1138 y(4.)29 b(Supp)q(ort)12 b(for)f(LaT)599 1148 y(E)625 1138 y(X2e)g(is)h(no)o(w)g(pro)o(vided.)19 b(See)12 b(Section)h(10.1.3)d([LaT)l(eX],)g(page)i(93.)220 1201 y(5.)29 b(The)16 b(st)o(yle-\014le)g(parameter)f Fu(index.name)f Fz(w)o(as)g(added.)21 b(This)16 b(is)g(the)f(section)h (name)285 1253 y(to)f(b)q(e)h(giv)o(en)g(to)e(the)i(Index)g(\(see)g (Chapter)f(11)f([Index],)i(page)f(103\),)f(whic)o(h)i(should)285 1305 y(b)q(e)h(the)f(last)g(ma)s(jor)f(\(starred\))f(section.)23 b(It)17 b(b)q(ecomes)f(the)g(con)o(ten)o(ts)g(of)f(the)i(macro)285 1357 y Fu(\\INDEX)p Fz(.)i(Therefore,)c(one)g(can)g(end)h(one's)f (source)g(\014le)i(b)o(y)e(sa)o(ying)405 1419 y Fu(@*)24 b(\\INDEX.)220 1482 y Fz(6.)29 b(The)13 b(`)p Fu($IF...)p Fz(')e(class)i(of)g(built-in)i(functions)f(w)o(as)e(rew)o(ork)o(ed.)18 b(They)13 b(should)h(no)o(w)e(b)q(e)285 1534 y(more)g(robust,)g (recursiv)o(e,)h(and)g(in)o(tuitiv)o(e.)20 b(Simple)14 b(uses)f(of)e(these)i(functions)g(should)285 1586 y(w)o(ork)g(as)g(b)q (efore.)20 b(Ho)o(w)o(ev)o(er,)13 b(complicated)i(uses)f(that)f(dep)q (ended)j(on)e(tric)o(ky)g(things)285 1638 y(ab)q(out)g(the)g(order)f (of)h(expansion)g(of)g(argumen)o(ts)f(ma)o(y)g(require)i(revision.)20 b(Carefully)285 1690 y(compare)13 b(the)g(descriptions)i(of)e(these)g (functions)h(in)h(the)e(do)q(cumen)o(tation)h(\(e.g.,)e(see)285 1742 y(Section)h(7.2.3.23)e([$IF],)g(page)h(71\))g(with)h(y)o(our)f (usage)g(of)g(them)h(in)g(an)o(y)g(pre-existing)285 1793 y(co)q(de.)285 1856 y(In)20 b(some)g(cases,)g(if)g(a)g(previous)g (constructions)g(using)g Fu($IF)g Fz(no)f(longer)h(w)o(orks,)g(it)285 1908 y(migh)o(t)15 b(w)o(ork)f(if)i(y)o(ou)f(sa)o(y)405 1971 y Fu(@m)24 b($IF\(a,b,c\))e($$IF\(a,b,c\))285 2034 y Fz(and)g(then)h(use)f Fu($$IF)g Fz(in)g(y)o(our)g(co)q(de.)41 b(\(This)22 b(forces)g(an)g(extra)g(lev)o(el)h(of)f(macro)285 2086 y(expansion.\))e(The)c(same)f(remark)f(go)q(es)h(for)g Fu($DEFINE)p Fz(.)285 2148 y(The)g(old)h(forms)f(`)p Fu(_IF)p Fz(')f(etc.)19 b(no)d(longer)f(w)o(ork;)f(con)o(v)o(ert)g(to)h (`)p Fu($IF)p Fz('.)220 2211 y(7.)29 b(The)13 b(option)h(`)p Fu(-j)p Fz(')e(w)o(as)g(added.)20 b(This)14 b(inhibits)h(m)o(ultiple)g (inclusions)h(via)d(`)p Fu(@i)p Fz(')f(of)h(the)285 2263 y(same)i(include)i(\014le.)k(See)16 b(Section)g(4.2.22)e([-j],)g(page)h (22.)220 2326 y(8.)29 b(One)23 b(no)o(w)f(has)g(the)g(abilit)o(y)h(to)f (c)o(hange)g(the)g(commen)o(t)g(c)o(haracter)f(that)h(b)q(egins)285 2378 y Fw(Ft)m(angle)p Fz('s)16 b(`)p Fu(line)p Fz(')d(command.)20 b(In)c(the)f(st)o(yle)h(\014le,)f(sa)o(y)l(,)g(e.g.,)405 2441 y Fu(line_char.N)22 b('#')285 2503 y Fz(to)17 b(c)o(hange)h(the)h (default)f(`)p Fu(*line)p Fz(')f(output)g(b)o(y)h Fw(Ft)m(angle)h Fz(in)g Fw(F)o(or)m(tran)f Fz(mo)q(de)h(to)285 2555 y(`)p Fu(#line)p Fz('.)f(This)13 b(could)h(b)q(e)g(useful)g(if)f(one)h(runs)f (the)g(C)g(prepro)q(cessor)g(on)f(the)i(tangled)285 2607 y Fw(F)o(or)m(tran)h Fz(output.)220 2670 y(9.)29 b Fw(Fwea)l(ve)p Fz('s)15 b(pro)q(cessing)i(of)d Fp(t)o(yp)q(edef)i Fz(statemen)o(ts)e (in)i(C)f(and)g(C)p Fu(++)g Fz(w)o(as)g(impro)o(v)o(ed.)p eop %%Page: 129 131 129 130 bop 75 -58 a Fz(Chapter)15 b(14:)k(NEW)c(FEA)l(TURES)1103 b(129)197 183 y(10.)29 b Fw(Fweb)20 b Fz(should)g(no)o(w)e(b)q(e)h (able)h(to)e(pro)q(cess)h(C)p Fu(++)f Fz(templates)h(and)g(exception)h (han-)285 235 y(dling,)14 b(at)f(least)g(in)h(simple)g(situations.)20 b(The)13 b(t)o(yp)q(esetting)g(of)f(C)p Fu(++)h Fz(references)h (\(e.g.,)285 287 y(`)p Fu(int&)p Fz('\))g(w)o(as)g(also)h(impro)o(v)o (ed.)20 b(Please)c(rep)q(ort)f(an)o(y)g(di\016culties.)197 347 y(11.)29 b(There)15 b(w)o(ere)g(v)m(arious)h(miscellaneous)h (obscure)f(bug)f(\014xes.)75 464 y Fy(14.5)32 b(V)-6 b(ersion)23 b(1.40)220 553 y Fz(1.)29 b Fs(The)20 b(meaning)g(of)f(`)p Fu(@+)p Fs(')g(has)g(c)o(hanged.)33 b Fz(\(SORR)l(Y!\))21 b(F)l(ormerly)l(,)f(this)g(inhibited)i(a)285 605 y(line)d(break;)g (that)e(function)i(is)f(no)o(w)f(p)q(erformed)i(b)o(y)e(`)p Fu(@~)p Fz('.)27 b(The)18 b(new)g(meaning)g(of)285 657 y(`)p Fu(@+)p Fz(')12 b(is)i(to)e(force)h(an)g(index)i(en)o(try)e (\(the)g(opp)q(osite)g(of)g(`)p Fu(@-)p Fz(',)f(whic)o(h)i(inhibits)i (an)d(index)285 709 y(en)o(try\).)285 769 y(If)i(y)o(ou)f(ha)o(v)o(e)h (large)g(co)q(des)g(using)g(the)g(old)g(`)p Fu(@+)p Fz(')f(that)g(y)o (ou)h(do)f(not)h(wish)g(to)f(con)o(v)o(ert,)285 821 y(y)o(ou)g(can)h (reco)o(v)o(er)f(the)h(old)g(mappings)h(b)o(y)e(placing)i(the)f(follo)o (wing)g(commands)g(in)o(to)285 873 y(`)p Fu(fweb.sty)p Fz(':)405 934 y Fu(yes_index)23 b(=)g("~")405 985 y(no_line_break)f(=)i ("+")285 1046 y Fz(Ho)o(w)o(ev)o(er,)13 b(please)h(try)f(to)g(mak)o(e)h (the)f(con)o(v)o(ersion;)h(the)g(new)g(co)q(des)g(are)g(in)o(tended)h (to)285 1098 y(b)q(e)h(more)f(symmetrical)g(and)h(easier)f(to)g(remem)o (b)q(er.)220 1158 y(2.)29 b Fs(Built-in)19 b(functions)f(no)o(w)f(b)q (egin)h(with)f(`)p Fu($)p Fs(',)f(not)h(`)p Fu(_)p Fs('.)24 b Fz(The)18 b(underscore)f(pre\014x)h(w)o(as)285 1210 y(a)f(bad)h(design)h(decision;)h(it)e(in)o(tro)q(duces)g(con\015icts)h (with)f(ANSI)g(C)g(in)g(certain)g(cir-)285 1262 y(cumstances.)j(T)l(o) 15 b(ease)g(con)o(v)o(ersion,)g(the)h(old)g(forms)e(are)i(still)g (understo)q(o)q(d.)21 b(Th)o(us,)285 1314 y(one)16 b(can)h(use)f(`)p Fu($EVAL)p Fz(')f(and)h(`)p Fu(_EVAL)p Fz(')f(in)o(terc)o(hangably)l(.) 23 b(Ho)o(w)o(ev)o(er,)15 b Fs(do)h(not)g(use)j Fz(the)285 1366 y(underscore)d(forms;)e(they)h(will)i(b)q(e)f(deleted)g(in)g (future)g(releases.)220 1426 y(3.)29 b Fs(F)l(ull)20 b(LaT)456 1436 y(E)482 1426 y(X)f(supp)q(ort.)32 b Fw(Fweb)20 b Fz(no)f(longer)g(usurps)g(LaT)1305 1436 y(E)1331 1426 y(X's)g Fu(\\output)f Fz(routine,)285 1478 y(and)c(LaT)448 1488 y(E)474 1478 y(X's)f(sectioning)i(commands,)f(T)l(able-of-Con)o (ten)o(ts)f(commands,)h(etc.)19 b(are)285 1530 y(used.)g(The)12 b(app)q(earance)f(of)g(the)h(w)o(o)o(v)o(en)e(output)h(is)h(c)o(hanged) f(to)g(b)q(e)h(more)f(b)q(o)q(ok-lik)o(e.)285 1582 y(\(This)k(is)h(an)f (exp)q(erimen)o(t.\))220 1642 y(4.)29 b Fs(V)l(erbatim)15 b(language.)20 b Fz(`)p Fu(@Lv)p Fz(')14 b(selects)h(a)g (language-indep)q(enden)o(t)i(format.)i(See)c(Sec-)285 1694 y(tion)g(8.2.6)f([V)l(erbatim],)h(page)g(88)220 1754 y(5.)29 b Fs(Language-indep)q(enden)o(t)18 b(mo)q(de.)k Fz(The)16 b(N)g(mo)q(de)g(inhibits)i(prett)o(y-prin)o(ting,)e(blank)285 1806 y(compression,)h(etc.;)g(source)g(co)q(de)g(is)h(essen)o(tially)g (copied)g(literally)h(from)d(input)i(to)285 1858 y(output.)h(This)14 b(mo)q(de)g(is)g(turned)g(on)g(automatically)g(b)o(y)g(the)f Fw(verba)m(tim)h Fz(language,)285 1910 y(but)k(it)g(can)g(also)g(b)q(e) g(used)h(with)f(the)g(other)f(languages.)28 b(It)18 b(is)g(turned)g(on) g(b)o(y)g(the)285 1962 y(command-line)i(option)f(`)p Fu(-N)p Fz(')e(or)h(the)g(lo)q(cal)h(command)g(`)p Fu(@N)p Fz('.)28 b(See)19 b(Section)g(5.5.17)285 2014 y([A)l(TN)p 398 2014 14 2 v 16 w(],)c(page)g(46.)220 2074 y(6.)29 b Fs(W)l(riting)13 b(of)f(temp)q(orary)g(\014les.)19 b Fz(When)13 b(the)g(`)p Fu(-F)p Fz(')e(command-line)j(option)f(is)f (in)i(e\013ect,)285 2126 y(tangled)g(output)e(is)i(written)f(to)g(temp) q(orary)f(\014les)i(instead)g(of)e(the)i(\014nal)g(target)d(\014les,) 285 2178 y(and)k(the)f(temp)q(orary)g(\014les)i(are)e(compared)h(to)f (the)g(last)h(v)o(ersion)g(of)f(the)h(target)e(\014les)285 2230 y(on)i(disk.)20 b(If)c(there)f(is)g(no)g(c)o(hange,)f(the)h (target)f(\014les)i(are)f(not)f(up)q(dated.)21 b(This)15 b(a)o(v)o(oid)285 2281 y(unnecessary)20 b(recompilation)h(if)f(only)g (the)g(do)q(cumen)o(tation,)g(not)f(the)h(co)q(de,)h(w)o(as)285 2333 y(c)o(hanged.)f(See)c(Section)g(4.2.15)d([-F)p 910 2333 V 16 w(],)i(page)g(19.)220 2394 y(7.)29 b Fs(Con)o(v)o(erting)15 b(output)g(tok)o(ens)f(to)h(lo)o(w)o(er)g(case.)20 b Fz(See)15 b(Section)i(4.2.61)c([-U)p 1534 2394 V 16 w(],)h(page)i(32.) 220 2454 y(8.)29 b Fs(The)18 b(built-in)i(functions)f(`)p Fu($E)p Fs(')e(and)h(`)p Fu($PI)p Fs('.)27 b Fz(See)19 b(Section)f(7.2.3.15)e([$E],)g(page)i(70,)285 2506 y(Section)e (7.2.3.47)d([$PI],)h(page)h(76.)220 2566 y(9.)29 b Fs(The)19 b(built-in)i(functions)f(`)p Fu($EXP)p Fs(',)e(`)p Fu($LOG)p Fs(',)g(and)h(`)p Fu($LOG10)p Fs('.)28 b Fz(See)20 b(Section)f (7.2.3.18)285 2618 y([$EXP],)f(page)g(71,)h(Section)h(7.2.3.37)d ([$LOG],)h(page)g(75,)h(and)h(Section)f(7.2.3.38)285 2670 y([$LOG10],)14 b(page)h(75.)p eop %%Page: 130 132 130 131 bop 75 -58 a Fz(Chapter)15 b(14:)k(NEW)c(FEA)l(TURES)1103 b(130)197 183 y(10.)29 b Fs(`)p Fu($MAX)p Fs(')14 b(and)h(`)p Fu($MIN)p Fs(')f(generalized)j(to)d(tak)o(e)g(arbitrary)h(list)h(of)f (argumen)o(ts.)j Fz(See)e(Sec-)285 235 y(tion)f(7.2.3.40)e([$MAX],)h (page)h(75,)f(Section)i(7.2.3.41)d([$MIN],)h(page)h(75.)197 299 y(11.)29 b Fs(The)16 b(marriage-sa)o(v)o(er)e(option)p Fz(.)22 b(In)17 b(resp)q(onse)f(to)f(a)h(serious)g(user)g(request,)f (see)h(Sec-)285 351 y(tion)f(4.2.6)f([-B)p 550 351 14 2 v 16 w(],)h(page)g(17.)p eop %%Page: 131 133 131 132 bop 75 -58 a Fz(Chapter)15 b(15:)k(SUPPOR)l(T)1259 b(131)75 183 y Ft(15)41 b(SUPPOR)-7 b(T)137 300 y Fw(Fweb)24 b Fz(is)e(supp)q(orted)h(b)o(y)g(John)f(Krommes,)i Fu (krommes@princeton.edu)p Fz(.)38 b(This)23 b(pro)s(ject)e(is)i(a)75 355 y(de\014nitiv)o(ely)d Fs(spare-time)e(activit)o(y)t Fz(!!!)26 b(Bug)18 b(rep)q(orts)f(submitted)h(with)g(v)o(ery)g(short)f (test)g(\014les)h(will)h(b)q(e)75 410 y(v)o(eri\014ed,)f(although)e (not)g(necessarily)i(in)g(real)f(time.)24 b(F)l(or)16 b(v)o(ery)g(simple)i(\014xes,)f(a)f(c)o(hange)h(\014le)g(ma)o(y)f(b)q (e)75 465 y(pro)o(vided.)35 b(Generally)l(,)22 b(ho)o(w)o(ev)o(er,)e (bugs)h(are)e(not)h(\014xed)h(un)o(til)g(the)f(next)g(release.)35 b(Releases)22 b(o)q(ccur)75 519 y(in)o(termitten)o(tly)l(,)16 b(dep)q(ending)h(on)e(m)o(y)g(man)o(y)g(other)g(professional)g (obligations.)137 587 y(Suggestions)j(are)g(v)o(ery)f(w)o(elcome.)28 b(Man)o(y)17 b(of)g Fw(Fweb)p Fz('s)i(curren)o(t)e(features)g(w)o(ere)h (incorp)q(orated)g(in)75 642 y(resp)q(onse)g(to)f(users')g(requests.)26 b(Ho)o(w)o(ev)o(er,)17 b(the)g(queue)h(for)f(future)g(impro)o(v)o(emen) o(ts)g(is)h(long;)g(nothing)75 696 y(ma)o(y)12 b(happ)q(en)i (immediately)l(.)21 b(The)13 b(next)h(ma)s(jor)d(release)j(of)e Fw(Fweb)p Fz(,)i(V)l(ersion)g(2.00,)e(is)h(planned)i(for)d(ap-)75 751 y(pro)o(ximately)g(the)g(y)o(ear)f(2000.)18 b(\(Y)l(ou)11 b(ma)o(y)g(b)q(e)i(reliev)o(ed)g(to)e(kno)o(w)h(that,)f(to)g(the)h(b)q (est)g(of)f(m)o(y)h(kno)o(wledge,)75 806 y Fw(Fweb)k Fz(do)q(es)g(not)f(su\013er)f(from)h(the)g(Y2K)g(bug.\))137 873 y(This)h(info)g(do)q(cumen)o(tation)f(is)h(no)o(w)f(accessible)i (on)e(the)g(W)l(orld-Wide)i(W)l(eb)e(from)195 937 y Fu (http://w3.pppl.gov/~kromme)o(s/fweb_)o(toc.html)o Fz(.)137 1005 y(Y)l(ou)20 b(can)f(subscrib)q(e)i(to)d(one)h(or)g(b)q(oth)g(of)g (t)o(w)o(o)f Fw(Fweb)i Fz(mailing)g(lists,)h Fu(fweb-users)c Fz(and)j Fu(fweb-)75 1060 y(installers)p Fz(.)i(T)l(o)16 b(subscrib)q(e,)h(send)g(e-mail)h(to)d Fu(majordomo@pppl.gov)p Fz(.)21 b(In)c(the)f Fs(b)q(o)q(dy)21 b Fz(of)16 b(the)g(mes-)75 1114 y(sage,)e(sa)o(y)l(,)h(e.g.,)195 1179 y Fu(subscribe)f(fweb-users) 75 1246 y Fz(Y)l(ou)22 b(will)h(receiv)o(e)g(in)o(tro)q(ductory)e (information)h(describing)i(ho)o(w)d(these)h(lists)g(are)f(in)o(tended) i(to)e(b)q(e)75 1301 y(used.)35 b(T)l(o)20 b(unsubscrib)q(e)i(at)e(an)o (y)g(time,)h(substitute)f Fu(unsubscribe)f Fz(for)g Fu(subscribe)g Fz(in)i(the)f(ab)q(o)o(v)o(e)75 1356 y(instructions.)137 1423 y(Arc)o(hiv)o(e)c(\014les)g(con)o(taining)g(the)f(messages)g(sen)o (t)g(to)g(the)g Fw(Fweb)h Fz(mailing)h(lists)f(are)f(k)o(ept)g(in)195 1487 y Fu(ftp.pppl.gov:/pub/fweb/arc)o(hive/fw)o(eb-{user)o(s,insta)o (llers}.)o(archive)p Fz(.)75 1554 y(In)25 b(addition)h(to)e(anon)o (ymous)g Fu(ftp)p Fz(,)j(these)e(\014les)g(ma)o(y)f(b)q(e)i(obtained)f (b)o(y)g(sending)h(a)e(message)h(to)75 1609 y Fu(majordomo@pppl.gov)13 b Fz(of)h(the)i(form)195 1673 y Fu(get)f(fweb-users)f (fweb-users.archive)p Fz(.)p eop %%Page: 132 134 132 133 bop 75 -58 a Fz(App)q(endix)17 b(A:)e(Installing)i Fw(Fweb)1140 b Fz(132)75 183 y Ft(App)r(endix)25 b(A)41 b(Installing)25 b Fv(Fweb)137 300 y Fz(Here)16 b(is)f(the)h(bare-b)q (ones)g(installation)g(pro)q(cedure)g(for)f Fw(unix)f Fz(users:)100 368 y(1.)29 b(Do)o(wnload)14 b(the)g Fu(zgip)p Fz(-compressed)g Fu(tar)g Fz(\014le)h(from)e Fu(ftp.pppl.gov:/pub/fweb) p Fz(.)k(The)d(name)g(of)165 422 y(the)h(\014le)i(con)o(tains)e(the)g (v)o(ersion)h(n)o(um)o(b)q(er|e.g.,)e(`)p Fu(fweb-1.61.tar.gz)p Fz('.)285 487 y Fu(ftp)23 b(ftp.pppl.gov)285 539 y(bin)285 590 y(get)g(fweb-1.61.tar.gz)285 642 y(quit)100 710 y Fz(2.)29 b(Uncompress)15 b(and)h(unpac)o(k)f(the)h(tar)e(\014le:)285 774 y Fu(gunzip)23 b(fweb-1.61.tar.gz)285 826 y(tar)g(-xf)h (fweb-1.61.tar)165 893 y Fz(If)15 b(the)h(GNU)f Fu(tar)f Fz(is)i(installed,)h(these)e(t)o(w)o(o)f(steps)h(can)h(b)q(e)g(com)o (bined)g(in)o(to)285 957 y Fu(gtar)23 b(-xzf)h(fweb-1.61.tar.gz)165 1025 y Fz(Unpac)o(king)14 b(creates)f(the)g(directory)g(`)p Fu(fweb-1.61)p Fz(',)e(with)i(at)g(least)g(the)g(t)o(w)o(o)e(sub)q (directories)k(`)p Fu(Web)p Fz(')165 1079 y(and)g(`)p Fu(Manual)p Fz('.)100 1147 y(3.)29 b(Change)15 b(to)g(the)g(new)g(`)p Fu(Web)p Fz(')f(sub)q(directory)j(and)e(run)g(the)h(con\014guration)f (script.)285 1211 y Fu(cd)24 b(fweb-1.61/Web)285 1263 y(./configure)165 1330 y Fz(`)p Fu(./configure)p Fz(')c(is)i(an)g Fu(sh)g Fz(script.)40 b(It)22 b(attempts)f(to)g(\014gure)h(out)g(v)m (arious)g(lo)q(cal)i(system)d(fea-)165 1385 y(tures)i(automatically)l (,)j(then)d(generates)g(the)h(three)f(\014les)h(`)p Fu(defaults.mk)p Fz(',)f(`)p Fu(config.h)p Fz(',)g(and)165 1440 y(`)p Fu(custom.h)p Fz(';)16 b(those)h(are)g(used)h(in)g(the)f Fu(make)p Fz(.)26 b(F)l(or)17 b(further)g(information)g(ab)q(out)g(the) h(op)q(eration)165 1495 y(of)d(`)p Fu(./configure)p Fz(',)d(see)k(`)p Fu(fweb-1.61/READ_ME.FWEB)o Fz('.)100 1562 y(4.)29 b(Mak)o(e)14 b(and)i(install)g(the)g(release:)285 1626 y Fu(make)23 b Fs([)6 b Fu(CFLAGS=')p Fs(sp)q(ecial)16 b(compiler)g(\015ags)r Fu(')p Fs(])285 1678 y Fu(make)23 b(install)165 1745 y Fz(If)16 b Fu(gcc)e Fz(is)i(a)o(v)m(ailable,)h(it)f(will)h(b)q(e)f (used)f(in)i(the)e Fu(make)p Fz(;)f(in)j(that)d(case,)h(the)h(default)g Fu(CFLAGS)e Fz(should)165 1800 y(b)q(e)20 b(su\016cien)o(t.)35 b(If)20 b(another)f(compiler)j(is)e(used,)h(ensure)g(that)e(it)h(is)g (run)g(in)h(ANSI-compatible)165 1855 y(mo)q(de,)15 b(not)g(the)g (old-st)o(yle)h(Kernighan)h(and)e(Ritc)o(hie.)165 1922 y Fw(Fweb)25 b Fz(compiles)g(on)e(m)o(y)g(system)g(without)h(an)o(y)f (w)o(arnings)g(with)h(`)p Fu(gcc)15 b(-ansi)f(-pedantic)p Fz(')n(.)165 1977 y(Please)i(rep)q(ort)f(an)o(y)g(compiler)h(w)o (arnings)f(from)f(an)i(allegedly)h(ANSI-C)f(en)o(vironmen)o(t.)p eop %%Page: 133 135 133 134 bop 75 -58 a Fz(Concept)15 b(index)1447 b(133)75 183 y Ft(Concept)27 b(index)75 359 y Fy(.)75 417 y Ff(.false.)11 b Fe(.)c(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(87)75 467 y(.true.)5 b Fe(.)h(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)18 b Ff(87)75 574 y Fy(@)75 632 y Ff(@,)12 b(literal)g Fe(.)6 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)22 b Ff(7)75 738 y Fy(A)75 796 y Ff(Absolute)14 b(v)n(alue)s Fe(.)8 b(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)16 b Ff(68)75 846 y(Allo)q(cation,)f(memory)6 b Fe(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(35,)13 b(108)75 896 y(ASCI)q(I,)f(con)o(v)o(erting)j(to)6 b Fe(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(51,)13 b(68)75 946 y(Asserting)h(a)f (condition)8 b Fe(.)h(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(68)75 996 y(Assignmen)o(t)14 b(op)q(erators,)g(comp)q(ound)f Fe(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(37,)13 b(87)75 1045 y(Author)7 b Fe(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(68)75 1095 y(Automatic)14 b(pseudo-semicolons)6 b Fe(.)i(.)e(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)17 b Ff(24,)c(58,)g(88)75 1145 y(Automatic)h (semicolons)6 b Fe(.)i(.)e(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)18 b Ff(24,)13 b(87)75 1252 y Fy(B)75 1310 y Ff(Bar,)g(v)o(ertical)c Fe(.)f(.)e(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)21 b Ff(39,)13 b(56)75 1360 y(Binary)h(notation)5 b Fe(.)k(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) 18 b Ff(84,)13 b(85)75 1409 y(Blo)q(c)o(ks,)h(n)o(um)o(b)q(ering)t Fe(.)8 b(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)16 b Ff(17,)d(25,)g(30)75 1459 y(Brac)o(k)o(ets,)g (activ)o(e)g Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) 24 b Ff(33)75 1509 y(Breakp)q(oin)o(ts,)15 b(inserting)d Fe(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(41)75 1559 y(Breakp)q(oin)o (ts,)15 b(suppressing)t Fe(.)8 b(.)e(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)16 b Ff(41)75 1609 y(Bugs)8 b Fe(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(131)75 1658 y(Bugs,)13 b(v)o(ersion)i(1.61)8 b Fe(.)e(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)21 b Ff(126)75 1708 y(built-in)16 b(functions,)e(rede\014ning)8 b Fe(.)g(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(31)75 1758 y(Bullet)7 b Fe(.)h(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(114)75 1808 y(Bullet)15 b(subscript)c Fe(.)c(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)23 b Ff(115)75 1914 y Fy(C)75 1973 y Ff(C)13 b(hin)o(ts)6 b Fe(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(84)75 2022 y(C)p Fd(++)12 b Ff(hin)o(ts)s Fe(.)c(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)16 b Ff(85)75 2072 y(Case,)d(c)o(hanging)5 b Fe(.)j(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)17 b Ff(73,)c(78)75 2122 y(Class)h(options)7 b Fe(.)h(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(93)75 2172 y(Co)q(de)13 b(mo)q(de)8 b Fe(.)f(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(7)75 2222 y(Co)q(de)13 b(part,)g(b)q(eginning)j(unnamed)d Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)23 b Ff(40)75 2271 y(Co)q(de,)13 b(con)o(v)o(erting)i(to)e Fc(Fweb)7 b Fe(.)t(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)19 b Ff(121)75 2321 y(Co)q(de,)13 b(temp)q(orarily)i(commen)o(ting)g(out)5 b Fe(.)i(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)18 b Ff(61,)13 b(86)75 2371 y(Co)q(de,)g(t)o(yp)q(esetting)5 b Fe(.)j(.)e(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(7)75 2421 y(Colon,)c(pseudo)9 b Fe(.)e(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)21 b Ff(59)75 2471 y(Color)s Fe(.)7 b(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)16 b Ff(117)75 2521 y(Color)e(mo)q(de,)f (ANSI)t Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)17 b Ff(117)75 2570 y(Color)d(mo)q(de,)f(bilev)o(el)6 b Fe(.)j(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(117)75 2620 y(Color)14 b(mo)q(de,)f(trilev)o(el)f Fe(.)6 b(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)23 b Ff(117)75 2670 y(Color)14 b(mo)q(de,)f(user-de\014ned)f Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)23 b Ff(117)1012 359 y(Color,)14 b(and)f(message)h(t)o (yp)q(es)7 b Fe(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)19 b Ff(117)1012 409 y(Color,)14 b(ANSI)5 b Fe(.)g(.)i(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)17 b Ff(117)1012 459 y(Color,)d(setting)t Fe(.)7 b(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(18)1012 509 y(Columns,)c(m)o(ultiple)7 b Fe(.)i(.)d(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)20 b Ff(96)1012 558 y(Commands,)14 b(rede\014ned)t Fe(.)8 b(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(124)1012 608 y(Commen)o(tary)m(,)c(optional)c Fe(.)g(.)d(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)22 b Ff(7)1012 658 y(Commen)o(ting)15 b(st)o(yles)c Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)23 b Ff(60)1012 708 y(Commen)o(ts)7 b Fe(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)20 b Ff(52,)13 b(60)1012 758 y(Commen)o(ts,)g Fc(F)o(or)n(tran)6 b Fe(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)19 b Ff(27)1012 807 y(Commen)o(ts,)13 b(generating)7 b Fe(.)h(.)e(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)20 b Ff(68)1012 857 y(Commen)o(ts,)13 b(ignorable)c Fe(.)g(.)d(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)22 b Ff(52)1012 907 y(Commen)o(ts,)13 b(ignore)h(single-li)q(ne)i(F)m(ortran)s Fe(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(25)1012 957 y(Commen)o(ts,)c(in)o(visibl)q(e)c Fe(.)g(.)d(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)22 b Ff(60)1012 1007 y(Commen)o(ts,)13 b(short)t Fe(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(37,)c(86)1012 1056 y(Commen)o(ts,)g(temp)q(orary)7 b Fe(.)g(.)f(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) 20 b Ff(61)1012 1106 y(Commen)o(ts,)13 b(T)1236 1114 y(E)1257 1106 y(X)8 b Fe(.)d(.)h(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)21 b Ff(31)1012 1156 y(Commen)o(ts,)13 b(v)o(erbatim)g Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)25 b Ff(32)1012 1206 y(Commen)o(ts,)13 b(visible)8 b Fe(.)h(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)21 b Ff(60)1012 1256 y(Compiler)15 b(directiv)o(es)7 b Fe(.)i(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(53)1012 1306 y(Completion,)15 b(automatic)f(\014le-name)6 b Fe(.)h(.)f(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(12)1012 1355 y(Concatenation)6 b Fe(.)i(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)19 b Ff(27)1012 1405 y(Condition,)c(asserting)c Fe(.)c(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(68)1012 1455 y(Conditional)q(,)15 b(n-w)o(a)o(y)c Fe(.)6 b(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)24 b Ff(71)1012 1505 y(Conditional)q(,)15 b(t)o(w)o(o-w)o(a)o(y)c Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)25 b Ff(71,)13 b(72)1012 1555 y(Con)o(ten)o(ts,)g(table)h(of)e Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)25 b Ff(96)1012 1604 y(Con)o(trol)14 b(text)7 b Fe(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(55)1012 1654 y(Con)o(v)o(erting)15 b(an)e(existing)i(co)q(de)f(to)f Fc(Fweb)8 b Fe(.)d(.)h(.)g(.)g(.)g(.)g(.)g(.)h(.)20 b Ff(121)1012 1704 y(Cross-references,)14 b(eliminating)7 b Fe(.)i(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)20 b Ff(34)1012 1754 y(Cross-references,)14 b(suppressing)t Fe(.)8 b(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)17 b Ff(34)1012 1804 y(Customization)t Fe(.)9 b(.)d(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(107)1012 1853 y(Customizing)e Fc(Fweb)8 b Fe(.)d(.)h(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)20 b Ff(107)1012 1955 y Fy(D)1012 2013 y Ff(Date)11 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)23 b Ff(68)1012 2062 y(Date,)13 b(generating)i(the)6 b Fe(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)19 b Ff(68)1012 2112 y(Da)o(y)m(,)13 b(generating)i(the)5 b Fe(.)i(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)18 b Ff(68)1012 2162 y(Debugging)7 b Fe(.)i(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)20 b Ff(16,)13 b(38)1012 2212 y(Debugging)j(macros)7 b Fe(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(70)1012 2262 y(Do)q(cumen)o(tation)c(format)t Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)17 b Ff(91)1012 2312 y(Dot)d(constan)o(ts,)f (recognizing)7 b Fe(.)i(.)d(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)20 b Ff(35)1012 2413 y Fy(E)1012 2471 y Ff(En)o(vironmen)o(t)15 b(v)n(ariables)d Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)23 b Ff(71,)12 b(107)1012 2521 y(En)o(vironmen)o(t,)j (obtaining)h(the)6 b Fe(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(71)1012 2570 y(Error)14 b(messages,)f(prin)o(ting)7 b Fe(.)i(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(70)1012 2620 y(Escap)q(e)14 b(sequences,)g(ANSI)8 b Fe(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)20 b Ff(118)1012 2670 y(Example,)15 b(of)d Fc(Fweb)g Ff(\014le)c Fe(.)g(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)21 b Ff(6)p eop %%Page: 134 136 134 135 bop 75 -58 a Fz(Concept)15 b(index)1447 b(134)75 183 y Ff(Exp)q(onen)o(tiation)6 b Fe(.)i(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(71,)c(76,)g(87)75 233 y(Expression)i(ev)n(aluation)t Fe(.)9 b(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(81)75 283 y(Expression,)e(pseudo)c Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) 22 b Ff(57)75 333 y(Expressions,)15 b(ev)n(aluating)8 b Fe(.)h(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(70)75 439 y Fy(F)75 497 y Ff(F)m(eatures,)13 b(new)e Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)23 b Ff(124)75 547 y(F)m(eatures,)13 b(v)o(ersion)i(1.40)t Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(129)75 597 y(F)m(eatures,)c(v)o(ersion)i(1.50)t Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(128)75 647 y(F)m(eatures,)c(v)o (ersion)i(1.52)t Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(127)75 697 y(F)m(eatures,)c(v)o(ersion)i(1.53)t Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(126)75 746 y(F)m(eatures,)c(v)o (ersion)i(1.61)t Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(125)75 796 y(File,)d(including)i(w)o(eb)5 b Fe(.)i(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)18 b Ff(43,)13 b(44)75 846 y(File,)h(initiali)q(zati)q(on)g Fe(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(108)75 896 y(File,)14 b(op)q(ening)h(output)6 b Fe(.)h(.)f(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)19 b Ff(47)75 946 y(File,)14 b(R)o(CS)e Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)24 b Ff(76)75 996 y(File,)14 b(st)o(yle)d Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) 23 b Ff(112)75 1045 y(File-name)15 b(completion)6 b Fe(.)i(.)e(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)18 b Ff(12)75 1095 y(Files)13 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(12)75 1145 y(Files,)14 b(c)o(hange)e Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)23 b Ff(13)75 1195 y(Files,)14 b(input)6 b Fe(.)h(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)18 b Ff(12)75 1245 y(Files,)c(output)e Fe(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(13)75 1294 y(F)m(on)o(ts)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)17 b Ff(92)75 1344 y(F)m(ormatting)7 b Fe(.)h(.)e(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(91)75 1394 y Fc(F)o(or)n(tran)12 b Ff(hin)o(ts)c Fe(.)g(.)e(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(85)75 1444 y Fc(F)o(or)n(tran)p Ff(,)12 b(Rational)6 b Fe(.)j(.)d(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)19 b Ff(89)75 1494 y(F)m(unctions,)14 b(built-in)6 b Fe(.)j(.)d(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(66)75 1544 y(F)m(unctions,)14 b(in)o(trinsic)9 b Fe(.)g(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)21 b Ff(18)75 1593 y(FWEB)14 b(output,)f(inserting)i(in)o(to)f(LaT)m(eX)f(do)q(cumen) o(t)155 1643 y Fe(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)16 b Ff(99)75 1693 y Fc(Fweb)p Ff(,)c(customizing)c Fe(.)g(.)e(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)h(.)f(.)g(.)20 b Ff(107)75 1743 y Fc(Fweb)p Ff(,)12 b(initiali)q(zin)q(g)h Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(108)75 1849 y Fy(H)75 1907 y Ff(Header)8 b Fe(.)f(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(71)75 1957 y(Header)13 b(commen)o(ts,)g(prin)o(ting)g Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)23 b Ff(31)75 2007 y(Headers)9 b Fe(.)e(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22 b Ff(98)75 2057 y(Hexadecimal)15 b(notation)s Fe(.)8 b(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)16 b Ff(85)75 2107 y(Hin)o(ts,)d(C)5 b Fe(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)18 b Ff(84)75 2157 y(Hin)o(ts,)13 b(C)p Fd(++)e Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)24 b Ff(85)75 2206 y(Hin)o(ts,)13 b Fc(F)o(or)n(tran)8 b Fe(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)20 b Ff(85)75 2256 y(Hin)o(ts,)13 b(T)210 2264 y(E)231 2256 y(X)c Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)22 b Ff(88)75 2363 y Fy(I)75 2421 y Ff(I/O)13 b(k)o(eyw)o(ords)t Fe(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)16 b Ff(18)75 2471 y(Iden)o(ti\014cation)8 b Fe(.)h(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)20 b Ff(71)75 2521 y(Iden)o(ti\014er,)14 b(formatting)d Fe(.)c(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(42)75 2570 y(Iden)o(ti\014ers,)14 b(o)o(v)o(erloading)7 b Fe(.)i(.)d(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)20 b Ff(50,)13 b(102)75 2620 y(Iden)o(ti\014ers,)h (single-c)o(haracter)t Fe(.)9 b(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)16 b Ff(33)75 2670 y(Iden)o(ti\014ers,)e(truncating)t Fe(.)9 b(.)d(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)17 b Ff(32)1012 183 y(Include)e(\014le,)e(formatting)h(name)g (of)6 b Fe(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)19 b Ff(43)1012 233 y(Include)c(\014le,)e(prin)o(ting)j(name)d(of)e Fe(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)25 b Ff(43)1012 283 y(Include)15 b(\014les,)f(\014nding)9 b Fe(.)f(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)22 b Ff(21)1012 333 y(Include)15 b(\014les,)f(indexing)t Fe(.)9 b(.)d(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)18 b Ff(21)1012 382 y(Include)d(\014les,)f(inhibiting)h Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)25 b Ff(22)1012 432 y(Include)15 b(\014les,)f(scanning)f Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)24 b Ff(20)1012 482 y(Include)15 b(\014les,)f(skipping)5 b Fe(.)k(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(21)1012 532 y(Index)8 b Fe(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(7,)13 b(96)1012 582 y(Index)h(en)o(tries,)g(deleting)9 b Fe(.)f(.)e(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)22 b Ff(54)1012 632 y(Index)14 b(en)o(tries,)g(forcing)d Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(54)1012 681 y(Index)14 b(en)o(tries,)g(Roman)f(t)o(yp)q(e)6 b Fe(.)h(.)f(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)19 b Ff(54)1012 731 y(Index)14 b(en)o(tries,)g(t)o(yp)q(ewriter)g(t)o(yp)q (e)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)18 b Ff(54)1012 781 y(Index)c(en)o(tries,)g(underlining)7 b Fe(.)i(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)19 b Ff(54)1012 831 y(Index)14 b(en)o(tries,)g (user)f(format)t Fe(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)17 b Ff(54)1012 881 y(Index,)d(name)f(of)c Fe(.)d(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)22 b Ff(113)1012 930 y(Index,)14 b(stand-alone)5 b Fe(.)j(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(103)1012 980 y(Indexes,)c(merging)d Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)22 b Ff(105)1012 1030 y(Indexing)15 b(commands)d Fe(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(54)1012 1080 y(Information)15 b(options)s Fe(.)8 b(.)e(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)17 b Ff(37)1012 1130 y(Initializa)q(tion)g(\014le)5 b Fe(.)i(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)17 b Ff(108)1012 1180 y(Input)d(line,)g(n)o(um)o(b)q(er)g(of)7 b Fe(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)20 b Ff(72)1012 1229 y(Installing)c Fc(Fweb)8 b Fe(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)21 b Ff(132)1012 1279 y(In)o(trinsic)15 b(functions)9 b Fe(.)f(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)22 b Ff(18)1012 1329 y(Items,)13 b(joining)s Fe(.)8 b(.)e(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(57)1012 1434 y Fy(J)1012 1492 y Ff(Joining)e(items)6 b Fe(.)h(.)f(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)19 b Ff(57)1012 1597 y Fy(K)1012 1655 y Ff(Keyw)o(ord,)13 b(R)o(CS)6 b Fe(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(72,)13 b(73)1012 1705 y(Keyw)o(ord,)g(R)o(CS-lik)o(e)f Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)23 b Ff(50)1012 1755 y(Keyw)o(ords,)13 b(I/O)5 b Fe(.)h(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)18 b Ff(18,)13 b(87)1012 1865 y Fy(L)1012 1923 y Ff(Language)i(n)o(um)o(b)q(er)d Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)24 b Ff(74)1012 1973 y(Language,)14 b(determining)s Fe(.)9 b(.)d(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)16 b Ff(74)1012 2022 y(Language,)e(determining)i(the)t Fe(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)17 b Ff(74)1012 2072 y(Language,)d(global)f Fe(.)6 b(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(83)1012 2122 y(Language,)14 b(setting)e Fe(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)23 b Ff(18,)13 b(45,)g(83)1012 2172 y(Languages)5 b Fe(.)j(.)e(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(83)1012 2222 y(LaT)1077 2230 y(E)1098 2222 y(X)10 b Fe(.)c(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)23 b Ff(93)1012 2271 y(LaT)1077 2280 y(E)1098 2271 y(X)13 b(section)6 b Fe(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)19 b Ff(95)1012 2321 y(LaT)1077 2329 y(E)1098 2321 y(X2e)9 b Fe(.)d(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)22 b Ff(93)1012 2371 y(Left)13 b(brace,)g(inserting)c Fe(.)f(.)e(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)22 b Ff(41)1012 2421 y(Length)14 b(of)f(string)c Fe(.)e(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)22 b Ff(74)1012 2471 y(Lev)o(el,)14 b(message)t Fe(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)17 b Ff(23)1012 2521 y(Lim)o(b)q(o)d(section)e Fe(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(8)1012 2570 y(Lim)o(b)q(o)14 b(text)8 b Fe(.)f(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 b Ff(45)1012 2620 y(Line)14 b(break,)g(canceling)9 b Fe(.)f(.)e(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)22 b Ff(57)1012 2670 y(Line)14 b(break,)g(forcing)s Fe(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)16 b Ff(55)p eop %%Page: 135 137 135 136 bop 75 -58 a Fz(Concept)15 b(index)1447 b(135)75 183 y Ff(Line)14 b(break,)f(forcing)h(with)g(inden)o(t)e Fe(.)6 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(56)75 233 y(Line)14 b(break,)f(optional)t Fe(.)8 b(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)16 b Ff(39,)d(56)75 283 y(Line)h(n)o(um)o(b)q (er)t Fe(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)16 b Ff(76)75 333 y(Line)e(n)o(um)o(b)q(ering,)h(turning)f (o\013)5 b Fe(.)i(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)18 b Ff(48)75 382 y(Literate)c(programming)f Fe(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(3)75 432 y(Lo)q(c)o(k)11 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(75)75 482 y(Logarithms,)14 b(base)g(10)9 b Fe(.)d(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)22 b Ff(75)75 532 y(Logarithms,)14 b(natural)5 b Fe(.)j(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(70,)13 b(75)75 582 y(Lo)o(w)o(er)g(case)e Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(73)75 719 y Fy(M)75 777 y Ff(Macros)7 b Fe(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(62)75 827 y(Macros,)13 b(absolute)i(v)n(alue)f(of)8 b Fe(.)e(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(68)75 877 y(Macros,)13 b(debugging)t Fe(.)c(.)d(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)16 b Ff(70)75 927 y(Macros,)d(debugging)j(with)c Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(79)75 976 y(Macros,)13 b(decremen)o(ting)s Fe(.)c(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)16 b Ff(69)75 1026 y(Macros,)d(deferred)t Fe(.)7 b(.)f(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(31)75 1076 y(Macros,)c(de\014ning)c Fe(.)g(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22 b Ff(69,)13 b(75)75 1126 y(Macros,)g(ev)n(aluating)s Fe(.)c(.)d(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)16 b Ff(70)75 1176 y(Macros,)d(formatting)c Fe(.)e(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 b Ff(79)75 1225 y(Macros,)13 b Fc(Fweb)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)17 b Ff(63)75 1275 y(Macros,)c(incremen)o(ting) 7 b Fe(.)h(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(72)75 1325 y(Macros,)13 b(inhibiti)q(ng)j(expansion)g(of)8 b Fe(.)d(.)i(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(59)75 1375 y(Macros,)13 b(outer)f Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(62)75 1425 y(Macros,)13 b(prepro)q(cessing)g Fe(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(80)75 1474 y(macros,)13 b(rede\014ning)c Fe(.)f(.)e(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)21 b Ff(31)75 1524 y(Macros,)13 b(rede\014nition)j(of)6 b Fe(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(64)75 1574 y(Macros,)13 b(rep)q(etitiv)o(ely)j(de\014ning)7 b Fe(.)h(.)e(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)20 b Ff(69)75 1624 y(Macros,)13 b(sp)q(ecial)i(tok)o(ens)f(for) t Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)16 b Ff(65)75 1674 y(Macros,)d(unde\014ning)g Fe(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(78)75 1724 y(Macros,)13 b(with)h(v)n(ariable)h(argumen)o(ts)6 b Fe(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)18 b Ff(64)75 1773 y(Ma)r(jor)13 b(section,)h(b)q(eginning)t Fe(.)9 b(.)d(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)16 b Ff(39)75 1823 y(Ma)r(jor)d(section,)h (optional)h(argumen)o(t)f(for)t Fe(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)17 b Ff(39)75 1873 y(Ma)r(jor)c(subsection)8 b Fe(.)h(.)d(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)21 b Ff(39)75 1923 y(Mak)o(e\014les,)14 b(using)t Fe(.)8 b(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)16 b Ff(5)75 1973 y(Mak)o(eindex,)f(using)5 b Fe(.)j(.)e(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)h(.)f(.)g(.)g(.)18 b Ff(103)75 2022 y(Marriage)9 b Fe(.)f(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)22 b Ff(17)75 2072 y(Maxim)o(um)8 b Fe(.)g(.)e(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(75)75 2122 y(Memory)14 b(allo)q(cation)6 b Fe(.)j(.)d(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)19 b Ff(35,)13 b(108)75 2172 y(Message)h(lev)o(el)6 b Fe(.)h(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)18 b Ff(23)75 2222 y(Message)c(t)o(yp)q(es)6 b Fe(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)19 b Ff(117)75 2271 y(Minin)o(um)9 b Fe(.)f(.)e(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)21 b Ff(75)75 2321 y(Mo)q(dule)15 b(name,)e(b)q (eginning)5 b Fe(.)k(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(40)75 2371 y(Mo)q(dule)d(name,)e(ending)6 b Fe(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)18 b Ff(40)75 2421 y(Mo)q(dule,)c(name)g(of)d Fe(.)6 b(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(75)75 2471 y(Mo)q(dule,)14 b(named)7 b Fe(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)19 b Ff(9)75 2521 y(Mo)q(dule,)14 b(unnamed)f Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)23 b Ff(8)75 2570 y(Mo)q(dules)6 b Fe(.)j(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(8)75 2620 y(Mo)q(dules,)14 b(missing)8 b Fe(.)h(.)d(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)21 b Ff(77)75 2670 y(Mo)q(dules,)14 b(n)o(um)o(b)q(er)g (of)d Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)23 b Ff(75)1012 183 y(Mo)q(dules,)15 b(w)o(arning)f(lev)o(el)h(for)7 b Fe(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)21 b Ff(32)1012 233 y Fd(multicol)p Ff(,)10 b(using)i Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)23 b Ff(96)1012 340 y Fy(N)1012 398 y Ff(Named)14 b(mo)q(dule)d Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(9)1012 448 y(Not)13 b(equal)6 b Fe(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(37,)13 b(87)1012 497 y(Notation,)h(binary)8 b Fe(.)g(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(84,)13 b(85)1012 547 y(Notation,)h(hexadecimal)7 b Fe(.)i(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(85)1012 597 y(Notation,)14 b(o)q(ctal)9 b Fe(.)e(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)22 b Ff(85)1012 647 y(Num)o(b)q(ering)15 b(blo)q(c)o(ks)8 b Fe(.)f(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)21 b Ff(17,)13 b(25,)g(30)1012 753 y Fy(O)1012 812 y Ff(Octal)h(notation)t Fe(.)8 b(.)e(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(85)1012 861 y(Op)q(erators,)c(o)o(v)o(erloading)e Fe(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(28,)13 b(49,)f(101)1012 911 y(Op)q(erators,)i(pseudo-)d Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)23 b Ff(57)1012 961 y(Options,)14 b(class)e Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(93)1012 1011 y(Options,)14 b(information)t Fe(.)8 b(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(16,)c(18,)g(35,)g(37)1012 1061 y(Options,)h(negating)s Fe(.)9 b(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(16)1012 1110 y(Ouput,)d(redirecting)5 b Fe(.)k(.)d(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)19 b Ff(36)1012 1160 y(Outer)13 b(macro,)g (de\014ning)g Fe(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(42)1012 1210 y(Outer)13 b(macros,)g(unde\014ning)8 b Fe(.)h(.)d(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(49)1012 1260 y(Output)14 b(\014les,)g(c)o(hanging)h(names)e(of)5 b Fe(.)i(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(13)1012 1310 y(Output)14 b(line)s Fe(.)8 b(.)e(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(76)1012 1360 y(Output,)d(c)o(hanging)h(app)q(earance)f(of)d Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(16)1012 1409 y(Ov)o(erloading)8 b Fe(.)h(.)d(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(101)1012 1459 y(Ov)o(erloading)c(iden)o(ti\014ers)5 b Fe(.)j(.)e(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) 17 b Ff(102)1012 1509 y(Ov)o(erloading)f(op)q(erators)8 b Fe(.)f(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)20 b Ff(101)1012 1616 y Fy(P)1012 1674 y Ff(P)o(ac)o(k)n(age,)14 b Fd(fwebnum)5 b Fe(.)s(.)i(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(98)1012 1724 y(P)o(ac)o(k)n(age,)14 b Fd(multicol)t Fe(.)s(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)17 b Ff(96)1012 1773 y(P)o(ac)o(k)n(ages,)d(user)7 b Fe(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(93)1012 1823 y(P)o(age)14 b(headers)9 b Fe(.)e(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)22 b Ff(98)1012 1873 y(P)o(age)14 b(n)o(um)o(b)q(ers)c Fe(.)c(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)23 b Ff(98)1012 1923 y(P)o(art,)13 b(co)q(de)s Fe(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)16 b Ff(5,)d(7)1012 1973 y(P)o(art,)g(de\014nition)5 b Fe(.)k(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)17 b Ff(5,)c(7)1012 2022 y(P)o(art,)g(T)1132 2030 y(E)1153 2022 y(X)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)18 b Ff(5,)13 b(7)1012 2072 y(P)o(arts)7 b Fe(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(5)1012 2122 y(Phases,)14 b(of)f Fc(Ft)n(angle)8 b Fe(.)e(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)23 b Ff(10)1012 2172 y(Phases,)14 b(of)f Fc(Fwea)m(ve)8 b Fe(.)d(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)21 b Ff(11)1012 2222 y(Pi)6 b Fe(.)i(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(76)1012 2271 y(P)o(ound)14 b(sign)8 b Fe(.)g(.)e(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(76)1012 2321 y(Prepro)q(cessing)s Fe(.)9 b(.)d(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(80)1012 2371 y(Prepro)q(cessor)e(sym)o(b)q(ol)6 b Fe(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)19 b Ff(76)1012 2421 y(Prepro)q(cessor,)14 b(m4)9 b Fe(.)d(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22 b Ff(24)1012 2471 y(Prepro)q(cessor,)13 b(sending)h(additional)h (argumen)o(ts)e(to)5 b Fe(.)i(.)17 b Ff(33)1012 2521 y(Prett)o(y-prin)o(ting)8 b Fe(.)h(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)20 b Ff(100)1012 2570 y(Prin)o(ting,)15 b(t)o(w)o(o-sided)c Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)23 b Ff(93)1012 2620 y(Pro)q(cessor,)14 b(LaT)1261 2628 y(E)1282 2620 y(X)t Fe(.)5 b(.)h(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(28)1012 2670 y(Pro)q(cessor,)d(T)1218 2678 y(E)1239 2670 y(X)8 b Fe(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) 21 b Ff(28)p eop %%Page: 136 138 136 137 bop 75 -58 a Fz(Concept)15 b(index)1447 b(136)75 183 y Ff(Pro)q(cessors,)14 b Fc(Fweb)t Fe(.)5 b(.)h(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(5)75 233 y(Program)d(unit)5 b Fe(.)i(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(77)75 283 y(Programming)d(tips)8 b Fe(.)f(.)f(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)21 b Ff(122)75 333 y(Pseudo-colon)8 b Fe(.)h(.)d(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(59)75 382 y(Pseudo-expression)9 b Fe(.)g(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)21 b Ff(57)75 432 y(Pseudo-op)q(erators)12 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)22 b Ff(57,)13 b(101)75 482 y(Pseudo-semicolon)6 b Fe(.)i(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)18 b Ff(58)75 532 y(Pseudo-semicolons)q(,)d(automatic)d Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(24,)13 b(58,)g(88)75 632 y Fy(R)75 690 y Fc(Ra)n(tf)o(or)7 b Fe(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)20 b Ff(89)75 739 y Fc(Ra)n(tf)o(or)13 b Ff(commands)6 b Fe(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)18 b Ff(89)75 789 y Fc(Ra)n(tf)o(or)p Ff(,)12 b(ca)o(v)o(eats)i(ab)q(out)8 b Fe(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(90)75 839 y(Rational)15 b Fc(F)o(or)n(tran)s Fe(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) 16 b Ff(89)75 889 y(R)o(CS)d(\014le)7 b Fe(.)g(.)f(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(76)75 939 y(R)o(CS-lik)o(e)14 b(k)o(eyw)o(ord)d Fe(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)22 b Ff(50,)13 b(72,)g(73)75 989 y(Recursion)g Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(64)75 1038 y(Rede\014ned)15 b(commands,)e(v)o(ersion)i(1.61)8 b Fe(.)e(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)21 b Ff(124)75 1088 y(References,)13 b(forw)o(ard)6 b Fe(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)18 b Ff(51)75 1138 y(Reserv)o(ed)c(w)o(ords)5 b Fe(.)i(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)18 b Ff(18)75 1188 y(Revision)5 b Fe(.)j(.)e(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)17 b Ff(76)75 1238 y(Ro)q(ot,)c(square)g Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)24 b Ff(77)75 1337 y Fy(S)75 1395 y Ff(Scien)o(ti\014c)15 b(programming)9 b Fe(.)g(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)22 b Ff(123)75 1445 y(Scrap,)13 b(irreducibl)q(e)5 b Fe(.)k(.)d(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)18 b Ff(16)75 1495 y(Section)c(names,)g(long)s Fe(.)7 b(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)16 b Ff(39)75 1545 y(Section)e(names,)g(short)t Fe(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)17 b Ff(39)75 1595 y(Section)d(n)o(um)o(b)q(er,)g(curren)o(t)c Fe(.)c(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)22 b Ff(77)75 1644 y(Section)14 b(n)o(um)o(b)q(er,)g(maxim)o(um)t Fe(.)7 b(.)f(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(77)75 1694 y(Section,)d(b)q(eginning)i(ma)r(jor)11 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)23 b Ff(39)75 1744 y(Section,)14 b(b)q(eginning)i(minor)d Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(39)75 1794 y(Section,)14 b(lim)o(b)q(o)9 b Fe(.)f(.)e(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 b Ff(8)75 1844 y(Sections)9 b Fe(.)e(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)21 b Ff(5)75 1893 y(Sections,)14 b(named)d Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) 22 b Ff(6)75 1943 y(Sections,)14 b(n)o(um)o(b)q(ering)9 b Fe(.)g(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22 b Ff(98)75 1993 y(Sections,)14 b(unnamed)5 b Fe(.)j(.)e(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)18 b Ff(6)75 2043 y(Semicolon,)d(pseudo)8 b Fe(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)20 b Ff(58)75 2093 y(Semicolons,)15 b(automatic)d Fe(.)6 b(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)23 b Ff(24,)13 b(87)75 2143 y(Semicolons,)i(prin)o(ting)8 b Fe(.)h(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(26)75 2192 y(Sharp)14 b(sign)t Fe(.)8 b(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(76)75 2242 y(Spacing)e(commands)c Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)22 b Ff(55)75 2292 y(Spacing,)15 b(thin)f(space)8 b Fe(.)e(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)20 b Ff(55)75 2342 y(Square)14 b(ro)q(ot)s Fe(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)16 b Ff(77)75 2392 y(State)7 b Fe(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)19 b Ff(77)75 2441 y(Statemen)o(t)14 b(n)o(um)o(b)q(ers,)f(automatic)t Fe(.)8 b(.)e(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) 17 b Ff(36)75 2491 y(Statistics,)d(prin)o(ting)6 b Fe(.)j(.)d(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)h(.)18 b Ff(30)75 2541 y(String)c(length)9 b Fe(.)f(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)21 b Ff(74)1012 183 y(String,)14 b(de\014nition)i(of)6 b Fe(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)19 b Ff(67)1012 233 y(String,)14 b(quoted)7 b Fe(.)h(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)20 b Ff(67)1012 283 y(String,)14 b(quoting)h(a)c Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(77)1012 333 y(String,)14 b(unquoted)f Fe(.)7 b(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)25 b Ff(67)1012 382 y(Strings,)14 b(con)o(tin)o(uing)t Fe(.)9 b(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) 17 b Ff(35)1012 432 y(Strings,)d(long)t Fe(.)8 b(.)e(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(35)1012 482 y(Strings,)c(paren)o(thesized)g Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)24 b Ff(36)1012 532 y(Strings,)14 b(unquoting)6 b Fe(.)j(.)d(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)h(.)f(.)g(.)g(.)g(.)19 b Ff(78)1012 582 y(St)o(yle)14 b(\014le)e Fe(.)6 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)23 b Ff(112)1012 632 y(St)o(yle)14 b(\014le,)g(c)o(hanging)h(name)e(of)7 b Fe(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(35)1012 681 y(St)o(yle)14 b(\014le,)g(for)f(mak)o(eindex)c Fe(.)f(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)21 b Ff(104)1012 731 y(Subscript,)15 b(bullet)t Fe(.)8 b(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(114)1012 781 y(Subsection,)e(b)q(eginning)h(ma)r(jor)8 b Fe(.)e(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)21 b Ff(39)1012 831 y(Suggestions)s Fe(.)9 b(.)d(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)16 b Ff(122)1012 881 y(Supp)q(ort)7 b Fe(.)h(.)e(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(131)1012 930 y(Syn)o(tax,)14 b(command-line)8 b Fe(.)h(.)d(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)21 b Ff(15)1012 980 y(Syn)o(tax,)14 b(free-form)c Fe(.)c(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)23 b Ff(26,)13 b(88)1012 1088 y Fy(T)1012 1146 y Ff(T)m(able)h(of)f(Con)o(ten)o(ts)s Fe(.)7 b(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(96)1012 1196 y(T)m(able)d(of)f(con)o (ten)o(ts,)g(en)o(tries)h(for)6 b Fe(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(39)1012 1246 y(T)m(ags,)13 b(en)o(um)5 b Fe(.)i(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(84)1012 1296 y(T)m(ags,)13 b(structure)c Fe(.)e(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)22 b Ff(84)1012 1346 y(T)1034 1354 y(E)1055 1346 y(X)13 b(hin)o(ts)e Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(88)1012 1395 y(T)m(ext,)13 b(con)o(trol)e Fe(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(55)1012 1445 y(Time)11 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)23 b Ff(68,)13 b(77)1012 1495 y(T)m(ok)o(ens,)g(upp)q (er-case)f Fe(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(32)1012 1545 y(T)m(ransliteration)15 b Fe(.)6 b(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)24 b Ff(78)1012 1595 y(T)o(yp)q(esetting)12 b Fe(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)h(.)23 b Ff(91)1012 1703 y Fy(U)1012 1761 y Ff(Unnamed)14 b(mo)q(dule)6 b Fe(.)i(.)e(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)19 b Ff(8)1012 1810 y(Upp)q(er)14 b(case)9 b Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)22 b Ff(78)1012 1860 y(User)13 b(pac)o(k)n(ages)f Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)23 b Ff(93)1012 1968 y Fy(V)1012 2026 y Ff(V)m(ariable)15 b(argumen)o(ts)7 b Fe(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)20 b Ff(64)1012 2076 y(V)m(ariables,)15 b(en)o(vironmen)o(t)d Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(107)1012 2126 y(V)m(ersion)14 b(n)o(um)o(b)q(er)t Fe(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)17 b Ff(32)1012 2176 y(V)m(ersion,)d(of)f(FWEB)7 b Fe(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(78)1012 2226 y(V)m(ertical)14 b(bar)5 b Fe(.)i(.)g(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(39,)13 b(56)1012 2275 y(V)m(ertical)h(bars)t Fe(.)7 b(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)17 b Ff(7)1012 2383 y Fy(W)1012 2441 y Ff(W)m(arning)e(lev)o(el)g(for)d(mo)q(dules)g Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)23 b Ff(32)1012 2491 y(W)m(eb,)14 b(structure)s Fe(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)16 b Ff(5)1012 2541 y(W)m(ords,)e(reserv)o(ed)d Fe(.)6 b(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(18)p eop %%Page: 137 139 137 138 bop 75 -58 a Fz(Option)16 b(and)f(command)g(index)1177 b(137)75 183 y Ft(Option)26 b(and)h(command)h(index)75 359 y Fy(#)75 417 y Fd(#line)8 b Fe(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)22 b Ff(79)75 520 y Fy($)75 578 y Fd($A)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)18 b Ff(68)75 628 y Fd($ABS)10 b Fe(.)c(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)24 b Ff(68)75 677 y Fd($ASSERT)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(68)75 727 y Fd($AUTHOR)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(68)75 777 y Fd($COMMENT)6 b Fe(.)s(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(68)75 827 y Fd($DATE)8 b Fe(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)22 b Ff(68)75 877 y Fd($DATE_TIME)r Fe(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)16 b Ff(68)75 927 y Fd($DAY)10 b Fe(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(68)75 976 y Fd($DECR)8 b Fe(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)22 b Ff(69)75 1026 y Fd($DEFINE)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)20 b Ff(69)75 1076 y Fd($DO)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)16 b Ff(69)75 1126 y Fd($DUMPDEF)6 b Fe(.)s(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(70)75 1176 y Fd($E)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(70)75 1225 y Fd($ERROR)9 b Fe(.)s(.)d(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 b Ff(70)75 1275 y Fd($EVAL)8 b Fe(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)22 b Ff(70)75 1325 y Fd($EXP)10 b Fe(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(71)75 1375 y Fd($GETENV)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(71)75 1425 y Fd($HEADER)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(71)75 1474 y Fd($HOME)8 b Fe(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)22 b Ff(71)75 1524 y Fd($ID)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)16 b Ff(71)75 1574 y Fd($IF)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)16 b Ff(71)75 1624 y Fd($IFCASE)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(71)75 1674 y Fd($IFDEF)9 b Fe(.)s(.)d(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 b Ff(72)75 1724 y Fd($IFELSE)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(72)75 1773 y Fd($IFNDEF)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(72)75 1823 y Fd($INCR)8 b Fe(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)22 b Ff(72)75 1873 y Fd($INPUT_LIN)o(E)7 b Fe(.)g(.)f(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)23 b Ff(72)75 1923 y Fd($KEYWORD)9 b Fe(.)s(.)d(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)22 b Ff(50,)13 b(72)75 1973 y Fd($L)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(73)75 2022 y Fd($L_KEYWORD)6 b Fe(.)s(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)19 b Ff(50,)13 b(73)75 2072 y Fd($LANGUAGE)t Fe(.)s(.)6 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)17 b Ff(74)75 2122 y Fd($LANGUAGE_)o(NU)o(M)8 b Fe(.)s(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(74)75 2172 y Fd($LEN)10 b Fe(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(74)75 2222 y Fd($LOCKER)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(75)75 2271 y Fd($LOG)10 b Fe(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(75)75 2321 y Fd($LOG10)9 b Fe(.)s(.)d(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 b Ff(75)75 2371 y Fd($M)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(75)75 2421 y Fd($MAX)10 b Fe(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(75)75 2471 y Fd($MIN)10 b Fe(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(75)75 2521 y Fd($MODULE_NA)o(ME)6 b Fe(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)22 b Ff(75)75 2570 y Fd($MODULES)6 b Fe(.)s(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(75)75 2620 y Fd($NAME)8 b Fe(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)22 b Ff(75)75 2670 y Fd($OUTPUT_LI)o(NE)6 b Fe(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)22 b Ff(76)1012 359 y Fd($P)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(76)1012 409 y Fd($PI)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)17 b Ff(76)1012 459 y Fd($POW)10 b Fe(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)24 b Ff(76)1012 509 y Fd($PP)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)17 b Ff(76)1012 558 y Fd($RCSfile)6 b Fe(.)s(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)19 b Ff(76)1012 608 y Fd($REVISION)5 b Fe(.)s(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(76)1012 658 y Fd($ROUTINE)6 b Fe(.)s(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)19 b Ff(77)1012 708 y Fd($SECTION_NU)o(M)6 b Fe(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)23 b Ff(77)1012 758 y Fd($SECTIONS)5 b Fe(.)s(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)18 b Ff(77)1012 807 y Fd($SOURCE)7 b Fe(.)t(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(77)1012 857 y Fd($SQRT)8 b Fe(.)e(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(77)1012 907 y Fd($STATE)9 b Fe(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22 b Ff(77)1012 957 y Fd($STRING)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(77)1012 1007 y Fd($STUB)8 b Fe(.)e(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(77)1012 1056 y Fd($TIME)8 b Fe(.)e(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(77)1012 1106 y Fd($TRANSLIT)5 b Fe(.)s(.)h(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(78)1012 1156 y Fd($U)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(78)1012 1206 y Fd($UNDEF)9 b Fe(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22 b Ff(78)1012 1256 y Fd($UNQUOTE)6 b Fe(.)s(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)19 b Ff(78)1012 1306 y Fd($UNROLL)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(70)1012 1355 y Fd($UNSTRING)5 b Fe(.)s(.)h(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(78)1012 1405 y Fd($VERBATIM)5 b Fe(.)s(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(78)1012 1455 y Fd($VERSION)6 b Fe(.)s(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)19 b Ff(78)1012 1566 y Fy(-)1012 1624 y Fd(-)6 b Fe(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) 20 b Ff(15)1012 1674 y Fd(-!)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)18 b Ff(37)1012 1724 y Fd(-#)8 b Fe(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)21 b Ff(36,)13 b(87)1012 1773 y Fd(-\()5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)18 b Ff(36)1012 1823 y Fd(-.)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)18 b Ff(35)1012 1873 y Fd(-/)5 b Fe(.)h(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)18 b Ff(37)1012 1923 y Fd(-:)5 b Fe(.)h(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)18 b Ff(36)1012 1973 y Fd(-=)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(36)1012 2022 y Fd(-@)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(16)1012 2072 y Fd(-+)8 b Fe(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)21 b Ff(37,)13 b(87)1012 2122 y Fd(->)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)18 b Ff(36)1012 2172 y Fd(-\\)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)18 b Ff(35)1012 2222 y Fd(-1)5 b Fe(.)h(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)18 b Ff(16)1012 2271 y Fd(-2)5 b Fe(.)h(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)18 b Ff(16)1012 2321 y Fd(-A)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(17)1012 2371 y Fd(-b)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(17)1012 2421 y Fd(-B)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) 18 b Ff(17)1012 2471 y Fd(-c)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)18 b Ff(18)1012 2521 y Fd(-C)7 b Fe(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(17,)12 b(117)1012 2570 y Fd(-c++)e Fe(.)c(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)24 b Ff(18)1012 2620 y Fd(-d)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) 18 b Ff(19)1012 2670 y Fd(-D)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)18 b Ff(18)p eop %%Page: 138 140 138 139 bop 75 -58 a Fz(Option)16 b(and)f(command)g(index)1177 b(138)75 183 y Fd(-e)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(19)75 233 y Fd(-E)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(19)75 283 y Fd(-f)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(20)75 333 y Fd(-F)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(19)75 382 y Fd(-h)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(21)75 432 y Fd(-H)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(20)75 482 y Fd(-Hr)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)16 b Ff(20)75 532 y Fd(-Hx)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)16 b Ff(20)75 582 y Fd(-HX)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)16 b Ff(20)75 632 y Fd(-i)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(21)75 681 y Fd(-I)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(21)75 731 y Fd(-ix)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)16 b Ff(21)75 781 y Fd(-j)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(22)75 831 y Fd(-k)8 b Fe(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(22,)13 b(87)75 881 y Fd(-l)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)18 b Ff(23)75 930 y Fd(-L)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)18 b Ff(22)75 980 y Fd(-m)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)18 b Ff(23)75 1030 y Fd(-M)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)18 b Ff(23)75 1080 y Fd(-m;)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)16 b Ff(24)75 1130 y Fd(-m4)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)16 b Ff(24)75 1180 y Fd(-n)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)18 b Ff(24)75 1229 y Fd(-n!)7 b Fe(.)e(.)h(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(27,)13 b(88)75 1279 y Fd(-n&)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)16 b Ff(26)75 1329 y Fd(-n\))t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)16 b Ff(27)75 1379 y Fd(-n/)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)16 b Ff(27)75 1429 y Fd(-n:)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)16 b Ff(25)75 1478 y Fd(-n;)7 b Fe(.)e(.)h(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(24,)13 b(58)75 1528 y Fd(-n@;)6 b Fe(.)t(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)18 b Ff(24,)13 b(58)75 1578 y Fd(-n\\)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)16 b Ff(26)75 1628 y Fd(-n9)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)16 b Ff(24)75 1678 y Fd(-nb)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)16 b Ff(25)75 1727 y Fd(-nC)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)16 b Ff(25)75 1777 y Fd(-np)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)16 b Ff(26)75 1827 y Fd(-o)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)18 b Ff(28)75 1877 y Fd(-p)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)18 b Ff(28)75 1927 y Fd(-P)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)18 b Ff(28)75 1977 y Fd(-r)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)18 b Ff(29)75 2026 y Fd(-r!)t Fe(.)5 b(.)h(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)16 b Ff(30)75 2076 y Fd(-r\))t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)16 b Ff(30)75 2126 y Fd(-r/)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)16 b Ff(30)75 2176 y Fd(-r;)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)16 b Ff(30)75 2226 y Fd(-r@;)10 b Fe(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(30)75 2275 y Fd(-r9)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)16 b Ff(29)75 2325 y Fd(-rb)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)16 b Ff(30)75 2375 y Fd(-rg)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)16 b Ff(29)75 2425 y Fd(-rk)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)16 b Ff(29)75 2475 y Fd(-rK)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)16 b Ff(30)75 2524 y Fd(-s)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(30)75 2574 y Fd(-sm)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)16 b Ff(30)75 2624 y Fd(-t)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(32)1012 183 y Fd(-T#)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)17 b Ff(31)1012 233 y Fd(-T\045)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)17 b Ff(31)1012 283 y Fd(-Tb)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)17 b Ff(31)1012 333 y Fd(-TD)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)17 b Ff(31)1012 382 y Fd(-Tm)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)17 b Ff(31)1012 432 y Fd(-Tv)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)17 b Ff(31)1012 482 y Fd(-u)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(32)1012 532 y Fd(-U)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(32)1012 582 y Fd(-v)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(32)1012 632 y Fd(-V)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(32)1012 681 y Fd(-w)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(34)1012 731 y Fd(-W)8 b Fe(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)21 b Ff(32,)13 b(34)1012 781 y Fd(-W@)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)17 b Ff(32)1012 831 y Fd(-W[)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)17 b Ff(33)1012 881 y Fd(-W1)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)17 b Ff(33)1012 930 y Fd(-WH)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)17 b Ff(33)1012 980 y Fd(-x)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)18 b Ff(34)1012 1030 y Fd(-X)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)18 b Ff(34)1012 1080 y Fd(-XI)11 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(104)1012 1130 y Fd(-y)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(35)1012 1180 y Fd(-yb)11 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(108)1012 1229 y Fd(-ybs)9 b Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(109)1012 1279 y Fd(-ycb)9 b Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(109)1012 1329 y Fd(-ycf)9 b Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(109)1012 1379 y Fd(-ycg)9 b Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(109)1012 1429 y Fd(-yd)11 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(109)1012 1478 y Fd(-ydt)9 b Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(109)1012 1528 y Fd(-ydx)9 b Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(109)1012 1578 y Fd(-yid)9 b Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(109)1012 1628 y Fd(-yif)9 b Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(110)1012 1678 y Fd(-ykt)9 b Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(110)1012 1727 y Fd(-ykw)9 b Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(110)1012 1777 y Fd(-ylb)9 b Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(110)1012 1827 y Fd(-yll)9 b Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(110)1012 1877 y Fd(-yln)9 b Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(110)1012 1927 y Fd(-ylx)9 b Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(110)1012 1977 y Fd(-ym)11 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(110)1012 2026 y Fd(-yma)9 b Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(110)1012 2076 y Fd(-ymb)9 b Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(111)1012 2126 y Fd(-yn)11 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(111)1012 2176 y Fd(-ynf)9 b Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(111)1012 2226 y Fd(-yop)9 b Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(111)1012 2275 y Fd(-yr)11 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(111)1012 2325 y Fd(-ys)11 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(111)1012 2375 y Fd(-ysb)9 b Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(111)1012 2425 y Fd(-ytt)9 b Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(111)1012 2475 y Fd(-ytw)9 b Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(112)1012 2524 y Fd(-yx)11 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(112)1012 2574 y Fd(-yxb)9 b Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(112)1012 2624 y Fd(-z)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)18 b Ff(35)p eop %%Page: 139 141 139 140 bop 75 -58 a Fz(Option)16 b(and)f(command)g(index)1177 b(139)75 183 y Fd(-Z)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(35)75 298 y Fy(.)75 356 y Fd(.fweb)s Fe(.)5 b(.)h(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)16 b Ff(12,)d(108)75 470 y Fy(@)75 528 y Fd(@)6 b Fe(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)19 b Ff(39)75 578 y Fd(@!)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(59)75 628 y Fd(@#)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(56)75 677 y Fd(@#define)6 b Fe(.)s(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(80)75 727 y Fd(@#elif)9 b Fe(.)s(.)d(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 b Ff(80)75 777 y Fd(@#endif)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(80)75 827 y Fd(@#if)10 b Fe(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(80)75 877 y Fd(@#ifdef)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(80)75 927 y Fd(@#ifndef)6 b Fe(.)s(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(80)75 976 y Fd(@#line)9 b Fe(.)s(.)d(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)21 b Ff(80)75 1026 y Fd(@#undef)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)20 b Ff(80)75 1076 y Fd(@\045)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(52)75 1126 y Fd(@\045\045)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)16 b Ff(52)75 1176 y Fd(@&)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(57)75 1225 y Fd(@')5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(51)75 1275 y Fd(@\()5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(53)75 1325 y Fd(@\))5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(53)75 1375 y Fd(@*)9 b Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(6,)12 b(39)75 1425 y Fd(@,)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)18 b Ff(55)75 1474 y Fd(@-)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)18 b Ff(54)75 1524 y Fd(@.)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)18 b Ff(54)75 1574 y Fd(@/)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)18 b Ff(55)75 1624 y Fd(@/*)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)16 b Ff(52)75 1674 y Fd(@//)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)16 b Ff(52)75 1724 y Fd(@:)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)18 b Ff(59)75 1773 y Fd(@;)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)18 b Ff(58)75 1823 y Fd(@=)5 b Fe(.)g(.)h(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)18 b Ff(55)75 1873 y Fd(@?)5 b Fe(.)g(.)h(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)18 b Ff(53)75 1923 y Fd(@@)5 b Fe(.)g(.)h(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)18 b Ff(38)75 1973 y Fd(@[)8 b Fe(.)e(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)21 b Ff(14,)13 b(52)75 2022 y Fd(@])5 b Fe(.)g(.)h(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)18 b Ff(14)75 2072 y Fd(@_)5 b Fe(.)g(.)h(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)18 b Ff(54)75 2122 y Fd(@")5 b Fe(.)g(.)h(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)18 b Ff(51)75 2172 y Fd(@|)8 b Fe(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(39,)13 b(56)75 2222 y Fd(@~)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(57)75 2271 y Fd(@+)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(54)75 2321 y Fd(@>)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(40)75 2371 y Fd(@^)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(54)75 2421 y Fd(@\\)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(56)75 2471 y Fd(@<)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(40)75 2521 y Fd(@0)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(38)75 2570 y Fd(@1)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(38)75 2620 y Fd(@2)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(38)75 2670 y Fd(@9)5 b Fe(.)g(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(54)1012 183 y Fd(@a)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(40)1012 233 y Fd(@A)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(40)1012 283 y Fd(@b)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(41)1012 333 y Fd(@B)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(41)1012 382 y Fd(@c)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(41)1012 432 y Fd(@c++)10 b Fe(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)24 b Ff(42)1012 482 y Fd(@d)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(42)1012 532 y Fd(@D)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(42)1012 582 y Fd(@e)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(57)1012 632 y Fd(@E)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(42)1012 681 y Fd(@f)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(42)1012 731 y Fd(@i)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(43)1012 781 y Fd(@I)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(44)1012 831 y Fd(@k)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(50)1012 881 y Fd(@K)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(50)1012 930 y Fd(@l)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(45)1012 980 y Fd(@L)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(45)1012 1030 y Fd(@m)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) 18 b Ff(45)1012 1080 y Fd(@M)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)18 b Ff(45)1012 1130 y Fd(@n)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)18 b Ff(47)1012 1180 y Fd(@N)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)18 b Ff(46)1012 1229 y Fd(@n9)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)17 b Ff(47)1012 1279 y Fd(@o)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)18 b Ff(47)1012 1329 y Fd(@O)5 b Fe(.)h(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)18 b Ff(47)1012 1379 y Fd(@q)5 b Fe(.)h(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)18 b Ff(48)1012 1429 y Fd(@r)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(49)1012 1478 y Fd(@R)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(49)1012 1528 y Fd(@r9)t Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)17 b Ff(49)1012 1578 y Fd(@t)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) 18 b Ff(55)1012 1628 y Fd(@u)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)18 b Ff(49)1012 1678 y Fd(@v)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)18 b Ff(49)1012 1727 y Fd(@W)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)18 b Ff(50)1012 1777 y Fd(@x)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)18 b Ff(50)1012 1827 y Fd(@y)5 b Fe(.)h(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)18 b Ff(50)1012 1877 y Fd(@z)5 b Fe(.)h(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)18 b Ff(50)1012 2014 y Fg(\\)1012 2072 y Fd(\\/)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Ff(27)1012 2122 y Fd(\\beforeinde)o(x)6 b Fe(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(96)1012 2172 y Fd(\\botofconte)o(nt)o(s)7 b Fe(.)s(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)20 b Ff(97)1012 2222 y Fd(\\documentcl)o(as)o(s)7 b Fe(.)s(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)20 b Ff(93)1012 2271 y Fd(\\documentst)o(yl)o(e)7 b Fe(.)s(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)20 b Ff(93)1012 2321 y Fd(\\FWEBtoc)6 b Fe(.)s(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)19 b Ff(96)1012 2371 y Fd(\\idxname)5 b Fe(.)s(.)h(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)17 b Ff(106)1012 2421 y Fd(\\INDEX)6 b Fe(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)19 b Ff(7,)13 b(96,)f(113)1012 2471 y Fd(\\maketitle)s Fe(.)s(.)6 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(97)1012 2521 y Fd(\\numbercode)7 b Fe(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(98)1012 2570 y Fd(\\numberdefs)7 b Fe(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)24 b Ff(98)1012 2620 y Fd(\\numberline)7 b Fe(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(97)1012 2670 y Fd(\\numberTeX)s Fe(.)s(.)6 b(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(97)p eop %%Page: 140 142 140 141 bop 75 -58 a Fz(Option)16 b(and)f(command)g(index)1177 b(140)75 183 y Fd(\\pagerefs)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)20 b Ff(97,)13 b(98)75 233 y Fd(\\pg)d Fe(.)c(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)24 b Ff(105)75 283 y Fd(\\section)6 b Fe(.)s(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(95)75 333 y Fd(\\startinde)o(x)7 b Fe(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)23 b Ff(96)75 382 y Fd(\\subsectio)o(n)7 b Fe(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)23 b Ff(95)75 432 y Fd(\\subsubsec)o(ti)o(on)6 b Fe(.)t(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(95)75 482 y Fd(\\title)9 b Fe(.)s(.)d(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)21 b Ff(97)75 532 y Fd(\\Title)9 b Fe(.)s(.)d(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)21 b Ff(97)75 582 y Fd(\\topofcont)o(en)o(ts)6 b Fe(.)t(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(97)75 632 y Fd(\\topofinde)o(x)6 b Fe(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)22 b Ff(106)75 681 y Fd(\\twocolumn)r Fe(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)16 b Ff(96)75 731 y Fd(\\usepackag)o(e)7 b Fe(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)23 b Ff(93)75 781 y Fd(\\WARRAY)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(33)75 831 y Fd(\\Wbegin)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(94)75 881 y Fd(\\Wblock)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(17)75 930 y Fd(\\Wfin)8 b Fe(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)22 b Ff(96)75 980 y Fd(\\Wid)8 b Fe(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(115)75 1030 y Fd(\\WID)8 b Fe(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(115)75 1080 y Fd(\\WidD)9 b Fe(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22 b Ff(116)75 1130 y Fd(\\WIDD)9 b Fe(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22 b Ff(116)75 1180 y Fd(\\WidM)9 b Fe(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22 b Ff(116)75 1229 y Fd(\\WIDM)9 b Fe(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22 b Ff(116)75 1279 y Fd(\\WIF)10 b Fe(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(43)75 1329 y Fd(\\WIFfmt)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(43)75 1379 y Fd(\\Wintrinsi)o(c)6 b Fe(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)22 b Ff(116)75 1429 y Fd(\\Wkeyword)s Fe(.)s(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)17 b Ff(116)75 1478 y Fd(\\WKEYWORD)s Fe(.)s(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)17 b Ff(116)75 1528 y Fd(\\Wlbl)5 b Fe(.)t(.)h(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(25,)c(87)75 1578 y Fd(\\Wreserved)7 b Fe(.)f(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(116)75 1628 y Fd(\\WRESERVED)7 b Fe(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)24 b Ff(116)75 1678 y Fd(\\Wshort)6 b Fe(.)t(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)19 b Ff(116)75 1727 y Fd(\\Wtypewrit)o(er)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 b Ff(116)75 1777 y Fd(\\WXA)10 b Fe(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(33)1012 183 y Fy(A)1012 241 y Fd(ASCIIstr)6 b Fe(.)s(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)19 b Ff(51)1012 361 y Fy(C)1012 419 y Fd(CONTENTS.te)o(x)6 b Fe(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(13)1012 539 y Fy(F)1012 597 y Fd(fweb.sty)8 b Fe(.)t(.)e(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)21 b Ff(12,)12 b(112)1012 647 y Fd(FWEB_HDR_IN)o(CL)o(UDE)o(S)7 b Fe(.)f(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)23 b Ff(107)1012 696 y Fd(FWEB_INCLUD)o(ES)6 b Fe(.)t(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(108)1012 746 y Fd(FWEB_INI)5 b Fe(.)s(.)h(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)17 b Ff(108)1012 796 y Fd(FWEB_STYLE_)o(DI)o(R)6 b Fe(.)s(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)18 b Ff(108)1012 846 y Fd(fwebinsert.)o(st)o(y)7 b Fe(.)s(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)20 b Ff(99)1012 896 y Fd(fwebmac.sty)t Fe(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)19 b Ff(91,)13 b(92)1012 945 y Fd(fwebmac.web)6 b Fe(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)22 b Ff(115)1012 995 y Fd(fwebnum.sty)s Fe(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(98,)12 b(100)1012 1115 y Fy(I)1012 1173 y Fd(idxmerge.st)o(y)c Fe(.)s(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(105)1012 1223 y Fd(INDEX.tex)5 b Fe(.)s(.)h(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(13)1012 1342 y Fy(M)1012 1400 y Fd(MODULES.tex)7 b Fe(.)f(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(13)1012 1450 y Fd(multicol.st)o(y)6 b Fe(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)23 b Ff(96)1012 1570 y Fy(T)1012 1628 y Fd(tempnam)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(19)1012 1678 y Fd(termcap)6 b Fe(.)t(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(118)1012 1727 y Fd(termcap0)5 b Fe(.)s(.)h(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)17 b Ff(118)1012 1777 y Fd(tmpnam)9 b Fe(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)22 b Ff(19)p eop %%Page: 141 143 141 142 bop 75 -58 a Fz(P)o(arameter)14 b(index)1404 b(141)75 183 y Ft(P)n(arameter)27 b(index)75 345 y Fy(A)75 403 y Fd(ASCII_Fcn)s Fe(.)s(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(118)75 513 y Fy(C)75 571 y Fd(cchar)9 b Fe(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22 b Ff(118)75 621 y Fd(cdir_start)7 b Fe(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)24 b Ff(118)75 671 y Fd(Color.blac)o(k)6 b Fe(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)22 b Ff(118)75 721 y Fd(Color.blue)7 b Fe(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(118)75 771 y Fd(Color.cyan)7 b Fe(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)24 b Ff(118)75 820 y Fd(Color.defa)o(ul)o(t)7 b Fe(.)s(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(118)75 870 y Fd(color.erro)o(r)6 b Fe(.)g(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)22 b Ff(117)75 920 y Fd(color.fata)o(l)6 b Fe(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)22 b Ff(117)75 970 y Fd(Color.gree)o(n)6 b Fe(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)22 b Ff(118)75 1020 y Fd(color.in_f)o(il)o(e)7 b Fe(.)s(.)f(.)g(.)g(.)g(.) g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(117)75 1070 y Fd(color.incl)o(ud)o(e_f)o(il)o(e)6 b Fe(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)22 b Ff(117)75 1119 y Fd(color.info)7 b Fe(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(117)75 1169 y Fd(color.line)o(_n)o(um)5 b Fe(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)19 b Ff(117)75 1219 y Fd(Color.mage)o(nt)o(a)7 b Fe(.)s(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(118)75 1269 y Fd(color.mod_)o(na)o(me)5 b Fe(.)s(.)i(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(117)75 1319 y Fd(color.mod_)o(nu)o (m)7 b Fe(.)s(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(117)75 1368 y Fd(color.ordi)o(na)o(ry)5 b Fe(.)s(.)i(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(117)75 1418 y Fd(color.out_)o(fi)o (le)5 b Fe(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(117)75 1468 y Fd(color.prog)o(ra)o(m_n)o(am)o(e)6 b Fe(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)22 b Ff(117)75 1518 y Fd(Color.red)s Fe(.)s(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)17 b Ff(118)75 1568 y Fd(color.timi)o(ng)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 b Ff(117)75 1618 y Fd(color.warn)o(in)o(g)7 b Fe(.)s(.)f(.)g(.)g(.)g(.) g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(117)75 1667 y Fd(Color.whit)o(e)6 b Fe(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)22 b Ff(118)75 1717 y Fd(Color.yell)o(ow)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 b Ff(118)75 1767 y Fd(contents.p)o(os)o(tam)o(bl)o(e)6 b Fe(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)22 b Ff(114)75 1817 y Fd(contents.p)o(re)o(amb)o(le)7 b Fe(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)23 b Ff(114)75 1867 y Fd(contents.t)o(ex)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 b Ff(114)75 1977 y Fy(D)75 2035 y Fd(delim_0)6 b Fe(.)t(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(113)75 2085 y Fd(delim_n)6 b Fe(.)t(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(113)75 2134 y Fd(dot_consta)o(nt)o(.be)o(gi)o(n)6 b Fe(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) 22 b Ff(120)75 2184 y Fd(dot_consta)o(nt)o(.en)o(d)s Fe(.)s(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)16 b Ff(120)75 2294 y Fy(E)75 2352 y Fd(ext.ch)7 b Fe(.)t(.)f(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)20 b Ff(120)75 2402 y Fd(ext.hch)6 b Fe(.)t(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(120)75 2452 y Fd(ext.hweb)5 b Fe(.)s(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(120)75 2502 y Fd(ext.web)6 b Fe(.)t(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(120)75 2612 y Fy(F)75 2670 y Fd(format.id)s Fe(.)s(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(115)1012 345 y Fd(format.ID)t Fe(.)s(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)16 b Ff(115)1012 395 y Fd(format.intr)o(in)o(sic)r Fe(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)16 b Ff(115)1012 445 y Fd(format.keyw)o(or)o(d)6 b Fe(.)s(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)18 b Ff(115)1012 495 y Fd(format.KEYW)o(OR)o(D)6 b Fe(.)s(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)18 b Ff(115)1012 544 y Fd(format.oute)o(r_)o(mac)o(ro)6 b Fe(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22 b Ff(115)1012 594 y Fd(format.rese)o(rv)o(ed)t Fe(.)s(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)17 b Ff(115)1012 644 y Fd(format.RESE)o(RV)o(ED)t Fe(.)s(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(115)1012 694 y Fd(format.shor)o(t_)o(id)t Fe(.)s(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(115)1012 744 y Fd(format.type)o(wr)o(ite)o(r)7 b Fe(.)f(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)23 b Ff(115)1012 793 y Fd(format.WEB_)o(ma)o(cro)r Fe(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)16 b Ff(115)1012 893 y Fy(G)1012 951 y Fd(group_skip)7 b Fe(.)g(.)f(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)23 b Ff(114)1012 1051 y Fy(I)1012 1109 y Fd(indent.code)6 b Fe(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)22 b Ff(116)1012 1159 y Fd(indent.TeX)7 b Fe(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)23 b Ff(116)1012 1209 y Fd(index.colla)o(te)6 b Fe(.)t(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(113)1012 1259 y Fd(index.name)7 b Fe(.)g(.)f(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)23 b Ff(113)1012 1308 y Fd(index.posta)o(mb)o(le)t Fe(.)s(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)17 b Ff(113)1012 1358 y Fd(index.pream)o(bl)o(e)6 b Fe(.)s(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)18 b Ff(113)1012 1408 y Fd(index.tex)t Fe(.)s(.)6 b(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)16 b Ff(113)1012 1458 y Fd(item_0)7 b Fe(.)e(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(114)1012 1557 y Fy(L)1012 1616 y Fd(language.pr)o(ef)o(ix)t Fe(.)s(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(114)1012 1665 y Fd(language.su)o(ff)o(ix)t Fe(.)s(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)17 b Ff(114)1012 1715 y Fd(LaTeX.class)6 b Fe(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)22 b Ff(116)1012 1765 y Fd(LaTeX.class)o(.o)o(pti)o(on)o(s)8 b Fe(.)s(.)e(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)h(.)20 b Ff(116)1012 1815 y Fd(LaTeX.optio)o (ns)6 b Fe(.)t(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(116)1012 1865 y Fd(LaTeX.packa)o(ge)6 b Fe(.)t(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(116)1012 1914 y Fd(LaTeX.packa)o (ge)o(.op)o(ti)o(ons)t Fe(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(116)1012 1964 y Fd(LaTeX.style)6 b Fe(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)22 b Ff(116)1012 2014 y Fd(lethead.fla)o(g)8 b Fe(.)s(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(114)1012 2064 y Fd(lethead.pre)o(fi)o(x)6 b Fe(.)s(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)18 b Ff(114)1012 2114 y Fd(lethead.suf)o (fi)o(x)6 b Fe(.)s(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)18 b Ff(114)1012 2164 y Fd(limbo.begin)6 b Fe(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)22 b Ff(120)1012 2213 y Fd(limbo.end)t Fe(.)s(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)16 b Ff(120)1012 2263 y Fd(line_char)t Fe(.)s(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)16 b Ff(119)1012 2313 y Fd(line_length)6 b Fe(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)22 b Ff(119)1012 2413 y Fy(M)1012 2471 y Fd(macros)7 b Fe(.)e(.)h(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(119)1012 2521 y Fd(mark_define)o(d.)o(exp)o(_t)o(ype)t Fe(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)18 b Ff(115)1012 2570 y Fd(mark_define)o(d.)o(fcn)o (_n)o(ame)t Fe(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(115)1012 2620 y Fd(mark_define)o(d.)o(gen)o(er)o(ic_)o(na)o(me)9 b Fe(.)s(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)21 b Ff(115)1012 2670 y Fd(mark_define)o(d.)o(out)o(er)o(_ma)o(cr)o(o)7 b Fe(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)23 b Ff(115)p eop %%Page: 142 144 142 143 bop 75 -58 a Fz(P)o(arameter)14 b(index)1404 b(142)75 183 y Fd(mark_defin)o(ed)o(.ty)o(pe)o(def)o(_na)o(me)8 b Fe(.)s(.)e(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) 22 b Ff(115)75 233 y Fd(mark_defin)o(ed)o(.WE)o(B_)o(mac)o(ro)t Fe(.)s(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)17 b Ff(115)75 283 y Fd(meta)8 b Fe(.)f(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)23 b Ff(120)75 333 y Fd(meta.botto)o(m)6 b Fe(.)g(.)h(.)f(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)22 b Ff(119)75 382 y Fd(meta.botto)o(m.)o(hdr)t Fe(.)s(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)h(.)f(.)17 b Ff(119)75 432 y Fd(meta.prefi)o(x)6 b Fe(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)22 b Ff(119)75 482 y Fd(meta.prefi)o(x.)o(hdr)t Fe(.)s(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)17 b Ff(119)75 532 y Fd(meta.top)5 b Fe(.)s(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(119)75 582 y Fd(meta.top.h)o(dr) 7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 b Ff(119)75 632 y Fd(modules.in)o(fo)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 b Ff(114)75 681 y Fd(modules.po)o(st)o (amb)o(le)7 b Fe(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)23 b Ff(114)75 731 y Fd(modules.pr)o(ea)o(mbl)o(e)s Fe(.)s(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)16 b Ff(114)75 781 y Fd(modules.te)o(x)6 b Fe(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)22 b Ff(114)75 893 y Fy(N)75 951 y Fd(null_file)s Fe(.)s(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)17 b Ff(120)1012 183 y Fy(O)1012 241 y Fd(outer.def)t Fe(.)s(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)16 b Ff(119)1012 291 y Fd(outer.under)6 b Fe(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)22 b Ff(119)1012 403 y Fy(P)1012 461 y Fd(preamble.na)o(me)o(d)6 b Fe(.)s(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)18 b Ff(120)1012 511 y Fd(preamble.un)o(na)o(med)r Fe(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)16 b Ff(120)1012 561 y Fd(protect)6 b Fe(.)t(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(119)1012 673 y Fy(S)1012 731 y Fd(suffix)7 b Fe(.)e(.)h(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(119)1012 843 y Fy(U)1012 901 y Fd(underline.p)o(re)o(fix)r Fe(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)16 b Ff(114)1012 951 y Fd(underline.s)o(uf)o(fix)r Fe(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)16 b Ff(114)p eop %%Page: -1 145 -1 144 bop 1862 -58 a Fz(i)75 183 y Ft(Short)27 b(Con)n(ten)n(ts)75 304 y Fr(Fweb)14 b Fb(.)c(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)31 b Fa(1)75 374 y Fr(Fweb)16 b Fa(Cop)o(ying)g(P)o(ermissions)i Fb(.)10 b(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)36 b Fa(2)75 445 y(1)78 b(INTR)o(ODUCTION)15 b(to)i Fr(Fweb)7 b Fb(.)i(.)i(.)f(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)24 b Fa(3)75 515 y(2)78 b(WEB)17 b(CONCEPTS)11 b Fb(.)g(.)f(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)28 b Fa(5)75 586 y(3)78 b(FILES)8 b Fb(.)j(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)h(.)24 b Fa(12)75 656 y(4)78 b(R)o(UNNING)14 b Fr(Fweb)e Fb(.)e(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)28 b Fa(15)75 727 y(5)78 b Fr(Fweb)16 b Fa(COMMANDS)11 b Fb(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)28 b Fa(38)75 798 y(6)78 b(COMMENTING)16 b(STYLES)e Fb(.)c(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)30 b Fa(60)75 868 y(7)78 b(MA)o(CR)o(OS)15 b(and)i(PREPR)o(OCESSING)f Fb(.)10 b(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h (.)f(.)32 b Fa(62)75 939 y(8)78 b(LANGUA)o(GES)15 b Fb(.)c(.)f(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)32 b Fa(83)75 1009 y(9)78 b Fr(Ra)l(tf)o(or)15 b Fb(.)10 b(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)31 b Fa(89)75 1080 y(10)54 b(DOCUMENT)l(A)l(TION)8 b Fb(.)h(.)h(.)h(.)f(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)h(.)24 b Fa(91)75 1150 y(11)54 b Fr(Fweb)p Fa('s)16 b(INDEX.)d Fb(.)d(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)31 b Fa(103)75 1221 y(12)54 b(CUSTOMIZA)l(TION)10 b Fb(.)f(.)h(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.) g(.)h(.)f(.)g(.)g(.)27 b Fa(107)75 1292 y(13)54 b(USA)o(GE)16 b(TIPS)g(and)h(SUGGESTIONS)11 b Fb(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)28 b Fa(121)75 1362 y(14)54 b(NEW)17 b(FEA)l(TURES)6 b Fb(.)j(.)h(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.) f(.)22 b Fa(124)75 1433 y(15)54 b(SUPPOR)l(T)11 b Fb(.)g(.)f(.)g(.)g(.) g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)28 b Fa(131)75 1503 y(App)q(endix)16 b(A)49 b(Installing)15 b Fr(Fweb)8 b Fb(.)i(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)h(.)f(.)g(.)25 b Fa(132)75 1574 y(Concept)16 b(index)10 b Fb(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) h(.)f(.)g(.)27 b Fa(133)75 1644 y(Option)16 b(and)h(command)d(index)6 b Fb(.)j(.)i(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)22 b Fa(137)75 1715 y(P)o(arameter)15 b(index)j Fb(.)10 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)h(.)35 b Fa(141)p eop %%Page: -2 146 -2 145 bop 1850 -58 a Fz(ii)75 183 y Ft(T)-7 b(able)27 b(of)f(Con)n(ten)n(ts)75 349 y Fr(Fweb)7 b Fb(.)j(.)g(.)g(.)g(.)g(.)h (.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)29 b Fy(1)75 482 y Fr(Fweb)22 b Fy(Cop)n(ying)h(P)n(ermissions)18 b Fb(.)10 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)h(.)f(.)g(.)40 b Fy(2)75 615 y(1)67 b(INTR)n(ODUCTION)19 b(to)j Fr(Fweb)d Fb(.)10 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)42 b Fy(3)224 683 y Fz(1.1)j(History)15 b(of)g(WEB)g(and)g(literate)h(programming)11 b Fh(.)d(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)26 b Fz(3)224 738 y(1.2)45 b(F)l(eatures)15 b(of)g Fw(Fweb)c Fh(.)d(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)25 b Fz(3)75 857 y Fy(2)67 b(WEB)23 b(CONCEPTS)7 b Fb(.)i(.)h(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)h(.)29 b Fy(5)224 925 y Fz(2.1)45 b(The)15 b Fw(Fweb)i Fz(pro)q(cessors:)i Fw(Fwea)l(ve)d Fz(and)g Fw(Ft)m(angle)e Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)28 b Fz(5)224 980 y(2.2)45 b(The)15 b(structure)g(of)g(a)g(w)o(eb)5 b Fh(.)i(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f (.)19 b Fz(5)523 1035 y(2.2.0.1)44 b(A)15 b(simple)h(example)10 b Fh(.)f(.)f(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)25 b Fz(6)523 1090 y(2.2.0.2)44 b(The)15 b(T)816 1099 y(E)841 1090 y(X)h(part)6 b Fh(.)g(.)i(.)g(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)20 b Fz(7)523 1144 y(2.2.0.3)44 b(The)15 b(de\014nition)i(part)8 b Fh(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)23 b Fz(7)523 1199 y(2.2.0.4)44 b(The)15 b(co)q(de)h(part)d Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)28 b Fz(7)523 1254 y(2.2.0.5)44 b(The)15 b(lim)o(b)q(o)h(section)9 b Fh(.)f(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)23 b Fz(8)224 1309 y(2.3)45 b(Mo)q(dules)9 b Fh(.)f(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)23 b Fz(8)374 1364 y(2.3.1)44 b(The)15 b(unnamed)h(mo)q(dule)8 b Fh(.)h(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)22 b Fz(8)374 1418 y(2.3.2)44 b(Named)15 b(mo)q(dules)f Fh(.)7 b(.)h(.)f(.)h(.)f(.)h (.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)27 b Fz(9)224 1473 y(2.4)45 b(Phases)15 b(of)g(pro)q(cessing)7 b Fh(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)22 b Fz(10)374 1528 y(2.4.1)44 b(The)15 b(phases)h(of)e Fw(Ft)m(angle)7 b Fh(.)i(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)22 b Fz(10)374 1583 y(2.4.2)44 b(The)15 b(phases)h(of)e Fw(Fwea)l(ve)5 b Fh(.)j(.)g(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)20 b Fz(11)75 1702 y Fy(3)67 b(FILES)20 b Fb(.)10 b(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)42 b Fy(12)224 1770 y Fz(3.1)j(Input)16 b(\014les)e Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)28 b Fz(12)374 1825 y(3.1.1)44 b(Automatic)15 b(\014le-name)h(completion)f Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)29 b Fz(12)224 1880 y(3.2)45 b(Output)16 b(\014les)5 b Fh(.)j(.)g(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)20 b Fz(13)224 1935 y(3.3)45 b(Change)15 b(\014les)h Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)30 b Fz(13)75 2054 y Fy(4)67 b(R)n(UNNING)21 b Fr(Fweb)10 b Fb(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h (.)f(.)33 b Fy(15)224 2122 y Fz(4.1)45 b(Command-line)17 b(syn)o(tax)12 b Fh(.)c(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)29 b Fz(15)224 2177 y(4.2)45 b(Command-line)17 b(options)7 b Fh(.)g(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)22 b Fz(15)374 2232 y(4.2.1)44 b(Negating)15 b(options)f Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)29 b Fz(16)374 2286 y(4.2.2)44 b(`)p Fu(-1)p Fz(':)19 b(T)l(urn)c(on)g (brief)h(debugging)g(mo)q(de)g(\()p Fw(Fwea)l(ve)p Fz(\))5 b Fh(.)j(.)f(.)21 b Fz(16)374 2341 y(4.2.3)44 b(`)p Fu(-2)p Fz(':)19 b(T)l(urn)c(on)g(v)o(erb)q(ose)g(debugging)i(mo)q(de)e(\()p Fw(Fwea)l(ve)p Fz(\))477 2396 y Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)28 b Fz(16)374 2451 y(4.2.4)44 b(`)p Fu(-@)p Fz(':)19 b(Displa)o(y)c(the)h(con)o(trol-co)q(de)f(mappings)10 b Fh(.)f(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)26 b Fz(16)374 2506 y(4.2.5)44 b(`)p Fu(-A)p Fz(':)19 b(T)l(urn)c(on)g(ASCI)q(I)i (translations)5 b Fh(.)i(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.) f(.)h(.)f(.)20 b Fz(17)374 2560 y(4.2.6)44 b(`)p Fu(-B)p Fz(':)19 b(T)l(urn)c(o\013)f(audible)k(b)q(eeps)c Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)29 b Fz(17)374 2615 y(4.2.7)44 b(`)p Fu(-b)p Fz(':)19 b(Num)o(b)q(er)c(blo)q(c)o(ks)h(\()p Fw(Fwea)l(ve)p Fz(\))8 b Fh(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) 23 b Fz(17)374 2670 y(4.2.8)44 b(`)p Fu(-C)p Fz(':)19 b(Set)c(the)g(color)g(mo)q(de)6 b Fh(.)i(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.) g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)21 b Fz(18)p eop %%Page: -3 147 -3 146 bop 1837 -58 a Fz(iii)374 42 y(4.2.9)44 b(`)p Fu(-c)p Fz(':)19 b(Set)c(global)h(language)f(to)g(C)e Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.) h(.)28 b Fz(18)374 96 y(4.2.10)43 b(`)p Fu(-c++)p Fz(':)19 b(Set)c(global)h(language)g(to)e(C)p Fu(++)8 b Fh(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)23 b Fz(18)374 151 y(4.2.11)43 b(`)p Fu(-D)p Fz(':)19 b(Displa)o(y)d(reserv)o(ed)f(w)o(ords)8 b Fh(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)23 b Fz(18)374 206 y(4.2.12)43 b(`)p Fu(-d)p Fz(':)19 b(Con)o(v)o(ert)14 b(do...enddo)t Fh(.)8 b(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)19 b Fz(19)374 261 y(4.2.13)43 b(`)p Fu(-E)p Fz(':)19 b(Change)c(the)h (delimiter)h(of)e(a)f(\014le-name)j(extension)477 315 y Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)28 b Fz(19)374 370 y(4.2.14)43 b(`)p Fu(-e)p Fz(':)19 b(T)l(urn)d(on)f (automatic)g(\014le-name)h(completion)7 b Fh(.)i(.)f(.)22 b Fz(19)374 425 y(4.2.15)43 b(`)p Fu(-F)p Fz(':)19 b(Compare)c(output)g (\014les)h(with)g(old)f(v)o(ersions)465 480 y(\()p Fw(Ft)m(angle)p Fz(\))7 b Fh(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)23 b Fz(19)374 535 y(4.2.16)43 b(`)p Fu(-f)p Fz(':)19 b(T)l(urn)d(o\013)e(mo)q(dule)j(references)e (for)g(iden)o(ti\014ers)465 589 y(\()p Fw(Fwea)l(ve)p Fz(\))5 b Fh(.)j(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)20 b Fz(20)374 644 y(4.2.17)43 b(`)p Fu(-H)p Fz(':)19 b(Scan)d(C/C)p Fu(++)e Fz(include)k(\014les)e (\()p Fw(Fwea)l(ve)p Fz(\))7 b Fh(.)h(.)f(.)h(.)f(.)h(.)f(.)23 b Fz(20)374 699 y(4.2.18)43 b(`)p Fu(-h)p Fz(':)19 b(Get)c(help)10 b Fh(.)f(.)f(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)25 b Fz(21)374 754 y(4.2.19)43 b(`)p Fu(-I)p Fz(':)19 b(App)q(end)e(to)e (searc)o(h)g(list)h(for)e(include)k(\014les)t Fh(.)9 b(.)e(.)h(.)f(.)h(.)19 b Fz(21)374 809 y(4.2.20)43 b(`)p Fu(-i)p Fz(':)19 b(Don't)14 b(prin)o(t)i(`)p Fu(@I)p Fz(')e(include)k(\014les)e(\()p Fw(Fwea)l(ve)p Fz(\))5 b Fh(.)j(.)f(.)h(.)20 b Fz(21)374 863 y(4.2.21)43 b(`)p Fu(-i!)p Fz(':)19 b(Don't)14 b(read)h(`)p Fu(@I)p Fz(')g(include)i (\014les)e Fh(.)7 b(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)29 b Fz(22)374 918 y(4.2.22)43 b(`)p Fu(-j)p Fz(':)19 b(Inhibit)f(m)o (ultiple)f(includes)f Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)g(.)f(.)29 b Fz(22)374 973 y(4.2.23)43 b(`)p Fu(-k)p Fz(':)19 b(Don't)14 b(recognize)j(lo)o(w)o(er-case)e (forms)f(of)h(k)o(eyw)o(ords)477 1028 y Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)28 b Fz(22)374 1083 y(4.2.24)43 b(`)p Fu(-L)p Fz(':)19 b(Select)e(global)e(language)6 b Fh(.)i(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)21 b Fz(22)374 1137 y(4.2.25)43 b(`)p Fu(-l)p Fz(':)19 b(Ec)o(ho)c(input)i(line)8 b Fh(.)h(.)f(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)24 b Fz(23)374 1192 y(4.2.26)43 b(`)p Fu(-M)p Fz(':)19 b(Set)d(output)f(message)f(lev)o(el)g Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)28 b Fz(23)374 1247 y(4.2.27)43 b(`)p Fu(-m)p Fz(':)19 b(De\014ne)d Fw(Fweb)g Fz(macro)f(\()p Fw(Ft)m(angle)p Fz(\))e Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)28 b Fz(23)374 1302 y(4.2.28)43 b(`)p Fu(-m4)p Fz(':)19 b(Understand)d Fu(m4)f Fz(built-in)i(commands)c Fh(.)7 b(.)h(.)f(.)h(.)g(.)f(.)28 b Fz(24)374 1357 y(4.2.29)43 b(`)p Fu(-m;)p Fz(':)19 b(App)q(end)e(pseudo-semicolons)11 b Fh(.)e(.)f(.)g(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)26 b Fz(24)374 1411 y(4.2.30)43 b(`)p Fu(-n)p Fz(':)19 b(Set)d(global)f(language)h(to)e Fw(F)o(or)m(tran)p Fz({77)5 b Fh(.)j(.)f(.)h(.)f(.)h(.)f(.)21 b Fz(24)374 1466 y(4.2.31)43 b(`)p Fu(-n9)p Fz(':)19 b(Set)c(global)h(language)g(to)e Fw(F)o(or)m(tran)p Fz({90)t Fh(.)8 b(.)f(.)h(.)f(.)h(.)19 b Fz(24)374 1521 y(4.2.32)43 b(`)p Fu(-n@;)p Fz(':)19 b(Supply)e(automatic)d(pseudo-semicolons)465 1576 y([)p Fw(F)o(or)m(tran)p Fz(])c Fh(.)d(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)25 b Fz(24)374 1631 y(4.2.33)43 b(`)p Fu(-n;)p Fz(':)19 b(Supply)e (automatic)e(semicolons)h([)p Fw(F)o(or)m(tran)p Fz(])477 1685 y Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)28 b Fz(24)374 1740 y(4.2.34)43 b(`)p Fu(-n:)p Fz(':)19 b(Put)c(statemen)o(t)f(lab)q(el)j(on)e(separate)g(line)465 1795 y([)p Fw(F)o(or)m(tran)p Fz(])10 b Fh(.)d(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)25 b Fz(25)374 1850 y(4.2.35)43 b(`)p Fu(-nb)p Fz(':)19 b(Num)o(b)q(er)d Fp(if)p Fz(s)f(and)h Fp(do)p Fz(s)f([)p Fw(F)o(or)m(tran)p Fz(])g(\()p Fw(Fwea)l(ve)p Fz(\))477 1905 y Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)28 b Fz(25)374 1959 y(4.2.36)43 b(`)p Fu(-nC)p Fz(':)19 b(Ignore)c(single-line)k(commen)o(ts)14 b([)p Fw(F)o(or)m(tran)p Fz(])g Fh(.)8 b(.)29 b Fz(25)374 2014 y(4.2.37)43 b(`)p Fu(-np)p Fz(':)19 b(Prin)o(t)c(semicolons)i([)p Fw(F)o(or)m(tran)p Fz(])d(\()p Fw(Fwea)l(ve)p Fz(\))g Fh(.)8 b(.)29 b Fz(26)374 2069 y(4.2.38)43 b(`)p Fu(-n\\)p Fz(':)19 b(F)l(ree-form)13 b(syn)o(tax)h(con)o(tin)o(ued)h(b)o(y)f(bac)o(kslash)5 b Fh(.)j(.)19 b Fz(26)374 2124 y(4.2.39)43 b(`)p Fu(-n&)p Fz(':)19 b(F)l(ree-form)c(syn)o(tax)f(con)o(tin)o(ued)i(b)o(y)g(amp)q (ersand)477 2178 y Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)28 b Fz(26)374 2233 y(4.2.40)43 b(`)p Fu(-n/)p Fz(':)19 b(Recognize)e(short)d(commen)o(ts)h([)p Fw(F)o(or)m(tran)p Fz(])t Fh(.)8 b(.)f(.)h(.)19 b Fz(27)374 2288 y(4.2.41)43 b(`)p Fu(-n!)p Fz(':)19 b(Mak)o(e)c(`)p Fu(!)p Fz(')f(denote)h(short)g (commen)o(t)g([)p Fw(F)o(or)m(tran)p Fz(])477 2343 y Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)28 b Fz(27)374 2398 y(4.2.42)43 b(`)p Fu(-n\))p Fz(':)19 b(Rev)o(erse)d(arra)o(y)e(indices)j([)p Fw(F)o(or)m(tran)p Fz(])e(\()p Fw(Ft)m(angle)p Fz(\))477 2452 y Fh(.)8 b(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)28 b Fz(27)374 2507 y(4.2.43)43 b(`)p Fu(-o)p Fz(':)19 b(Don't)14 b(o)o(v)o(erload)h(op)q(erators)10 b Fh(.)d(.)g(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) 25 b Fz(28)374 2562 y(4.2.44)43 b(`)p Fu(-q)p Fz(':)19 b(Don't)14 b(translate)h Fw(Ra)m(tf)o(or)t Fh(.)9 b(.)e(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)19 b Fz(28)374 2617 y(4.2.45)43 b(`)p Fu(-P)p Fz(':)19 b(Select)e(T)798 2627 y(E)823 2617 y(X)e(pro)q(cessor)7 b Fh(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)22 b Fz(28)p eop %%Page: -4 148 -4 147 bop 1838 -58 a Fz(iv)374 42 y(4.2.46)43 b(`)p Fu(-p)p Fz(':)19 b(Bu\013er)c(up)h(a)f(st)o(yle-\014le)i(en)o(try)6 b Fh(.)h(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)22 b Fz(28)374 96 y(4.2.47)43 b(`)p Fu(-r)p Fz(':)19 b(Set)d(global)f (language)h(to)e Fw(Ra)m(tf)o(or)p Fz({77)8 b Fh(.)g(.)f(.)h(.)f(.)h(.) f(.)h(.)23 b Fz(29)374 151 y(4.2.48)43 b(`)p Fu(-r9)p Fz(':)19 b(Set)c(global)h(language)g(to)e Fw(Ra)m(tf)o(or)p Fz({90)7 b Fh(.)g(.)h(.)f(.)h(.)g(.)f(.)22 b Fz(29)374 206 y(4.2.49)43 b(`)p Fu(-rg)p Fz(':)19 b(Set)c Fp(goto)g Fz(parameters)d Fh(.)c(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)29 b Fz(29)374 261 y(4.2.50)43 b(`)p Fu(-rk)p Fz(':)19 b(Suppress)d(commen)o(ts)f(ab)q(out)g Fw(Ra)m(tf)o(or)465 315 y Fz(translation)g(\()p Fw(Ft)m(angle)p Fz(\))c Fh(.)c(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)26 b Fz(29)374 370 y(4.2.51)43 b(`)p Fu(-rK)p Fz(':)19 b(W)l(rite)d(commen)o(ts)e(ab)q (out)h Fw(Ra)m(tf)o(or)h Fz(translation)465 425 y(\()p Fw(Ft)m(angle)p Fz(\))7 b Fh(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)23 b Fz(30)374 480 y(4.2.52)43 b(`)p Fu(-r@;)p Fz(':)19 b(T)l(urn)d(on)f(auto-semi)g (mo)q(de)g(using)h(pseudo-semis)465 535 y([)p Fw(Ra)m(tf)o(or)p Fz(])d Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) g(.)f(.)h(.)f(.)h(.)f(.)28 b Fz(30)374 589 y(4.2.53)43 b(`)p Fu(-r;)p Fz(':)19 b(T)l(urn)d(on)f(auto-semi)g(mo)q(de)h(using)g (actual)f(semis)465 644 y([)p Fw(Ra)m(tf)o(or)p Fz(])e Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f (.)h(.)f(.)h(.)f(.)28 b Fz(30)374 699 y(4.2.54)43 b(`)p Fu(-rb)p Fz(':)19 b(Num)o(b)q(er)d Fp(if)p Fz(s)f(and)h Fp(do)p Fz(s)f([)p Fw(Ra)m(tf)o(or)p Fz(])c Fh(.)d(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)27 b Fz(30)374 754 y(4.2.55)43 b(`)p Fu(-r/)p Fz(':)19 b(Recognize)e(short)d(commen)o(ts)h([)p Fw(Ra)m(tf)o(or)p Fz(])7 b Fh(.)g(.)h(.)f(.)h(.)22 b Fz(30)374 809 y(4.2.56)43 b(`)p Fu(-r!)p Fz(':)19 b(Mak)o(e)c(`)p Fu(!)p Fz(')f(denote)h(short)g(commen)o(t)g([)p Fw(Ra)m(tf)o(or)p Fz(])477 863 y Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)28 b Fz(30)374 918 y(4.2.57)43 b(`)p Fu(-r\))p Fz(':)19 b(Rev)o(erse)d(arra)o(y)e(indices)j([)p Fw(Ra)m(tf)o(or)p Fz(])e(\()p Fw(Ft)m(angle)p Fz(\))477 973 y Fh(.)8 b(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)28 b Fz(30)374 1028 y(4.2.58)43 b(`)p Fu(-s)p Fz(':)19 b(Prin)o(t)c(statistics)g Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)29 b Fz(30)374 1083 y(4.2.59)43 b(`)p Fu(-T)p Fz(':)19 b(Flag-setting)c(options)h(for)e Fw(Ft)m(angle)8 b Fh(.)h(.)e(.)h(.)g(.)f(.)h(.)f(.)h(.)23 b Fz(31)523 1137 y(4.2.59.1)43 b(`)p Fu(-TD)p Fz(':)19 b(P)o(ermit)c(pro)q(cessing)h(of)f(deferred)h(macro)614 1192 y(de\014nitions)7 b Fh(.)j(.)e(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)23 b Fz(31)523 1247 y(4.2.59.2)43 b(`)p Fu(-Tb)p Fz(':)19 b(P)o(ermit)c(built-functions)j(to)c(b)q(e)614 1302 y(rede\014ned)9 b Fh(.)h(.)d(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)g(.)24 b Fz(31)523 1357 y(4.2.59.3)43 b(`)p Fu(-Tm)p Fz(':)19 b(P)o(ermit)c(user)g(macros)g(to)f(b)q(e)i (rede\014ned)627 1411 y Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)28 b Fz(31)523 1466 y(4.2.59.4)43 b(`)p Fu(-Tv)p Fz(':)19 b(Don't)14 b(prin)o(t)i(header)f(info)9 b Fh(.)f(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)24 b Fz(31)523 1521 y(4.2.59.5)43 b(`)p Fu(-T\045)p Fz(':)19 b(Don't)14 b(retain)i(trailing)g(commen)o(ts)614 1576 y(\(T)657 1586 y(E)682 1576 y(X\))7 b Fh(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)22 b Fz(31)523 1631 y(4.2.59.6)43 b(`)p Fu(-T#)p Fz(':)19 b(Don't)14 b(insert)i(`)p Fu(#line)p Fz(')d(command)j(after)614 1685 y(`)p Fu(@\045)p Fz(')9 b Fh(.)e(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)24 b Fz(31)374 1740 y(4.2.60)43 b(`)p Fu(-t)p Fz(':)19 b(T)l(runcate)d(iden)o (ti\014ers)10 b Fh(.)f(.)f(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)26 b Fz(32)374 1795 y(4.2.61)43 b(`)p Fu(-U)p Fz(':)19 b(Con)o(v)o(ert)14 b(reserv)o(ed)i(output)f(tok)o(ens)f(to)h(lo)o(w)o(er)g(case)465 1850 y(\()p Fw(Ft)m(angle)p Fz(\))7 b Fh(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)23 b Fz(32)374 1905 y(4.2.62)43 b(`)p Fu(-u)p Fz(':)19 b(Unde\014ne)e Fw(Fweb)f Fz(macro)f(\()p Fw(Ft)m(angle)p Fz(\))10 b Fh(.)d(.)h(.)f(.)h(.)f(.)h(.)f(.)25 b Fz(32)374 1959 y(4.2.63)43 b(`)p Fu(-V)p Fz(':)19 b(Prin)o(t)c Fw(Fweb)i Fz(v)o(ersion)e(n)o(um)o(b)q(er)10 b Fh(.)e(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)g(.)f(.)h(.)f(.)25 b Fz(32)374 2014 y(4.2.64)43 b(`)p Fu(-v)p Fz(':)19 b(Mak)o(e)c(all)h(commen)o(ts)f(v)o(erbatim)g (\()p Fw(Ft)m(angle)p Fz(\))c Fh(.)c(.)26 b Fz(32)374 2069 y(4.2.65)43 b(`)p Fu(-W)p Fz(':)19 b(Flag-setting)c(options)h(for) e Fw(Fwea)l(ve)6 b Fh(.)j(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)21 b Fz(32)523 2124 y(4.2.65.1)43 b(`)p Fu(-W@)p Fz(':)19 b(Set)c(mo)q(dule)i(w)o(arning)e(\015ag.)d Fh(.)c(.)f(.)h(.)f(.)h(.)g (.)28 b Fz(32)523 2178 y(4.2.65.2)43 b(`)p Fu(-W1)p Fz(':)19 b(Cross-reference)c(single-c)o(haracter)614 2233 y(iden)o(ti\014ers)g Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)28 b Fz(33)523 2288 y(4.2.65.3)43 b(`)p Fu(-W[)p Fz(':)19 b(Pro)q(cess)14 b(brac)o(k)o(eted)g(arra)o(y)f(indices)5 b Fh(.)10 b(.)19 b Fz(33)523 2343 y(4.2.65.4)43 b(`)p Fu(-WH)p Fz(':)19 b(Send)d(additional)h(argumen)o(ts)d(to)h(the)g(C)614 2398 y(prepro)q(cessor)8 b Fh(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.) h(.)f(.)23 b Fz(33)523 2452 y(4.2.65.5)43 b(`)p Fu(-WdfFlmvw)p Fz(':)18 b(Don't)c(prin)o(t)i(v)m(arious)f(things)h(in)614 2507 y(w)o(o)o(v)o(en)f(output)7 b Fh(.)g(.)g(.)h(.)g(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)22 b Fz(34)374 2562 y(4.2.66)43 b(`)p Fu(-w)p Fz(':)19 b(Change)c(name)h(of)e(macro)h(pac)o(k)m(age)g(\()p Fw(Fwea)l(ve)p Fz(\))477 2617 y Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)28 b Fz(34)p eop %%Page: -5 149 -5 148 bop 1851 -58 a Fz(v)374 42 y(4.2.67)43 b(`)p Fu(-x)p Fz(':)19 b(Eliminate)e(or)e(reduce)h(cross-reference)465 96 y(information)f(\()p Fw(Fwea)l(ve)p Fz(\).)5 b Fh(.)i(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f (.)h(.)f(.)h(.)f(.)20 b Fz(34)374 151 y(4.2.68)43 b(`)p Fu(-X)p Fz(':)19 b(Prin)o(t)c(selected)i(cross-reference)f(information) 465 206 y(\()p Fw(Fwea)l(ve)p Fz(\))5 b Fh(.)j(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)20 b Fz(34)374 261 y(4.2.69)43 b(`)p Fu(-y)p Fz(':)19 b(Allo)q(cate)e (dynamic)f(memory)7 b Fh(.)g(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)22 b Fz(35)374 315 y(4.2.70)43 b(`)p Fu(-Z)p Fz(':)19 b(Displa)o(y)d(default)g(st)o(yle-\014le)g(parameters) 7 b Fh(.)g(.)h(.)f(.)h(.)f(.)h(.)22 b Fz(35)374 370 y(4.2.71)43 b(`)p Fu(-z)p Fz(':)19 b(Change)c(name)h(of)e(st)o(yle)i(\014le)7 b Fh(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) 22 b Fz(35)374 425 y(4.2.72)43 b(`)p Fu(-.)p Fz(':)19 b(Don't)14 b(recognize)j(dot)d(constan)o(ts)5 b Fh(.)i(.)g(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)20 b Fz(35)374 480 y(4.2.73)43 b(`)p Fu(-\\)p Fz(':)19 b(Explicitly)f(escap)q(e)e(con)o(tin)o(ued)g (strings)10 b Fh(.)d(.)h(.)f(.)h(.)f(.)h(.)f(.)25 b Fz(35)374 535 y(4.2.74)43 b(`)p Fu(-\()p Fz(':)19 b(Con)o(tin)o(ue)d(paren)o (thesized)g(strings)f(with)465 589 y(bac)o(kslashes)7 b Fh(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f (.)h(.)f(.)h(.)22 b Fz(36)374 644 y(4.2.75)43 b(`)p Fu(-:)p Fz(':)19 b(Set)d(starting)e(automatic)h(statemen)o(t)f(n)o(um)o(b)q(er) 7 b Fh(.)h(.)22 b Fz(36)374 699 y(4.2.76)43 b(`)p Fu(->)p Fz(':)19 b(Redirect)e(output)e(\()p Fw(Ft)m(angle)p Fz(\))d Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)27 b Fz(36)374 754 y(4.2.77)43 b(`)p Fu(-=)p Fz(':)19 b(Redirect)e(output) e(\()p Fw(Ft)m(angle)p Fz(\))d Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)27 b Fz(36)374 809 y(4.2.78)43 b(`)p Fu(-#)p Fz(':)19 b(T)l(urn)d(o\013)e(commen)o(ts)h(ab)q(out)g(line)i (and)e(section)465 863 y(n)o(um)o(b)q(ers)g(\()p Fw(Ft)m(angle)p Fz(\))e Fh(.)7 b(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)28 b Fz(36)374 918 y(4.2.79)43 b(`)p Fu(-+)p Fz(':)19 b(Don't)14 b(in)o(terpret)i(comp)q(ound)g(assignmen)o(t)465 973 y(op)q(erators)5 b Fh(.)i(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)21 b Fz(37)374 1028 y(4.2.80)43 b(`)p Fu(-/)p Fz(':)19 b(Recognize)e(short)e(commen)o (ts)f(\()p Fw(F)o(or)m(tran)h Fz(&)465 1083 y Fw(Ra)m(tf)o(or)p Fz(\))6 b Fh(.)h(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)21 b Fz(37)374 1137 y(4.2.81)43 b(`)p Fu(-!)p Fz(':)19 b(Mak)o(e)c(`)p Fu(!)p Fz(')f(denote)i(short)e (commen)o(t)h(\()p Fw(F)o(or)m(tran)g Fz(&)465 1192 y Fw(Ra)m(tf)o(or)p Fz(\))6 b Fh(.)h(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)21 b Fz(37)374 1247 y(4.2.82)43 b(Information)16 b(options)6 b Fh(.)h(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)21 b Fz(37)75 1368 y Fy(5)67 b Fr(Fweb)22 b Fy(COMMANDS)13 b Fb(.)d(.)h(.)f(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)38 b Fy(38)224 1437 y Fz(5.1)45 b(Debugging)16 b(commands)d Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)28 b Fz(38)374 1491 y(5.1.1)44 b(`)p Fu(@0)p Fz(':)19 b(T)l(urn)c(o\013)f (debugging)t Fh(.)9 b(.)f(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)19 b Fz(38)374 1546 y(5.1.2)44 b(`)p Fu(@1)p Fz(':)19 b(Displa)o(y)c(irreducible)j (scraps)c Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)29 b Fz(38)374 1601 y(5.1.3)44 b(`)p Fu(@2)p Fz(':)19 b(Displa)o(y)c(detailed)i(reductions)f(of)f(the)g(scraps)5 b Fh(.)j(.)f(.)h(.)20 b Fz(38)224 1656 y(5.2)45 b(Literal)16 b(con)o(trol)f(c)o(haracters)d Fh(.)c(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)28 b Fz(38)374 1711 y(5.2.1)44 b(`)p Fu(@@)p Fz(':)19 b(The)c(c)o(haracter)f(`)p Fu(@)p Fz(')e Fh(.)c(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)28 b Fz(38)374 1765 y(5.2.2)44 b(`)p Fu(@|)p Fz(':)19 b(Literal)d(v)o(ertical)g(bar,)e(or)h(optional)h (line)g(break)t Fh(.)8 b(.)g(.)19 b Fz(39)224 1820 y(5.3)45 b(Beginning)17 b(of)e(section)9 b Fh(.)f(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)24 b Fz(39)374 1875 y(5.3.1)44 b(`)p Fu(@)14 b Fz(':)20 b(Begin)c(minor)f(section)c Fh(.)d(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)26 b Fz(39)374 1930 y(5.3.2)44 b(`)p Fu(@*)p Fz(',)14 b(`)p Fu(@*)p Fs(n)p Fz(':)19 b(Begin)d(ma)s(jor)d(section)7 b Fh(.)i(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)22 b Fz(39)224 1985 y(5.4)45 b(Beginning)17 b(of)e(co)q(de)h(part)t Fh(.)7 b(.)g(.)h(.)g(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)20 b Fz(40)374 2039 y(5.4.1)44 b(`)p Fu(@<)p Fz(':)19 b(Begin)d(mo)q(dule)g(name)7 b Fh(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)22 b Fz(40)374 2094 y(5.4.2)44 b(`)p Fu(@>)p Fz(':)19 b(End)c(mo)q(dule)i(name)12 b Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)27 b Fz(40)374 2149 y(5.4.3)44 b(`)p Fu(@A)p Fz(':)19 b(Begin)d(co)q(de)g(part)e(of)h(unnamed)h (section)7 b Fh(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)23 b Fz(40)374 2204 y(5.4.4)44 b(`)p Fu(@a)p Fz(':)19 b(Begin)d(co)q(de)g(part)e(of)h (unnamed)h(section,)f(and)h(mark)477 2259 y Fh(.)8 b(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)28 b Fz(40)224 2313 y(5.5)45 b(Con)o(trol)15 b(co)q(des)g(b{z)10 b Fh(.)e(.)g(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)25 b Fz(41)374 2368 y(5.5.1)44 b(`)p Fu(@B)p Fz(':)19 b(Suppress)d (insertion)g(of)f(breakp)q(oin)o(t)g(command)6 b Fh(.)h(.)21 b Fz(41)374 2423 y(5.5.2)44 b(`)p Fu(@b)p Fz(':)19 b(Insert)c(a)g (breakp)q(oin)o(t)h(command)7 b Fh(.)g(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)g(.)f(.)22 b Fz(41)374 2478 y(5.5.3)44 b(`)p Fu(@c)p Fz(':)19 b(Set)c(language)g(to)g(C)5 b Fh(.)i(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)20 b Fz(41)374 2533 y(5.5.4)44 b(`)p Fu(@c++)p Fz(':)18 b(Set)e(language)f(to)g(C)p Fu(++)c Fh(.)c(.)g(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)26 b Fz(42)374 2587 y(5.5.5)44 b(`)p Fu(@D)p Fz(':)19 b(De\014ne)c(outer)g (macro)f Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)29 b Fz(42)374 2642 y(5.5.6)44 b(`)p Fu(@d)p Fz(':)19 b(De\014ne)c(outer)g(macro,)f(and)i (mark)11 b Fh(.)d(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)27 b Fz(42)p eop %%Page: -6 150 -6 149 bop 1838 -58 a Fz(vi)374 42 y(5.5.7)44 b(`)p Fu(@E)p Fz(':)19 b(T)l(reat)14 b(next)h(iden)o(ti\014er)i(as)e(ordinary)g (expression)465 96 y(\()p Fw(Fwea)l(ve)p Fz(\))5 b Fh(.)j(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)20 b Fz(42)374 151 y(5.5.8)44 b(`)p Fu(@f)p Fz(':)19 b(F)l(ormat)13 b(iden)o(ti\014er)k(or)e(mo)q(dule)h(name)8 b Fh(.)g(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)23 b Fz(42)374 206 y(5.5.9)44 b(`)p Fu(@i)p Fz(':)19 b(Include)e(\014le)f(\(unconditional\))10 b Fh(.)f(.)f(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)25 b Fz(43)374 261 y(5.5.10)43 b(`)p Fu(@I)p Fz(':)19 b(Include)f(\014le)e (\(conditional\))e Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)g(.)28 b Fz(44)374 315 y(5.5.11)43 b(`)p Fu(@K)p Fz(':)19 b(Extract)14 b(global)i(R)o(CS-lik)o(e)h(k)o(eyw)o (ord)6 b Fh(.)h(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)22 b Fz(44)374 370 y(5.5.12)43 b(`)p Fu(@k)p Fz(':)19 b(Access)d(lo)q(cal) g(R)o(CS-lik)o(e)h(k)o(eyw)o(ord)8 b Fh(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)24 b Fz(44)374 425 y(5.5.13)43 b(`)p Fu(@L)p Fz(':)19 b(Set)d(language)d Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)28 b Fz(45)374 480 y(5.5.14)43 b(`)p Fu(@l)p Fz(':)19 b(Sp)q(ecify)e(lim)o(b)q(o)f(text)11 b Fh(.)d(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)26 b Fz(45)374 535 y(5.5.15)43 b(`)p Fu(@M)p Fz(':)19 b(De\014ne)d Fw(Fweb)g Fz(macro)t Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)19 b Fz(45)374 589 y(5.5.16)43 b(`)p Fu(@m)p Fz(':)19 b(De\014ne)d Fw(Fweb)g Fz(macro,)e(and)i(mark)c Fh(.)c(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) 28 b Fz(45)374 644 y(5.5.17)43 b(`)p Fu(@N)p Fz(':)19 b(T)l(urn)d(on)f(N)g(mo)q(de)6 b Fh(.)i(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)21 b Fz(46)374 699 y(5.5.18)43 b(`)p Fu(@n)p Fz(':)19 b(Set)d(language)f (to)g Fw(F)o(or)m(tran)p Fz({77)8 b Fh(.)e(.)i(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)g(.)f(.)23 b Fz(47)374 754 y(5.5.19)43 b(`)p Fu(@n9)p Fz(':)19 b(Set)c(language)h(to)e Fw(F)o(or)m(tran)p Fz({90)7 b Fh(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)22 b Fz(47)374 809 y(5.5.20)43 b(`)p Fu(@O)p Fz(':)19 b(Op)q(en)e(output)e (\014le)h(\(global)g(scop)q(e\))11 b Fh(.)d(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)27 b Fz(47)374 863 y(5.5.21)43 b(`)p Fu(@o)p Fz(':)19 b(Op)q(en)e(output)e(\014le)h(\(lo)q(cal)g(scop)q(e\))e Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)29 b Fz(47)374 918 y(5.5.22)43 b(`)p Fu(@q)p Fz(':)19 b(T)l(urn)d(o\013)e (mo)q(dule)j(and)e(line)i(info)e(lo)q(cally)c Fh(.)f(.)d(.)h(.)f(.)h(.) 26 b Fz(48)374 973 y(5.5.23)43 b(`)p Fu(@R)p Fz(':)19 b(T)l(reat)c(next)g(iden)o(ti\014er)i(as)e(in)o(teger-lik)o(e)h(reserv) o(ed)477 1028 y Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) 28 b Fz(49)374 1083 y(5.5.24)43 b(`)p Fu(@r)p Fz(':)19 b(Set)d(language)f(to)g Fw(Ra)m(tf)o(or)p Fz({77)10 b Fh(.)d(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)26 b Fz(49)374 1137 y(5.5.25)43 b(`)p Fu(@r9)p Fz(':)19 b(Set)c(language)h(to)e Fw(Ra)m(tf)o(or)p Fz({90)9 b Fh(.)f(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)24 b Fz(49)374 1192 y(5.5.26)43 b(`)p Fu(@u)p Fz(':)19 b(Unde\014ne)e (outer)e(macro)10 b Fh(.)d(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)25 b Fz(49)374 1247 y(5.5.27)43 b(`)p Fu(@v)p Fz(':)19 b(Ov)o(erload)d(op)q(erator)11 b Fh(.)c(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)27 b Fz(49)374 1302 y(5.5.28)43 b(`)p Fu(@W)p Fz(':)19 b(Ov)o(erload)d(iden)o(ti\014er)8 b Fh(.)h(.)f(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)23 b Fz(50)374 1357 y(5.5.29)43 b(`)p Fu(@x)p Fz(':)19 b(T)l(erminate)d(ignorable)g(material,)f(or)g(b) q(egin)465 1411 y(material)g(to)g(b)q(e)h(c)o(hanged)10 b Fh(.)d(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)25 b Fz(50)374 1466 y(5.5.30)43 b(`)p Fu(@y)p Fz(':)19 b(Begin)d(c)o(hange)g(material) t Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)19 b Fz(50)374 1521 y(5.5.31)43 b(`)p Fu(@z)p Fz(':)19 b(Begin)d(ignorable)h(material,)e(or)f(terminate)h(c)o (hange)477 1576 y Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)28 b Fz(50)224 1631 y(5.6)45 b(Con)o(v)o(ersion)15 b(to)f(ASCI)q(I)h Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)g(.)f(.)h(.)f(.)28 b Fz(51)374 1685 y(5.6.1)44 b(`)p Fu(@')p Fz(':)19 b(Con)o(v)o(ert)14 b(c)o(haracter)g(to)h(ASCI)q(I)g Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)29 b Fz(51)374 1740 y(5.6.2)44 b(`)p Fu(@")p Fz(':)19 b(Con)o(v)o(ert)14 b(string)h(to)f(ASCI)q(I)5 b Fh(.)10 b(.)d(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)21 b Fz(51)224 1795 y(5.7)45 b(F)l(orw)o(ard)14 b(referencing)f Fh(.)8 b(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) 28 b Fz(51)374 1850 y(5.7.1)44 b(`)p Fu(@[)p Fz(':)19 b(Mark)14 b(as)h(de\014ned)f Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)28 b Fz(52)224 1905 y(5.8)45 b(Commen)o(ts)8 b Fh(.)e(.)i(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)23 b Fz(52)374 1959 y(5.8.1)44 b(`)p Fu(@/*)p Fz(':)18 b(Begin)f(long)e(v)o(erbatim)g(commen)o(t)c Fh(.)c(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)26 b Fz(52)374 2014 y(5.8.2)44 b(`)p Fu(@//)p Fz(':)18 b(Begin)f(short)d(v)o (erbatim)h(commen)o(t)e Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) 28 b Fz(52)374 2069 y(5.8.3)44 b(`)p Fu(@\045)p Fz(':)19 b(Ignorable)c(commen)o(t)f Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)29 b Fz(52)374 2124 y(5.8.4)44 b(`)p Fu(@?)p Fz(':)19 b(Begin)d(compiler)g (directiv)o(e)7 b Fh(.)i(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)22 b Fz(53)374 2178 y(5.8.5)44 b(`)p Fu(@\()p Fz(':)19 b(Begin)d(meta-commen)o(t)t Fh(.)7 b(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)19 b Fz(53)374 2233 y(5.8.6)44 b(`)p Fu(@\))p Fz(':)19 b(End)c(meta-commen)o(t)9 b Fh(.)e(.)g(.)h(.)g(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)24 b Fz(53)224 2288 y(5.9)45 b(Sp)q(ecial)17 b(left)f(brace)7 b Fh(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)22 b Fz(53)224 2343 y(5.10)45 b(Index)16 b(en)o(tries)6 b Fh(.)i(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)21 b Fz(54)374 2398 y(5.10.1)43 b(`)p Fu(@_)p Fz(':)19 b(F)l(orce)c(index)i(en)o(try)e (to)f(b)q(e)i(underlined)9 b Fh(.)i(.)c(.)h(.)f(.)h(.)f(.)h(.)24 b Fz(54)374 2452 y(5.10.2)43 b(`)p Fu(@-)p Fz(':)19 b(Delete)d(index)h (en)o(try)10 b Fh(.)c(.)i(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)25 b Fz(54)374 2507 y(5.10.3)43 b(`)p Fu(@+)p Fz(':)19 b(F)l(orce)c(index)i(en)o(try)8 b Fh(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)g(.)f(.)h(.)f(.)h(.)23 b Fz(54)374 2562 y(5.10.4)43 b(`)p Fu(@^)p Fz(':)19 b(Mak)o(e)c(index)h(en)o(try)f(\(Roman)g(t)o(yp) q(e\))c Fh(.)d(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)26 b Fz(54)374 2617 y(5.10.5)43 b(`)p Fu(@.)p Fz(':)19 b(Mak)o(e)c(index)h (en)o(try)f(\(t)o(yp)q(ewriter)g(t)o(yp)q(e\))d Fh(.)7 b(.)g(.)h(.)f(.)h(.)f(.)27 b Fz(54)p eop %%Page: -7 151 -7 150 bop 1826 -58 a Fz(vii)374 42 y(5.10.6)43 b(`)p Fu(@9)p Fz(':)19 b(Mak)o(e)c(index)h(en)o(try)f(\(user-de\014ned)i (format\))5 b Fh(.)h(.)h(.)h(.)20 b Fz(54)224 96 y(5.11)45 b(Con)o(trol)14 b(text)d Fh(.)d(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)27 b Fz(55)374 151 y(5.11.1)43 b(`)p Fu(@t)p Fz(':)19 b(Put)c(con)o(trol)g (text)g(in)o(to)g(a)g(T)1133 161 y(E)1158 151 y(X)h Fu(\\)p Fz(h)o(b)q(o)o(x)f(\()p Fw(Fwea)l(ve)p Fz(\))477 206 y Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)28 b Fz(55)374 261 y(5.11.2)43 b(`)p Fu(@=)p Fz(':)19 b(P)o(ass)c(con)o (trol)g(text)f(v)o(erbatim)h(to)g(the)g(output)f Fh(.)7 b(.)29 b Fz(55)224 315 y(5.12)45 b(Spacing)15 b Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)29 b Fz(55)374 370 y(5.12.1)43 b(`)p Fu(@,)p Fz(':)19 b(Insert)d(a)f(thin)h(space)8 b Fh(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)g(.)f(.)h(.)f(.)23 b Fz(55)374 425 y(5.12.2)43 b(`)p Fu(@/)p Fz(':)19 b(F)l(orce)c(a)g(line)i(break,)e(preserving)h (inden)o(tation.)477 480 y Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)28 b Fz(55)374 535 y(5.12.3)43 b(`)p Fu(@\\)p Fz(':)19 b(F)l(orce)c(a)g(line)i(break,)e(then)g(inden)o(t)5 b Fh(.)k(.)f(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)21 b Fz(56)374 589 y(5.12.4)43 b(`)p Fu(@|)p Fz(':)19 b(Literal)d(v)o (ertical)f(bar,)f(or)h(optional)g(line)h(break)5 b Fh(.)j(.)20 b Fz(56)374 644 y(5.12.5)43 b(`)p Fu(@#)p Fz(':)19 b(Blank)d(line)6 b Fh(.)j(.)f(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)21 b Fz(56)374 699 y(5.12.6)43 b(`)p Fu(@~)p Fz(':)19 b(Cancel)d(line)h (break)10 b Fh(.)e(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)25 b Fz(57)374 754 y(5.12.7)43 b(`)p Fu(@&)p Fz(':)19 b(Join)d(items)t Fh(.)9 b(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)19 b Fz(57)224 809 y(5.13)45 b(Pseudo)15 b(\(in)o(visible\))j(op)q (erators)7 b Fh(.)f(.)h(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)22 b Fz(57)374 863 y(5.13.1)43 b(`)p Fu(@e)p Fz(':)19 b(Pseudo-expression) 14 b Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)28 b Fz(57)374 918 y(5.13.2)43 b(`)p Fu(@;)p Fz(':)19 b(Pseudo-semicolon)8 b Fh(.)h(.)f(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)23 b Fz(58)374 973 y(5.13.3)43 b(`)p Fu(@:)p Fz(':)19 b(Pseudo-colon)9 b Fh(.)g(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)24 b Fz(59)224 1028 y(5.14)45 b(Miscellaneous)17 b(commands)d Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)30 b Fz(59)374 1083 y(5.14.1)43 b(`)p Fu(@!)p Fz(':)19 b(Inhibit)f(macro)c (expansion)6 b Fh(.)i(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)21 b Fz(59)75 1204 y Fy(6)67 b(COMMENTING)20 b(STYLES)h Fb(.)10 b(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.) f(.)g(.)43 b Fy(60)224 1272 y Fz(6.1)i(In)o(visible)18 b(commen)o(ts)10 b Fh(.)c(.)i(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)25 b Fz(60)224 1327 y(6.2)45 b(Visible)17 b(commen)o(ts)d Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)29 b Fz(60)224 1382 y(6.3)45 b(T)l(emp)q(orary)15 b(commen)o(ts)5 b Fh(.)h(.)i(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) 20 b Fz(61)75 1503 y Fy(7)67 b(MA)n(CR)n(OS)22 b(and)h(PREPR)n (OCESSING)18 b Fb(.)10 b(.)g(.)h(.)f(.)g(.)g(.)h(.)41 b Fy(62)224 1572 y Fz(7.1)k(Outer)15 b(macros)10 b Fh(.)d(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)25 b Fz(62)224 1626 y(7.2)45 b Fw(Fweb)16 b Fz(macros)7 b Fh(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)22 b Fz(63)374 1681 y(7.2.1)44 b(V)l(arious)15 b(features)g(of)g Fw(Fweb)h Fz(macros)11 b Fh(.)d(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)27 b Fz(64)523 1736 y(7.2.1.1)44 b Fw(Fweb)16 b Fz(macros)e(with)h(v)m(ariable)i(argumen)o(ts)5 b Fh(.)i(.)20 b Fz(64)523 1791 y(7.2.1.2)44 b(Recursion)14 b Fh(.)8 b(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)29 b Fz(64)523 1846 y(7.2.1.3)44 b(Protecting)15 b(macros)f(against)h(rede\014nition)c Fh(.)f(.)26 b Fz(64)374 1900 y(7.2.2)44 b(Sp)q(ecial)17 b(tok)o(ens)9 b Fh(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)24 b Fz(65)523 1955 y(7.2.2.1)44 b(ANSI)16 b(C-compatible)g (tok)o(ens)7 b Fh(.)g(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)22 b Fz(65)523 2010 y(7.2.2.2)44 b(Extensions)15 b(to)g(ANSI)h(C)f(macro)f (syn)o(tax)7 b Fh(.)g(.)g(.)h(.)22 b Fz(65)374 2065 y(7.2.3)44 b(Built-in)17 b(functions)7 b Fh(.)i(.)f(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)23 b Fz(66)523 2120 y(7.2.3.1)44 b(Strings)15 b(and)g(quotes)d Fh(.)c(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)27 b Fz(67)523 2174 y(7.2.3.2)44 b(Rede\014ning)17 b(built-in)h(functions)10 b Fh(.)e(.)g(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)25 b Fz(67)523 2229 y(7.2.3.3)44 b Fu($A)p Fz(:)19 b(Con)o(v)o(ert)14 b(to)h(ASCI)q(I)e Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.) 27 b Fz(68)523 2284 y(7.2.3.4)44 b Fu($ABS)p Fz(:)19 b(Absolute)d(v)m(alue)8 b Fh(.)h(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)23 b Fz(68)523 2339 y(7.2.3.5)44 b Fu($ASSERT)p Fz(:)18 b(Assert)d(a)g(condition)f Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)28 b Fz(68)523 2394 y(7.2.3.6)44 b Fu($AUTHOR)p Fz(:)18 b(V)l(alue)f(of)d(R)o(CS)i (global)g(k)o(eyw)o(ord)614 2448 y Fu(Author)6 b Fh(.)h(.)g(.)h(.)f(.)h (.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)21 b Fz(68)523 2503 y(7.2.3.7)44 b Fu($COMMENT)p Fz(:)18 b(Generate)d(a)g (commen)o(t)8 b Fh(.)f(.)g(.)h(.)g(.)f(.)h(.)f(.)23 b Fz(68)523 2558 y(7.2.3.8)44 b Fu($DATE)p Fz(:)19 b(T)l(o)q(da)o(y's)14 b(date)t Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g (.)f(.)h(.)f(.)h(.)19 b Fz(68)523 2613 y(7.2.3.9)44 b Fu($DATE_TIME)p Fz(:)18 b(V)l(alue)e(of)f(R)o(CS)g(global)h(k)o(eyw)o (ord)614 2667 y Fu(Date)8 b Fh(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)23 b Fz(68)p eop %%Page: -8 152 -8 151 bop 1813 -58 a Fz(viii)523 42 y(7.2.3.10)43 b Fu($DAY)p Fz(:)20 b(The)15 b(da)o(y)7 b Fh(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)23 b Fz(68)523 96 y(7.2.3.11)43 b Fu($DECR)p Fz(:)19 b(Decremen)o(t)c(a)g (macro)e Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)28 b Fz(69)523 151 y(7.2.3.12)43 b Fu($DEFINE)p Fz(:)19 b(Deferred)c(macro)g(de\014nition)h Fh(.)8 b(.)f(.)30 b Fz(69)523 206 y(7.2.3.13)43 b Fu($DO)p Fz(:)20 b(Macro)14 b(do)h(lo)q(op)c Fh(.)d(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)26 b Fz(69)523 261 y(7.2.3.14)43 b Fu($DUMPDEF)p Fz(:)19 b(Dump)c(macro)g(de\014nitions)i(to)d(the)614 315 y(terminal)5 b Fh(.)j(.)g(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)20 b Fz(70)523 370 y(7.2.3.15)43 b Fu($E)p Fz(:)20 b(Base)15 b(of)g(the)g(natural)g(logarithms)f Fh(.)8 b(.)f(.)h(.)29 b Fz(70)523 425 y(7.2.3.16)43 b Fu($ERROR)p Fz(:)19 b(Send)d(error)f(message)g(to)f(output)627 480 y Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)28 b Fz(70)523 535 y(7.2.3.17)43 b Fu($EVAL)p Fz(:)19 b(Ev)m(aluate)d(a)f(macro)g(expression)9 b Fh(.)f(.)g(.)24 b Fz(70)523 589 y(7.2.3.18)43 b Fu($EXP)p Fz(:)20 b(Exp)q(onen)o(tial)c(function)10 b Fh(.)e(.)g(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)25 b Fz(71)523 644 y(7.2.3.19)43 b Fu($GETENV)p Fz(:)19 b(Get)c(v)m(alue)h(of)f(en)o(vironmen)o(t)614 699 y(v)m(ariable)c Fh(.)e(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)26 b Fz(71)523 754 y(7.2.3.20)43 b Fu($HEADER)p Fz(:)19 b(V)l(alue)d(of)f(R)o(CS)h(global)f(k)o(eyw)o(ord)614 809 y Fu(Header)6 b Fh(.)h(.)g(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)21 b Fz(71)523 863 y(7.2.3.21)43 b Fu($HOME)p Fz(:)19 b(The)d(user's)f(home)g(directory)c Fh(.)d(.)g(.)f(.)h(.)26 b Fz(71)523 918 y(7.2.3.22)43 b Fu($ID)p Fz(:)20 b(V)l(alue)c(of)f(R)o(CS)g(global)h(k)o(eyw)o(ord)e Fu(Id)5 b Fh(.)j(.)20 b Fz(71)523 973 y(7.2.3.23)43 b Fu($IF)p Fz(:)20 b(Tw)o(o-w)o(a)o(y)13 b(conditional)i Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)28 b Fz(71)523 1028 y(7.2.3.24)43 b Fu($IFCASE)p Fz(:)19 b(n-w)o(a)o(y)c(conditional)7 b Fh(.)i(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)22 b Fz(71)523 1083 y(7.2.3.25)43 b Fu($IFDEF)p Fz(:)19 b(Tw)o(o-w)o(a)o(y)14 b(conditional)9 b Fh(.)g(.)f(.)f(.)h(.)f (.)h(.)f(.)h(.)24 b Fz(72)523 1137 y(7.2.3.26)43 b Fu($IFNDEF)p Fz(:)19 b(Tw)o(o-w)o(a)o(y)14 b(conditional)8 b Fh(.)h(.)e(.)h(.)f(.)h (.)f(.)h(.)23 b Fz(72)523 1192 y(7.2.3.27)43 b Fu($IFELSE)p Fz(:)19 b(Tw)o(o-w)o(a)o(y)14 b(conditional)8 b Fh(.)h(.)e(.)h(.)f(.)h (.)f(.)h(.)23 b Fz(72)523 1247 y(7.2.3.28)43 b Fu($INCR)p Fz(:)19 b(Incremen)o(t)d(a)f(macro)9 b Fh(.)e(.)g(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)24 b Fz(72)523 1302 y(7.2.3.29)43 b Fu($INPUT_LINE)p Fz(:)19 b(Line)d(n)o(um)o(b)q(er)g(that)e(b)q(egins) 614 1357 y(curren)o(t)h(section)6 b Fh(.)i(.)f(.)h(.)g(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)21 b Fz(72)523 1411 y(7.2.3.30)43 b Fu($KEYWORD)p Fz(:)19 b(V)l(alue)d(of)f(global)h(R)o(CS-lik)o(e)614 1466 y(k)o(eyw)o(ord)6 b Fh(.)h(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)21 b Fz(72)523 1521 y(7.2.3.31)43 b Fu($L)p Fz(:)20 b(Change)15 b(to)g(lo)o(w)o(er)f(case)d Fh(.)d(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)26 b Fz(73)523 1576 y(7.2.3.32)43 b Fu($L_KEYWORD)p Fz(:)19 b(V)l(alue)d(of)f(lo)q(cal)h(R)o(CS-lik)o(e)614 1631 y(k)o(eyw)o(ord)6 b Fh(.)h(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)21 b Fz(73)523 1685 y(7.2.3.33)43 b Fu($LANGUAGE)p Fz(:)19 b(Iden)o(ti\014er)d(for)f(curren)o(t)g(language)627 1740 y Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)28 b Fz(74)523 1795 y(7.2.3.34)43 b Fu($LANGUAGE_NUM)p Fz(:)18 b(Num)o(b)q(er)e(of)f(curren)o(t)614 1850 y(language)d Fh(.)c(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)27 b Fz(74)523 1905 y(7.2.3.35)43 b Fu($LEN)p Fz(:)20 b(Length)15 b(of)g(string)5 b Fh(.)i(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)20 b Fz(74)523 1959 y(7.2.3.36)43 b Fu($LOCKER)p Fz(:)19 b(V)l(alue)d(of)f(R)o(CS)h(global)f(k)o(eyw)o (ord)614 2014 y Fu(Locker)6 b Fh(.)h(.)g(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)21 b Fz(75)523 2069 y(7.2.3.37)43 b Fu($LOG)p Fz(:)20 b(Natural)15 b(logarithm)6 b Fh(.)h(.)h(.)f(.)h(.)g (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)21 b Fz(75)523 2124 y(7.2.3.38)43 b Fu($LOG10)p Fz(:)19 b(Logarithm)c(to)g(the)g(base)g(10) 7 b Fh(.)h(.)f(.)h(.)f(.)23 b Fz(75)523 2178 y(7.2.3.39)43 b Fu($M)p Fz(:)20 b(De\014ne)c(a)f(deferred)g(macro)5 b Fh(.)i(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)20 b Fz(75)523 2233 y(7.2.3.40)43 b Fu($MAX)p Fz(:)20 b(Maxim)o(um)14 b(of)h(a)g(list)g Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f (.)29 b Fz(75)523 2288 y(7.2.3.41)43 b Fu($MIN)p Fz(:)20 b(Minim)o(um)t Fh(.)8 b(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)19 b Fz(75)523 2343 y(7.2.3.42)43 b Fu($MODULE_NAME)p Fz(:)18 b(Name)e(of)e(presen)o(t)i Fu(web)614 2398 y Fz(mo)q(dule)5 b Fh(.)k(.)e(.)h(.)f(.)h(.)f(.)h(.)g (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)20 b Fz(75)523 2452 y(7.2.3.43)43 b Fu($MODULES)p Fz(:)19 b(T)l(otal)c(n)o(um)o(b)q(er)h (of)e(indep)q(enden)o(t)614 2507 y(mo)q(dules)7 b Fh(.)i(.)e(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)22 b Fz(75)523 2562 y(7.2.3.44)43 b Fu($NAME)p Fz(:)19 b(V)l(alue)e(of)d(R)o(CS)i (global)g(k)o(eyw)o(ord)e Fu(Name)627 2617 y Fh(.)8 b(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)28 b Fz(75)p eop %%Page: -9 153 -9 152 bop 1838 -58 a Fz(ix)523 42 y(7.2.3.45)43 b Fu($OUTPUT_LINE)p Fz(:)18 b(Curren)o(t)d(line)i(n)o(um)o(b)q(er)f(of)614 96 y(tangled)g(output)5 b Fh(.)i(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)20 b Fz(76)523 151 y(7.2.3.46)43 b Fu($P)p Fz(:)20 b(The)15 b(C)g(prepro)q(cessor)h(sym)o(b)q(ol)d Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.) 29 b Fz(76)523 206 y(7.2.3.47)43 b Fu($PI)p Fz(:)20 b(Pi)t Fh(.)8 b(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)19 b Fz(76)523 261 y(7.2.3.48)43 b Fu($POW)p Fz(:)20 b(Exp)q(onen)o (tiation)13 b Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g (.)f(.)h(.)27 b Fz(76)523 315 y(7.2.3.49)43 b Fu($PP)p Fz(:)20 b(The)15 b(C)g(prepro)q(cessor)g(sym)o(b)q(ol)e Fh(.)8 b(.)f(.)h(.)f(.)h(.)27 b Fz(76)523 370 y(7.2.3.50)43 b Fu($RCSFILE)p Fz(:)19 b(V)l(alue)d(of)f(R)o(CS)g(global)h(k)o(eyw)o (ord)614 425 y Fu($RCSfile)e Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)30 b Fz(76)523 480 y(7.2.3.51)43 b Fu($REVISION)p Fz(:)19 b(V)l(alue)d(of)f(R)o(CS)g(global)h(k)o(eyw)o (ord)614 535 y Fu(Revision)e Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)30 b Fz(76)523 589 y(7.2.3.52)43 b Fu($ROUTINE)p Fz(:)19 b(Curren)o(t)c(function)h(\()p Fw(Ra)m(tf)o(or)614 644 y Fz(only\))5 b Fh(.)j(.)f(.)h(.)f(.)h(.)g(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)20 b Fz(77)523 699 y(7.2.3.53)43 b Fu($SECTION_NUM)p Fz(:)18 b(Num)o(b)q(er)e(of)f(curren)o(t)g Fw(Fweb)614 754 y Fz(section)9 b Fh(.)g(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.) f(.)h(.)f(.)h(.)24 b Fz(77)523 809 y(7.2.3.54)43 b Fu($SECTIONS)p Fz(:)19 b(Maxim)o(um)c(section)h(n)o(um)o(b)q(er)627 863 y Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)28 b Fz(77)523 918 y(7.2.3.55)43 b Fu($SOURCE)p Fz(:)19 b(V)l(alue)d(of)f(R)o(CS)h(global)f(k)o(eyw)o (ord)614 973 y Fu(Source)6 b Fh(.)h(.)g(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)21 b Fz(77)523 1028 y(7.2.3.56)43 b Fu($SQRT)p Fz(:)19 b(Square)d(ro)q(ot)t Fh(.)7 b(.)g(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)19 b Fz(77)523 1083 y(7.2.3.57)43 b Fu($STATE)p Fz(:)19 b(V)l(alue)e(of)d(R)o(CS)i(global)g(k)o(eyw)o(ord)614 1137 y Fu(State)7 b Fh(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)22 b Fz(77)523 1192 y(7.2.3.58)43 b Fu($STRING)p Fz(:)19 b(Expand,)c(then)h(stringize)11 b Fh(.)d(.)g(.)f(.)h(.)f(.)26 b Fz(77)523 1247 y(7.2.3.59)43 b Fu($STUB)p Fz(:)19 b(T)l(rap)c(for)g(missing)h(mo)q(dule)6 b Fh(.)j(.)f(.)f(.)h(.)f(.)h(.)21 b Fz(77)523 1302 y(7.2.3.60)43 b Fu($TIME)p Fz(:)19 b(The)d(time)8 b Fh(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)23 b Fz(77)523 1357 y(7.2.3.61)43 b Fu($TRANSLIT)p Fz(:)19 b(T)l(ransliteration)12 b Fh(.)c(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) 27 b Fz(78)523 1411 y(7.2.3.62)43 b Fu($U)p Fz(:)20 b(Change)15 b(to)g(upp)q(er)h(case)5 b Fh(.)j(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)21 b Fz(78)523 1466 y(7.2.3.63)43 b Fu($UNDEF)p Fz(:)19 b(Unde\014ne)e(a)e(macro)9 b Fh(.)e(.)g(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)24 b Fz(78)523 1521 y(7.2.3.64)43 b Fu($UNQUOTE)p Fz(:)19 b(Remo)o(v)o(e)c(quotes)g(from)f(string)627 1576 y Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)28 b Fz(78)523 1631 y(7.2.3.65)43 b Fu($UNSTRING)p Fz(:)19 b(Con)o(v)o(ert)14 b(string)h(in)o(to)g(c)o (haracters)627 1685 y Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)28 b Fz(78)523 1740 y(7.2.3.66)43 b Fu($VERBATIM)p Fz(:)19 b(\(Obsolete\))12 b Fh(.)c(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)27 b Fz(78)523 1795 y(7.2.3.67)43 b Fu($VERSION)p Fz(:)19 b(Presen)o(t)c Fw(Fweb)h Fz(v)o(ersion)g(n)o(um)o(b)q(er)627 1850 y Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)28 b Fz(78)374 1905 y(7.2.4)44 b(Debugging)15 b(with)h(macros)11 b Fh(.)d(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)27 b Fz(79)224 1959 y(7.3)45 b(Prepro)q(cessing)9 b Fh(.)f(.)g(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)24 b Fz(80)75 2081 y Fy(8)67 b(LANGUA)n(GES)7 b Fb(.)j(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)30 b Fy(83)224 2149 y Fz(8.1)45 b(Setting)16 b(the)f(language)5 b Fh(.)j(.)f(.)h(.)g (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)21 b Fz(83)224 2204 y(8.2)45 b(Sp)q(ecial)17 b(hin)o(ts)f(and)f (considerations)h(for)f(eac)o(h)g(language)d Fh(.)c(.)f(.)h(.)f(.)h(.)f (.)h(.)27 b Fz(84)374 2259 y(8.2.1)44 b(Sp)q(ecial)17 b(considerations)f(for)f(C)d Fh(.)c(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)28 b Fz(84)374 2313 y(8.2.2)44 b(Sp)q(ecial)17 b(considerations)f(for)f(C)p Fu(++)10 b Fh(.)d(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)26 b Fz(85)374 2368 y(8.2.3)44 b(Sp)q(ecial)17 b(considerations)f(for)f Fw(F)o(or)m(tran)7 b Fh(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)g(.)f(.)h(.)22 b Fz(85)523 2423 y(8.2.3.1)44 b(Items)15 b(for)f(b)q(oth)i Fw(F)o(or)m(tran)p Fz(-77)f(and)614 2478 y Fw(F)o(or)m(tran)p Fz(-90)g Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)30 b Fz(85)523 2533 y(8.2.3.2)44 b(Items)15 b(sp)q(eci\014c)i(to)d Fw(F)o(or)m(tran)p Fz(-77)h(and)614 2587 y(\014xed-form)h Fw(F)o(or)m(tran-90)10 b Fh(.)e(.)f(.)h(.)f(.)h (.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)25 b Fz(87)523 2642 y(8.2.3.3)44 b(Items)15 b(sp)q(eci\014c)i(to)d Fw(F)o(or)m(tran)p Fz(-90)8 b Fh(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) 23 b Fz(87)p eop %%Page: -10 154 -10 153 bop 1851 -58 a Fz(x)374 42 y(8.2.4)44 b(Sp)q(ecial)17 b(considerations)f(for)f Fw(Ra)m(tf)o(or)10 b Fh(.)e(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)25 b Fz(88)374 96 y(8.2.5)44 b(Sp)q(ecial)17 b(considerations)f(for)f(T)l(eX)9 b Fh(.)f(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)24 b Fz(88)374 151 y(8.2.6)44 b(Sp)q(ecial)17 b(considerations)f(for)f (the)g Fw(verba)m(tim)h Fz(language)477 206 y Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)28 b Fz(88)75 327 y Fy(9)67 b Fr(Ra)l(tf)o(or)18 b Fb(.)10 b(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)42 b Fy(89)224 396 y Fz(9.1)j Fw(Ra)m(tf)o(or)16 b Fz(syn)o(tax)10 b Fh(.)d(.)g(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)g(.)f(.)h(.)25 b Fz(89)224 450 y(9.2)45 b Fw(Ra)m(tf)o(or)16 b Fz(commands)d Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)29 b Fz(89)374 505 y(9.2.1)44 b Fw(Ra)m(tf)o(or)p Fz({77)15 b(commands)5 b Fh(.)j(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)21 b Fz(89)374 560 y(9.2.2)44 b(Additional)17 b Fw(Ra)m(tf)o(or)p Fz({90)e(commands)c Fh(.)c(.)g(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)26 b Fz(90)224 615 y(9.3)45 b(Ca)o(v)o(eats)14 b(ab)q(out)h Fw(Ra)m(tf)o(or)8 b Fh(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)23 b Fz(90)75 736 y Fy(10)66 b(DOCUMENT)-6 b(A)g(TION)16 b Fb(.)10 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)42 b Fy(91)224 804 y Fz(10.1)j(T)o(yp)q (esetting)5 b Fh(.)j(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)20 b Fz(91)374 859 y(10.1.1)43 b Fw(Fwea)l(ve)p Fz('s)16 b(OUTPUT)t Fh(.)8 b(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)20 b Fz(91)374 914 y(10.1.2)43 b(The)16 b(macro)e(pac)o(k)m(age)i(`)p Fu(fwebmac.sty)p Fz(')10 b Fh(.)5 b(.)j(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)25 b Fz(92)523 969 y(10.1.2.1)43 b(User)15 b(macros)10 b Fh(.)d(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)25 b Fz(92)523 1024 y(10.1.2.2)43 b(F)l(on)o(ts)13 b Fh(.)7 b(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)29 b Fz(92)374 1078 y(10.1.3)43 b(LaT)611 1088 y(E)637 1078 y(X)15 b(supp)q(ort)8 b Fh(.)g(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)23 b Fz(93)523 1133 y(10.1.3.1)43 b(LaT)796 1143 y(E)822 1133 y(X's)15 b(do)q(cumen)o(t)g(class)9 b Fh(.)f(.)g(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)24 b Fz(93)523 1188 y(10.1.3.2)43 b(Using)16 b(REVT)971 1198 y(E)997 1188 y(X)9 b Fh(.)f(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)24 b Fz(94)523 1243 y(10.1.3.3)43 b(LaT)796 1253 y(E)822 1243 y(X)15 b(pac)o(k)m(ages)g(related)h(to)e Fw(Fweb)h Fh(.)8 b(.)f(.)h(.)f(.)29 b Fz(95)523 1298 y(10.1.3.4)43 b(Sections)16 b(in)g(LaT)1026 1307 y(E)1052 1298 y(X)e Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)29 b Fz(95)523 1352 y(10.1.3.5)43 b(LaT)796 1362 y(E)822 1352 y(X's)15 b(index.)f Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)29 b Fz(96)523 1407 y(10.1.3.6)43 b(LaT)796 1417 y(E)822 1407 y(X's)15 b(T)l(able)h(of)e(Con)o(ten)o(ts)t Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)19 b Fz(96)523 1462 y(10.1.3.7)43 b(Customizing)16 b(LaT)1059 1472 y(E)1085 1462 y(X's)f(output)t Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)20 b Fz(97)374 1517 y(10.1.4)43 b(P)o(age)15 b(references)8 b Fh(.)g(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) 23 b Fz(98)374 1572 y(10.1.5)43 b(P)o(age)15 b(headers)9 b Fh(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)24 b Fz(98)374 1626 y(10.1.6)43 b(Section)17 b(n)o(um)o(b)q(ering)f(sc)o (hemes)7 b Fh(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)22 b Fz(98)523 1681 y(10.1.6.1)43 b(P)o(ac)o(k)m(age)15 b Fu(fwebinsert)p Fz(:)j(Inserting)e Fw(Fwea)l(ve)p Fz('s)614 1736 y(output)f(in)o(to)g(a)g(LaT)969 1746 y(E)995 1736 y(X)g(do)q(cumen)o(t)e Fh(.)8 b(.)f(.)h(.)f(.)h(.)f (.)h(.)g(.)f(.)h(.)f(.)28 b Fz(99)224 1791 y(10.2)45 b(Prett)o(y-prin)o(ting)5 b Fh(.)i(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)20 b Fz(100)374 1846 y(10.2.1)43 b(Pseudo-op)q(erators)9 b Fh(.)f(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) g(.)f(.)h(.)f(.)24 b Fz(101)374 1900 y(10.2.2)43 b(Alternativ)o(es)16 b(for)f(v)m(arious)g(input)i(tok)o(ens)10 b Fh(.)c(.)i(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)25 b Fz(101)374 1955 y(10.2.3)43 b(Ov)o(erloading)17 b(op)q(erators)d(and)h(iden)o(ti\014ers)5 b Fh(.)10 b(.)d(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)20 b Fz(101)523 2010 y(10.2.3.1)43 b(Ov)o(erloading)16 b(op)q(erators)8 b Fh(.)f(.)g(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)23 b Fz(101)523 2065 y(10.2.3.2)43 b(Ov)o(erloading)16 b(iden)o(ti\014ers)h Fh(.)7 b(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)30 b Fz(102)75 2186 y Fy(11)66 b Fr(Fweb)p Fy('s)22 b(INDEX.)14 b Fb(.)d(.)f(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) 39 b Fy(103)224 2254 y Fz(11.1)45 b Fw(Fweb)p Fz('s)15 b(self-generated)h(index)g Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)29 b Fz(103)224 2309 y(11.2)45 b(Creating)15 b(a)g(stand-alone)g(index)i (with)e Fu(makeindex)d Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)28 b Fz(103)374 2364 y(11.2.1)43 b(Creating)15 b(a)g(stand-alone)h(index:) 21 b(Summary)8 b Fh(.)f(.)h(.)f(.)h(.)f(.)h(.)22 b Fz(103)374 2419 y(11.2.2)43 b(Creating)15 b(a)g(stand-alone)h(index:)21 b(Details)13 b Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)27 b Fz(104)224 2474 y(11.3)45 b(Using)15 b(the)h Fu(idxmerge)e Fz(utilit)o(y)i(to)f(merge)g(indexes)h Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)29 b Fz(105)374 2528 y(11.3.1)43 b(Using)16 b Fu(idxmerge)p Fz(:)j(Summary)7 b Fh(.)g(.)g(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)21 b Fz(105)374 2583 y(11.3.2)43 b(Using)16 b Fu(idxmerge)p Fz(:)j(Details)11 b Fh(.)d(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)26 b Fz(106)p eop %%Page: -11 155 -11 154 bop 1838 -58 a Fz(xi)75 42 y Fy(12)66 b(CUSTOMIZA)-6 b(TION)6 b Fb(.)i(.)j(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)h(.)28 b Fy(107)224 110 y Fz(12.1)45 b(En)o(vironmen)o(t)15 b(v)m(ariables)7 b Fh(.)i(.)f(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)22 b Fz(107)224 165 y(12.2)45 b(Initialization)7 b Fh(.)j(.)d(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)21 b Fz(108)374 220 y(12.2.1)43 b(The)16 b(initialization)i(\014le)5 b Fh(.)j(.)g(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)20 b Fz(108)374 274 y(12.2.2)43 b(Memory)15 b(allo)q(cation)5 b Fh(.)k(.)e(.)h(.)f(.)h(.)g(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) 20 b Fz(108)523 329 y(12.2.2.1)43 b(`)p Fu(-yb)p Fz(':)19 b(Maxim)o(um)c(b)o(ytes)g(for)f(iden)o(ti\014ers,)614 384 y(index)j(en)o(tries,)e(and)g(mo)q(dule)i(names)8 b Fh(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)23 b Fz(108)523 439 y(12.2.2.2)43 b(`)p Fu(-ybs)p Fz(':)19 b(Size)d(of)f(the)g(c)o (hange)h(bu\013er,)e(in)i(b)o(ytes)627 494 y Fh(.)7 b(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)27 b Fz(109)523 548 y(12.2.2.3)43 b(`)p Fu(-ycb)p Fz(':)19 b(Size)d(of)f(line)i(bu\013er)e(for)g(C)g(output,)f(in)614 603 y(b)o(ytes)g Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)29 b Fz(109)523 658 y(12.2.2.4)43 b(`)p Fu(-ycf)p Fz(':)19 b(Size)d(of)f(a)g(Ratfor)f(bu\013er,)h(in)h(b) o(ytes)627 713 y Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)27 b Fz(109)523 768 y(12.2.2.5)43 b(`)p Fu(-ycg)p Fz(':)19 b(Size)d(of)f(another)g (Ratfor)f(bu\013er,)h(in)614 822 y(b)o(ytes)f Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)29 b Fz(109)523 877 y(12.2.2.6)43 b(`)p Fu(-yd)p Fz(':)19 b(Incremen)o(t)d(for)e(expanding)j(the)e(dots)614 932 y(table)6 b Fh(.)i(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)21 b Fz(109)523 987 y(12.2.2.7)43 b(`)p Fu(-ydt)p Fz(':)19 b(Maxim)o(um)c(n)o(um)o(b)q(er)g(of)g(deferred)614 1042 y(macro)g(tok)o(ens)10 b Fh(.)d(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)25 b Fz(109)523 1096 y(12.2.2.8)43 b(`)p Fu(-ydx)p Fz(':)19 b(Maxim)o(um)c(n)o(um)o(b)q(er)g(of)g(deferred)614 1151 y(macro)g(texts)e Fh(.)7 b(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) 29 b Fz(109)523 1206 y(12.2.2.9)43 b(`)p Fu(-yid)p Fz(':)19 b(Maxim)o(um)c(depth)h(of)e(\014le)j(inclusion)627 1261 y Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)27 b Fz(109)523 1315 y(12.2.2.10)43 b(`)p Fu(-yif)p Fz(':)19 b(Maxim)o(um)14 b(n)o(um)o(b)q(er)i(of)f (unique)614 1370 y(include-\014l)q(e)j(names)8 b Fh(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) g(.)22 b Fz(110)523 1425 y(12.2.2.11)43 b(`)p Fu(-ykt)p Fz(':)19 b(Stac)o(k)14 b(size)i(for)f Fw(Ft)m(angle)f Fh(.)7 b(.)h(.)f(.)h(.)28 b Fz(110)523 1480 y(12.2.2.12)43 b(`)p Fu(-ykw)p Fz(':)19 b(Stac)o(k)14 b(size)i(for)f Fw(Fwea)l(ve)c Fh(.)d(.)g(.)f(.)h(.)f(.)26 b Fz(110)523 1535 y(12.2.2.13)43 b(`)p Fu(-yll)p Fz(':)19 b(Line)d(length)g(for)f Fw(Fwea)l(ve)p Fz('s)g(output,)614 1589 y(in)h(b)o(ytes)9 b Fh(.)f(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)24 b Fz(110)523 1644 y(12.2.2.14)43 b(`)p Fu(-yln)p Fz(':)19 b(Maxim)o(um)14 b(length)i(of)f(mo)q(dule)614 1699 y(names)g(or)g (strings,)g(in)h(b)o(ytes)t Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)19 b Fz(110)523 1754 y(12.2.2.15)43 b(`)p Fu(-ylb)p Fz(':)19 b(Maxim)o(um)14 b(n)o(um)o(b)q(er)i(of)f (nested)g(lo)q(ops)614 1809 y(in)h Fw(Ra)m(tf)o(or)10 b Fh(.)e(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)24 b Fz(110)523 1863 y(12.2.2.16)43 b(`)p Fu(-ylx)p Fz(':)19 b(Maxim)o(um)14 b(length)i(of)f(expressions)614 1918 y(that)g(can)g(b)q(e)h(expanded)g(with)g(the)f(p)q(ost-incremen)o(t)614 1973 y(op)q(erators)f(of)h Fw(F)o(or)m(tran)h Fz(or)e Fw(Ra)m(tf)o(or)h Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)29 b Fz(110)523 2028 y(12.2.2.17)43 b(`)p Fu(-ym)p Fz(':)19 b(Maxim)o(um)c(n)o(um)o(b)q(er)g(of)g(sections)627 2083 y Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)27 b Fz(110)523 2137 y(12.2.2.18)43 b(`)p Fu(-yma)p Fz(':)19 b(Maxim)o(um)14 b(n)o(um)o(b)q(er)i(of)f (argumen)o(ts)614 2192 y(to)g Fw(Fweb)h Fz(macros)8 b Fh(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)23 b Fz(110)523 2247 y(12.2.2.19)43 b(`)p Fu(-ymb)p Fz(':)19 b(Size)d(of)f(the)g(bu\013er)g(for)g (expanding)614 2302 y Fw(Fweb)h Fz(macros)e Fh(.)7 b(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)29 b Fz(111)523 2357 y(12.2.2.20)43 b(`)p Fu(-yn)p Fz(':)19 b(Maxim)o(um)c(n)o(um)o(b)q(er)g(of)g(iden)o (ti\014ers)614 2411 y(and)h(mo)q(dule)g(names)9 b Fh(.)e(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)24 b Fz(111)523 2466 y(12.2.2.21)43 b(`)p Fu(-ynf)p Fz(':)19 b(Maxim)o(um)14 b(n)o(um)o(b)q(er)i(of)f(op)q(en)h(output)614 2521 y(\014les)7 b Fh(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)22 b Fz(111)523 2576 y(12.2.2.22)43 b(`)p Fu(-yop)p Fz(':)19 b(Maxim)o(um)14 b(n)o(um)o(b)q(er)i(of)f(en)o (tries)g(in)614 2631 y(the)h(table)f(for)g(op)q(erator)f(o)o(v)o (erloading.)t Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)19 b Fz(111)p eop %%Page: -12 156 -12 155 bop 1826 -58 a Fz(xii)523 42 y(12.2.2.23)43 b(`)p Fu(-yr)p Fz(':)19 b(Maxim)o(um)c(n)o(um)o(b)q(er)g(of)614 96 y(cross-references)10 b Fh(.)e(.)g(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)25 b Fz(111)523 151 y(12.2.2.24)43 b(`)p Fu(-ys)p Fz(':)19 b(Maxim)o(um)c(n)o(um)o(b)q(er)g(of)g(scraps)f Fh(.)8 b(.)29 b Fz(111)523 206 y(12.2.2.25)43 b(`)p Fu(-ysb)p Fz(':)19 b(Size)d(of)f(st)o(yle-\014le)h(input-line)i(bu\013er)627 261 y Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)27 b Fz(111)523 315 y(12.2.2.26)43 b(`)p Fu(-ytt)p Fz(':)19 b(Maxim)o(um)14 b(n)o(um)o(b)q(er)i(of)f(tok)o (ens)f(that)614 370 y Fw(Ft)m(angle)i Fz(can)g(pro)q(cess)c Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)27 b Fz(111)523 425 y(12.2.2.27)43 b(`)p Fu(-ytw)p Fz(':)19 b(Maxim)o(um)14 b(tok)o(ens)h(in)h(the)f(curren)o(t) 614 480 y(section)h(b)q(eing)g(pro)q(cessed)g(b)o(y)g Fw(Fwea)l(ve)p Fz(.)t Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)19 b Fz(112)523 535 y(12.2.2.28)43 b(`)p Fu(-yx)p Fz(':)19 b(Maxim)o(um)c(n)o(um)o(b)q(er)g(of)g(texts)5 b Fh(.)i(.)h(.)f(.)20 b Fz(112)523 589 y(12.2.2.29)43 b(`)p Fu(-yxb)p Fz(':)19 b(Size)d(of)f(line)i(bu\013er)e(for)f(T)1352 599 y(E)1378 589 y(X)h(and)614 644 y(v)o(erbatim)g(output)c Fh(.)c(.)h(.)f(.)h(.)g (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)26 b Fz(112)224 699 y(12.3)45 b(The)15 b(St)o(yle)h(\014le)c Fh(.)c(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)g(.)f(.)h(.)26 b Fz(112)374 754 y(12.3.1)43 b(Customizing)16 b Fw(Fwea)l(ve)p Fz('s)g(index)5 b Fh(.)k(.)e(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)20 b Fz(113)523 809 y(12.3.1.1)43 b Fu(index.)p Fs(???)8 b Fh(.)h(.)e(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.) f(.)19 b Fz(113)523 863 y(12.3.1.2)43 b Fu(delim_)p Fs(?)8 b Fh(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)19 b Fz(113)523 918 y(12.3.1.3)43 b Fu(group_skip)11 b Fh(.)d(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)27 b Fz(114)523 973 y(12.3.1.4)43 b Fu(item_0)6 b Fh(.)h(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)g(.)f(.)21 b Fz(114)523 1028 y(12.3.1.5)43 b Fu(language.)p Fs(???)16 b Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)26 b Fz(114)523 1083 y(12.3.1.6)43 b Fu(lethead.)p Fs(???)17 b Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)27 b Fz(114)523 1137 y(12.3.1.7)43 b Fu(underline.)p Fs(???)15 b Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)25 b Fz(114)374 1192 y(12.3.2)43 b(Customizing)16 b(the)g(mo)q(dule)g(list)7 b Fh(.)i(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)22 b Fz(114)374 1247 y(12.3.3)43 b(Customizing)16 b(the)g(T)l(able)g(of)e(Con)o(ten)o(ts)6 b Fh(.)g(.)i(.)g(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)20 b Fz(114)374 1302 y(12.3.4)43 b(Customizing)16 b(cross-reference)g(subscripts)f Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)29 b Fz(114)374 1357 y(12.3.5)43 b(Customizing)16 b(the)g(b)q(eha)o(vior)f(of)g(`)p Fu(fwebmac.sty)p Fz(')e(macros)477 1411 y Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)27 b Fz(115)523 1466 y(12.3.5.1)43 b Fu(format.)p Fs(???)19 b Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)29 b Fz(115)523 1521 y(12.3.5.2)43 b Fu(indent.)p Fs(???)19 b Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)29 b Fz(116)523 1576 y(12.3.5.3)43 b Fu(LaTeX.)p Fs(???)8 b Fh(.)h(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)19 b Fz(116)374 1631 y(12.3.6)43 b(Remapping)17 b(con)o(trol)e(co)q(des)6 b Fh(.)i(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)21 b Fz(116)374 1685 y(12.3.7)43 b(Color)15 b(output)9 b Fh(.)f(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) 24 b Fz(117)374 1740 y(12.3.8)43 b(Miscellaneous)18 b(st)o(yle-\014le)e (parameters)10 b Fh(.)c(.)i(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)24 b Fz(118)523 1795 y(12.3.8.1)43 b Fu(ASCII_Fcn)12 b Fh(.)c(.)f(.)h(.)f (.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)28 b Fz(118)523 1850 y(12.3.8.2)43 b Fu(cchar)7 b Fh(.)g(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)22 b Fz(118)523 1905 y(12.3.8.3)43 b Fu(cdir_start)11 b Fh(.)d(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)27 b Fz(118)523 1959 y(12.3.8.4)43 b Fu(line_char.)p Fs(l)16 b Fz(\()p Fw(Ft)m(angle)p Fz(\))f Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)29 b Fz(119)523 2014 y(12.3.8.5)43 b Fu(line_length.)p Fs(l)16 b Fz(\()p Fw(Ft)m(angle)p Fz(\))c Fh(.)7 b(.)h(.)f(.)h(.)g(.)f(.)h(.)f (.)h(.)26 b Fz(119)523 2069 y(12.3.8.6)43 b Fu(meta.)p Fs(???.?)t Fz(,)16 b Fu(meta.)p Fs(???)p Fu(.hdr.)p Fs(?)k Fz(\()p Fw(Ft)m(angle)p Fz(\))627 2124 y Fh(.)7 b(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)27 b Fz(119)523 2178 y(12.3.8.7)43 b Fu(outer.)p Fs(???)8 b Fh(.)h(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)19 b Fz(119)523 2233 y(12.3.8.8)43 b Fu(protect.?)12 b Fh(.)c(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)28 b Fz(119)523 2288 y(12.3.8.9)43 b Fu(suffix.?)14 b Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)29 b Fz(119)523 2343 y(12.3.8.10)43 b Fu(macros)6 b Fh(.)g(.)i(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)20 b Fz(119)523 2398 y(12.3.8.11)43 b Fu(limbo.begin)p Fz(,)13 b Fu(limbo.end)7 b Fh(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)22 b Fz(120)523 2452 y(12.3.8.12)43 b Fu(meta.)p Fs(???)20 b Fz(\()p Fw(Fwea)l(ve)p Fz(\))11 b Fh(.)d(.)g(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)26 b Fz(120)523 2507 y(12.3.8.13)43 b Fu(preamble.)p Fs(???)15 b Fh(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)26 b Fz(120)523 2562 y(12.3.8.14)43 b Fu(dot_constant.)p Fs(???.?)14 b Fh(.)8 b(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)25 b Fz(120)523 2617 y(12.3.8.15)43 b Fu(null_file)12 b Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)28 b Fz(120)p eop %%Page: -13 157 -13 156 bop 1813 -58 a Fz(xiii)374 42 y(12.3.9)43 b(Automatic)16 b(\014le)g(name)f(completion)f Fh(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)28 b Fz(120)75 163 y Fy(13)66 b(USA)n(GE)23 b(TIPS)f(and)h(SUGGESTIONS)6 b Fb(.)k(.)g(.)g(.)g(.)h(.)28 b Fy(121)224 231 y Fz(13.1)45 b(Con)o(v)o(erting)14 b(an)i(existing)g (co)q(de)g(to)e Fw(Fweb)7 b Fh(.)i(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)22 b Fz(121)224 286 y(13.2)45 b(Programming)14 b(tips)i(and)f(other)g(suggestions)c Fh(.)c(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)25 b Fz(122)224 341 y(13.3)45 b(F)l(eatures)15 b(for)f(scien)o(ti\014c)j (programming)8 b Fh(.)e(.)i(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)22 b Fz(123)75 462 y Fy(14)66 b(NEW)23 b(FEA)-6 b(TURES)8 b Fb(.)j(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)30 b Fy(124)224 531 y Fz(14.1)45 b(V)l(ersion)16 b(1.61)11 b Fh(.)c(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)27 b Fz(124)374 585 y(14.1.1)43 b(Up)q(dates)16 b(to)f(do)q(cumen)o(tation)g(\(v1.61\))10 b Fh(.)c(.)h(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)25 b Fz(124)374 640 y(14.1.2)43 b(Rede\014ned)18 b(commands)d(\(v1.61\))d Fh(.)5 b(.)i(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) 26 b Fz(124)374 695 y(14.1.3)43 b(New)16 b(features)f(\(v1.61\))7 b Fh(.)e(.)i(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)21 b Fz(125)374 750 y(14.1.4)43 b(Signi\014can)o(t)17 b(bugs)e(\(v1.61\))10 b Fh(.)c(.)i(.)f(.)h(.)f(.) h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)25 b Fz(126)224 804 y(14.2)45 b(V)l(ersion)16 b(1.53)11 b Fh(.)c(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)27 b Fz(126)224 859 y(14.3)45 b(V)l(ersion)16 b(1.52)11 b Fh(.)c(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)27 b Fz(127)224 914 y(14.4)45 b(V)l(ersion)16 b(1.50)11 b Fh(.)c(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f (.)h(.)f(.)h(.)f(.)h(.)f(.)27 b Fz(128)224 969 y(14.5)45 b(V)l(ersion)16 b(1.40)11 b Fh(.)c(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h (.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)27 b Fz(129)75 1090 y Fy(15)66 b(SUPPOR)-6 b(T)12 b Fb(.)f(.)f(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)h(.)f(.)g(.)g(.)g(.)35 b Fy(131)75 1225 y(App)r(endix)24 b(A)67 b(Installing)25 b Fr(Fweb)16 b Fb(.)10 b(.)g(.)g(.)h(.)f(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)39 b Fy(132)75 1360 y(Concept)22 b(index)12 b Fb(.)g(.)e(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)35 b Fy(133)75 1495 y(Option)23 b(and)g(command)f(index)d Fb(.)11 b(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)40 b Fy(137)75 1630 y(P)n(arameter)22 b(index)11 b Fb(.)i(.)d(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)34 b Fy(141)p eop %%Trailer end userdict /end-hook known{end-hook}if %%EOF fweb-1.62/Manual/fweb.sty100644 10061 1115 4242 6602703126 14421 0ustar krommesusers% --- SAMPLE STYLE FILE fweb.sty --- % (Not completed yet; see `info fweb customization style'.) % NOTE: If you are not using this file to typeset the FWEB sources, % comment out the next command!!! % Include typesetting and page-layout macros for FWEB sources. limbo.begin "\\input fweb" % Input fweb.tex automatically. % Get LaTeX2e to include the optional file `twoside.sty'. LaTeX.class.options "twoside" % Activate several packages. Multicol is used for the Index. LaTeX.package "indentfirst,multicol" % To get the entire document in two-column forma, uncomment the three lines % beginning with `limbo.end'. (One must include `multicol' in % `LaTeX.package'.) % limbo.end "\\def\\beforeindex{\\end{multicols}\\newpage}\n\ %\\begin{multicols}{2}\n\ %\\raggedcolumns" % Use the following for two-column format, or for generally tightening up % the manuscript. % doc.preamble "\\secpenalty0" % Trial extensions. To activate these, put `-e' into .fweb. ext.web "web wb" ext.hweb "hwb" % Pretty up the documentation. named.preamble "\\7" % Empty line after module name. % Non-default names for the TeX output files. index.tex "#.ndx" modules.tex "#.mds" contents.tex "#.cts" % Separate index entries by \letter{...}. See `fweb.tex' for a sample % definition of \letter. lethead.prefix "\\letter{" lethead.suffix "}\n" lethead.flag -1 % Use lower case letters. % Starting stuff for compiler directives. (This is an example; you'll % probably want to change it for your system.) cdir_start.N "*VOCL" % Fortran-77 compiler directives will start with ``*VOCL'' cdir_start.N90 "CMF$" % Subscript symbols with the section number where they were defined. With % this setting, function names will be subscripted with cross-reference % information. To turn off all such subscripting, use the command-line % option `-f'. mark_defined.fcn_name 1 mark_defined.WEB_macro 0 mark_defined.outer_macro 0 mark_defined.exp_type 0 mark_defined.typedef_name 0 % It may no longer be necessary to use the following. % format.identifier "\\\\" % format.WEB_macro "\\>" % format.keyword "\\?" % format.typewriter "\\YYY" % Example of a tricky thing for Fortran. % dot_constant.begin '[' % dot_constant.end ']' fweb-1.62/Manual/fwebinsert.sty100644 10061 1115 3547 6602703126 15655 0ustar krommesusers% This file is a LaTeX2e package. One may select it in a LaTeX document by % the command % % \usepackage{fwebinsert} % % The package sets things up so that one can include TeX output from FWEAVE % into a LaTeX document. % J. A. Krommes, April 12, 1996 \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{fwebinsert}[1996/04/12] \DeclareOption{FWEBstandalone}{\input{fwebmac.sty}\FWEBstandalonetrue} \DeclareOption{FWEBinsert}{\input{fwebmac.sty}\FWEBstandalonefalse} \ExecuteOptions{FWEBinsert} % Set up default. \ProcessOptions \makeatletter % The optional argument to \FWEBinput is zero or more letters from the list % 0,1,2,3 (fweb levels), h (headers), or c (table of contents). \newcommand\FWEBinput[2][]{\begingroup\W@read{#1}{#2}\endgroup} \global\let\fwebinput\FWEBinput %\newcommand\fwebinput[2][]{\W@read{#1}{#2}}% No surrounding group; dangerous. \gdef\W@read#1#2{% \toks0={#1}% \ifW@intoks{\toks0}0{\FWEBlevel{0}}{}% \ifW@intoks{\toks0}1{\FWEBlevel{1}}{}% \ifW@intoks{\toks0}2{\FWEBlevel{2}}{}% \ifW@intoks{\toks0}3{\FWEBlevel{3}}{}% \ifW@intoks{\toks0}h{\W@headerstrue}{\W@headersfalse}% \ifW@intoks{\toks0}c{}{\def\Wcon##1{\W@onecolumn}}% \def\jobname{#2}% For reading the aux file in \Wbegin. \def\@writefile##1##2{}% Don't mess with input-file toc. \edef\Wb@se{\the\c@section}% Starting section number. \input{#2.tex}% Read the TeX'd output from fweave. } \gdef\FWEBlevel#1{\def\W@ssmin{#1}} \global\let\fweblevel\FWEBlevel \gdef\W@preface#1{\W@getsection{#1}} \newif\ifW@inlist \gdef\ifW@intoks#1#2#3#4{\let\W@tsttoken#2% \expandafter\W@listcheck\the#1\relax \ifW@inlist#3\else#4\fi } \gdef\W@listcheck#1\relax{% \W@inlistfalse \def\test{#1}% \ifx\test\empty \else \W@tokscheck#1\relax \fi } \gdef\W@tokscheck#1#2\relax{% \if\W@tsttoken#1 \W@inlisttrue \let\next\relax \else \def\next{\W@listcheck#2\relax}% \fi \next } \makeatother fweb-1.62/Manual/fwebmac.sty100644 10061 1115 134111 6602703126 15141 0ustar krommesusers% FTANGLE v1.60, %% created with UNIX on "Thursday, September 10, 1998 at 22:59." %% COMMAND LINE: "/u/krommes/Fweb/Web/ftangle -# fwebmac" %% RUN TIME: "Friday, September 11, 1998 at 18:55." %% WEB FILE: "fwebmac.web" %% CHANGE FILE: (none) \ifx\FWEBisloaded\relax\endinput\else\let\FWEBisloaded\relax\fi \newif\ifFWEBstandalone \FWEBstandalonetrue \catcode`\@=11 \chardef\other=12 \long\def\comment#1\endcomment{} \def\FWEBversion{$REVISION} \def\FWEBdate{September 23, 1995} \newcount\W@count \newcount\W@counta \newtoks\W@tk \ifx\DeclareRobustCommand\undefined \def\DeclareRobustCommand#1{\@ifnextchar[% {\W@argdef#1}{\W@argdef#1[0]}} \def\W@argdef#1[#2]{\W@tk={}% \W@count=0 \loop \ifnum\W@count<#2 \advance\W@count by1 \edef\next{\W@tk={\the\W@tk########\the\W@count}}\next \repeat \edef\next{\def\noexpand#1\the\W@tk}\next} \fi \ifx\@ifnextchar\undefined \def\@ifnextchar#1#2#3{\let\@tempe#1 \def\@tempa{#2}% \def\@tempb{#3}% \futurelet\@tempc\@ifnch} \def\@ifnch{\ifx\@tempc\@sptoken \let\@tempd\@xifnch \else \ifx\@tempc\@tempe \let\@tempd\@tempa \else \let\@tempd\@tempb \fi \fi \@tempd } {\def\:{\global\let\@sptoken= } \: } \def\@xifnch{\futurelet\@tempc\@ifnch} \fi \let\DRC\DeclareRobustCommand \def\TeX{T\kern-0.1667em\lower0.5ex\hbox{E}\kern-0.125emX\W@t} \ifx\LaTeX\undefined \def\LaTeX{L\kern-0.36em\raise0.3ex\hbox{\Csc a}\kern-0.15em\TeX} \fi \newif\ifnoLaTeXe% By default, we have \LaTeXe. \ifx\LaTeXe\undefined \noLaTeXetrue \def\LaTeXe{\LaTeX 2$_\varepsilon$} \fi \newif\ifLaTeXisloaded \ifx\pageno\undefined \LaTeXisloadedtrue \fi \ifLaTeXisloaded \def\W@stop{} \else \def\W@stop{ \message{Please use LaTeX. Plain TeX is no longer supported. ABORTING!} \end } \fi \W@stop \newif\ifuseREVTeX \newif\ifusedocumentstyle \ifnoLaTeXe \usedocumentstyletrue \fi \ifuseREVTeX \usedocumentstyletrue \fi \DRC\WEB{\Wtypewriter{WEB}} \DRC\FWEB{\Wtypewriter{FWEB}} \DRC\CWEB{\Wtypewriter{CWEB}} \DRC\TANGLE{\Wtypewriter{TANGLE}} \let\Tangle\TANGLE \DRC\WEAVE{\Wtypewriter{WEAVE}} \let\Weave\WEAVE \DRC\FTANGLE{\Wtypewriter{FTANGLE}} \DRC\FWEAVE{\Wtypewriter{FWEAVE}} \DRC\C{C\W@t} \DRC\Cpp{\C{\tt ++}} \DRC\FORTRAN{{\Csc Fortran}} \let\Fortran\FORTRAN \DRC\MAKE{{\tt MAKE}} \let\Make\MAKE \DRC\RATFOR{{\Csc Ratfor}} \let\Ratfor\RATFOR \DRC\UNIX{{\SC UNIX}} \let\Unix\UNIX \ifLaTeXisloaded \else \let\@\relax \let\\\relax \let\protect\relax \fi \let\amp\& \let\at\@ \let\bslash\\ \let\caret\^ \let\dollar\$ \let\dstar\* \let\equals\= \let\period\. \let\textcolon: \let\leftbrace\{ \let\rightbrace\} \let\vertbar| \let\PM\# \let\PC\% \let\W@t\@ \let\W@S\S \dimen0=\normalbaselineskip \parskip=\dimen0 plus 1pt minus 6pt \newskip\pardimen \pardimen=\parskip \newdimen\TeXindent \TeXindent 1em% For paragraphs in the \TeX\ part. \ifLaTeXisloaded \let\pageno\c@page% \WEB\ has its own name for the page number. \fi \ifnoLaTeXe \ifx\tenrm\undefined \font\tenrm=cmr10 \fi \ifx\itfam\undefined \chardef\itfam4 \fi \ifx\small\undefined \let\small\relax \fi \let\mainfont\tenrm \let\cmntfont\tenrm \font\eightrm=cmr8 \let\SC\eightrm \font\titlefont=cmssbx10 scaled \magstep2% Sans serif \font\ttitlefont=cmtt10 scaled\magstep2% Typewriter type \font\tentex=cmtex10 % \TeX\ \.{extended char.\ set} (used in strings) \let\extendedtex\tentex \font\Csc=cmcsc10 % Caps/small caps. \font\tenbfit=cmbxti10 % \&{Intrinsic functions} \let\bfit\tenbfit % Doesn't work right in titles. \font\seventi=cmti7 \font\sevenrm=cmr7 \font\sevenbf=cmbx7 \font\sevenit=cmti7 \scriptfont\itfam=\sevenit \scriptscriptfont\itfam=\sevenit \def\mathrm#1{{\rm #1}} \def\mathit#1{{\it #1}} \else % \LaTeXe \def\mainfont{\normalsize\usefont{OT1}{\rmdefault}{m}{n}} \let\cmntfont\mainfont \def\eightrm{\footnotesize\usefont{OT1}{\rmdefault}{m}{n}} \let\SC\eightrm \def\titlefont{\Large\usefont{OT1}{\sfdefault}{\bfdefault}{n}} \def\ttitlefont{\Large\usefont{OT1}{\ttdefault}{m}{n}} \def\extendedtex{\usefont{OT1}{\ttdefault}{m}{n}} \def\tentex{\normalsize\extendedtex} \def\Csc{\usefont{OT1}{\rmdefault}{m}{\scdefault}} \def\bfit{\usefont{OT1}{\rmdefault}{\bfdefault}{\itdefault}} \def\tenbfit{\normalsize\bfit} \def\seventi{\scriptsize\usefont{OT1}{\rmdefault}{m}{\itdefault}} \def\sevenrm{\scriptsize\usefont{OT1}{\rmdefault}{m}{n}} \def\sevenbf{\scriptsize\usefont{OT1}{\rmdefault}{\bfdefault}{n}} \def\fiveti{\tiny\usefont{OT1}{\rmdefault}{m}{\itdefault}} \def\fiverm{\tiny\usefont{OT1}{\rmdefault}{m}{n}} \def\fivebf{\tiny\usefont{OT1}{\rmdefault}{\bfdefault}{n}} \def\tensy{\normalsize\usefont{OT1}{cmsy}{m}{n}} \fi \DRC\Wshort[1]{\leavevmode\hbox{$#1$}}% One-letter identifiers such % as~\Wshort{x} look better this way. \DRC\Wid[1]{\leavevmode\hbox{\it#1\/\kern.05em}}% Italic type for ordinary % identifiers such as \Wid{test}. \DRC\WID[1]{\leavevmode\hbox{\small\it#1\/\kern.05em}}% For all % %\WID{UPPERCASE}. \let\WidD\Wid % Outer macro \let\WIDD\WID % Upper-case outer macro \let\WidM\Wid % FWEB macro \let\WIDM\WID % Upper-case FWEB macro \DRC\Wreserved[1]{\leavevmode\hbox{\def\\{\tt\WBS}\bf#1\/}}% Boldface type % for reserved words such as \Wreserved{int}. \DRC\WRESERVED[1]{\leavevmode\hbox{\def\\{\tt\WBS}\small\bf#1\/}}% Boldface %type % for upper-case reserved words such as \WRESERVED{INTEGER}. \DRC\Wintrinsic[1]{\leavevmode\hbox{\def\\{\tt\WBS}\bfit#1\/\kern.05em}}% % Library/intrinsic function name such as \@{sin}. \def\W@twodef#1#2#3#4{\gdef#1{#3}\gdef#2{#4}} \def\Wequate#1#2#3#4#5#6#7#8#9{% \W@twodef#1\Wreserved\WRESERVED% |\&| by default. \gdef#2{\Wshort}% |\|| by default. \W@twodef#5\WidM\WIDM% |\\| by default. \W@twodef#4\WidD\WIDD% |\\| by default. \W@twodef#3\Wid\WID% |\\| by default. \gdef#6{\Wintrinsic}% |\@| by default. \W@twodef#7\Wkeyword\WKEYWORD% |\.| by default. \gdef#8{\Wtypewriter}% |\.| by default. % \#9 is for future use. } \def\W@zero{0}% For the comparison in |\WIN| below. \DRC\WIN[2]{\ifmmode\def\ZZ{}\else\def\ZZ{\null$\null}\fi \ZZ_{\def\W@rg{#2}\ifx\W@rg\W@zero{\bullet}\else\W@IN{#1}{#2}\fi}\ZZ} \gdef\W@IN#1#2{% \ifcase#1 \underline{\hbox{\sevenrm\Wmodtrans{#2}}}% Generic name (\.{@[}). [0] \or\hbox{\sevenrm\Wmodtrans{#2}}% Function name. [1] \or\underline{\hbox{\seventi\Wmodtrans{#2}}}% WEB macro. [2] \or\hbox{\seventi\Wmodtrans{#2}}% Outer macro. [3] \or\underline{\hbox{\sevenbf\Wmodtrans{#2}}}% \.{@`}. [4] \or\hbox{\sevenbf\Wmodtrans{#2}}% \&{typedef}. [5] \else{\Wmodtrans{#2}}% Error trap. \fi } \DRC\Wtypewriter[1]{\relax\ifmmode\gdef\YY{\null$\null}\else\gdef\YY{}\fi \YY{\leavevmode\W@INITSTR#1}\YY} \let\Wkeyword\Wtypewriter \let\WKEYWORD\Wtypewriter \let\.\Wtypewriter \def\W@INITSTR{% \extendedtex % Typewriter type for strings. (We don't say \let\\=\WBS % Backslash in a string: '\.\\'. \let\'=\WRQ % Right quote in a string: '\.\''. \let\`=\WLQ % Left quote in a string: '\.\`'. \let\{=\WLB % Left brace in a string: '\.\WLB'. \let\}=\WRB % Right brace in a string: '\.\WRB'. \let\~=\WTL % Tilde in a string: '\.\~'. \let\ =\WSP % Space in a string: '\.\ '. \let\_=\WUL % Underline in a string: '\.\_'. \let\&=\WAM % Ampersand in a string: '\.\&'. \def\0{\discretionary{\WBS}{}{}}% \FWEB\ inserts this automatically every % so often so very long strings will break. Broken strings will % be marked by a backslash. \def\1{,\0}% \FWEB\ replaces commas in strings by this, so strings % tend to break after commas. \let\2\space % Ordinary space after control sequences in \TeX. \def\3{\space\space}% Translation of a tab in \TeX. } \DRC\#{\hbox{\tt\char35}}% Parameter sign: '\#'. \DRC\${\hbox{\tt\char36}}% Dollar sign: '\$'. \DRC\%{\hbox{\tt\char37}}% Percent sign: '\%'. \DRC\^{\ifmmode\raise0.45ex\hbox{$\,\scriptstyle\mathchar"25E\,$}% \else\char`^ \fi}% Pointer or % hat: '\^'. % Circumflex accents can be obtained from |\^^D| instead of |\^|. \let\Caret\^% For proper indexing of |@c++ operator ^|. \def\AT!{@}% Knuth's abbreviation for the at sign for control text: '\AT!' \chardef\asterisk=`\* \chardef\WAM=`\&% Ampersand character in a string: '\.\&'. \chardef\WBS=`\\% Backslash in a string: '\.\\'. \DRC\WttBS{{\tt\WBS}}% Literal backslash: '\WttBS'. \chardef\WLB=`\{% Left brace in a string: '\.\WLB'. \DRC\WLQ{{\tt\char'22}}% Left quote in a string: '\.\`'. \chardef\WRB=`\}% Right brace in a string: '\.\WRB'. \DRC\WRQ{{\tt\char'23}}% Right quote in a string: '\.\''. \DRC\WSP{{\tt\char`\ }}% (Visible) space in a string: '\.\ '. \chardef\WTL=`\~% Tilde in a string: '\.\~'. \chardef\WUL=`\_% Underline character in a string: '\.\_'. \DRC\WLQx{\hbox{\WLQ}} \newbox\rulebox \newcount\ruleno \def\rules#1{\leavevmode \ruleno=0 \rlap{\vtop to 0pt{\null \def\R{\setbox0=\hbox{\the\ruleno}% \rlap{\vrule height0pt depth#1}% \kern-0.5\wd0\copy0\kern-0.5\wd0 \advance\ruleno by1 \hskip1em} \rlap{\R\R\R\R\R\R\R} \vss}}} \newdimen\notch \newcount\W@globalindent \W@globalindent=3 % Global indentation in notches. \newcount\W@ind % Current indentation in notches. \newcount\W@lastind % Used for preprocessor commands. \def\W@saveind{\global\W@lastind=\W@ind} \newbox\b@k \newbox\b@kk \def\W@setboxes#1{\notch=#1 \setbox\b@k=\hbox to -\notch{}% Backspace one notch. \setbox\b@kk=\hbox to -2\notch{}% Backspace two notches. } \newif\ifW@firstbreak \newcount\W@nBK \def\WBKo{}% NOT FINISHED YET! \def\WBK{\WBK@{0}} \def\WBK@#1{\hfil\break \ifW@firstbreak \W@nBK=\W@ind \advance\W@nBK by -#1 % Compensate for glob's outdented by 1 from body. \W@firstbreakfalse % Reset by |\6|. \fi \hangindent\W@nBK\notch \ignorespaces} \def\1{\global\advance\W@ind by1\hangindent\W@ind\notch}% Indent one more notch \def\2{\global\advance\W@ind by-1{}}% Indent one less notch \def\3#1{\hfil\penalty#10\hfilneg}% Optional break within a statement. \def\4{\copy\b@k \ignorespaces}% Backspace one notch \def\5{\hfil\penalty-1\hfilneg \kern2.5\notch\copy\b@kk \yskipfalse\ignorespaces} \def\6{\ifmmode\else\par \hangindent\W@ind\notch \noindent \kern\W@ind\notch \copy\b@kk \ignorespaces% \fi} \def\7{\WY\6}% Forced break and a little extra space. \def\8{\hskip-\W@ind\notch \hskip 2\notch} \newif\ifyskip \def\yskip{\medskip} \def\W@Hspace{\hbox{ }} \DRC\WPR[1]{\copy\b@kk \W@saveind% |\global\advance\W@ind by 2| \1\Wreserved{@#1}\W@Hspace} \DRC\WPs{\global\W@ind=\W@lastind} \def\W@point{!} \def\W@defin#1#2{\4\W@saveind \1\Wreserved{#1}% \def\W@temp{#2}% \ifx\W@temp\ast \ast \else\ifx\W@temp\W@point \W@point \else\hbox{$^{\mathrm{#2}}$}% \fi\fi \W@Hspace}% Begin @d, @m, or @f. \def\note#1#2.{\WY\noindent{\hangindent2em\baselineskip10pt\footnotesize #1 #2.\par}} \def\W@lapstar{\rlap{*}} \newif\ifW@modchanged \def\W@checkstar{\edef\W@temp{\noexpand\W@isstar\modstar\noexpand\*\relax}% \W@temp} \def\W@isstar#1\*#2\relax{\ifx#2\*\W@modchangedtrue\else\W@modchangedfalse\fi} \def\W@includefile{} \def\WIF#1{\gdef\W@includefile{#1}} \def\WIF@name{\ifx\W@includefile\empty \else \W@prninclude \fi} \def\W@prninclude{\ifLaTeXisloaded\else\ \fi \WIFfmt{\W@includefile} } \def\WIFfmt#1{[{\tt#1}]} \def\W@startsection{\WQ \W@checkstar {\let\*=\W@lapstar \ifLaTeXisloaded \leavevmode \else \noindent \bf\modstar.% \fi \WIF@name% Print name of current include file, if there is one. \ifLaTeXisloaded\else\quad\fi }} \def\W@skipbrace#1{\catcode`\{=1 } \DRC\WC{\W@cmnt{/\ast}{\W@finishcomment}}% Long comment. \DRC\Wc{\W@cmnt{//}{\XX}}% Short comment. \DRC\Wci{\W@cmnt{}{\XX}}% No comment symbol at all; for special effects. \def\W@cmnt#1#2{\ifmmode\gdef\XX{\null$\null}\else\gdef\XX{}\fi% C-style cmnt \XX\hfil\penalty-1\hfilneg \ifyskip\else\quad\fi$#1\,$% \bgroup\cmntfont % The user can redefine the comment font |\cmntfont|. \aftergroup#2% \catcode`\{=\other\W@skipbrace} \def\W@finishcomment{$\,\ast/$\XX} \def\Wx#1{\kern-0.5\notch\hbox{\tt\%}} \def\WCDIR#1{\WPR?\Wtypewriter{#1}\WPs} \DRC\WCD[1]{\ifmmode\hbox\fi{\ignorespaces#1}} \def\WD#1{\W@defin{@D}{#1}}% Outer macro definition: `\.{@D}' \def\Wd#1{\W@defin{@d}{#1}}% Outer macro definition: `\.{@d}' \def\WUd#1{\W@defin{@u}{#1}}% Undef outer macro: `\.{@u}'. \def\WMD{\W@defin{@M}}% WEB macro definition: `\.{@M}'. Second argument % supplied by \FWEAVE. \def\WMd{\W@defin{@m}}% WEB macro definition: `\.{@m}'. As above. \def\WE#1{\WPR{\##1}}% WEB preprocessor command: `\.{@\#if\dots}'. \def\Wf#1{\W@defin{@f}{#1}}% Format definition: `\.{@f}'. \def\WF#1{\W@defin{@F}{#1}}% Format definition: `\.{@F}'. \def\Wl#1{\W@defin{@l}{#1}}% Limbo text definition: `\.{@l}'. \def\Wv#1{\W@defin{@v}{#1}}% Operator overloading: `\.{@v}'. \def\WWW#1{\W@defin{@W}{#1}}% Identifier overloading: `\.{@W}'. \def\Ww#1{\W@defin{@w}{#1}}% Identifier overloading: `\.{@w}'. \newif\ifpagerefs% Page references or module-number references? \pagerefsfalse \newif\ifnumberTeX% Do we start the \TeX\ part of unnamed sections with \numberTeXfalse \newif\ifnumberdefs% As above, but for the definition part. \numberdefstrue \newif\ifnumbercode% As above, but for the code part. \numbercodetrue \newif\ifnumberunnamed% Number unnamed section? \numberunnamedfalse \newskip\Wuparindent \let\Wrefstepcounter\refstepcounter \newif\ifstripzeros \ifuseREVTeX \stripzerosfalse \else \stripzerostrue % By default, we're bold. \fi \def\W@modequate#1{\def\W@temp{#1}% \ifx\W@temp\empty\else \gdef#1{\Wmodtrans}% \fi} \newcount\W@ssmax% Maximum depth of the \.{@*}$n$ commands. \newcount\W@lsmax% Max. local (per section) depth of the \.{@*}$n$ commands. \def\W@maxdepth#1{{\count0=#1 \advance\count0 by\W@ssmin% \xdef\W@depth{\the\count0}}% \ifFWEBstandalone\else \immediate\write\@auxout{\string\@writefile{toc}% {\string\setcounter{tocdepth}{\W@depth}}}% \fi } \def\Wunnamed#1#2{\csname ifnumber#1\endcsname \gdef\Wnewoutname{#2}% \ifx\Woutname\Wnewoutname\else \8\Wtypewriter{"#2"} \Wscrap ${}\equiv{}$\6% \global\let\Woutname\Wnewoutname \fi\fi} \newcount\secpenalty \secpenalty=-500 % Strongly encourage breaks at sections. \def\W@Lvmode#1{% \if@minipage\else \if@nobreak\else \ifdim\lastskip=\z@ \vfil \penalty#1\relax \vfilneg \else \@tempskipb\lastskip \vskip-\lastskip \vfil \penalty#1 \vfilneg \vskip\@tempskipb \fi\fi\fi} \ifLaTeXisloaded \def\W@raggedbottom{\def\@textbottom{\vskip\z@ \vfil}% \let\@texttop\relax \@secpenalty=\secpenalty \ifnum\secpenalty<0 \def\addpenalty##1{% \ifvmode \W@Lvmode{##1}% \else \@noitemerr \fi} \fi } \newcounter{subsubsubsection} \gdef\thesubsubsubsection{\thesubsubsection.\arabic{subsubsubsection}} \gdef\cl@subsubsubsection{\@elt{paragraph}} \gdef\l@subsubsubsection{\@dottedtocline{4}{3.8em}{3.2em}} \gdef\subsubsubsectionmark#1{} \ifnoLaTeXe \gdef\paragraph{\@startsection{paragraph}{5}{\z@}{3.25ex plus1ex minus.2ex}{-1em}{\reset@font\normalsize\bf}} \fi \gdef\W@setsecdepth{% \@ifundefined{W@depth}{\gdef\W@depth{1}}{}% \setcounter{secnumdepth}{\W@depth}% \setcounter{tocdepth}{\W@depth}% \ifnumberunnamed \Wuparindent0pt \addtocounter{secnumdepth}{1}% \gdef\WRefstepcounter##1{}% \else \Wuparindent-\TeXindent \global\let\WRefstepcounter\Wrefstepcounter \fi \ifcase\W@depth % Level 0; should never happen. \or % Level 1 \def\subsection{\WRefstepcounter{subsection}% \@startsection{subsection}{2}{\z@}{-3.25ex plus-1ex minus-.2ex}{\Wuparindent} {\reset@font \normalsize \bf}}% \let\Wunnamedsect\subsection \def\W@subsect{subsection}% \or % Level 2 \def\subsubsection{\WRefstepcounter{subsubsection}% \@startsection{subsubsection}{3}{\z@}{-3.25ex plus-1ex minus-.2ex} {\Wuparindent}{\reset@font \normalsize \bf}}% \let\Wunnamedsect\subsubsection \def\W@subsect{subsubsection}% \or % Level 3 \def\subsubsubsection{% \WRefstepcounter{subsubsubsection}% \@startsection{subsubsubsection}{4}{\z@}{-3.25ex plus-1ex minus-.2ex} {\Wuparindent}{\reset@font \normalsize \bf}}% \let\Wunnamedsect\subsubsubsection \def\W@subsect{subsubsubsection}% \else \let\Wunnamedsect\paragraph \def\W@subsect{}% \fi } \gdef\Wmodtrans#1{\@ifundefined{r@#1} {\W@split{\##1}{\##1}{0}{0}} {\expandafter\expandafter\expandafter \W@split\csname r@#1\endcsname{#1}}% } \gdef\W@split#1#2#3#4{% \ifpagerefs #2% Just extract the page number. % Add a letter subscript if more than 1 sec. per page. \@ifundefined{W@#3}% {\setcounter{W@tempcounter}{#4}% \addtocounter{W@tempcounter}{-#3}% \ifnum\value{W@tempcounter}>25 \setcounter{W@tempcounter}{25}\fi \hbox{\alph{W@tempcounter}}} {}% \else % Section-number references (the default). \ifstripzeros \W@strip#1.,% \else #1% If we gave up and said |\stripzerosfalse|. \fi \fi } \def\W@strip#1.#2,{\W@first#1\relax \W@tempc{#1}{#2}} \def\W@first#1#2\relax{% \ifx#1\#% \def\W@tempc##1##2{##1}% \else \def\W@tempc##1##2{% \W@Strip{##1.##2}% { \@ifundefined{l@##1}% {0}% {\csname l@##1\endcsname}% }% }% \fi } \def\W@Strip#1#2{\W@STRIP#1\relax{#2}} \def\W@STRIP#1.\relax#2{{% \W@tk={}\W@count=0 \W@counta=\W@depth \advance\W@counta by-#2 % How many zeros to strip. \loop \ifnum\W@count<\W@counta \advance\W@count by1 \edef\next{\W@tk={\the\W@tk.0}}\next % Build template `\.{.0.0\dots}'. \repeat \let\eat\let \edef\next{\def\noexpand\reduce####1\the\W@tk####2\eat####3\eat {\noexpand\W@preface{####1}####2}}% \next \edef\next{\noexpand\reduce#1\eat\the\W@tk\eat\eat\relax}% \def\eat##1{}% \next}} \global\let\modno\empty \global\let\W@name\empty \def\W@preface#1{#1}% Redefined to |\W@getsection| in fwebinsert.sty. \def\W@getsection#1{% \let\W@Preface\empty% Just in case. \ifcase\W@ssmin\relax \W@xsection#1.\relax \def\W@Preface{\thesection}% Level 0 \or \def\W@Preface{\thesection.#1}% Level 1 \or \def\W@Preface{\thesubsection.#1}% Level 2 \or \def\W@Preface{\thesubsubsection.#1}% Level 3 \fi \W@Preface } \def\W@xsection#1.#2\relax{\c@section=\Wb@se \advance\c@section by#1} \def\WM#1.{\WMN#1.% \W@mark{{\oldmodno}{\oldWname}}{{\modno}{\W@name}}% \ifon \advance\W@ss by10 % \W@start{\ifnumberTeX\Wmodtrans{\modno}\fi}% ???? \advance\W@ss by-10 % \ignorespaces} \else % No \LaTeX; for \TeX, one just gets module numbers. \def\Wmodtrans#1{#1} \outer\def\WM#1.{\WMN#1.\W@mark\ifon\Wskip\W@startsection\ignorespaces} \fi % End of no \LaTeX. \newcount\W@ss % Counter for the dots. \newcount\W@lastsect % Level number of section immediately above. \newif\ifW@dotsafter % Do subsection dots come after or before the section %name? \W@dotsafterfalse \ifW@dotsafter % ``@* NAME...'' \def\W@before/#1.{\W@defname{#1}\W@dot}% \def\W@fter{\W@Nss}% \else % ``@*.. NAME.'' or ``@*2 NAME.'' \def\W@before/ {\futurelet\next\W@check}% \def\W@fter#1.{\W@defname{#1}\W@Nss}% Done after figuring out level. \def\W@fter@#1#2.{\W@defname{#2}\W@Nss}% |#1| eats the sectionnum. \fi \def\W@check{\ifx\next.\def\next{\W@dot.}% Count arbitrary dots. \else\ifx\next0\W@sectionnum{0}% \else\ifx\next1\W@sectionnum{1}% \else\ifx\next2\W@sectionnum{2}% Highest numerical level (subsubsect.) \else\ifx\next3\W@badlevel{3}% \else\ifx\next4\W@badlevel{4}% \else\ifx\next5\W@badlevel{5}% \else\ifx\next6\W@badlevel{6}% \else\ifx\next7\W@badlevel{7}% \else\ifx\next8\W@badlevel{8}% \else\ifx\next9\W@badlevel{9}% \else\let\next\W@fter \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next}% \def\W@badlevel#1{\errhelp=\b@dlevelhelp \errmessage{FWEBMAC WARNING: @*#1 changed to @*2}% \W@sectionnum{2}} \newhelp\b@dlevelhelp{Only the major-section (table-of-contents) commands @* (section), @*1 (subsection), and @*2 (subsubsection) are allowed.} \def\W@sectionnum#1{\W@ss#1% \advance\W@ss by\W@ssmin \let\next\W@fter@} \def\W@defname#1{\@ifnextchar[{\W@getname}{\W@getname[#1]}#1.} \def\W@getname[#1]#2.{\gdef\W@name{#1}% Running headline (short name). \gdef\W@longname{#2}}% Remember name of section (used in |\W@start|). \def\W@ssmin{0}% The lowest (top) level. \def\WN#1.{\WMN#1.\W@ss=\W@ssmin \W@before/}% Begin a starred section. \def\W@outlsmax#1{\if@filesw {% \ifLaTeXisloaded \expandafter\W@major\c@section.\relax \else \expandafter\W@major\@currentlabel.\relax \fi \advance\W@count by#1 \advance\W@count by-1 \advance\W@lsmax by1 \edef\@tempa{\ifFWEBstandalone \write\@auxout{\string\Lastdepth{\the\W@count}% {\the\W@lsmax}}% \fi}% \expandafter}\@tempa \fi \W@lsmax=0 } \ifLaTeXisloaded \def\W@major#1.#2\relax{\W@count=#1}% Get the major section. \def\Lastdepth#1#2{% \edef\@tempc{\gdef\expandafter\noexpand \csname l@#1\endcsname{#2}}% \@tempc% Define something like |\l@1| to be last max depth. } \else \def\W@outlsmax#1{} \fi \def\W@dot{\futurelet\next\W@Ns} \def\W@Ns{\ifx\next.% \advance\W@ss by 1 \let\next\W@next \else \let\next\W@fter \fi \next} \def\W@next#1{\W@dot} \ifLaTeXisloaded \let\Wsectionbreak\relax \else \def\Wsectionbreak{\ifcase\W@ss\vfil\eject\fi} \fi \def\rhead{\ifcase\W@ss \uppercase{\ignorespaces\W@name}% \else \ignorespaces\W@name% \fi}% Define running headline. \let\WZ\let % Now one can |\send| the control sequence |\WZ| \let\WIM\let % This macro is made temporarily unexpandable; see |\WZ|. \def\W@Llabel#1{\@bsphack \if@filesw {\let\thepage\relax \let\W@botmodno\relax \def\protect{\noexpand\noexpand\noexpand}% \edef\@tempa{\ifFWEBstandalone \write\@auxout{\string\Newlabel{#1}% {{\@currentlabel}{\thepage}}{\W@botmodno}}% \fi}% \expandafter}\@tempa \if@nobreak \ifvmode \nobreak \fi \fi \fi \@esphack} \ifLaTeXisloaded \gdef\NoIndex{NoIndex}% Written as arg to |\Wbegin| by \.{-xi}. \gdef\W@Nss{% {\let\protect\noexpand \xdef\Wupn@me{\W@name}}% \ifx\Wupn@me\INDEX \ifx\INDEX\NoIndex \onfalse% Don't print section heading. \else \W@mark{{\oldmodno}{\oldWname}}{{\oldmodno}{\oldWname}}% \fi \else% Emit mark before section break. \W@mark{{\oldmodno}{\oldWname}}{{\modno}{\W@name}}% \fi \message{*\modno}% Progress report to the terminal. \ifon% Start output of named section; explicit |\fi| \ifnum\W@ss>\W@ssmax \global\W@ssmax=\W@ss% Track max depth. \fi \ifnum\W@ss>\W@lsmax \global\W@lsmax=\W@ss% Maximum local depth. \fi \W@start{\W@longname}% \ignorespaces } \def\steppagemodule{\noexpand\expandafter\expandafter\expandafter {\addtocounter{pagemodule}{1}}\thepagemodule} \let\Wlabel\W@Llabel \gdef\beforeindex{% \ifx\multicols\undefined \twocolumn \else \ifFWEBstandalone \newpage \fi \fi } \gdef\W@start#1{% {\let\protect\noexpand \xdef\Wupn@me{\W@name}}% \ifx\Wupn@me\INDEX\beforeindex\fi \ifcase\W@ss \let\Wsect\section % Level 0 \W@lastsect\W@ss \or \let\Wsect\subsection % Level 1 \W@lastsect\W@ss \or \let\Wsect\subsubsection % Level 2 \W@lastsect\W@ss \else \let\Wsect\Wunnamedsect \fi \ifnum\W@lastsect>2 \W@setU \fi \Wsect{#1}% Execute LaTeX section heading. \ifnum\W@ss=0 % Check if major section. \W@outlsmax{0}% If so, write out |\Lastdepth| command. \fi \W@mark{{\modno}{\W@name}}{{\modno}{\W@name}}% \Wlabel{\modno}% Section number to aux file. \@ifundefined{r@\modno} {\expandafter\xdef\csname r@\modno\endcsname {{\@currentlabel}{\thepage}{-1}}} {}% For present run. \W@startsection } \else % No \LaTeX \def\W@Nss{% \let\protect\noexpand \W@mark%Can't put this in |\WMN| since |\rhead| must be defined first. \Wsectionbreak % Typeset the break between sections. \message{*\modno}% Progress report to the terminal. \ifon \ifcase\W@ss\else\Wskip\fi \W@startsection{\bf\ignorespaces\W@name.\quad}% {\def\WIN{\WIM}% \edef\next{\write\W@cont{\WZ{\the\W@ss}{\W@name}% {\modno}{\noexpand\the\pageno}}}\next}% % To contents file |CONTENTS.tex|. \ignorespaces} \fi \ifuseREVTeX \def\W@setu#1{\expandafter\def\csname p@\W@subsect\endcsname{#1} \expandafter\def\csname the\W@subsect\endcsname{\arabic{\W@subsect}}} \def\W@setU{ \ifcase\lastsect \W@setu{\thesection.}% \or \W@setu{\thesection\,\thesubsection.}% \or \W@setu{\thesection\,\thesubsection\,\thesubsubsection.}% \fi } \else \def\W@setU{} \fi \def\W@markN{\def\W@mark{{\def\WIN{\WIM}% \mark{\modno\noexpand\else\rhead}}}} \ifx\selectfont\undefined \W@markN \else \def\W@mark{{\def\WIN{\WIM}\let\protect\noexpand \mark{\modno\noexpand\else\rhead}}} \fi \def\Wmodno{\iftrue\topmark\fi}% Extracts the left-hand part of the mark. \def\Whead{{\let\WIM\WIN \expandafter\iffalse\topmark\fi}}% Extracts the right-hand part. \def\WMN#1.{\par \parskip=\pardimen % Reset to \TeX\ spacing \parindent=\TeXindent {\ifLaTeXisloaded \global\let\oldmodno\modno \global\let\oldWname\W@name \xdef\@currentlabel{\modno}% \global\let\Woutname\empty \addtocounter{pagemodule}{1}% \fi \xdef\modstar{#1}% \let\*=\empty \xdef\modno{#1}% }% \ifx\modno\modstar \global\onmaybe% For conditional listing of changed secs. \else \global\ontrue% Print this section. \fi } \def\Wscrap{{\footnotesize\Wmodtrans{\modno}% \ifW@modchanged*\fi}} {\gdef\@verbatim{\if@minipage \else \vskip \parskip \fi \leftskip \@totalleftmargin \rightskip \z@ \parindent \z@ \parfillskip \@flushglue \parskip \z@ \@@par \@tempswafalse \def \par {\if@tempswa \hbox {}\fi \@tempswatrue \@@par \penalty \interlinepenalty }\obeylines \tt \catcode ``=13 \@noligs \let \do \@makeother \dospecials}} {\catcode`/=0 /catcode`/\=12 /catcode`/^^I=13 /gdef/WBM{%/8/kern/notch /begingroup /parindent/W@globalindent/notch /advance/parindent by-1/notch /def/par{/endgraf/leavevmode}% /catcode`^^I=13 /def^^I{/leavevmode/penalty10000/ / / / / / / / }% /catcode``=13 /@noligs /tt /let/do/@makeother /dospecials /@vobeyspaces/frenchspacing/obeylines /W@M} /gdef/W@M#1\WEM{#1/endgroup}} \def\WDP#1{\ifx E#1\else{\tt#1}\fi}% Used in the exponent macro below. \DRC\WO[1]{% {% Make the next definitions local. \let\-\_% \let\d\$% \def\\{\let\_\-\let\$\d}% \def\?{\kern.2em}% \let\{\bgroup% Braces are inserted in \Fortran-90 by kind parameter. \let\}\egroup \def\###1{\kern0.1em{\tt \ifcase##1F\or L\or U\or UL\else?\fi}}%C~constant. \def\^##1{\cdot 10^{\aftergroup}\aftergroup\WDP\aftergroup##1}% Power of ten \def\_{_{\\\rm\aftergroup}}% Fortran-90 kind parameter. \def\%{{\rm H}\hbox{\aftergroup}\Wtypewriter{\aftergroup}}% Hollerith constant \def\&{0{\tt b}}% Binary constant. \def\~{\hbox{\rm\char'23\kern-.2em\it\aftergroup\?\aftergroup}}% Octal \def\`{\hbox{\rm\char"7D\tt\aftergroup}}% Double quotes for hex constant #1}} \def\WKINDCHAR#1\.#2{% \hbox{\Wtypewriter{#2}}_{\Wkindids \rm #1}} \DRC\Wkindids{\def\Wshort##1{##1}% \def\Wid##1{##1}% \def\WID##1{##1}} \def\WPr{\global\W@ind=\W@globalindent \1} \def\WP{\parskip=0pt \parindent=\notch \rightskip=0pt plus 100pt minus 10pt \sfcode`;=3000 \pretolerance 10000 \WPr \W@firstbreaktrue % Reset to true by |\6|. \leavevmode\kern\notch} \def\WQ{\rightskip=0pt \sfcode`;=1500 \pretolerance 200 \hyphenpenalty 50 \exhyphenpenalty 50 } \def\Wendd{\par}% End of definition part. \def\Wendc{\par}% End of code part. \def\WA{\note{See also}}% Cross-reference for multiply defined section names. % English! \def\Wauto[#1]{\Wtypewriter{[#1]}\ } \DRC\WB{\mathopen{\Wtypewriter{@/\ast}}}% Begin controlled comment. \let\WG\ge % Greater than or equal sign: '$\WG$'. \DRC\WI{\neq}% Unequal sign: '$\WI$'. (Better reserve |\ne| for the % electron density~$n_e$.) \DRC\WJ{\Wtypewriter{@\&}}% TANGLE's join operation: '\WJ'. \let\WK\gets % Left arrow: '$\WK$'. \let\Wlbl\llap \let\WL\le % Less than or equal sign: '$\WL$'. \let\WLA\langle % Opening of template: '$\WLA$'. \let\WRA\rangle % Closing of template: '$\WRA$'. \DRC\WTLD{\Wtypewriter{@\~}} \def\Wskip{\vfil\penalty-100\vfilneg \vskip12ptminus3pt}% See |\WM|, etc. \def\Wskipped#1{\8\mathhexbox278.\quad\Wtypewriter{@I "#1"}\ \ {\it Section(s) skipped}\dots\WP} \let\WPtr\Rightarrow % Fortran's stupid pointer assignment statement: % '$\WPtr$'. \let\WR=\lnot % Logical not: '$\WR$'. \let\WS=\equiv % Equivalence sign: '$\WS$'. \let\WSQ=\equiv % This symbol is used when defining a section name. \DRC\WSl{\ifmmode\mathbin{/}\else/\fi}% Division \DRC\WT{\mathclose{\Wtypewriter{@\ast/}}}% Terminate controlled comment. \def\WU{\note{This code is used in}}% Cross-reference for uses of sections. % English! \let\WV\lor % Logical or: '$\WV$'. \let\WW=\land % Logical and: '$\WW$'. \ifLaTeXisloaded \else \let\footnotesize\eightrm \fi \def\WX#1#2\X#3\X{\ifmmode\gdef\XX{\null$\null}\else\gdef\XX{}\fi \XX$\langle\,$#2{\footnotesize\kern.5em#1}% $\,\rangle^{\mathrm{#3}}$\XX} \def\WY{\par \yskip \parskip=0pt} \DRC\?{\mathrel?} \DRC\Colon{\ifmmode\colon\else\textcolon\fi} \DRC\WCC{\mathord{::}}% For C: '$x\WCC y$'. \DRC\WCF{{}\mathbin{::}{}}% For \Fortran: '$x\WCF y$'. \DRC\=[1]{\kern2pt\hbox{\vrule\vtop{\vbox{\hrule \hbox{\strut\kern2pt\Wtypewriter{#1}\kern2pt}} \hrule}\vrule}\kern2pt} \let\Wequals\= \let\~=\ignorespaces \let\*=* \def\WPQ{\mathrel{+\mathord\equiv}}% '$\WPQ$'. \def\W@LP{(}% Must be |\def|, not |\let|. \def\W@ISL#1#2]{\def\next{#1}} \DRC\WEE[1]{\W@ISL#1]\ifx\next\W@LP\WEXP[#1]\else\WEXP[(#1)]\fi} \def\WEXP[(#1)]{^{#1}} \DRC\WCMN[2]{\Wtypewriter{/#2/}} \let\WSlSl\parallel% Concatenation: '$\WSlSl$'. \DRC\WEQV{\mathrel{?{=}}}% `$x\WEQV y$'. \DRC\WNEQV{\not\equiv}% `$x\WNEQV y$'. \DRC\WLS{\mathopen{({/}\,}} \DRC\WSR{\mathclose{\,{/})}} \DRC\WFALSE{{\cal F}}% '$\WFALSE$'. \DRC\WTRUE{{\cal T}}% '$\WTRUE$'. \def\Wblock#1{\Wc\bgroup\ Block #1\egroup}% `\Wblock{99}' \def\WNN{\hbox{\#\#}}% '\WNN'. \def\WNP{\hbox{\#!}}% '\WNP'. \def\WNC{\hbox{\#:}}% '\WNC'. \def\WND{\hbox{\#.}}% '\WND'. \def\WNq{\hbox{\#\tt'}}% '\WNq'. \def\WNQ{\hbox{\#\tt"}}% '\WNQ'. \mathchardef\TLD="0218 % '$\TLD$'. \DRC\WPP{\mathord{++}}% '$\WPP$'. \DRC\WMM{\mathord{--}}% '$\WMM$'. \DRC\WMG{\mathord{\to}}% '$\WMG$'. \DRC\Wcp{\mathrel{+{=}}} \let\PE\Wcp % `$x\PE y$'. \DRC\Wcm{\mathrel{-{=}}} \let\ME\Wcm % `$x\ME y$'. \DRC\Wcs{\mathrel{\ast{=}}} \let\TE\Wcs % `$x\Wcs y$'. \DRC\Wcv{\mathrel{/{=}}} \let\FE\Wcv % `$x\FE y$'. \DRC\Wcd{\mathrel{\%{=}}} \let\CE\Wcd % `$x\Wcd y$'. \DRC\Wcx{\mathrel{\^\!{=}}}% `$x\Wcx y$'. \DRC\Wca{\mathrel{\amp{=}}}% `$x\Wca y$'. \DRC\Wco{\mathrel{\WOR{=}}}% `$x\Wco y$'. \DRC\Wcg{\mathrel{\WGG\!{=}}}% `$x\Wcg y$'. \DRC\Wcl{\mathrel{\WLL\!{=}}}% `$x\Wcl y$'. \DRC\WMOD{\mathrel{\%}}% `$x\WMOD y$'. \DRC\WOR{{\,|\,}}% `$x\WOR y$'. \DRC\WAND{{\,\amp\,}}% `$x\WAND y$. \DRC\WGG{\mathrel{>\!>}}% `$x\WGG y$'. \DRC\WLL{\mathrel{<\!<}}% `$x\WLL y$'. \DRC\WHE{\mathrel{\uparrow=}}% `$x\WHE y$'. \DRC\Woperator[1]{\Wreserved{operator}~\hbox{$#1$}\ignorespaces} \DRC\Woperatoro{\Wreserved{operator}~\ignorespaces} \let\openbraces=\{ \let\closebraces=\} \def\{{\ifmmode\openbraces\else$\openbraces$\fi} \def\}{\ifmmode\closebraces\else$\closebraces$\fi} \newif\ifop \newbox\dotbox \def\Wunknown#1{\={??#1??}}% For unknown dot constant. {\catcode`\_=11 \gdef\newop#1#2#3{% \edef\next{\def\expandafter\noexpand\csname _#1_#2\endcsname}% \next{#3}} \gdef\newbinop#1#2#3{% \edef\next{\def\expandafter\noexpand\csname _#1_#2\endcsname}% \next{\mathrel{#3}}} \gdef\newunop#1#2#3{% \edef\next{\def\expandafter\noexpand\csname _#1_#2\endcsname}% \next{\mathbin{#3}}} \gdef\Wop#1#2{\setbox\dotbox\hbox{\tt .#1.}% \edef\nxt{\expandafter\noexpand\csname _#1_#2\endcsname}% \edef\ifnxt{\noexpand\ifx\expandafter\noexpand\csname _#1_#2\endcsname}% \ifnxt\empty \def\next{\box\dotbox}% Macro not defined; just use \.{.NAME.}. \else \def\next{\futurelet\nextchar\W@q}% Be careful about |\WEE|. \fi \next}% } \global\let\Wb\Wop \global\let\Wu\Wop \let\Lbrace{ \def\W@q{\ifx\nextchar\Lbrace \let\next\nxt % There's an argument coming up. \else \ifop \def\next{\nxt{}\equiv\box\dotbox}% \else \let\next\nxt \fi \fi \opfalse \next} \DRC\WTeX[1]{\ [{\ifmmode\def\XX{}\else\def\XX{\null$\null}\fi \XX#1\XX}]\ } \newtoks\W@ARRAYarga \newtoks\W@ARRAYargb \DRC\WXA[1]{\begingroup \def\Wshort##1{##1}% \def\Wid##1{\mathit{##1\/\kern.05em}}% \global\W@ARRAYarga{#1}% \futurelet\W@next\WARRAYm} \def\WARRAYm{\ifx\W@next\WXA \global\let\W@next\WARRAYn% Multiple indices in C: a[i][j][k] \else \global\let\W@next\relax \WARRAY{\the\W@ARRAYarga}% Typeset the accumulated indices. \fi \endgroup \W@next} \def\WARRAYn#1#2{\W@ARRAYargb{#2}% \edef\W@next{\noexpand\WXA{\the\W@ARRAYarga,\the\W@ARRAYargb}}%Concatenate \W@next} \DRC\WARRAY[1]{[#1]}% Default definition. \DRC\WSUB[1]{_{\scriptstyle#1}}% E.g., subscript indices. \def\Wouto#1#2{\Wreserved{@#1}\W@Hspace\Wtypewriter{#2}} \def\Wout#1{\Wouto{o}{#1}} \def\WOut#1{\Wouto{O}{#1}} \def\WRCS#1#2{\langle\!\langle\,\Wtypewriter{#2}\,\rangle\!\rangle \ifnum#1=0 _{0}\fi} \def\modlabel#1{% \ifLaTeXisloaded \label{MOD#1}% \else \edef\next{\gdef\expandafter\noexpand\csname MOD#1\endcsname{\modno}}% \next \fi} \def\Wmodule#1{\ifLaTeXisloaded \ref{MOD#1}% \else \csname MOD#1\endcsname \fi} \def\WEBsection#1{section~\Wmodule{#1}}% |\section| is used by \LaTeX. \def\WEBmodule#1{module~\Wmodule{#1}} \let\module\WEBmodule% For backward compatibility. \def\strutdepth{\dp\strutbox} \def\W@marginal#1{\strut\vadjust{\kern-\strutdepth\W@specialmargin{#1}}} \def\W@specialmargin#1{\vtop to\strutdepth{ \baselineskip\strutdepth \vss\llap{#1 }\null}} \def\LANGUAGE#1{\W@marginal{\smash{\vtop{\hbox{% \hbox{\tt @L\lowercase{#1}\textcolon\enspace}}\null}}}\ignorespaces} \newif\ifon \def\onmaybe{\let\ifon=\maybe} \let\maybe=\iftrue \newif\iftitle \newif\ifpagesaved \newcount\contentspageno \def\Wmodhd#1{ [#1]} \newif\ifW@headers \W@headerstrue% Stand-alone setting (might be changed in fwebinsert.sty). \def\W@seczero{0} \def\WsetLmarks{ \def\Wsecrange##1##2{% \def\W@tempa{##1}\def\W@tempb{##2}% \ifx\W@tempa\W@tempb% Equal sec.\ nums; just print one. \W@S\Wmodtrans{##1}\Wmodhd{\###1}% \else\ifx\W@tempb\W@seczero \W@S\Wmodtrans{##1}\Wmodhd{\###1}% \else \W@S\Wmodtrans{##1}--\W@S\Wmodtrans{##2}% \Wmodhd{\###1--\###2}% \fi\fi} \gdef\@leftmark##1##2##3##4{% \let\protect\relax \let\\\ % \qquad\mainfont##2 \hfill \Wtitle\qquad \ifnum##1>0% \mainfont\Wsecrange{##1}{##3}% \fi } \gdef\@rightmark##1##2##3##4{% \let\protect\relax \let\\\ % \ifnum##1>0 \mainfont\Wsecrange{##1}{##3}\qquad% \fi \mainfont\Wtitle \hfill \mainfont##4\qquad } \gdef\leftmark{% \ifnoLaTeXe \else \let\protect\@unexpandable@protect \fi \edef\W@tempb{\expandafter\iftrue\botmark\fi}% \edef\W@tempa{\expandafter\iffalse\topmark\fi}% \expandafter\expandafter\expandafter\@leftmark\expandafter\W@tempa\W@tempb{}{}} \gdef\rightmark{% \ifnoLaTeXe \else \let\protect\@unexpandable@protect \fi \edef\W@tempb{\expandafter\iftrue\botmark\fi}% \edef\W@tempa{\expandafter\iffalse\topmark\fi}% \expandafter\expandafter\expandafter\@rightmark\expandafter\W@tempa% \W@tempb{}{}} \gdef\W@markN{\gdef\W@mark####1####2{{\def\WIN{\WIM}% \mark{####1\noexpand\else####2}}}} \ifx\selectfont\undefined \W@markN \else \gdef\W@mark##1##2{{%\def\WIN{\WIM}% \let\protect\@unexpandable@protect \mark{##1\noexpand\else##2}}} \fi } \ifLaTeXisloaded \else \def\lheader{\mainfont\the\pageno\eightrm\qquad\Whead\hfill\Wtitle\qquad \ifnum\pageno=\contentspageno\else \W@S\mainfont\Wmodno \fi} \def\rheader{\ifnum\pageno=\contentspageno\else \W@S\mainfont\Wmodno \fi \eightrm\qquad\Wtitle\hfill\Whead \qquad\mainfont\the\pageno} \fi \def\pagewidtho{6.5}% The width of each page \def\pageheighto{8.7}% The height of each page \def\fullpageheighto{9}% Page height including headlines \newdimen\pagewidth \pagewidth\pagewidtho in \newdimen\pageheight \pageheight\pageheighto in \newdimen\fullpageheight \fullpageheight\fullpageheighto in \newdimen\pageshift \pageshift=0in% Shift righthand pages wrt lefthand ones \def\setpage{\hsize\pagewidth \vsize\pageheight \ifLaTeXisloaded \oddsidemargin=0pt \evensidemargin=0pt \topmargin=0pt \setlength{\linewidth}{\pagewidth} \setlength{\textwidth}{\pagewidth} \setlength{\textheight}{\pageheight} \fi } \ifLaTeXisloaded \else \def\magnify#1{\mag=#1 \pagewidth\pagewidtho truein \pageheight\pageheighto truein \fullpageheight\fullpageheighto truein \setpage} \fi \def\page{\box255 } \newif\ifidenticalpageheads \def\normaloutput#1#2#3{ \ifodd\pageno\hoffset=\pageshift\fi \shipout\vbox { \vbox to\fullpageheight { \iftitle\global\titlefalse \else \hbox to\pagewidth {\vbox to10pt{}% \ifidenticalpageheads#2\else \ifodd\pageno #3% Pg nos alternate left \& right. \else#2\fi \fi }% \fi \vfill#1% Parameter |#1| is the page itself. } } \global\advance\pageno by1} \def\W@name{{FWEB} OUTPUT}% This section name is reset by starred sections. \newtoks\Woutput \Woutput\output% Remember \FWEB's definition. \newcount\minutes \newcount\hours \hours=\time \divide\hours by 60 \multiply\hours by 60 \minutes=\time \advance\minutes by -\hours \divide\hours by 60 \def\Time{\the\hours\textcolon\ifnum\minutes<10 0\fi\the\minutes} \def\Date{\ifcase\month\or January\or February\or March\or April\or May\or June\or July\or August\or September\or October\or November\or December\fi \space\number\day, \number\year} \def\Wtitle{}% Short title for running heads. Can redefine after |\Title|.j \def\Title{\@ifnextchar[\W@@Title\W@Title} \def\W@Title#1{\W@@Title[#1]{#1}} \def\W@@Title[#1]#2{\gdef\Wtitle{{\large\tt#1}}\title{{\ttitlefont#2}}} \ifLaTeXisloaded \def\topofcontents{}% We use \LaTeX's defaults. \else \def\topofcontents{\centerline{\titlefont\Wtitle} \vfill} % This is the default. \fi \ifLaTeXisloaded \def\botofcontents{} \else \def\botofcontents{\vfill \rightline{\Date} \rightline{\Time}} \fi \ifLaTeXisloaded \contentspageno=1 \pageno=\contentspageno \else \contentspageno=0% Default page number for table of contents \fi \newwrite\W@cont % For the table of contents. \ifLaTeXisloaded \def\Wfirst#1#2#3#4#5{#1} \def\W@output{\setcounter{pagemodule}{0}% \xdef\W@botmodno{\expandafter\Wfirst\botmark}} \def\W@botmodno{0} \def\Newlabel#1#2#3{% \ifFWEBstandalone \@ifundefined{r@#1}{}% {\@warning {Label `#1' multiply defined}} \fi \global\@namedef{r@#1}{#2{#3}}% |\@namedef| is from \LaTeX. \global\W@lpha=#3 \ifnum\W@lpha=\W@ref\global\advance\W@pmcount by1 \else \ifnum\W@pmcount=1 \edef\next{\gdef\csname W@\the\W@ref\endcsname{}}\next \fi \W@ref=\W@lpha \W@pmcount=1 \fi} \fi \newcount\W@ref \W@ref=-1 \newcount\W@lpha \newcount\W@pmcount \W@pmcount=1 \outer\def\Wbegin[#1]#2#3#4#5#6#7#8#9{\edef\contentsfile{#5}% \def\readcontents{\input\contentsfile}% \Wequate#6 \W@modequate{#7}% \edef\INDEX{#9}% \def\W@splitprms##1##2[##3;##4]{\def##1{##3}\def##2{##4}}% \W@splitprms\W@preamble\W@postamble[#8]% \ifLaTeXisloaded \ifFWEBstandalone \def\FWEBend{% \LaTeX\ redefines |\end|. \W@outlsmax{1}% The `1' is because sec. # % isn't incremented for the module list. \global\advance\W@ssmax by1 \immediate\write\@auxout{\string\W@maxdepth{\the\W@ssmax}}% \W@postamble \W@makeatend% Override |\makeatletter| \end{document}% }% \def\W@ssmin{0} \else% Insert mode; not stand-alone. \def\FWEBend{} % |\W@ssmin| isn't defined; it's set by |\fweblevel|. \fi \W@splitprms\W@prma\W@prmb[#1]% \W@splitprms\W@prmc\W@prmd[#2]% \ifusedocumentstyle \edef\W@temp{\noexpand\documentstyle[\W@prma]{\W@prmc}}% \W@temp \else \ifFWEBstandalone \documentclass[\W@prma]{\W@prmc}% \usepackage[\W@prmb]{\W@prmd}% \fi \fi \ifFWEBstandalone \textwidth\pagewidth \textheight\pageheight \fi \TeXindent#3 \title{}% \author{}% \date{\today\\[3pt]\Time}% \pagestyle{myheadings}% \ifx\c@pagemodule\undefined \newcounter{pagemodule}% \newcounter{W@tempcounter}% \fi \gdef\cl@section{\@elt{subsection}\cl@subsection} \gdef\cl@subsection{\@elt{subsubsection}\cl@subsubsection} \gdef\cl@subsubsection{\@elt{subsubsubsection}} \xdef\normaloutput##1##2##3{\the\output \noexpand\W@output}% \ifW@headers \WsetLmarks \else \def\W@markN{}% \def\W@mark##1##2{}% \fi \W@preamble \W@raggedbottom \ifFWEBstandalone \begin{document} \else \begingroup \makeatletter \@input{\jobname.aux} %|\jobname| is redefined in \.{fwebinsert.sty}. \endgroup \fi \W@setsecdepth \else % Plain \TeX. \immediate\openout\W@cont=\contentsfile \def\FWEBend{\W@postamble\end} \TeXindent#3 \W@preamble \fi \W@setboxes{#4}% Set dimensions of backspace boxes. \ifFWEBstandalone \output {\setbox0=\page% The first page is garbage \global\output{\normaloutput\page\lheader\rheader}% }% \setpage \vbox to \vsize{} \fi } \def\W@makeatend{\let\W@makeatletter\makeatletter \def\makeatletter{\def\Newlabel{\W@testdef r}% \W@makeatletter}} \def\W@testdef#1#2#3#4{\def\reserved@a{#3{#4}}% \expandafter\ifx\csname#1@#2\endcsname \reserved@a \else \@tempswatrue \fi } \def\Wch{\note{The following sections were changed by the change file:} \let\*=\relax}% English! \newbox\Sbox % Saved box preceding the index \newbox\Lbox % Lefthand column in the index \ifLaTeXisloaded \def\startindex{\ifx\multicols\undefined \medskip \else \begin{multicols}{2}% \fi } \else \def\startindex{\par\vskip6pt plus 1fil} \fi \def\Winx{\startindex \ifLaTeXisloaded \else \write\W@cont{ }% Ensure that the contents file isn't empty \closeout\W@cont % The contents information has been fully gathered \output{\ifpagesaved\normaloutput{\box\Sbox}\lheader\rheader\fi \global\setbox\Sbox=\page \global\pagesavedtrue} \pagesavedfalse \eject % Eject the page-so-far and predecessors \setbox\Sbox\vbox{\unvbox\Sbox}% Take it out of its box \vsize=\pageheight \advance\vsize by -\ht\Sbox % The remaining height \hsize=.5\pagewidth \advance\hsize by -10pt % Column width for the index (20pt between cols) \parfillskip 0pt plus .6\hsize % Try to avoid almost empty lines \def\lr{L}% This tells whether the left or right column is next \output{\if L\lr\global\setbox\Lbox=\page \gdef\lr{R} \else\normaloutput{\vbox to\pageheight{\box\Sbox\vss \hbox to\pagewidth{\box\Lbox\hfil\page}}}\lheader\rheader \global\vsize\pageheight\gdef\lr{L}\global\pagesavedfalse\fi} \fi \outer\def\:##1, {\par\hangindent2em\noindent##1\textcolon\kern1em}% Index %entry \def\[##1]{$\underline{##1}$}% Underlined index item \def\(##1){$^{\rm ##1}$}% Language marker \let\Windexspace\medskip % Spacing between letter groups in index. \rm {\ifFWEBstandalone\let\glbl\global\else\let\glbl\empty\fi \glbl\parskip 0pt plus .5pt \glbl\rightskip0pt plus 2.5em \glbl\tolerance 10000 \glbl\let\*=\W@lapstar \glbl\hyphenpenalty 10000 \glbl\parindent0pt } } \ifLaTeXisloaded \def\Wfin{\ifx\multicols\undefined\else\end{multicols}\fi} \else \let\Wfin\relax \fi \def\W@onecolumn{% \ifx\multicols\undefined \onecolumn% In case of insertions & no module list. \fi } \def\pgfmt#1{\uppercase\expandafter{\romannumeral#1}} \def\pg#1#2#3{\def\temp{#1}% \ifx\temp\empty% For the case where \.{idxmerge} hasn't been run. \else \pgfmt{#1}.% \fi #2{#3}% } \def\topofindex{} \def\botofindex{} \def\Wmods{% \def\W@name{Names of the Modules}% \ifLaTeXisloaded \W@outlsmax{1}% The `1' is because sec. # hasn't been incremented \edef\next{\noexpand\W@mark{{0}{\INDEX}} {{0}{\W@name}}}\next \onecolumn% This also starts a new page. \edef\next{\noexpand\W@mark{{0}{\W@name}}{{0}{\W@name}}}\next \parfillskip 0pt plus 1fil \else \par\vfill\eject \ifpagesaved\null\vfill\eject\fi % Output a null index column \if L\lr\else\null\vfill\eject\fi % Finish the current page \parfillskip 0pt plus 1fil \edef\rhead{\W@name}% \output{\normaloutput\page\lheader\rheader} \setpage \fi \def\note##1##2.{\quad{\footnotesize##1 ##2.}} \def\WU{\note{Used in}}% Cross-reference for uses of sections. English! \def\:{\par\hangindent 2em}\let\*=*% } \def\Winfo#1#2#3#4{% \bigskip \:{{\bf COMMAND LINE\textcolon}\ \ \Wtypewriter{#1}.}\smallskip \:{{\bf WEB FILE\textcolon}\ \ \Wtypewriter{#2}.}\smallskip \:{{\bf CHANGE FILE\textcolon}\ \ \Wtypewriter{#3}.}\smallskip \:{{\bf GLOBAL LANGUAGE\textcolon}\ \ {\rm #4}.}\bigskip } \def\Wkwds{\:{\leavevmode{\bf Global RCS-like keywords\textcolon}}\medskip} \def\Wkwd#1#2{\:{\leavevmode\quad{\bf \dollar#1\textcolon}\ \ % \Wtypewriter{"#2"}}} \ifLaTeXisloaded \def\W@settoc#1{}% \def\Wtoc#1{\begingroup \W@settoc{#1}% \def\Newlabel##1##2##3{}% \setcounter{tocdepth}{\W@depth}% \thispagestyle{empty}% \def\W@name{Table of Contents}% English! \edef\next{\noexpand\W@mark{{0}{\W@name}}{{0}{\W@name}}}% \next% \pagenumbering{roman}% \maketitle \topofcontents \tableofcontents \botofcontents \edef\next{\noexpand\W@mark{{1}{\W@name}}{{1}{}}}\next \gdef\W@name{}% \newpage% Break after TOC. \endgroup \pagenumbering{arabic}% \pageno=1 } \def\Wcon#1{\newpage \let\WIM\WIN % Restore the proper definition. \pageno=\contentspageno \Wtoc{#1}% } \def\FWEBtoc{% \ifFWEBstandalone \Wtoc{}% No toc for insertions. \fi \gdef\Wcon##1{% Redefinition! \W@onecolumn }% } \else \def\Wcon#1{\par\vfill\eject \rightskip 0pt \hyphenpenalty 50 \tolerance 200 \setpage \output{\normaloutput\page\lheader\rheader} \titletrue % Prepare to output the table of contents \pageno=\contentspageno \def\rhead{Table of Contents}% English! \topofcontents \catcode`\@=11 \hbox to\hsize{\hfil Section\hbox to3em{\hss Page}} \def\WZ##1##2##3##4{\hbox to\hsize{\kern##1em\ignorespaces##2 \leaders\hbox to .5em{.\hfil}\hfil\ ##3\hbox to3em{\hss##4}}} \let\WIM\WIN % Restore the proper definition. \readcontents\relax % Read the contents info. \botofcontents } \def\FWEBtoc{\message{! Front Table of Contents is only supported with LaTeX.}} \fi \newskip\ttglue \ttglue=0.5em plus 0.25em minus 0.15em \def\ttother{\catcode`\\=\other \catcode`\{=\other \catcode`\}=\other \catcode`\$=\other \catcode`\&=\other \catcode`\#=\other \catcode`\%=\other \catcode`\~=\other \catcode`\_=\other \catcode`\^=\other} \def\ttverbatim{\begingroup \ttother \obeyspaces \obeylines \tt} {\obeyspaces\gdef {\ }} \def\begintt{$$\let\par=\endgraf \ttverbatim \parskip=0pt \rightskip=-\parindent \ttfinish} \def\Begintt{\bgroup \let\par=\endgraf \ttverbatim \parskip=0pt \rightskip=-\parindent \ttFinish} {\catcode`\|=0 |catcode`|\=\other |obeylines% |gdef|ttfinish#1^^M#2\endtt{#1|vbox{#2}|endgroup$$}% |gdef|ttFinish#1\Endtt{#1|endgroup|egroup}} \let\verticalbar| \def\activebar{\catcode`\|=\active} {\activebar \gdef\normalbar{\activebar \let|\verticalbar}} {\obeylines% \gdef\ttbar{\activebar% {\obeylines\gdef|{\ttverbatim% \spaceskip=\ttglue% \let^^M=\ \let|=\endgroup}}}} \let\WCX\Begintt \catcode`\@=12 fweb-1.62/Manual/fwebmac.web100644 10061 1115 245247 6602703126 15114 0ustar krommesusers@z --- fwebmac.web --- $Id: fwebmac.web,v 1.53.1.13 1996/09/14 12:43:41 krommes Exp krommes $ $Revision: 1.53.1.13 $ Copyright (C) 1987 Princeton University Original authors: D. Knuth, S. Levy Upgraded by J.A. Krommes for FWEB. @x----------------------------------------------------------------------------- \Title{fwebmac-1.60} \author{John A. Krommes\\(after D. Knuth and S. Levy)} \date{December 31, 1996} \numberdefsfalse \numbercodefalse @Lx @* INTRODUCTION. These are the standard macros for \FWEB\ (v.~1.60) listings (in addition to those of \.{PLAIN.TEX} and/or \LaTeX). Beginning with v.~1.50, \LaTeXe\ is supported. WARNING: Some of these macros are not independent of stuff hard-coded into \FWEAVE. In other words, if you change something here, you may also need to recompile \FWEAVE. So caution! @ Print a comment at the beginning of the \.{.sty} file that is created. @A % --- THIS IS fwebmac.sty --- % DO NOT EDIT THIS FILE; it is generated automatically from fwebmac.web. % This file must be included into all .tex files produced by FWEAVE. % You can weave fwebmac.web to see discussions of the fwebmac.sty logic. % --------------------------------------------------------------------------- @ First, we have a flag |\FWEBisloaded| that prevents \.{fwebmac.sty} from being loaded twice. For the use of this flag, see the Dirty Tricks appendix of the \TeX book. @A % If it's not defined yet, load in the macros. \ifx\FWEBisloaded\relax\endinput\else\let\FWEBisloaded\relax\fi @ \FWEB\ can be run either in stand-alone mode (the usual application), or \FWEAVE\ output can be incorporated into a \LaTeX\ document. To distinguish, we need a flag, |\FWEBstandalone|. This is true by default; however, it is made false when the package \.{fwebinsert} is invoked. @A \newif\ifFWEBstandalone \FWEBstandalonetrue @ We need to refer to various internal macros, so we make '\.{@@}' an ordinary letter. @f `\@@ 11 @A \catcode`\@@=11 @ Here's something for trickery with catcodes. @A \chardef\other=12 @ One can comment stuff out by bracketing it with |\comment...\endcomment|. @A \long\def\comment#1\endcomment{} @*1 The current version. Various things need to know the current version number and date. @A \def\FWEBversion{$REVISION} \def\FWEBdate{September 23, 1995} @*1 Defining robust macros. Robust commands are useful; we provide our own version if the \LaTeXe\ |\DeclareRobustCommand| isn't available. (However, at present our own version just defines a macro with $n$~arguments; it doesn't actually make it robust for \TeX\ or ordinary \LaTeX.) @A \newcount\W@@count \newcount\W@@counta \newtoks\W@@tk \ifx\DeclareRobustCommand\undefined \def\DeclareRobustCommand#1{\@@ifnextchar[% {\W@@argdef#1}{\W@@argdef#1[0]}} \def\W@@argdef#1[#2]{\W@@tk={}% \W@@count=0 \loop \ifnum\W@@count<#2 \advance\W@@count by1 \edef\next{\W@@tk={\the\W@@tk########\the\W@@count}}\next \repeat \edef\next{\def\noexpand#1\the\W@@tk}\next} \fi \ifx\@@ifnextchar\undefined \def\@@ifnextchar#1#2#3{\let\@@tempe#1 \def\@@tempa{#2}% \def\@@tempb{#3}% \futurelet\@@tempc\@@ifnch} \def\@@ifnch{\ifx\@@tempc\@@sptoken \let\@@tempd\@@xifnch \else \ifx\@@tempc\@@tempe \let\@@tempd\@@tempa \else \let\@@tempd\@@tempb \fi \fi \@@tempd } {\def\:{\global\let\@@sptoken= } \: } \def\@@xifnch{\futurelet\@@tempc\@@ifnch} \fi \let\DRC\DeclareRobustCommand @*1 Printing ``\TeX'' and ``\LaTeX'', and distinguishing between them. \FWEB\ now offers full \LaTeX\ support. Here's how to refer to it. [Note the use of |\W@@t| (defined in \WEBsection{syn} below) rather than |\@@|; the latter is used for other things in \FWEB.] @A \def\TeX{T\kern-0.1667em\lower0.5ex\hbox{E}\kern-0.125emX\W@@t} \ifx\LaTeX\undefined \def\LaTeX{L\kern-0.36em\raise0.3ex\hbox{\Csc a}\kern-0.15em\TeX} \fi \newif\ifnoLaTeXe% By default, we have \LaTeXe. \ifx\LaTeXe\undefined \noLaTeXetrue \def\LaTeXe{\LaTeX 2$_\varepsilon$} \fi @ One needs to distinguish whether or not \LaTeX\ is loaded. Assuming that only \TeX\ or \LaTeX\ will be used, one way of doing this is to discriminate on whether |\pageno| is defined. @A \newif\ifLaTeXisloaded \ifx\pageno\undefined \LaTeXisloadedtrue \fi \ifLaTeXisloaded \def\W@@stop{} \else \def\W@@stop{ \message{Please use LaTeX. Plain TeX is no longer supported. ABORTING!} \end } \fi \W@@stop @ We also attempt to support \REVTeX. This is annoying, because it doesn't work properly with |\documentclass| yet. @A \newif\ifuseREVTeX %\useREVTeXtrue @ In two cases, we must use |\documentstyle| rather than |\documentclass|: if we're not using \LaTeXe, or if we're using \REVTeX. (The last ought to be fixed by the \REVTeX\ people.) @A \newif\ifusedocumentstyle \ifnoLaTeXe \usedocumentstyletrue \fi \ifuseREVTeX \usedocumentstyletrue \fi @*1 Convenience macros such as \.{\\FWEAVE} or \.{\\Fortran}. Here's how to refer to the individual processors. The user may wish to redefine these. Note that we use the primitive |\Wtypewriter|, since the user can change the usual typewriter macro ``|\.|'' to something else. @A \DRC\WEB{\Wtypewriter{WEB}} \DRC\FWEB{\Wtypewriter{FWEB}} \DRC\CWEB{\Wtypewriter{CWEB}} \DRC\TANGLE{\Wtypewriter{TANGLE}} \let\Tangle\TANGLE \DRC\WEAVE{\Wtypewriter{WEAVE}} \let\Weave\WEAVE \DRC\FTANGLE{\Wtypewriter{FTANGLE}} \DRC\FWEAVE{\Wtypewriter{FWEAVE}} @ Here's how one can refer to the individual languages. The user may also wish to redefine these. @A \DRC\C{C\W@@t} \DRC\Cpp{\C{\tt ++}} \DRC\FORTRAN{{\Csc Fortran}} \let\Fortran\FORTRAN \DRC\MAKE{{\tt MAKE}} \let\Make\MAKE \DRC\RATFOR{{\Csc Ratfor}} \let\Ratfor\RATFOR \DRC\UNIX{{\SC UNIX}} \let\Unix\UNIX @*1 Synonyms for macros such as \.{\\@@} usurped by \FWEB. \modlabel{syn} Now define a few things not known to \TeX, and remember some Plain \TeX\ stuff used for other purposes by \FWEB. @A \ifLaTeXisloaded \else \let\@@\relax \let\\\relax \let\protect\relax \fi \let\amp\& \let\at\@@ \let\bslash\\ \let\caret\^ \let\dollar\$ \let\dstar\* \let\equals\= \let\period\. \let\textcolon: \let\leftbrace\{ \let\rightbrace\} \let\vertbar| \let\PM\# \let\PC\% @ @A \let\W@@t\@@ \let\W@@S\S @ (The following was for Plain \TeX, and is probably obsolete.) Additionally, the TeXbook manual macro package \.{manmac} redefines the following stuff: |\iftitle \titlefont \rhead \pagewidth \pageheight \output| \noindent If you want to include \.{manmac.tex} to get various macro definitions, the best scheme is to use the `\.{-w}'~command-line option to prevent \FWEAVE\ from outputting |\input fwebmac.sty| as the first output line. Then include both files explicitly, in this order: |\input manmac| |\input fwebmac.sty| \noindent You can do this by defining the first limbo text command as follows: |@@l "\\input manmac \\input fwebmac.sty"| @*1 Paragraph skip and indentation for \TeX\ text. @A \dimen0=\normalbaselineskip \parskip=\dimen0 plus 1pt minus 6pt % If you don't like spaces between paragraphs, change |\pardimen| to |0pt|. \newskip\pardimen \pardimen=\parskip %\pardimen 0pt% No stretch between paragraphs % Indentation for the \TeX\ part is handled in a separate variable % |\TeXindent| (the style-file parameter \.{indent.TeX}) from the variable % |\notch| (the style-file parameter \.{indent.code}) used for % definition and code parts. \newdimen\TeXindent \TeXindent 1em% For paragraphs in the \TeX\ part. @*1 Page numbering. If \LaTeX\ is loaded, we equate |\pageno| to \LaTeX's counter so that the |\label| macro works correctly. @A \ifLaTeXisloaded \let\pageno\c@@page% \WEB\ has its own name for the page number. \fi @* FONTS. Several fonts have been declared in addition to the standard ones of \.{PLAIN} format: $$\vbox{\halign{\.{\\#}\quad\hfil&---\quad#\hfil\cr titlefont&\titlefont Title.\cr ttitlefont&\ttitlefont Title.\cr SC&\SC SMALL CAPS.\cr Csc&\Csc CAPS/Small caps.\cr tentex&\tentex \TeX\ extended character set, including~'\.{\ }'.\cr bfit&\bfit Bold-faced italic.\cr }}$$ The main font used for text is called |\mainfont|, which is |\let| to |\tenrm|. The font used for comments is called |\cmntfont|. By default, this is |\let| to |\mainfont|. @A \ifnoLaTeXe \ifx\tenrm\undefined \font\tenrm=cmr10 \fi \ifx\itfam\undefined \chardef\itfam4 \fi \ifx\small\undefined \let\small\relax \fi \let\mainfont\tenrm \let\cmntfont\tenrm \font\eightrm=cmr8 \let\SC\eightrm \font\titlefont=cmssbx10 scaled \magstep2% Sans serif \font\ttitlefont=cmtt10 scaled\magstep2% Typewriter type \font\tentex=cmtex10 % \TeX\ \.{extended char.\ set} (used in strings) \let\extendedtex\tentex \font\Csc=cmcsc10 % Caps/small caps. \font\tenbfit=cmbxti10 % \&{Intrinsic functions} \let\bfit\tenbfit % Doesn't work right in titles. % Used for module-number subscript: \font\seventi=cmti7 \font\sevenrm=cmr7 \font\sevenbf=cmbx7 % For special handling of array indices: \font\sevenit=cmti7 \scriptfont\itfam=\sevenit @%\font\fiveit=cmti5 @%\scriptscriptfont\itfam=\fiveit \scriptscriptfont\itfam=\sevenit \def\mathrm#1{{\rm #1}} \def\mathit#1{{\it #1}} \else % \LaTeXe \def\mainfont{\normalsize\usefont{OT1}{\rmdefault}{m}{n}} \let\cmntfont\mainfont \def\eightrm{\footnotesize\usefont{OT1}{\rmdefault}{m}{n}} \let\SC\eightrm \def\titlefont{\Large\usefont{OT1}{\sfdefault}{\bfdefault}{n}} \def\ttitlefont{\Large\usefont{OT1}{\ttdefault}{m}{n}} \def\extendedtex{\usefont{OT1}{\ttdefault}{m}{n}} \def\tentex{\normalsize\extendedtex} \def\Csc{\usefont{OT1}{\rmdefault}{m}{\scdefault}} \def\bfit{\usefont{OT1}{\rmdefault}{\bfdefault}{\itdefault}} \def\tenbfit{\normalsize\bfit} \def\seventi{\scriptsize\usefont{OT1}{\rmdefault}{m}{\itdefault}} \def\sevenrm{\scriptsize\usefont{OT1}{\rmdefault}{m}{n}} \def\sevenbf{\scriptsize\usefont{OT1}{\rmdefault}{\bfdefault}{n}} \def\fiveti{\tiny\usefont{OT1}{\rmdefault}{m}{\itdefault}} \def\fiverm{\tiny\usefont{OT1}{\rmdefault}{m}{n}} \def\fivebf{\tiny\usefont{OT1}{\rmdefault}{\bfdefault}{n}} \def\tensy{\normalsize\usefont{OT1}{cmsy}{m}{n}} % \def\pbf{\fontfamily{\rmdefault}\fontseries{\bfdefault}\fontshape{n}% % \selectfont} % \def\ptt{\fontfamily{\ttdefault}\fontseries{m}\fontshape{n}\selectfont} \fi @* HIGHLIGHTING MACROS. These are used for displaying identifiers, reserved words, intrinsic functions, etc. @*1 The primitive highlighting macros. Typically the user (or \FWEB\ automatically) does not actually type these macros directly. Instead of saying ``|\Wshort{x}|'', one says ``|\|x|''. The associations between the short-hand convenience macros such as `|\||', `|\&|', etc.\ are made by an equating procedure carried out by the |\Wbegin| macro (see \WEBsection{Wbegin} below). The short-hand names are style-file parameters that can be changed by the user. For more information, consult the on-line documentation, menu item |fwebmac params|. @A \DRC\Wshort[1]{\leavevmode\hbox{$#1$}}% One-letter identifiers such % as~\Wshort{x} look better this way. \DRC\Wid[1]{\leavevmode\hbox{\it#1\/\kern.05em}}% Italic type for ordinary % identifiers such as \Wid{test}. \DRC\WID[1]{\leavevmode\hbox{\small\it#1\/\kern.05em}}% For all \WID{UPPERCASE}. % By default, macros are formatted the same way as ordinary identifiers. % However, one can change the following definitions to get special effects. % Either make your own version of |fwebmac.sty| (use a change file with % |fwebmac.web|), or redefine |\WidD| and/or |\WidM| with an \.{@@l} command. \let\WidD\Wid % Outer macro \let\WIDD\WID % Upper-case outer macro \let\WidM\Wid % FWEB macro \let\WIDM\WID % Upper-case FWEB macro \DRC\Wreserved[1]{\leavevmode\hbox{\def\\{\tt\WBS}\bf#1\/}}% Boldface type % for reserved words such as \Wreserved{int}. \DRC\WRESERVED[1]{\leavevmode\hbox{\def\\{\tt\WBS}\small\bf#1\/}}% Boldface type % for upper-case reserved words such as \WRESERVED{INTEGER}. \DRC\Wintrinsic[1]{\leavevmode\hbox{\def\\{\tt\WBS}\bfit#1\/\kern.05em}}% % Library/intrinsic function name such as \@@{sin}. @*1 Equating abbreviations to the primitive highlighting macros. In the following, we use |\gdef| instead of |\global\let| because we might want to change the definition of, e.g., |\WidM| with an \.{@@l} command, which comes {\it after} the |\Wbegin| statement. @A \def\W@@twodef#1#2#3#4{\gdef#1{#3}\gdef#2{#4}} \def\Wequate#1#2#3#4#5#6#7#8#9{% \W@@twodef#1\Wreserved\WRESERVED% |\&| by default. \gdef#2{\Wshort}% |\|| by default. % Don't reorder the following four statements! In case arguments 3--6 are % identical, one wants the ordinary identifier to win. \W@@twodef#5\WidM\WIDM% |\\| by default. \W@@twodef#4\WidD\WIDD% |\\| by default. \W@@twodef#3\Wid\WID% |\\| by default. \gdef#6{\Wintrinsic}% |\@@| by default. \W@@twodef#7\Wkeyword\WKEYWORD% |\.| by default. \gdef#8{\Wtypewriter}% |\.| by default. % \#9 is for future use. } @ Identifiers that are recognized as function or macro names are followed by the construction\hfil\break \.{\\WIN\{{\it name}\_{\it type}\}\{{\it module}\_{\it number}\}}. The cases for the first argument correspond to $$\vbox{\halign{#\hfil&\ ---\ #\hfil\cr 0&Generic name, defined by \.{@@[}.\cr 1&Function name.\cr 2&\WEB\ macro (\.{@@m}).\cr 3&Outer macro (\.{@@d}).\cr 4&Reserved name defined with~\.{@@`}.\cr 5&|@c typedef| name.\cr }}$$ If the name was defined in the current module, the second argument will be zero; otherwise it will be the section number in which the name was defined. The macro shows how to display the 0~state differently (here with a bullet). Also, note how combinations of underlining and fonts are used to distinguish the various kinds of identifiers. @A \def\W@@zero{0}% For the comparison in |\WIN| below. \DRC\WIN[2]{\ifmmode\def\ZZ{}\else\def\ZZ{\null$\null}\fi \ZZ_{\def\W@@rg{#2}\ifx\W@@rg\W@@zero{\bullet}\else\W@@IN{#1}{#2}\fi}\ZZ} % Format the module-number subscript. \gdef\W@@IN#1#2{% \ifcase#1 \underline{\hbox{\sevenrm\Wmodtrans{#2}}}% Generic name (\.{@@[}). [0] \or\hbox{\sevenrm\Wmodtrans{#2}}% Function name. [1] \or\underline{\hbox{\seventi\Wmodtrans{#2}}}% WEB macro. [2] \or\hbox{\seventi\Wmodtrans{#2}}% Outer macro. [3] \or\underline{\hbox{\sevenbf\Wmodtrans{#2}}}% \.{@@`}. [4] \or\hbox{\sevenbf\Wmodtrans{#2}}% \&{typedef}. [5] \else{\Wmodtrans{#2}}% Error trap. \fi } @* STRINGS. Strings are indicated by ``\.{\\.\{\dots\}}''. You can also use this for typewriter type; remember to escape the appropriate symbols: ``\.{\ \\\#\%\$\^\_\{\}\~\&}''. The string macro itself does not surround its contents with an |\hbox|, in order that long strings can be broken by discretionaries (done automatically by \FWEAVE). @A \DRC\Wtypewriter[1]{\relax\ifmmode\gdef\YY{\null$\null}\else\gdef\YY{}\fi \YY{\leavevmode\W@@INITSTR#1}\YY} % The following are for certain \Fortran\ keywords. \let\Wkeyword\Wtypewriter \let\WKEYWORD\Wtypewriter \let\.\Wtypewriter @*1 Nucleus for the string macro. Here is the nucleus for the string macro~|\.| (more precisely, for |\Wtypewriter|). @A \def\W@@INITSTR{% \extendedtex % Typewriter type for strings. (We don't say %|\tentex| here so the font can grow in a title.) \let\\=\WBS % Backslash in a string: '\.\\'. \let\'=\WRQ % Right quote in a string: '\.\''. \let\`=\WLQ % Left quote in a string: '\.\`'. \let\{=\WLB % Left brace in a string: '\.\WLB'. \let\}=\WRB % Right brace in a string: '\.\WRB'. \let\~=\WTL % Tilde in a string: '\.\~'. \let\ =\WSP % Space in a string: '\.\ '. \let\_=\WUL % Underline in a string: '\.\_'. \let\&=\WAM % Ampersand in a string: '\.\&'. \def\0{\discretionary{\WBS}{}{}}% \FWEB\ inserts this automatically every % so often so very long strings will break. Broken strings will % be marked by a backslash. \def\1{,\0}% \FWEB\ replaces commas in strings by this, so strings % tend to break after commas. \let\2\space % Ordinary space after control sequences in \TeX. \def\3{\space\space}% Translation of a tab in \TeX. } @*1 Characters for strings. @A \DRC\#{\hbox{\tt\char35}}% Parameter sign: '\#'. \DRC\${\hbox{\tt\char36}}% Dollar sign: '\$'. \DRC\%{\hbox{\tt\char37}}% Percent sign: '\%'. \DRC\^{\ifmmode\raise0.45ex\hbox{$\,\scriptstyle\mathchar"25E\,$}% \else\char`^ \fi}% Pointer or % hat: '\^'. % Circumflex accents can be obtained from |\^^D| instead of |\^|. \let\Caret\^% For proper indexing of |@c++ operator ^|. \def\AT!{@@}% Knuth's abbreviation for the at sign for control text: '\AT!' @ The following funny business about asterisks is in case one wants to be clever and make~`\.*' an active character (for example, for complex conjugation). (Actually, the |\ast| definition appears to be both unnecessary and incorrect. The braces kill the binary nature. Also, \FWEB\ emits |\ast| in place of |@n *|, and because the ilk of |@n *| is |@c binop|, this should always be in math mode.) @A \chardef\asterisk=`\* %\DRC\ast{\ifmmode{\displaystyle\mathchar"2203}\else\asterisk\fi} @ More stuff for strings. @A \chardef\WAM=`\&% Ampersand character in a string: '\.\&'. \chardef\WBS=`\\% Backslash in a string: '\.\\'. \DRC\WttBS{{\tt\WBS}}% Literal backslash: '\WttBS'. \chardef\WLB=`\{% Left brace in a string: '\.\WLB'. \DRC\WLQ{{\tt\char'22}}% Left quote in a string: '\.\`'. \chardef\WRB=`\}% Right brace in a string: '\.\WRB'. \DRC\WRQ{{\tt\char'23}}% Right quote in a string: '\.\''. \DRC\WSP{{\tt\char`\ }}% (Visible) space in a string: '\.\ '. \chardef\WTL=`\~% Tilde in a string: '\.\~'. \chardef\WUL=`\_% Underline character in a string: '\.\_'. @ Left quote outside a string: @A \DRC\WLQx{\hbox{\WLQ}} @* INDENTATION, LINEBREAKS, etc{.}. These commands are mostly handled by the macros~|\1| to~|\8|. @*1 Demonstration of the indentation scheme. First, here are some macros to draw vertical lines to show off the indentation scheme. @A \newbox\rulebox \newcount\ruleno \def\rules#1{\leavevmode \ruleno=0 \rlap{\vtop to 0pt{\null \def\R{\setbox0=\hbox{\the\ruleno}% \rlap{\vrule height0pt depth#1}% \kern-0.5\wd0\copy0\kern-0.5\wd0 \advance\ruleno by1 \hskip1em} \rlap{\R\R\R\R\R\R\R} \vss}}} @ The indentation scheme is as follows. The unit of indentation is |\notch|. @A \newdimen\notch @ Here is typical output. \setbox\rulebox\vtop{\null \ifnoLaTeXe \else \let\\\> \fi \WY $\WP\WE{if}\WO{1}{}$\par \WP\WMd$\@|A\WIN2{0}$\5 $\WO{2}{}$\par \WP\WE{endif}\par \WP\WMD$\\{ALPHA}$\5 $\\{xxx}+\\{yyy}+\\{xxx}+\\{yyy}+\\{xxx}+\\{yyy}+\\{xxx}+\\{yyy}+\\{xxx}+% \\{yyy}+\\{xxx}+\\{yyy}+\\{xxx}+\\{yyy}+\\{xxx}+\\{yyy}+\\{xxx}+\\{yyy}+% \\{xxx}+\\{yyy}+\\{xxx}+\\{yyy}+\\{xxx}+\\{yyy}+\\{xxx}+\\{yyy}+\\{xxx}+% \\{yyy}+\\{xxx}+\\{yyy}+\\{xxx}+\\{yyy}+\\{xxx}+\\{yyy}+\\{xxx}+\\{yyy}+% \\{xxx}+\\{yyy}+\\{xxx}{}$\par \WY\WP$\\{main}(\,)$\1\1\6 \&{int} \1\\{abcde}, \\{abcde}, \\{abcde}, \\{abcde}, \\{abcde}, \\{abcde}, % \\{abcde}, \\{abcde}, \\{abcde}, \\{abcde}, \\{abcde}, \\{abcde}, \\{abcde}, % \\{abcde}, \\{abcde}, \\{abcde}, \\{abcde}, \\{abcde}, \\{abcde}, \\{abcde};\2% \2\2\1\6 $\{{}$\6 \WE{if}$\WO{1111}+\WO{2222}+\WO{1111}+\WO{2222}+\WO{1111}+\WO{2222}+\WO{1111}+% \WO{2222}+\WO{1111}+\WO{2222}+\\{aaaa}+\\{bbbb}+\WO{1111}+\WO{2222}+\WO{1111}+% \WO{2222}+\WO{1111}+\WO{2222}+\WO{1111}+\WO{2222}+\WO{1111}+\WO{2222}$\WPs\7 $\\{xxx}+\\{yyy}+\\{xxx}+\\{yyy}+\\{xxx}+\\{yyy}+\\{xxx}+\\{yyy}+\\{xxx}+% \\{yyy}+\\{xxx}+\\{yyy}+\\{xxx}+\\{yyy}+\\{xxx}+\\{yyy}+\\{xxx}+\\{yyy}+% \\{xxx}+\\{yyy}+\\{xxx}+\\{yyy}+\\{xxx}+\\{yyy}+\\{xxx}+\\{yyy}+\\{xxx}+\\z;{}$% \7 \WE{endif}\WPs\6 $\}$\2\WY\par } \vbox{\noindent\rules{\dp\rulebox}\box\rulebox} @*1 Indentation conventions. Preprocessor commands in the definition part are far left, definition-part commands such as~\.{@@m} are indented one notch, function names are at two notches, and the body of functions is at three notches. This distance is given the special name |\W@@globalindent|: @A \newcount\W@@globalindent \W@@globalindent=3 % Global indentation in notches. @ The current indentation is called |\W@@ind|. One also sometimes needs to save and restore that. @A \newcount\W@@ind % Current indentation in notches. \newcount\W@@lastind % Used for preprocessor commands. \def\W@@saveind{\global\W@@lastind=\W@@ind} @*1 Backspacing. Each output line of code is a separate paragraph. The scheme proceeds by first setting |\W@@ind|~to the appropriate hanging indentation, then backspacing appropriately. Here are the backspace quantities. Note that one can't initialize the boxes here, because the value of |\notch| isn't known until after |\Wbegin| (it's the style-file parameter \.{indent.code}). @A \newbox\b@@k \newbox\b@@kk \def\W@@setboxes#1{\notch=#1 \setbox\b@@k=\hbox to -\notch{}% Backspace one notch. \setbox\b@@kk=\hbox to -2\notch{}% Backspace two notches. } @ In order to implement the line-break macro |@@/| appropriately, the |\WBK| macro is emitted. This must deal with the fact that sometimes, but not always, the hanging indentation is changed in the middle of the line (as in a variable declaration like `|@c int i,j;|'. Therefore, |\WBK| computes the proper indentation at the point of its first occurence in the line, and uses that for all subsequent instances of |\WBK| within that same line. @A \newif\ifW@@firstbreak \newcount\W@@nBK \def\WBKo{}% NOT FINISHED YET! \def\WBK{\WBK@@{0}} \def\WBK@@#1{\hfil\break \ifW@@firstbreak \W@@nBK=\W@@ind \advance\W@@nBK by -#1 % Compensate for glob's outdented by 1 from body. \W@@firstbreakfalse % Reset by |\6|. \fi \hangindent\W@@nBK\notch \ignorespaces} @*1 The macros |\1| to |\8|. When there's the possibility that a line of code may be continued, we advance the indentation and set |\hangindent|. @A \def\1{\global\advance\W@@ind by1\hangindent\W@@ind\notch}% Indent one more notch @ Here we cancel the above. One doesn't need to reset |\hangindent| because this will always be followed by a~|\6| or~|\7|, which already does that. @A \def\2{\global\advance\W@@ind by-1{}}% Indent one less notch @ Now we provide for an optional break within a statement. (Note that the argument is multiplied by~10.) @A \def\3#1{\hfil\penalty#10\hfilneg}% Optional break within a statement. @ A simple command to backspace one notch. @A \def\4{\copy\b@@k \ignorespaces}% Backspace one notch @ Optional break (the |\yskipfalse| may be obsolete). @A \def\5{\hfil\penalty-1\hfilneg \kern2.5\notch\copy\b@@kk \yskipfalse\ignorespaces} @ The next command forces a line break. @A \def\6{\ifmmode\else\par \hangindent\W@@ind\notch \noindent \kern\W@@ind\notch \copy\b@@kk \ignorespaces\fi} @ This also forces a line break, but also adds some extra vertical space. @A \def\7{\WY\6}% Forced break and a little extra space. @ No indentation. @A \def\8{\hskip-\W@@ind\notch \hskip 2\notch} @ @A \newif\ifyskip \def\yskip{\medskip} @* PREPROCESSOR COMMANDS. The preprocessor commands are built out of the previous ones. First, we define a guaranteed space. @A \def\W@@Hspace{\hbox{ }} @ Start a preprocessor command such as \.{@@\#if}. When these are issued in the code section (rather than in the definition section), one must remember the present level of indentation. That's restored with~|\WPs|. @A \DRC\WPR[1]{\copy\b@@kk \W@@saveind% |\global\advance\W@@ind by 2| \1\Wreserved{@@#1}\W@@Hspace} \DRC\WPs{\global\W@@ind=\W@@lastind} @ The definition commands such as~\.{@@m} are similar, except that they also take a language argument. @A \def\W@@point{!} \def\W@@defin#1#2{\4\W@@saveind \1\Wreserved{#1}% \def\W@@temp{#2}% \ifx\W@@temp\ast \ast \else\ifx\W@@temp\W@@point \W@@point \else\hbox{$^{\mathrm{#2}}$}% \fi\fi \W@@Hspace}% Begin @@d, @@m, or @@f. @* VARIOUS NUCLEII. Here are some miscellaneous macros used by the innards of this macro package. @A \def\note#1#2.{\WY\noindent{\hangindent2em\baselineskip10pt\footnotesize #1 #2.\par}} @*1 Star macros. @A \def\W@@lapstar{\rlap{*}} \newif\ifW@@modchanged \def\W@@checkstar{\edef\W@@temp{\noexpand\W@@isstar\modstar\noexpand\*\relax}% \W@@temp} \def\W@@isstar#1\*#2\relax{\ifx#2\*\W@@modchangedtrue\else\W@@modchangedfalse\fi} @*1 Printing the current include file. If there's a current include file, it's printed at the start of each section. The macro |\WIF| is emitted by \FWEAVE\ and stores the current include-file name into |\W@@includefile|. |\WIF@@name| actually prints it, according to the macro |\WIFfmt|. @A \def\W@@includefile{} \def\WIF#1{\gdef\W@@includefile{#1}} \def\WIF@@name{\ifx\W@@includefile\empty \else \W@@prninclude \fi} \def\W@@prninclude{\ifLaTeXisloaded\else\ \fi \WIFfmt{\W@@includefile} } \def\WIFfmt#1{[{\tt#1}]} \def\W@@startsection{\WQ \W@@checkstar {\let\*=\W@@lapstar \ifLaTeXisloaded \leavevmode \else \noindent \bf\modstar.% \fi \WIF@@name% Print name of current include file, if there is one. \ifLaTeXisloaded\else\quad\fi }} @* HARD-CODED MACROS. We now describe various macros hard-coded into \FWEAVE, and their support macros. @*1 Comments. Comments are C-style. The long comment construction `|/* ...*/|' is output as `|\WC{ ... }|'; the short comment is output as `|\Wc{ ...}|'. The |\WC| and~|\Wc| macros aren't simply defined with an argument whose text would be the comment because one wants the comment to be a group and the user might be wanting to change catcodes inside that group; the argument form would absorb catcodes before they were changed. @A \def\W@@skipbrace#1{\catcode`\{=1 } \DRC\WC{\W@@cmnt{/\ast}{\W@@finishcomment}}% Long comment. \DRC\Wc{\W@@cmnt{//}{\XX}}% Short comment. \DRC\Wci{\W@@cmnt{}{\XX}}% No comment symbol at all; for special effects. \def\W@@cmnt#1#2{\ifmmode\gdef\XX{\null$\null}\else\gdef\XX{}\fi% C-style cmnt \XX\hfil\penalty-1\hfilneg \ifyskip\else\quad\fi$#1\,$% \bgroup\cmntfont % The user can redefine the comment font |\cmntfont|. \aftergroup#2% \catcode`\{=\other\W@@skipbrace} \def\W@@finishcomment{$\,\ast/$\XX} \def\Wx#1{\kern-0.5\notch\hbox{\tt\%}} @ Compiler directives are essentially comments, but are formatted more like preprocessor commands. @A \def\WCDIR#1{\WPR?\Wtypewriter{#1}\WPs} @*1 Code mode. Code mode is entered by vertical bars, giving an effect such as |@c x=y|. Because we make |\WCD| a robust command, code mode may be used inside the names of starred sections (\LaTeXe\ only). @A \DRC\WCD[1]{\ifmmode\hbox\fi{\ignorespaces#1}} @*1 Definitions. Various definition section stuff. @A \def\WD#1{\W@@defin{@@D}{#1}}% Outer macro definition: `\.{@@D}' \def\Wd#1{\W@@defin{@@d}{#1}}% Outer macro definition: `\.{@@d}' \def\WUd#1{\W@@defin{@@u}{#1}}% Undef outer macro: `\.{@@u}'. \def\WMD{\W@@defin{@@M}}% WEB macro definition: `\.{@@M}'. Second argument % supplied by \FWEAVE. \def\WMd{\W@@defin{@@m}}% WEB macro definition: `\.{@@m}'. As above. \def\WE#1{\WPR{\##1}}% WEB preprocessor command: `\.{@@\#if\dots}'. \def\Wf#1{\W@@defin{@@f}{#1}}% Format definition: `\.{@@f}'. \def\WF#1{\W@@defin{@@F}{#1}}% Format definition: `\.{@@F}'. \def\Wl#1{\W@@defin{@@l}{#1}}% Limbo text definition: `\.{@@l}'. \def\Wv#1{\W@@defin{@@v}{#1}}% Operator overloading: `\.{@@v}'. \def\WWW#1{\W@@defin{@@W}{#1}}% Identifier overloading: `\.{@@W}'. \def\Ww#1{\W@@defin{@@w}{#1}}% Identifier overloading: `\.{@@w}'. @*1 Sections. \FWEB\ supports both page number or section-number references. The style-file entry \.{encap.prefix} defines a \TeX\ macro---empty by default for TeX, ``|\M|'' by default for \LaTeX. When this macro is non-empty, it encloses the integer section numbers that are spit out by \FWEAVE. The |\Wbegin| macro uses |\W@@modequate| to define this macro to |\Wmodtrans|, which is the primitive that actually interprets the section number. For \TeX, |\Wmodtrans| is just the identity, so one gets ordinary section numbers. For \LaTeX, |\Wmodtrans| converts into either page or section numbers, depending on the setting of |\ifpagerefs|. @*2 Customizing the referencing style. (As an example, the current document is produced with the non-default settings |\numberdefsfalse| and |\numbercodefalse|.) @A \newif\ifpagerefs% Page references or module-number references? \pagerefsfalse \newif\ifnumberTeX% Do we start the \TeX\ part of unnamed sections with % a section number? \numberTeXfalse \newif\ifnumberdefs% As above, but for the definition part. \numberdefstrue \newif\ifnumbercode% As above, but for the code part. \numbercodetrue % The following works in conjunction with the \LaTeXe\ package |fwebnum|. \newif\ifnumberunnamed% Number unnamed section? \numberunnamedfalse \newskip\Wuparindent \let\Wrefstepcounter\refstepcounter % The following flag is explained in \WEBsection{strip}. \newif\ifstripzeros \ifuseREVTeX \stripzerosfalse \else \stripzerostrue % By default, we're bold. \fi \def\W@@modequate#1{\def\W@@temp{#1}% \ifx\W@@temp\empty\else \gdef#1{\Wmodtrans}% \fi} @*2 Sectioning commands. When LaTeX is selected with ``\.{-PL}'' (this is now the default), we use LaTeX's sectioning commands. The |\W@@depth| macro is defined at the bottom of the \.{aux} file to be the maximum depth of the \.{@@*}$n$ commands, plus~1. In other words, it's the effective level of the unnamed sections. @A \newcount\W@@ssmax% Maximum depth of the \.{@@*}$n$ commands. \newcount\W@@lsmax% Max. local (per section) depth of the \.{@@*}$n$ commands. \def\W@@maxdepth#1{{\count0=#1 \advance\count0 by\W@@ssmin% \xdef\W@@depth{\the\count0}}% \ifFWEBstandalone\else \immediate\write\@@auxout{\string\@@writefile{toc}% {\string\setcounter{tocdepth}{\W@@depth}}}% \fi } \def\Wunnamed#1#2{\csname ifnumber#1\endcsname \gdef\Wnewoutname{#2}% \ifx\Woutname\Wnewoutname\else \8\Wtypewriter{"#2"} \Wscrap ${}\equiv{}$\6% \global\let\Woutname\Wnewoutname \fi\fi} @ The |\W@@Lvmode| macro is basically a redefinition of \LaTeX's |\addpenalty| command to include the |\vfil| and |\vfilneg| commands. This is supposed to encourage it to break between sections. When |\secpenalty| is non-negative, however, |\addpenalty| is not redefined, and breaking at sections is not encouraged. The tricky thing is to set |\secpenalty| at the appropriate place. The solution is to use the style-file and say ``\.{doc.preamble "\\secpenalty0"}''. This is executed just before the |\W@@raggedbottom| command during |\Wbegin|. @A \newcount\secpenalty \secpenalty=-500 % Strongly encourage breaks at sections. % Although the following is used only in \LaTeX, don't put it inside the % |\ifLaTeXisloaded| because of \TeX's |\if| parsing. \def\W@@Lvmode#1{% \if@@minipage\else \if@@nobreak\else \ifdim\lastskip=\z@@ \vfil \penalty#1\relax \vfilneg \else \@@tempskipb\lastskip \vskip-\lastskip \vfil \penalty#1 \vfilneg \vskip\@@tempskipb \fi\fi\fi} \ifLaTeXisloaded \def\W@@raggedbottom{\def\@@textbottom{\vskip\z@@ \vfil}% \let\@@texttop\relax % Very strongly encourage to break at beginning of sections. \@@secpenalty=\secpenalty \ifnum\secpenalty<0 \def\addpenalty##1{% \ifvmode \W@@Lvmode{##1}% \else \@@noitemerr \fi} \fi } @ The deepest named section is \.{1.1.1}, corresponding to a sub-sub-section. The associated unnamed section will then be a sub-sub-sub-section, which we must declare. @A \newcounter{subsubsubsection} \gdef\thesubsubsubsection{\thesubsubsection.\arabic{subsubsubsection}} \gdef\cl@@subsubsubsection{\@@elt{paragraph}} \gdef\l@@subsubsubsection{\@@dottedtocline{4}{3.8em}{3.2em}} \gdef\subsubsubsectionmark#1{} \ifnoLaTeXe \gdef\paragraph{\@@startsection{paragraph}{5}{\z@@}{3.25ex plus1ex minus.2ex}{-1em}{\reset@@font\normalsize\bf}} \fi % After the \.{aux} file is read, we must set things up based on the depth % parameter |\W@@depth|. \gdef\W@@setsecdepth{% \@@ifundefined{W@@depth}{\gdef\W@@depth{1}}{}% \setcounter{secnumdepth}{\W@@depth}% \setcounter{tocdepth}{\W@@depth}% % Redefine appropriate section heading to begin the unnamed section. % At the moment, this only works right if the major sections don't go down % any deeper than 1.1.1. \ifnumberunnamed \Wuparindent0pt \addtocounter{secnumdepth}{1}% \gdef\WRefstepcounter##1{}% \else \Wuparindent-\TeXindent \global\let\WRefstepcounter\Wrefstepcounter \fi \ifcase\W@@depth % Level 0; should never happen. \or % Level 1 \def\subsection{\WRefstepcounter{subsection}% \@@startsection{subsection}{2}{\z@@}{-3.25ex plus-1ex minus-.2ex}{\Wuparindent} {\reset@@font \normalsize \bf}}% \let\Wunnamedsect\subsection \def\W@@subsect{subsection}% \or % Level 2 \def\subsubsection{\WRefstepcounter{subsubsection}% \@@startsection{subsubsection}{3}{\z@@}{-3.25ex plus-1ex minus-.2ex} {\Wuparindent}{\reset@@font \normalsize \bf}}% \let\Wunnamedsect\subsubsection \def\W@@subsect{subsubsection}% \or % Level 3 \def\subsubsubsection{% \WRefstepcounter{subsubsubsection}% \@@startsection{subsubsubsection}{4}{\z@@}{-3.25ex plus-1ex minus-.2ex} {\Wuparindent}{\reset@@font \normalsize \bf}}% \let\Wunnamedsect\subsubsubsection \def\W@@subsect{subsubsubsection}% \else \let\Wunnamedsect\paragraph \def\W@@subsect{}% \fi } @*2 Converting module numbers into section or page numbers. Here is the primitive macro |\Wmodtrans| that converts a module number into \LaTeX's section number or page number. This works by label information written to the \.{aux} file by the \FWEAVE\ section macros |\WM| (unnamed section) and |\WN| (named section). In the following, the first |\expandafter| creates a \LaTeX\ referencing macro such as |\r@@1|. Then the remaining |\expandafter| expands that @A \gdef\Wmodtrans#1{\@@ifundefined{r@@#1} {\W@@split{\##1}{\##1}{0}{0}} {\expandafter\expandafter\expandafter \W@@split\csname r@@#1\endcsname{#1}}% } @ Here we convert the \.{aux} label info into a page or section number. Pages are not too complicated. The real problem comes with ensuring that the unnamed sections are numbered at the deepest depth of the file, but only for the particular section. Because the mechanism is complicated, we introduce a flag |\stripzeros| that can turn it off if it doesn't work. \modlabel{strip} @A % #1---\LaTeX\ section number % #2---page number % #3---bottom section number % #4---\Fweb\ module number (argument to |\Wmodtrans|). \gdef\W@@split#1#2#3#4{% \ifpagerefs #2% Just extract the page number. % Add a letter subscript if more than 1 sec. per page. \@@ifundefined{W@@#3}% {\setcounter{W@@tempcounter}{#4}% \addtocounter{W@@tempcounter}{-#3}% \ifnum\value{W@@tempcounter}>25 \setcounter{W@@tempcounter}{25}\fi \hbox{\alph{W@@tempcounter}}} {}% \else % Section-number references (the default). \ifstripzeros \W@@strip#1.,% \else #1% If we gave up and said |\stripzerosfalse|. \fi \fi } @ In order to know how to strip, each major section at level 0 writes out to the \.{aux} file a line of the form |\Lastdepth{lastsect}{maxdepth}|. When the \.{aux} file is read in, |\Lastdepth| defines macros of the form |\l@@lastsect|. These can then be used to control the zero stripping. For example, the raw section number might be \S4.0.0.1, because the maximum depth |\W@@depth| for some section (not necessarily \S4) was 3. However, if \S4 had no subsections at all (a last depth of 1), we can number the unnamed section \S4.1---i.e., we want to strip off $3 - 1 = 2$ units of `\.{.0}'. This is what |\W@@STRIP| does. The intermediate macros beginning with |\W@@strip| take care of various subsidiary annoyances. |\W@@strip| picks off the level-0 section number from its argument. It must also watch out for an argument of the form |\#5|, which arises when the \LaTeX\ section number is undefined. @A % #1---level-0 section number---i.e., 1 in \.{1.2.3}. % #2---minor section number---i.e., 2.3 in the above example. \def\W@@strip#1.#2,{\W@@first#1\relax \W@@tempc{#1}{#2}} \def\W@@first#1#2\relax{% \ifx#1\#% \def\W@@tempc##1##2{##1}% \else \def\W@@tempc##1##2{% \W@@Strip{##1.##2}% { \@@ifundefined{l@@##1}% {0}% {\csname l@@##1\endcsname}% }% }% \fi } @ |\W@@Strip| gets two arguments: the first of the form `\.{4.0.0.1.}'; the second, the last maximum depth. @A \def\W@@Strip#1#2{\W@@STRIP#1\relax{#2}} @ |\W@@STRIP| kills off the final dot, figures out how many zeros to strip, constructs a macro definition with the appropriate template, then applies it to the section number. @A \def\W@@STRIP#1.\relax#2{{% \W@@tk={}\W@@count=0 \W@@counta=\W@@depth \advance\W@@counta by-#2 % How many zeros to strip. \loop \ifnum\W@@count<\W@@counta \advance\W@@count by1 \edef\next{\W@@tk={\the\W@@tk.0}}\next % Build template `\.{.0.0\dots}'. \repeat % We must worry about the possibility that there are no zeros at all. \let\eat\let \edef\next{\def\noexpand\reduce####1\the\W@@tk####2\eat####3\eat {\noexpand\W@@preface{####1}####2}}% \next \edef\next{\noexpand\reduce#1\eat\the\W@@tk\eat\eat\relax}% \def\eat##1{}% \next}} \global\let\modno\empty \global\let\W@@name\empty % For stand-alone operation, |\W@@preface| is the identity. In insert % mode, it prepends the section number of the section into which the file % is being inserted. \def\W@@preface#1{#1}% Redefined to |\W@@getsection| in fwebinsert.sty. % The next macro is used only in \.{fwebinsert.sty}. \def\W@@getsection#1{% \let\W@@Preface\empty% Just in case. \ifcase\W@@ssmin\relax % |\relax| terminates expansion of |\W@@ssmin| \W@@xsection#1.\relax \def\W@@Preface{\thesection}% Level 0 \or \def\W@@Preface{\thesection.#1}% Level 1 \or \def\W@@Preface{\thesubsection.#1}% Level 2 \or \def\W@@Preface{\thesubsubsection.#1}% Level 3 \fi \W@@Preface } % Extract just the left-most \LaTeX\ section number. (\Wb@@se is defined in % fwebinsert.sty; it is set to the section number in effect at the time the % file was inserted.) The |\advance| thus redefines the section number in % the inserted file to be relative to that in the including file. \def\W@@xsection#1.#2\relax{\c@@section=\Wb@@se \advance\c@@section by#1} @*2 Beginning of unnamed section is signified by |\WM|. @A \def\WM#1.{\WMN#1.% \W@@mark{{\oldmodno}{\oldWname}}{{\modno}{\W@@name}}% \ifon \advance\W@@ss by10 % \W@@start{\ifnumberTeX\Wmodtrans{\modno}\fi}% ???? \advance\W@@ss by-10 % \ignorespaces} \else % No \LaTeX; for \TeX, one just gets module numbers. \def\Wmodtrans#1{#1} \outer\def\WM#1.{\WMN#1.\W@@mark\ifon\Wskip\W@@startsection\ignorespaces} \fi % End of no \LaTeX. @*2 Beginning of starred section. Starred sections (begun with~`\.{@@*}') have associated level numbers, where 0~denotes the most significant level, 1~denotes a subsection, 2~denotes a subsubsection, and so on. One can indicate the level number in several ways. By default, one can say ``\.{@@*3\ Section name.}'' or equivalently ``\.{@@*...\ Section name.}'' to set the level number to~3. Alternatively, if one replaces the line below ``\.{\\W@@dotsafterfalse}'' with ``\.{\\W@@dotsaftertrue}'', one can instead say ``\.{@@*\ Section name....}'' (but don't do it). \begin{itemize} \item For \TeX: By default, major sections get a page break; subsections don't. Sections and subsections can be formatted in different ways in the table of contents by enhancing the definition of~|\WZ| (inside~|\Wcon|) to include an |\ifcase| construction. \item For \LaTeX: The appropriate \LaTeX\ section command is used. \end{itemize} @A \newcount\W@@ss % Counter for the dots. \newcount\W@@lastsect % Level number of section immediately above. \newif\ifW@@dotsafter % Do subsection dots come after or before the section name? \W@@dotsafterfalse \ifW@@dotsafter % ``@@* NAME...'' \def\W@@before/#1.{\W@@defname{#1}\W@@dot}% \def\W@@fter{\W@@Nss}% \else % ``@@*.. NAME.'' or ``@@*2 NAME.'' \def\W@@before/ {\futurelet\next\W@@check}% \def\W@@fter#1.{\W@@defname{#1}\W@@Nss}% Done after figuring out level. \def\W@@fter@@#1#2.{\W@@defname{#2}\W@@Nss}% |#1| eats the sectionnum. \fi \def\W@@check{\ifx\next.\def\next{\W@@dot.}% Count arbitrary dots. \else\ifx\next0\W@@sectionnum{0}% \else\ifx\next1\W@@sectionnum{1}% \else\ifx\next2\W@@sectionnum{2}% Highest numerical level (subsubsect.) \else\ifx\next3\W@@badlevel{3}% \else\ifx\next4\W@@badlevel{4}% \else\ifx\next5\W@@badlevel{5}% \else\ifx\next6\W@@badlevel{6}% \else\ifx\next7\W@@badlevel{7}% \else\ifx\next8\W@@badlevel{8}% \else\ifx\next9\W@@badlevel{9}% \else\let\next\W@@fter \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next}% \def\W@@badlevel#1{\errhelp=\b@@dlevelhelp \errmessage{FWEBMAC WARNING: @@*#1 changed to @@*2}% \W@@sectionnum{2}} \newhelp\b@@dlevelhelp{Only the major-section (table-of-contents) commands @@* (section), @@*1 (subsection), and @@*2 (subsubsection) are allowed.} % Assign numerical section number. \def\W@@sectionnum#1{\W@@ss#1% \advance\W@@ss by\W@@ssmin \let\next\W@@fter@@} @ By default, the full section name is used as a headline. Sometimes that might be too long. To deal with that, an optional argument may be used, as follows: \begin{verbatim} @@* [Short headline]Full section name. \end{verbatim} Then the optional argument will be used instead. (There should be no brace-protected periods inside the optional argument, because the whole construction up to the final period is absorbed at once.) @A \def\W@@defname#1{\@@ifnextchar[{\W@@getname}{\W@@getname[#1]}#1.} \def\W@@getname[#1]#2.{\gdef\W@@name{#1}% Running headline (short name). \gdef\W@@longname{#2}}% Remember name of section (used in |\W@@start|). \def\W@@ssmin{0}% The lowest (top) level. \def\WN#1.{\WMN#1.\W@@ss=\W@@ssmin \W@@before/}% Begin a starred section. @ Here we set up to output the maximum local section depth to the table of contents. For more explanation, see \WEBsection{strip}. @A % Put this here, not inside |\ifLaTeXisloaded|. \def\W@@outlsmax#1{\if@@filesw {% % The following doesn't work if one uses something like |\Roman| for % |\thesection|. If we only used LaTeX, it would be trivial to fix by % replacing |\@@currentlabel| by |\c@@section| (I think). \ifLaTeXisloaded \expandafter\W@@major\c@@section.\relax \else \expandafter\W@@major\@@currentlabel.\relax \fi % |\W@@count| now has major section number. \advance\W@@count by#1 \advance\W@@count by-1 \advance\W@@lsmax by1 \edef\@@tempa{\ifFWEBstandalone \write\@@auxout{\string\Lastdepth{\the\W@@count}% {\the\W@@lsmax}}% \fi}% \expandafter}\@@tempa \fi \W@@lsmax=0 } \ifLaTeXisloaded \def\W@@major#1.#2\relax{\W@@count=#1}% Get the major section. % #1---Last major (level-) section % #2---Maximum depth of that section \def\Lastdepth#1#2{% \edef\@@tempc{\gdef\expandafter\noexpand \csname l@@#1\endcsname{#2}}% \@@tempc% Define something like |\l@@1| to be last max depth. } \else \def\W@@outlsmax#1{} \fi @ Here we count the periods before or after the section name. @A \def\W@@dot{\futurelet\next\W@@Ns} \def\W@@Ns{\ifx\next.% \advance\W@@ss by 1 \let\next\W@@next \else \let\next\W@@fter \fi \next} \def\W@@next#1{\W@@dot} @ Now actually begin the section. Note the use of~|\ifcase| to conditionally format the sections and subsections. Also, the construction |\ifon...\fi| brackets the section to conditionally suppress printing. Finally, we make an entry in the table of contents for all starred names. The first argument of the \.{\\WZ}~macro is the level number for this section. This can be used to format the table of contents in various ways. The order of expansion is an issue in the~|\write| to the table of contents file~|\W@@cont|. One wants the macro~|\WZ| to be sent unexpanded, so we |\let|~it equal to a primitive. Also, it's possible that a~|\WIN| will appear inside of~|\W@@name| (if the user included certain kind of code inside the section name). This shouldn't be expanded until later, so we turn that into the temporarily unexpandable macro~|\WIM|. (This is presumably unnecessary for \LaTeXe, since |\WIN| is made robust.) @A % Page break for major sections. \ifLaTeXisloaded \let\Wsectionbreak\relax \else \def\Wsectionbreak{\ifcase\W@@ss\vfil\eject\fi} \fi % Running headline. \def\rhead{\ifcase\W@@ss \uppercase{\ignorespaces\W@@name}% \else \ignorespaces\W@@name% \fi}% Define running headline. \let\WZ\let % Now one can |\send| the control sequence |\WZ| \let\WIM\let % This macro is made temporarily unexpandable; see |\WZ|. \def\W@@Llabel#1{\@@bsphack \if@@filesw {\let\thepage\relax \let\W@@botmodno\relax \def\protect{\noexpand\noexpand\noexpand}% \edef\@@tempa{\ifFWEBstandalone \write\@@auxout{\string\Newlabel{#1}% {{\@@currentlabel}{\thepage}}{\W@@botmodno}}% \fi}% \expandafter}\@@tempa \if@@nobreak \ifvmode \nobreak \fi \fi \fi \@@esphack} \ifLaTeXisloaded \gdef\NoIndex{NoIndex}% Written as arg to |\Wbegin| by \.{-xi}. \gdef\W@@Nss{% {\let\protect\noexpand \xdef\Wupn@@me{\W@@name}}% \ifx\Wupn@@me\INDEX \ifx\INDEX\NoIndex \onfalse% Don't print section heading. \else \W@@mark{{\oldmodno}{\oldWname}}{{\oldmodno}{\oldWname}}% \fi \else% Emit mark before section break. \W@@mark{{\oldmodno}{\oldWname}}{{\modno}{\W@@name}}% \fi % Can't put this in |\WMN| since |\rhead| must be defined first. \message{*\modno}% Progress report to the terminal. \ifon% Start output of named section; explicit |\fi| % written by \FWEAVE. \ifnum\W@@ss>\W@@ssmax \global\W@@ssmax=\W@@ss% Track max depth. \fi \ifnum\W@@ss>\W@@lsmax \global\W@@lsmax=\W@@ss% Maximum local depth. \fi \W@@start{\W@@longname}% \ignorespaces } \def\steppagemodule{\noexpand\expandafter\expandafter\expandafter {\addtocounter{pagemodule}{1}}\thepagemodule} \let\Wlabel\W@@Llabel @ If the section name is exactly ``\.{INDEX}'' (or more precisely the contents of the style-file parameter |index.name|), we issue the |\beforeindex| command. By default, this is defined as follows: If \.{multicol.sty} is not loaded, we switch into |\twocolumn| mode, thereby starting the index on a new page. If it is loaded, we just issue a |\newpage| command. Later, after the beginning of the \.{INDEX} section is executed, the |\startsection| command will begin the multi-column mode. @A \gdef\beforeindex{% \ifx\multicols\undefined \twocolumn \else \ifFWEBstandalone \newpage \fi \fi } \gdef\W@@start#1{% {\let\protect\noexpand \xdef\Wupn@@me{\W@@name}}% \ifx\Wupn@@me\INDEX\beforeindex\fi % Select the appropriate \LaTeX\ section command. \ifcase\W@@ss \let\Wsect\section % Level 0 \W@@lastsect\W@@ss \or \let\Wsect\subsection % Level 1 \W@@lastsect\W@@ss \or \let\Wsect\subsubsection % Level 2 \W@@lastsect\W@@ss \else \let\Wsect\Wunnamedsect \fi % { \ifnum\W@@lastsect>2 \W@@setU \fi \Wsect{#1}% Execute LaTeX section heading. % } \ifnum\W@@ss=0 % Check if major section. \W@@outlsmax{0}% If so, write out |\Lastdepth| command. \fi % Emit mark after section break. \W@@mark{{\modno}{\W@@name}}{{\modno}{\W@@name}}% \Wlabel{\modno}% Section number to aux file. \@@ifundefined{r@@\modno} {\expandafter\xdef\csname r@@\modno\endcsname {{\@@currentlabel}{\thepage}{-1}}} {}% For present run. % \message{modno=\modno [\csname r@@\modno\endcsname]} % Debugging. \W@@startsection } \else % No \LaTeX \def\W@@Nss{% \let\protect\noexpand \W@@mark%Can't put this in |\WMN| since |\rhead| must be defined first. \Wsectionbreak % Typeset the break between sections. \message{*\modno}% Progress report to the terminal. \ifon \ifcase\W@@ss\else\Wskip\fi \W@@startsection{\bf\ignorespaces\W@@name.\quad}% {\def\WIN{\WIM}% \edef\next{\write\W@@cont{\WZ{\the\W@@ss}{\W@@name}% {\modno}{\noexpand\the\pageno}}}\next}% % To contents file |CONTENTS.tex|. \ignorespaces} \fi @ @A \ifuseREVTeX \def\W@@setu#1{\expandafter\def\csname p@@\W@@subsect\endcsname{#1} \expandafter\def\csname the\W@@subsect\endcsname{\arabic{\W@@subsect}}} \def\W@@setU{ \ifcase\lastsect \W@@setu{\thesection.}% \or \W@@setu{\thesection\,\thesubsection.}% \or \W@@setu{\thesection\,\thesubsection\,\thesubsubsection.}% \fi } \else \def\W@@setU{} \fi @ The marks that are emitted just before |\Wsectionbreak| are of the form ``{\it modno}|\else|{\it section name}''. (See the discussion just before Ex.~23.5 of the \textsl{\TeX book}.) Both parts are used in the page headers. In handling the section name, one must take care to avoid expanding the macro~|\WIN| prematurely. This is done just as in~|\W@@Nss| above. @A \def\W@@markN{\def\W@@mark{{\def\WIN{\WIM}% \mark{\modno\noexpand\else\rhead}}}} \ifx\selectfont\undefined \W@@markN \else \def\W@@mark{{\def\WIN{\WIM}\let\protect\noexpand \mark{\modno\noexpand\else\rhead}}} \fi \def\Wmodno{\iftrue\topmark\fi}% Extracts the left-hand part of the mark. \def\Whead{{\let\WIM\WIN \expandafter\iffalse\topmark\fi}}% Extracts the right-hand part. @ Common code for |\WM|, |\WN|. @A \def\WMN#1.{\par \parskip=\pardimen % Reset to \TeX\ spacing \parindent=\TeXindent {\ifLaTeXisloaded \global\let\oldmodno\modno \global\let\oldWname\W@@name \xdef\@@currentlabel{\modno}% \global\let\Woutname\empty \addtocounter{pagemodule}{1}% \fi \xdef\modstar{#1}% \let\*=\empty \xdef\modno{#1}% }% \ifx\modno\modstar \global\onmaybe% For conditional listing of changed secs. \else \global\ontrue% Print this section. \fi } %\let\MN\WMN % Backward compatibility. Commented out for v1.60. @*1 Nuweb mode. When the `N' mode is in effect, code to be transcribed verbatim will be bracketed by |\WBM|\dots|\WEM|. @A \def\Wscrap{{\footnotesize\Wmodtrans{\modno}% \ifW@@modchanged*\fi}} {\gdef\@@verbatim{\if@@minipage \else \vskip \parskip \fi \leftskip \@@totalleftmargin \rightskip \z@@ \parindent \z@@ \parfillskip \@@flushglue \parskip \z@@ \@@@@par \@@tempswafalse \def \par {\if@@tempswa \hbox {}\fi \@@tempswatrue \@@@@par \penalty \interlinepenalty }\obeylines \tt \catcode ``=13 \@@noligs \let \do \@@makeother \dospecials}} {\catcode`/=0 /catcode`/\=12 /catcode`/^^I=13 /gdef/WBM{%/8/kern/notch /begingroup /parindent/W@@globalindent/notch /advance/parindent by-1/notch /def/par{/endgraf/leavevmode}% /catcode`^^I=13 /def^^I{/leavevmode/penalty10000/ / / / / / / / }% /catcode``=13 /@@noligs /tt /let/do/@@makeother /dospecials /@@vobeyspaces/frenchspacing/obeylines /W@@M} /gdef/W@@M#1\WEM{#1/endgroup}} @*1 Constants. Various kinds of constants are handled: decimal~(|@c 10|), hexadecimal~(|@c 0xA|), octal~(|@c 012|), boolean~(|@c 0b1010|), floating-point (|@c 1.5e-35|), double-precision (|@n @e3.2d100|), long (|@c 99999L|), unsigned (|@c 99999U|), unsigned long (|@c 999999UL|), and Hollerith (|@r 3Habc|). \Forran-90 also introduces kind parameters. These are basically subscripts on constants, as in |@n9 12_34| or |@n9 1.2e34_high|. Presently, if a kind parameter is recognized, the basic number is enclosed in a group; otherwise exponents get subscripted instead of the whole number, because of the trickery with |\aftergroup|. This isn't quite ideal, because the subscript doesn't get tucked far enough to the left. This needs more work with the definition for \.{\\\^}. @A \def\WDP#1{\ifx E#1\else{\tt#1}\fi}% Used in the exponent macro below. \DRC\WO[1]{% {% Make the next definitions local. \let\-\_% \let\d\$% \def\\{\let\_\-\let\$\d}% \def\?{\kern.2em}% \let\{\bgroup% Braces are inserted in \Fortran-90 by kind parameter. \let\}\egroup \def\###1{\kern0.1em{\tt \ifcase##1F\or L\or U\or UL\else?\fi}}%C~constant. \def\^##1{\cdot 10^{\aftergroup}\aftergroup\WDP\aftergroup##1}% Power of ten \def\_{_{\\\rm\aftergroup}}% Fortran-90 kind parameter. \def\%{{\rm H}\hbox{\aftergroup}\Wtypewriter{\aftergroup}}% Hollerith constant \def\&{0{\tt b}}% Binary constant. \def\~{\hbox{\rm\char'23\kern-.2em\it\aftergroup\?\aftergroup}}% Octal \def\`{\hbox{\rm\char"7D\tt\aftergroup}}% Double quotes for hex constant #1}} @ In \Fortran-90, character constants may be preceded by a kind parameter. For output, we invert the order and use the parameter as a subscript on the string. @A \def\WKINDCHAR#1\.#2{% \hbox{\Wtypewriter{#2}}_{\Wkindids \rm #1}} \DRC\Wkindids{\def\Wshort##1{##1}% \def\Wid##1{##1}% \def\WID##1{##1}} @*1 Code mode. Either begin the code section, or a preprocessor or definition command. The following command sets up~|\W@@ind|. This somewhat peculiar construction is for historical reasons. Again, the global indentation is for the body of functions. The natural hanging indentation for continued lines is one more notch; hence the |\1|. @A \def\WPr{\global\W@@ind=\W@@globalindent \1} @ Now enter code mode. Note that |\leavevmode| starts a new indented paragraph; we then move in one more notch. @A \def\WP{\parskip=0pt \parindent=\notch \rightskip=0pt plus 100pt minus 10pt \sfcode`;=3000 \pretolerance 10000 @#if 0 \hyphenpenalty 10000 \exhyphenpenalty 10000 % If one turns these on, the % discretionary breaks in strings won't work! \global\W@@ind=\W@@globalindent \1\ \unskip} @#endif \WPr \W@@firstbreaktrue % Reset to true by |\6|. \leavevmode\kern\notch} @ Here we leave code mode. The |\Wend| macros can be redefined for special effects at the end of a code or definition part. @A \def\WQ{\rightskip=0pt \sfcode`;=1500 \pretolerance 200 \hyphenpenalty 50 \exhyphenpenalty 50 } \def\Wendd{\par}% End of definition part. \def\Wendc{\par}% End of code part. @* MISCELLANEOUS OPERATORS. Most of these are also hard-coded into \FWEAVE, and emitted automatically. @A \def\WA{\note{See also}}% Cross-reference for multiply defined section names. % English! \def\Wauto[#1]{\Wtypewriter{[#1]}\ } \DRC\WB{\mathopen{\Wtypewriter{@@/\ast}}}% Begin controlled comment. \let\WG\ge % Greater than or equal sign: '$\WG$'. \DRC\WI{\neq}% Unequal sign: '$\WI$'. (Better reserve |\ne| for the % electron density~$n_e$.) \DRC\WJ{\Wtypewriter{@@\&}}% TANGLE's join operation: '\WJ'. \let\WK\gets % Left arrow: '$\WK$'. % The next one is used for statement labels in \Fortran\ and \Ratfor. \let\Wlbl\llap % The above puts the label on the same line as the things it's labeling. % Some other choices, courtesy of Bart Childs, are % \def\Wlbl{\hskip-\notch} % jut into the left white space % \def\Wlbl{} % Maintains indentation. % To put the statement label on the previous line, use the `|-n:|' option. \let\WL\le % Less than or equal sign: '$\WL$'. \let\WLA\langle % Opening of template: '$\WLA$'. \let\WRA\rangle % Closing of template: '$\WRA$'. \DRC\WTLD{\Wtypewriter{@@\~}} \def\Wskip{\vfil\penalty-100\vfilneg \vskip12ptminus3pt}% See |\WM|, etc. \def\Wskipped#1{\8\mathhexbox278.\quad\Wtypewriter{@@I "#1"}\ \ {\it Section(s) skipped}\dots\WP} \let\WPtr\Rightarrow % Fortran's stupid pointer assignment statement: % '$\WPtr$'. \let\WR=\lnot % Logical not: '$\WR$'. \let\WS=\equiv % Equivalence sign: '$\WS$'. \let\WSQ=\equiv % This symbol is used when defining a section name. \DRC\WSl{\ifmmode\mathbin{/}\else/\fi}% Division \DRC\WT{\mathclose{\Wtypewriter{@@\ast/}}}% Terminate controlled comment. \def\WU{\note{This code is used in}}% Cross-reference for uses of sections. % English! \let\WV\lor % Logical or: '$\WV$'. \let\WW=\land % Logical and: '$\WW$'. @*1 Formatting a section name. Here's how to format a section name. Argument~1 is the name, argument~2 is the section number, and argument~3 is the language symbol. @A \ifLaTeXisloaded \else \let\footnotesize\eightrm \fi \def\WX#1#2\X#3\X{\ifmmode\gdef\XX{\null$\null}\else\gdef\XX{}\fi \XX$\langle\,$#2{\footnotesize\kern.5em#1}% $\,\rangle^{\mathrm{#3}}$\XX} @ @A \def\WY{\par \yskip \parskip=0pt} @ The following were for Pascal. @= \def\){\hbox{\Wtypewriter{@@\$}}}% sign for string pool check sum \def\]{\hbox{\Wtypewriter{@@\\}}}% sign for forced line break @*1 Questions and colons. For C's construction `|@c x ? 1 : 0|'. @A \DRC\?{\mathrel?} @ Colons have several uses. @A \DRC\Colon{\ifmmode\colon\else\textcolon\fi} \DRC\WCC{\mathord{::}}% For C: '$x\WCC y$'. \DRC\WCF{{}\mathbin{::}{}}% For \Fortran: '$x\WCF y$'. @*1 Verbatim strings. Verbatim strings are boxed for emphasis, like this: \Wequals{This is a verbatim string.} @A \DRC\=[1]{\kern2pt\hbox{\vrule\vtop{\vbox{\hrule \hbox{\strut\kern2pt\Wtypewriter{#1}\kern2pt}} \hrule}\vrule}\kern2pt} \let\Wequals\= @ @A \let\~=\ignorespaces \let\*=* @*1 Accreting to modules. The following symbol is used to denote accretions to already-existing modules. @A \def\WPQ{\mathrel{+\mathord\equiv}}% '$\WPQ$'. @*1 Exponentiation. The exponentiation macros strip away outer parentheses from the argument, turning ``|x^(a+b)|'' into ``|@n x^(a+b)|''. @A \def\W@@LP{(}% Must be |\def|, not |\let|. \def\W@@ISL#1#2]{\def\next{#1}} \DRC\WEE[1]{\W@@ISL#1]\ifx\next\W@@LP\WEXP[#1]\else\WEXP[(#1)]\fi} \def\WEXP[(#1)]{^{#1}} @#if 0 \def\WEE{\mathord{\hbox{\tt\^}}}% Poor-man's exponentiation; above is better. @#endif @*1 \Fortran. @A \DRC\WCMN[2]{\Wtypewriter{/#2/}} \let\WSlSl\parallel% Concatenation: '$\WSlSl$'. \DRC\WEQV{\mathrel{?{=}}}% `$x\WEQV y$'. \DRC\WNEQV{\not\equiv}% `$x\WNEQV y$'. @ For \Fortran--90's `|@n9 (/a,b,c/)|'. @A \DRC\WLS{\mathopen{({/}\,}} \DRC\WSR{\mathclose{\,{/})}} @ The standard \Fortran\ \.{.FALSE.} and \.{.TRUE.} operators. @A \DRC\WFALSE{{\cal F}}% '$\WFALSE$'. \DRC\WTRUE{{\cal T}}% '$\WTRUE$'. @ Block/loop numbers in \Fortran. {\it Note: One can't replace the |\bgroup| and |\egroup| by braces because of peculiarities of~|\Wc|. Also, if one puts an explicit comment on a line that will be labelled by |\Wblock|, with the following definition one will get two comments side by side. However, this could be modified by setting a counter to the block number and making a fancier definition of~|\WC| and~|\Wc|.} @A \def\Wblock#1{\Wc\bgroup\ Block #1\egroup}% `\Wblock{99}' @*1 Macro tokens. @A \def\WNN{\hbox{\#\#}}% '\WNN'. \def\WNP{\hbox{\#!}}% '\WNP'. \def\WNC{\hbox{\#:}}% '\WNC'. \def\WND{\hbox{\#.}}% '\WND'. \def\WNq{\hbox{\#\tt'}}% '\WNq'. \def\WNQ{\hbox{\#\tt"}}% '\WNQ'. @*1 C operators. @A \mathchardef\TLD="0218 % '$\TLD$'. \DRC\WPP{\mathord{++}}% '$\WPP$'. \DRC\WMM{\mathord{--}}% '$\WMM$'. \DRC\WMG{\mathord{\to}}% '$\WMG$'. \DRC\Wcp{\mathrel{+{=}}} \let\PE\Wcp % `$x\PE y$'. \DRC\Wcm{\mathrel{-{=}}} \let\ME\Wcm % `$x\ME y$'. \DRC\Wcs{\mathrel{\ast{=}}} \let\TE\Wcs % `$x\Wcs y$'. \DRC\Wcv{\mathrel{/{=}}} \let\FE\Wcv % `$x\FE y$'. \DRC\Wcd{\mathrel{\%{=}}} \let\CE\Wcd % `$x\Wcd y$'. \DRC\Wcx{\mathrel{\^\!{=}}}% `$x\Wcx y$'. \DRC\Wca{\mathrel{\amp{=}}}% `$x\Wca y$'. \DRC\Wco{\mathrel{\WOR{=}}}% `$x\Wco y$'. \DRC\Wcg{\mathrel{\WGG\!{=}}}% `$x\Wcg y$'. \DRC\Wcl{\mathrel{\WLL\!{=}}}% `$x\Wcl y$'. @ More C operators. @A \DRC\WMOD{\mathrel{\%}}% `$x\WMOD y$'. \DRC\WOR{{\,|\,}}% `$x\WOR y$'. \DRC\WAND{{\,\amp\,}}% `$x\WAND y$. \DRC\WGG{\mathrel{>\!>}}% `$x\WGG y$'. \DRC\WLL{\mathrel{<\!<}}% `$x\WLL y$'. \DRC\WHE{\mathrel{\uparrow=}}% `$x\WHE y$'. \DRC\Woperator[1]{\Wreserved{operator}~\hbox{$#1$}\ignorespaces} \DRC\Woperatoro{\Wreserved{operator}~\ignorespaces} @*1 Braces. We allow braces to be easily displayed outside of math mode. @A \let\openbraces=\{ \let\closebraces=\} \def\{{\ifmmode\openbraces\else$\openbraces$\fi} \def\}{\ifmmode\closebraces\else$\closebraces$\fi} @*1 Metacomments. @A % Print the meta-comment symbols. %\def\WBM{\6\8\Wreserved{@@(}} %\def\WEM{\6\8\Wreserved{@@)}} % Don't print the meta-comment symbols. %\def\WBM{} %\def\WEM{} @* OVERLOADING OPERATORS. Operator overloading is annoying because several languages may be in use simultaneously. Therefore, when we define an overloaded macro name, we append to it the language symbol, creating macros such as |\op_C|. These macros are typically defined automatically at the beginning of the output file from information contained in \.{@@v}~commands. @A \newif\ifop \newbox\dotbox \def\Wunknown#1{\={??#1??}}% For unknown dot constant. {\catcode`\_=11 \gdef\newop#1#2#3{% \edef\next{\def\expandafter\noexpand\csname _#1_#2\endcsname}% \next{#3}} \gdef\newbinop#1#2#3{% \edef\next{\def\expandafter\noexpand\csname _#1_#2\endcsname}% \next{\mathrel{#3}}} \gdef\newunop#1#2#3{% \edef\next{\def\expandafter\noexpand\csname _#1_#2\endcsname}% \next{\mathbin{#3}}} \gdef\Wop#1#2{\setbox\dotbox\hbox{\tt .#1.}% \edef\nxt{\expandafter\noexpand\csname _#1_#2\endcsname}% \edef\ifnxt{\noexpand\ifx\expandafter\noexpand\csname _#1_#2\endcsname}% \ifnxt\empty \def\next{\box\dotbox}% Macro not defined; just use \.{.NAME.}. \else \def\next{\futurelet\nextchar\W@@q}% Be careful about |\WEE|. \fi \next}% } \global\let\Wb\Wop \global\let\Wu\Wop \let\Lbrace{ \def\W@@q{\ifx\nextchar\Lbrace \let\next\nxt % There's an argument coming up. \else \ifop \def\next{\nxt{}\equiv\box\dotbox}% \else \let\next\nxt \fi \fi \opfalse \next} @ The following macro translates overloaded identifiers into their \TeX\ equivalents. @A \DRC\WTeX[1]{\ [{\ifmmode\def\XX{}\else\def\XX{\null$\null}\fi \XX#1\XX}]\ } @* ACTIVE ARRAY INDICES. The following is for special handling of array indices, when the |-W[| option is used. @A \newtoks\W@@ARRAYarga \newtoks\W@@ARRAYargb \DRC\WXA[1]{\begingroup % We don't want the identifiers to be in hboxes, because we want to get % |\scriptstyle| for subscripts. (One should always be in math mode here.) \def\Wshort##1{##1}% \def\Wid##1{\mathit{##1\/\kern.05em}}% \global\W@@ARRAYarga{#1}% \futurelet\W@@next\WARRAYm} \def\WARRAYm{\ifx\W@@next\WXA \global\let\W@@next\WARRAYn% Multiple indices in C: a[i][j][k] \else \global\let\W@@next\relax \WARRAY{\the\W@@ARRAYarga}% Typeset the accumulated indices. \fi \endgroup \W@@next} \def\WARRAYn#1#2{\W@@ARRAYargb{#2}% \edef\W@@next{\noexpand\WXA{\the\W@@ARRAYarga,\the\W@@ARRAYargb}}%Concatenate \W@@next} % Change the following definition---e.g., |\let\WARRAY\WSUB|---to get % indices printed in interesting ways. \DRC\WARRAY[1]{[#1]}% Default definition. \DRC\WSUB[1]{_{\scriptstyle#1}}% E.g., subscript indices. @* MISCELLANEOUS MACROS. @*1 Handle the \.{@@o}~command. @A \def\Wouto#1#2{\Wreserved{@@#1}\W@@Hspace\Wtypewriter{#2}} \def\Wout#1{\Wouto{o}{#1}} \def\WOut#1{\Wouto{O}{#1}} @*1 RCS-like keyword. @A \def\WRCS#1#2{\langle\!\langle\,\Wtypewriter{#2}\,\rangle\!\rangle \ifnum#1=0 _{0}\fi} @*1 Symbolic labels. Assign a symbolic name to a module. This scheme has no forward referencing at present for plain \TeX, although this could easily be extended. For \LaTeX, forward referencing works because the \.{aux}~file is used. @A % Label a section with an identifying name. \def\modlabel#1{% \ifLaTeXisloaded \label{MOD#1}% \else \edef\next{\gdef\expandafter\noexpand\csname MOD#1\endcsname{\modno}}% \next \fi} % Print the number of a labelled section. \def\Wmodule#1{\ifLaTeXisloaded \ref{MOD#1}% \else \csname MOD#1\endcsname \fi} % Examples of references to sections. \def\WEBsection#1{section~\Wmodule{#1}}% |\section| is used by \LaTeX. \def\WEBmodule#1{module~\Wmodule{#1}} \let\module\WEBmodule% For backward compatibility. @*1 Language commands. Language commands are printed in the left margin, following Knuth's solution in Appendix~A of the \TeX book. They are actually printed one line down, because the language command is gobbled up before the line break is emitted. @A \def\strutdepth{\dp\strutbox} \def\W@@marginal#1{\strut\vadjust{\kern-\strutdepth\W@@specialmargin{#1}}} \def\W@@specialmargin#1{\vtop to\strutdepth{ \baselineskip\strutdepth \vss\llap{#1 }\null}} \def\LANGUAGE#1{\W@@marginal{\smash{\vtop{\hbox{% \hbox{\tt @@L\lowercase{#1}\textcolon\enspace}}\null}}}\ignorespaces} % Use the next one if you don't want language changes to be printed. @#if 0 \def\LANGUAGE#1{\relax\ignorespaces} @#endif @* PAGE FORMAT. Now we deal with the overall page format. @*1 Listing the changed modules. If you want to list only the modules that have changed, together with the index, put the command `|\let\maybe=\iffalse|' in the limbo section before the first module of the \.{WEB} file. It's customary to make this the first change in the change file. @A \newif\ifon \def\onmaybe{\let\ifon=\maybe} \let\maybe=\iftrue @ Some flags, and the number of the table of contents. @A \newif\iftitle \newif\ifpagesaved \newcount\contentspageno @*1 Headers. The scheme for using |\mark| is that for Knuth's \textsl{The Art of Computer Programming}, as described in \textsl{The \TeX book}, just before Exercise 23.5. It requires emitting |\mark| commands just before and just after the section breaks. @A \def\Wmodhd#1{ [#1]} \newif\ifW@@headers \W@@headerstrue% Stand-alone setting (might be changed in fwebinsert.sty). \def\W@@seczero{0} \def\WsetLmarks{ \def\Wsecrange##1##2{% \def\W@@tempa{##1}\def\W@@tempb{##2}% \ifx\W@@tempa\W@@tempb% Equal sec.\ nums; just print one. \W@@S\Wmodtrans{##1}\Wmodhd{\###1}% \else\ifx\W@@tempb\W@@seczero \W@@S\Wmodtrans{##1}\Wmodhd{\###1}% \else \W@@S\Wmodtrans{##1}--\W@@S\Wmodtrans{##2}% \Wmodhd{\###1--\###2}% \fi\fi} \gdef\@@leftmark##1##2##3##4{% \let\protect\relax \let\\\ % \qquad\mainfont##2 \hfill \Wtitle\qquad \ifnum##1>0% \mainfont\Wsecrange{##1}{##3}% \fi } \gdef\@@rightmark##1##2##3##4{% \let\protect\relax \let\\\ % \ifnum##1>0 \mainfont\Wsecrange{##1}{##3}\qquad% \fi \mainfont\Wtitle \hfill \mainfont##4\qquad } \gdef\leftmark{% \ifnoLaTeXe \else \let\protect\@@unexpandable@@protect \fi \edef\W@@tempb{\expandafter\iftrue\botmark\fi}% \edef\W@@tempa{\expandafter\iffalse\topmark\fi}% \expandafter\expandafter\expandafter\@@leftmark\expandafter\W@@tempa\W@@tempb{}{}} \gdef\rightmark{% \ifnoLaTeXe \else \let\protect\@@unexpandable@@protect \fi \edef\W@@tempb{\expandafter\iftrue\botmark\fi}% \edef\W@@tempa{\expandafter\iffalse\topmark\fi}% \expandafter\expandafter\expandafter\@@rightmark\expandafter\W@@tempa\W@@tempb{}{}} \gdef\W@@markN{\gdef\W@@mark####1####2{{\def\WIN{\WIM}% \mark{####1\noexpand\else####2}}}} \ifx\selectfont\undefined \W@@markN \else \gdef\W@@mark##1##2{{%\def\WIN{\WIM}% \let\protect\@@unexpandable@@protect \mark{##1\noexpand\else##2}}} \fi } \ifLaTeXisloaded \else \def\lheader{\mainfont\the\pageno\eightrm\qquad\Whead\hfill\Wtitle\qquad \ifnum\pageno=\contentspageno\else \W@@S\mainfont\Wmodno \fi} \def\rheader{\ifnum\pageno=\contentspageno\else \W@@S\mainfont\Wmodno \fi \eightrm\qquad\Wtitle\hfill\Whead \qquad\mainfont\the\pageno} \fi @*1 Page dimensions. Here are the page dimensions (in inches). @A \def\pagewidtho{6.5}% The width of each page \def\pageheighto{8.7}% The height of each page \def\fullpageheighto{9}% Page height including headlines \newdimen\pagewidth \pagewidth\pagewidtho in \newdimen\pageheight \pageheight\pageheighto in \newdimen\fullpageheight \fullpageheight\fullpageheighto in \newdimen\pageshift \pageshift=0in% Shift righthand pages wrt lefthand ones % Use after changing page size. \def\setpage{\hsize\pagewidth \vsize\pageheight \ifLaTeXisloaded \oddsidemargin=0pt \evensidemargin=0pt \topmargin=0pt % Mods due to Bart Childs: \setlength{\linewidth}{\pagewidth} \setlength{\textwidth}{\pagewidth} \setlength{\textheight}{\pageheight} \fi } \ifLaTeXisloaded \else \def\magnify#1{\mag=#1 \pagewidth\pagewidtho truein \pageheight\pageheighto truein \fullpageheight\fullpageheighto truein \setpage} \fi @*1 Plain \TeX\ output routine. Here is the output routine for plain \TeX. (For \LaTeX, we use its own routine.) @A \def\page{\box255 } \newif\ifidenticalpageheads \def\normaloutput#1#2#3{ \ifodd\pageno\hoffset=\pageshift\fi \shipout\vbox { \vbox to\fullpageheight { \iftitle\global\titlefalse \else \hbox to\pagewidth {\vbox to10pt{}% \ifidenticalpageheads#2\else \ifodd\pageno #3% Pg nos alternate left \& right. \else#2\fi \fi }% \fi \vfill#1% Parameter |#1| is the page itself. } } \global\advance\pageno by1} \def\W@@name{{FWEB} OUTPUT}% This section name is reset by starred sections. @ Here we provide a storage place for |\output|. If one includes a macro package, such as \.{manmac}, that overrides the definition of |\output| {\it after} \.{fwebmac.sty}, one can get back the \.{fwebmac.sty} definition by saying |\input manmac| |\output\Woutput| @A \newtoks\Woutput \Woutput\output% Remember \FWEB's definition. @*1 Time and date. It's very useful to know exactly when one made the run. @A \newcount\minutes \newcount\hours \hours=\time \divide\hours by 60 \multiply\hours by 60 \minutes=\time \advance\minutes by -\hours \divide\hours by 60 \def\Time{\the\hours\textcolon\ifnum\minutes<10 0\fi\the\minutes} \def\Date{\ifcase\month\or January\or February\or March\or April\or May\or June\or July\or August\or September\or October\or November\or December\fi \space\number\day, \number\year} @*1 Optional title for the code. An optional title can be defined by the user in his limbo section. The syntax is `|\Title[short]{long}|', where the optional short argument is for the running heads in the document and is by default prefaced with |\large\tt|; the required long argument is for the title page and is by defualt prefaced with |\ttitlefont|. @A \def\Wtitle{}% Short title for running heads. Can redefine after |\Title|.j \def\Title{\@@ifnextchar[\W@@@@Title\W@@Title} \def\W@@Title#1{\W@@@@Title[#1]{#1}} \def\W@@@@Title[#1]#2{\gdef\Wtitle{{\large\tt#1}}\title{{\ttitlefont#2}}} @* TABLE OF CONTENTS. An entry is made in the table of contents for each starred section. @*1 |\topofcontents| and |\botofcontents|. One can customize things with |\topofcontents| and |botofcontents|. For more information, see the on-line documentation, menu item ``Table of contents''. @A \ifLaTeXisloaded \def\topofcontents{}% We use \LaTeX's defaults. \else \def\topofcontents{\centerline{\titlefont\Wtitle} \vfill} % This is the default. \fi @ End the table of contents page: @A @#if 0 \def\botofcontents{\vfill}% This makes the bottom of the contents page empty. @#endif \ifLaTeXisloaded \def\botofcontents{} \else \def\botofcontents{\vfill @#if 0 \rightline{My Name}% You can personalize your output here, for example. @#endif \rightline{\Date} \rightline{\Time}} \fi \ifLaTeXisloaded \contentspageno=1 \pageno=\contentspageno \else \contentspageno=0% Default page number for table of contents \fi @*1 Opening the contents file; the |\Wbegin| macro. \modlabel{Wbegin} Here we actually open up the contents file, which is the argument to |\Wbegin|. The |\Wbegin| macro is issued automatically just before the stuff for the first module. Also, \LaTeX\ does its own thing with the |\end| command, so we redefine it. To finish up the document, we write to the \.{aux} file ``|\W@@maxdepth{|$n$|}|'', where $n$~is the maximum section depth that was achieved. Whereas \LaTeX\ writes a |\newlabel| line to the table of contents in response to a |\label| command, we write a |\Newlabel| command for every section. That macro is patterned after |\newlabel|, but has an extra argument that is |\W@@botmodno|. The |\Newlabel| information is read both by the \FWEB\ processors (to correlate \LaTeX\ section numbers with integer module numbers) and by |\FWEBend| to check whether labels have changed. @A \newwrite\W@@cont % For the table of contents. \ifLaTeXisloaded \def\Wfirst#1#2#3#4#5{#1} \def\W@@output{\setcounter{pagemodule}{0}% \xdef\W@@botmodno{\expandafter\Wfirst\botmark}} \def\W@@botmodno{0} % #1---\Fweb\ module number % #2---{\LaTeX\ section number}{page number} % #3---module number of last section on page. \def\Newlabel#1#2#3{% \ifFWEBstandalone \@@ifundefined{r@@#1}{}% {\@@warning {Label `#1' multiply defined}} \fi \global\@@namedef{r@@#1}{#2{#3}}% |\@@namedef| is from \LaTeX. \global\W@@lpha=#3 \ifnum\W@@lpha=\W@@ref\global\advance\W@@pmcount by1 \else \ifnum\W@@pmcount=1 \edef\next{\gdef\csname W@@\the\W@@ref\endcsname{}}\next \fi \W@@ref=\W@@lpha \W@@pmcount=1 \fi} \fi @ The arguments to |\Wbegin| are various style-file parameters, as follows: $$\vbox{\halign{{\tt \##}\hfil& --- \vtop{\hsize0.75\hsize \noindent \strut\tt #\strut}\hfil\cr 1&LaTeX.class.options;LaTeX.package.options\cr 2&LaTeX.class;LaTeX.package\cr 3&indent.TeX\cr 4&indent.code\cr 5&contents.TeX\cr 6&\{format.reserved format.RESERVED\} \{format.short\_id\} \{format.id format.ID\} \{format.outer\_macro format.OUTER\_MACRO\} \{format.WEB\_macro format.WEB\_MACRO\} \{format.intrinsic\} \{format.keyword format.KEYWORD\} \{format.typewriter\}\cr 7&encap.prefix\cr 8&\{doc.preamble;doc.postamble\}\cr 9&index.name\cr }}$$ @A \newcount\W@@ref \W@@ref=-1 \newcount\W@@lpha \newcount\W@@pmcount \W@@pmcount=1 \outer\def\Wbegin[#1]#2#3#4#5#6#7#8#9{\edef\contentsfile{#5}% \def\readcontents{\input\contentsfile}% \Wequate#6 \W@@modequate{#7}% \edef\INDEX{#9}% \def\W@@splitprms##1##2[##3;##4]{\def##1{##3}\def##2{##4}}% \W@@splitprms\W@@preamble\W@@postamble[#8]% \ifLaTeXisloaded \ifFWEBstandalone \def\FWEBend{% \LaTeX\ redefines |\end|. \W@@outlsmax{1}% The `1' is because sec. # % isn't incremented for the module list. \global\advance\W@@ssmax by1 \immediate\write\@@auxout{\string\W@@maxdepth{\the\W@@ssmax}}% \W@@postamble \W@@makeatend% Override |\makeatletter| \end{document}% }% \def\W@@ssmin{0} \else% Insert mode; not stand-alone. \def\FWEBend{} % |\W@@ssmin| isn't defined; it's set by |\fweblevel|. \fi \W@@splitprms\W@@prma\W@@prmb[#1]% \W@@splitprms\W@@prmc\W@@prmd[#2]% \ifusedocumentstyle \edef\W@@temp{\noexpand\documentstyle[\W@@prma]{\W@@prmc}}% \W@@temp \else \ifFWEBstandalone \documentclass[\W@@prma]{\W@@prmc}% \usepackage[\W@@prmb]{\W@@prmd}% \fi \fi % Set up defaults. \ifFWEBstandalone \textwidth\pagewidth \textheight\pageheight \fi \TeXindent#3 \title{}% \author{}% \date{\today\\[3pt]\Time}% \pagestyle{myheadings}% % |\Wbegin| might be called more than once if one is using package % \.{fwebinsert}. \ifx\c@@pagemodule\undefined \newcounter{pagemodule}% \newcounter{W@@tempcounter}% \fi \gdef\cl@@section{\@@elt{subsection}\cl@@subsection} \gdef\cl@@subsection{\@@elt{subsubsection}\cl@@subsubsection} \gdef\cl@@subsubsection{\@@elt{subsubsubsection}} \xdef\normaloutput##1##2##3{\the\output \noexpand\W@@output}% \ifW@@headers \WsetLmarks \else \def\W@@markN{}% \def\W@@mark##1##2{}% \fi \W@@preamble \W@@raggedbottom \ifFWEBstandalone \begin{document} \else \begingroup \makeatletter \@@input{\jobname.aux} %|\jobname| is redefined in \.{fwebinsert.sty}. \endgroup \fi \W@@setsecdepth \else % Plain \TeX. \immediate\openout\W@@cont=\contentsfile \def\FWEBend{\W@@postamble\end} \TeXindent#3 \W@@preamble \fi \W@@setboxes{#4}% Set dimensions of backspace boxes. % Here we print out a garbage page, so that the first |\topmark| won't be null. \ifFWEBstandalone \output {\setbox0=\page% The first page is garbage \global\output{\normaloutput\page\lheader\rheader}% }% \setpage \vbox to \vsize{} \fi } @ We need to insert an extra test for changed labels that depends on the |\Newlabel| information in the \.{.aux} file. Now the \.{.aux} file is read by the \.{\\end\{document\}} command; the reading is immediately preceded by ``|\makeatletter|''. To insert the new test, we augment that command to include the appropriate redefinition of |\Newlabel|. We must also provide a cousin |\W@@testdef| to |\@@testdef| that recognizes the extended name definitions (including |\W@@botmodno|) that we use for the \FWEB\ section. @A \def\W@@makeatend{\let\W@@makeatletter\makeatletter \def\makeatletter{\def\Newlabel{\W@@testdef r}% \W@@makeatletter}} \def\W@@testdef#1#2#3#4{\def\reserved@@a{#3{#4}}% \expandafter\ifx\csname#1@@#2\endcsname \reserved@@a \else \@@tempswatrue \fi } @ @A \def\Wch{\note{The following sections were changed by the change file:} \let\*=\relax}% English! @* MACROS for the INDEX. The index is written by default into \.{INDEX.tex}, but that name can be overridden with the style-file parameter \.{index.tex}. @*1 Beginning the index. Here we begin the index. In \LaTeX, if \.{multicol.sty} is not loaded, by this time we should be in |\twocolumn| mode (from the |\beforeindex| command). If it is loaded, we begin multi-columns. It's ended with the |\Wfin| command. @A % The following two lines are for \TeX\ only. \newbox\Sbox % Saved box preceding the index \newbox\Lbox % Lefthand column in the index \ifLaTeXisloaded \def\startindex{\ifx\multicols\undefined \medskip \else \begin{multicols}{2}% \fi } \else \def\startindex{\par\vskip6pt plus 1fil} \fi @ The name of the |\Winx| macro is really the style-file parameter \.{index.preamble}. @A \def\Winx{\startindex \ifLaTeXisloaded \else \write\W@@cont{ }% Ensure that the contents file isn't empty \closeout\W@@cont % The contents information has been fully gathered \output{\ifpagesaved\normaloutput{\box\Sbox}\lheader\rheader\fi \global\setbox\Sbox=\page \global\pagesavedtrue} \pagesavedfalse \eject % Eject the page-so-far and predecessors \setbox\Sbox\vbox{\unvbox\Sbox}% Take it out of its box \vsize=\pageheight \advance\vsize by -\ht\Sbox % The remaining height \hsize=.5\pagewidth \advance\hsize by -10pt % Column width for the index (20pt between cols) \parfillskip 0pt plus .6\hsize % Try to avoid almost empty lines \def\lr{L}% This tells whether the left or right column is next \output{\if L\lr\global\setbox\Lbox=\page \gdef\lr{R} \else\normaloutput{\vbox to\pageheight{\box\Sbox\vss \hbox to\pagewidth{\box\Lbox\hfil\page}}}\lheader\rheader \global\vsize\pageheight\gdef\lr{L}\global\pagesavedfalse\fi} % \message{Index:} \fi \outer\def\:##1, {\par\hangindent2em\noindent##1\textcolon\kern1em}% Index entry \def\[##1]{$\underline{##1}$}% Underlined index item \def\(##1){$^{\rm ##1}$}% Language marker \let\Windexspace\medskip % Spacing between letter groups in index. \rm {\ifFWEBstandalone\let\glbl\global\else\let\glbl\empty\fi \glbl\parskip 0pt plus .5pt \glbl\rightskip0pt plus 2.5em \glbl\tolerance 10000 \glbl\let\*=\W@@lapstar \glbl\hyphenpenalty 10000 \glbl\parindent0pt } } @*1 Ending the index. The name of the |\Wfin| macro is the style-file parameter \.{index.postamble}. @A \ifLaTeXisloaded \def\Wfin{\ifx\multicols\undefined\else\end{multicols}\fi} \else \let\Wfin\relax \fi @ If we haven't loaded the \.{multicol} package, then the conventional \LaTeX\ commands |\twocolumn| has been used before the index starts. If the module list is omitted via \.{-xi}, then things will be left in two-column mode. This is an issue if we're inserting into another document. Thus, we need a command to bring it back to one column. (But we want to avoid |\onecolumn| if possible, because that starts a new page.) @A \def\W@@onecolumn{% \ifx\multicols\undefined \onecolumn% In case of insertions & no module list. \fi } @*1 Using |makeindex|. The |\pg| macro (more generally, the name given by the style-file entry \.{makeindex.page}) is used in the |.idx| file written in response to the `|-XI|' option. The first argument is either empty or an integer file id filled in by \.{idxmerge}; the second is a possible macro that should act on the third argument, which is the page number itself. This example uses the macro the macro |\pgfmt| to turn the integer id into an uppercase Roman numeral. For more information about the use of |\pg|, see the info documentation, menu item \.{Using makeindex}. @A \def\pgfmt#1{\uppercase\expandafter{\romannumeral#1}} \def\pg#1#2#3{\def\temp{#1}% \ifx\temp\empty% For the case where \.{idxmerge} hasn't been run. \else \pgfmt{#1}.% \fi #2{#3}% } @ The macros |\topofindex| and |\botofindex| are used in the preamble and postamble of the \.{.ind} file constructed by \.{makeindex}. A sample that reads in the list of names written out by \.{idxmerge} can be found in \.{/fweb/manual/idx.tex}. @A \def\topofindex{} \def\botofindex{} @* MACROS for the MODULE LIST. @*1 Beginning the module list. This is the style file entry \.{modules.preamble}. @A \def\Wmods{% \def\W@@name{Names of the Modules}% \ifLaTeXisloaded \W@@outlsmax{1}% The `1' is because sec. # hasn't been incremented % for the module list. \edef\next{\noexpand\W@@mark{{0}{\INDEX}} {{0}{\W@@name}}}\next \onecolumn% This also starts a new page. \edef\next{\noexpand\W@@mark{{0}{\W@@name}}{{0}{\W@@name}}}\next \parfillskip 0pt plus 1fil \else \par\vfill\eject \ifpagesaved\null\vfill\eject\fi % Output a null index column \if L\lr\else\null\vfill\eject\fi % Finish the current page \parfillskip 0pt plus 1fil \edef\rhead{\W@@name}% \output{\normaloutput\page\lheader\rheader} \setpage \fi \def\note##1##2.{\quad{\footnotesize##1 ##2.}} \def\WU{\note{Used in}}% Cross-reference for uses of sections. English! \def\:{\par\hangindent 2em}\let\*=*% } @* TERMINATION. @*1 Miscellaneous run info. The |\Winfo| command is issued after the List of Modules is processed via |\Wmods|. @A \def\Winfo#1#2#3#4{% \bigskip \:{{\bf COMMAND LINE\textcolon}\ \ \Wtypewriter{#1}.}\smallskip \:{{\bf WEB FILE\textcolon}\ \ \Wtypewriter{#2}.}\smallskip \:{{\bf CHANGE FILE\textcolon}\ \ \Wtypewriter{#3}.}\smallskip \:{{\bf GLOBAL LANGUAGE\textcolon}\ \ {\rm #4}.}\bigskip } \def\Wkwds{\:{\leavevmode{\bf Global RCS-like keywords\textcolon}}\medskip} \def\Wkwd#1#2{\:{\leavevmode\quad{\bf \dollar#1\textcolon}\ \ \Wtypewriter{"#2"}}} @*1 Finish the section names, do the table of contents, and terminate. @A \ifLaTeXisloaded \def\W@@settoc#1{}% \def\Wtoc#1{\begingroup \W@@settoc{#1}% \def\Newlabel##1##2##3{}% \setcounter{tocdepth}{\W@@depth}% \thispagestyle{empty}% \def\W@@name{Table of Contents}% English! \edef\next{\noexpand\W@@mark{{0}{\W@@name}}{{0}{\W@@name}}}% \next% \pagenumbering{roman}% \maketitle \topofcontents \tableofcontents \botofcontents % Force a |\mark| command just before the page break after TOC, using an % empty new section name (we don't know that yet!). If we don't do this, % the first page after TOC picks up ``Table of Contents'' as a header. \edef\next{\noexpand\W@@mark{{1}{\W@@name}}{{1}{}}}\next \gdef\W@@name{}% \newpage% Break after TOC. \endgroup \pagenumbering{arabic}% \pageno=1 } \def\Wcon#1{\newpage \let\WIM\WIN % Restore the proper definition. \pageno=\contentspageno \Wtoc{#1}% } % Put the |\FWEBtoc| command into \.{limbo.end} to have the Table of % Contents appear at the beginning. (This is the default.) \def\FWEBtoc{% \ifFWEBstandalone \Wtoc{}% No toc for insertions. \fi \gdef\Wcon##1{% Redefinition! \W@@onecolumn }% } \else \def\Wcon#1{\par\vfill\eject \rightskip 0pt \hyphenpenalty 50 \tolerance 200 \setpage \output{\normaloutput\page\lheader\rheader} \titletrue % Prepare to output the table of contents \pageno=\contentspageno \def\rhead{Table of Contents}% English! \topofcontents \catcode`\@@=11 \hbox to\hsize{\hfil Section\hbox to3em{\hss Page}} \def\WZ##1##2##3##4{\hbox to\hsize{\kern##1em\ignorespaces##2 \leaders\hbox to .5em{.\hfil}\hfil\ ##3\hbox to3em{\hss##4}}} \let\WIM\WIN % Restore the proper definition. \readcontents\relax % Read the contents info. \botofcontents } \def\FWEBtoc{\message{! Front Table of Contents is only supported with LaTeX.}} \fi @ The |\begintt| and |\endtt| verbatim constructions, borrowed from \TeX. @A \newskip\ttglue \ttglue=0.5em plus 0.25em minus 0.15em \def\ttother{\catcode`\\=\other \catcode`\{=\other \catcode`\}=\other \catcode`\$=\other \catcode`\&=\other \catcode`\#=\other \catcode`\%=\other \catcode`\~=\other \catcode`\_=\other \catcode`\^=\other} \def\ttverbatim{\begingroup \ttother \obeyspaces \obeylines \tt} {\obeyspaces\gdef {\ }} \def\begintt{$$\let\par=\endgraf \ttverbatim \parskip=0pt \rightskip=-\parindent \ttfinish} \def\Begintt{\bgroup \let\par=\endgraf \ttverbatim \parskip=0pt \rightskip=-\parindent \ttFinish} {\catcode`\|=0 |catcode`|\=\other |obeylines% |gdef|ttfinish#1^^M#2\endtt{#1|vbox{#2}|endgroup$$}% |gdef|ttFinish#1\Endtt{#1|endgroup|egroup}} \let\verticalbar| \def\activebar{\catcode`\|=\active} {\activebar \gdef\normalbar{\activebar \let|\verticalbar}} %\activebar {\obeylines% \gdef\ttbar{\activebar% {\obeylines\gdef|{\ttverbatim% \spaceskip=\ttglue% \let^^M=\ \let|=\endgroup}}}} \let\WCX\Begintt @ @A \catcode`\@@=12 @* \INDEX. fweb-1.62/Manual/fwebnum.sty100644 10061 1115 4450 6602703127 15143 0ustar krommesusers% This file is a LaTeX2e package. One may select it by the FWEB style-file % command % % LaTeX.package = "fwebnum" % % which should be put into fweb.sty. % The package provides a slight modification of LaTeX's \@sect command to % replace the Dewey-decimal type of section numbering with integer section % numbers a la the original WEB. By default, it numbers the unnamed % sections. However, one may say % % LaTeX.package.options = "dontnumberunnamed" % % to override that. % J. A. Krommes, September 9, 1995 \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{fwebnum}[1995/09/15] \DeclareOption{numberunnamed}{\numberunnamedtrue} \DeclareOption{dontnumberunnamed}{\numberunnamedfalse} \ExecuteOptions{numberunnamed} % Set up default. \ProcessOptions \gdef\Wrefstepcounter#1{\stepcounter{section}% \protected@edef\@currentlabel{\thesection}} \gdef\@seccntformat#1{\csname the#1\endcsname.\hskip1em} \gdef\@sect#1#2#3#4#5#6[#7]#8{% \ifnum#2>\c@secnumdepth \let\@svsec\@empty \else \Wrefstepcounter{#1}% \protected@edef\@svsec{\@seccntformat{#1}}% \fi \@tempskipa#5\relax \ifdim\@tempskipa>\z@ \begingroup #6\relax \@hangfrom{\hskip#3\relax\@svsec}% {\interlinepenalty\@M #8\par}% \endgroup \csname#1mark\endcsname{#7}% \addcontentsline{toc}{#1}% {\ifnum#2>\c@secnumdepth \else \protect\numberline{\csname the#1\endcsname}% \fi #7}% \else \def\@svsechd{#6\hskip#3\relax \@svsec#8\csname#1mark\endcsname{#7}% \addcontentsline{toc}{#1}% {\ifnum#2>\c@secnumdepth \else \protect\numberline{\csname the#1\endcsname}% \fi #7}% }% \fi \@xsect{#5}% } \gdef\Wmodhd#1{} % No redundant section numbering at top of page. \gdef\thesubsection{\thesection} \gdef\thesubsubsection{\thesection} \gdef\thesubsubsubsection{\thesection} % The following overrides LaTeX's default \numberline, which doesn't skip % enough for large section numbers and overwrites the header. One could % get fancier here. \newdimen\W@tempdima \def\W@settoc#1{{\setbox0=\hbox{\bf #1.\qquad} \global\W@tempdima=\wd0 \gdef\numberline##1{\hbox to\W@tempdima{\hfil##1.\enspace}} }} % The following is needed in case the table-of-contents appears at the % front; it doesn't know the maximum section number at that point, so we % guess it's in the range 10--99. \def\FWEBtoc{\ifFWEBstandalone\Wtoc{99}\fi \gdef\Wcon##1{\FWEBend}} fweb-1.62/Manual/idxmerge.sty100644 10061 1115 1652 6602703127 15305 0ustar krommesusers% This file is a LaTeX2e package. One may select it in a LaTeX document by % the command % % \usepackage{idxmerge} % % The package provides sample definitions for use with stand-alone merged % indexes. For detailed usage instructions, see the texinfo documentation, % menu item ``Merging indexes''. % J. A. Krommes, April 15, 1996 \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{idxmerge}[1996/04/15] % The following macro appears in the TEST-names.tex file written by % idxmerge. Its first argument is the number of a web source file. Its % second argument is the name of that file. The format of \idxname may be % redefined as desired. \def\idxname#1#2{\leavevmode\llap{\textbf{\pgfmt{#1}:}} \texttt{#2}\par} % The next macro is used in the preamble of the .ind file written by % makeindex. \def\topofindex{\noindent \textbf{List of merged files:}\par\smallskip {\parskip=0pt \parindent=25pt \input{\jobname-names} }% \bigskip } fweb-1.62/Manual/index.tex100644 10061 1115 332 6602703127 14543 0ustar krommesusers% --- A skeleton for printing a stand-alone index --- % (Used in conjunction with makeindex and idxmerge.) \documentclass{article} \usepackage{fwebmac,idxmerge} \begin{document} \input{\jobname.ind} \end{document} fweb-1.62/Manual/rwebmac.sty100644 10061 1115 134132 6602703127 15161 0ustar krommesusers% FTANGLE v1.60, %% created with UNIX on "Thursday, September 10, 1998 at 22:59." %% COMMAND LINE: "/u/krommes/Fweb/Web/ftangle -# fwebmac" %% RUN TIME: "Friday, September 11, 1998 at 18:55." %% WEB FILE: "fwebmac.web" %% CHANGE FILE: (none) \ifx\FWEBisloaded\relax\endinput\else\let\FWEBisloaded\relax\fi \newif\ifFWEBstandalone \FWEBstandalonetrue \catcode`\@=11 \chardef\other=12 \long\def\comment#1\endcomment{} \def\FWEBversion{$REVISION} \def\FWEBdate{September 23, 1995} \newcount\W@count \newcount\W@counta \newtoks\W@tk \ifx\DeclareRobustCommand\undefined \def\DeclareRobustCommand#1{\@ifnextchar[% {\W@argdef#1}{\W@argdef#1[0]}} \def\W@argdef#1[#2]{\W@tk={}% \W@count=0 \loop \ifnum\W@count<#2 \advance\W@count by1 \edef\next{\W@tk={\the\W@tk########\the\W@count}}\next \repeat \edef\next{\def\noexpand#1\the\W@tk}\next} \fi \ifx\@ifnextchar\undefined \def\@ifnextchar#1#2#3{\let\@tempe#1 \def\@tempa{#2}% \def\@tempb{#3}% \futurelet\@tempc\@ifnch} \def\@ifnch{\ifx\@tempc\@sptoken \let\@tempd\@xifnch \else \ifx\@tempc\@tempe \let\@tempd\@tempa \else \let\@tempd\@tempb \fi \fi \@tempd } {\def\:{\global\let\@sptoken= } \: } \def\@xifnch{\futurelet\@tempc\@ifnch} \fi \let\DRC\DeclareRobustCommand \def\TeX{T\kern-0.1667em\lower0.5ex\hbox{E}\kern-0.125emX\W@t} \ifx\LaTeX\undefined \def\LaTeX{L\kern-0.36em\raise0.3ex\hbox{\Csc a}\kern-0.15em\TeX} \fi \newif\ifnoLaTeXe% By default, we have \LaTeXe. \ifx\LaTeXe\undefined \noLaTeXetrue \def\LaTeXe{\LaTeX 2$_\varepsilon$} \fi \newif\ifLaTeXisloaded \ifx\pageno\undefined \LaTeXisloadedtrue \fi \ifLaTeXisloaded \def\W@stop{} \else \def\W@stop{ \message{Please use LaTeX. Plain TeX is no longer supported. ABORTING!} \end } \fi \W@stop \newif\ifuseREVTeX \ifuseREVTeXtrue \newif\ifusedocumentstyle \ifnoLaTeXe \usedocumentstyletrue \fi \ifuseREVTeX \usedocumentstyletrue \fi \DRC\WEB{\Wtypewriter{WEB}} \DRC\FWEB{\Wtypewriter{FWEB}} \DRC\CWEB{\Wtypewriter{CWEB}} \DRC\TANGLE{\Wtypewriter{TANGLE}} \let\Tangle\TANGLE \DRC\WEAVE{\Wtypewriter{WEAVE}} \let\Weave\WEAVE \DRC\FTANGLE{\Wtypewriter{FTANGLE}} \DRC\FWEAVE{\Wtypewriter{FWEAVE}} \DRC\C{C\W@t} \DRC\Cpp{\C{\tt ++}} \DRC\FORTRAN{{\Csc Fortran}} \let\Fortran\FORTRAN \DRC\MAKE{{\tt MAKE}} \let\Make\MAKE \DRC\RATFOR{{\Csc Ratfor}} \let\Ratfor\RATFOR \DRC\UNIX{{\SC UNIX}} \let\Unix\UNIX \ifLaTeXisloaded \else \let\@\relax \let\\\relax \let\protect\relax \fi \let\amp\& \let\at\@ \let\bslash\\ \let\caret\^ \let\dollar\$ \let\dstar\* \let\equals\= \let\period\. \let\textcolon: \let\leftbrace\{ \let\rightbrace\} \let\vertbar| \let\PM\# \let\PC\% \let\W@t\@ \let\W@S\S \dimen0=\normalbaselineskip \parskip=\dimen0 plus 1pt minus 6pt \newskip\pardimen \pardimen=\parskip \newdimen\TeXindent \TeXindent 1em% For paragraphs in the \TeX\ part. \ifLaTeXisloaded \let\pageno\c@page% \WEB\ has its own name for the page number. \fi \ifnoLaTeXe \ifx\tenrm\undefined \font\tenrm=cmr10 \fi \ifx\itfam\undefined \chardef\itfam4 \fi \ifx\small\undefined \let\small\relax \fi \let\mainfont\tenrm \let\cmntfont\tenrm \font\eightrm=cmr8 \let\SC\eightrm \font\titlefont=cmssbx10 scaled \magstep2% Sans serif \font\ttitlefont=cmtt10 scaled\magstep2% Typewriter type \font\tentex=cmtex10 % \TeX\ \.{extended char.\ set} (used in strings) \let\extendedtex\tentex \font\Csc=cmcsc10 % Caps/small caps. \font\tenbfit=cmbxti10 % \&{Intrinsic functions} \let\bfit\tenbfit % Doesn't work right in titles. \font\seventi=cmti7 \font\sevenrm=cmr7 \font\sevenbf=cmbx7 \font\sevenit=cmti7 \scriptfont\itfam=\sevenit \scriptscriptfont\itfam=\sevenit \def\mathrm#1{{\rm #1}} \def\mathit#1{{\it #1}} \else % \LaTeXe \def\mainfont{\normalsize\usefont{OT1}{\rmdefault}{m}{n}} \let\cmntfont\mainfont \def\eightrm{\footnotesize\usefont{OT1}{\rmdefault}{m}{n}} \let\SC\eightrm \def\titlefont{\Large\usefont{OT1}{\sfdefault}{\bfdefault}{n}} \def\ttitlefont{\Large\usefont{OT1}{\ttdefault}{m}{n}} \def\extendedtex{\usefont{OT1}{\ttdefault}{m}{n}} \def\tentex{\normalsize\extendedtex} \def\Csc{\usefont{OT1}{\rmdefault}{m}{\scdefault}} \def\bfit{\usefont{OT1}{\rmdefault}{\bfdefault}{\itdefault}} \def\tenbfit{\normalsize\bfit} \def\seventi{\scriptsize\usefont{OT1}{\rmdefault}{m}{\itdefault}} \def\sevenrm{\scriptsize\usefont{OT1}{\rmdefault}{m}{n}} \def\sevenbf{\scriptsize\usefont{OT1}{\rmdefault}{\bfdefault}{n}} \def\fiveti{\tiny\usefont{OT1}{\rmdefault}{m}{\itdefault}} \def\fiverm{\tiny\usefont{OT1}{\rmdefault}{m}{n}} \def\fivebf{\tiny\usefont{OT1}{\rmdefault}{\bfdefault}{n}} \def\tensy{\normalsize\usefont{OT1}{cmsy}{m}{n}} \fi \DRC\Wshort[1]{\leavevmode\hbox{$#1$}}% One-letter identifiers such % as~\Wshort{x} look better this way. \DRC\Wid[1]{\leavevmode\hbox{\it#1\/\kern.05em}}% Italic type for ordinary % identifiers such as \Wid{test}. \DRC\WID[1]{\leavevmode\hbox{\small\it#1\/\kern.05em}}% For all % %\WID{UPPERCASE}. \let\WidD\Wid % Outer macro \let\WIDD\WID % Upper-case outer macro \let\WidM\Wid % FWEB macro \let\WIDM\WID % Upper-case FWEB macro \DRC\Wreserved[1]{\leavevmode\hbox{\def\\{\tt\WBS}\bf#1\/}}% Boldface type % for reserved words such as \Wreserved{int}. \DRC\WRESERVED[1]{\leavevmode\hbox{\def\\{\tt\WBS}\small\bf#1\/}}% Boldface %type % for upper-case reserved words such as \WRESERVED{INTEGER}. \DRC\Wintrinsic[1]{\leavevmode\hbox{\def\\{\tt\WBS}\bfit#1\/\kern.05em}}% % Library/intrinsic function name such as \@{sin}. \def\W@twodef#1#2#3#4{\gdef#1{#3}\gdef#2{#4}} \def\Wequate#1#2#3#4#5#6#7#8#9{% \W@twodef#1\Wreserved\WRESERVED% |\&| by default. \gdef#2{\Wshort}% |\|| by default. \W@twodef#5\WidM\WIDM% |\\| by default. \W@twodef#4\WidD\WIDD% |\\| by default. \W@twodef#3\Wid\WID% |\\| by default. \gdef#6{\Wintrinsic}% |\@| by default. \W@twodef#7\Wkeyword\WKEYWORD% |\.| by default. \gdef#8{\Wtypewriter}% |\.| by default. % \#9 is for future use. } \def\W@zero{0}% For the comparison in |\WIN| below. \DRC\WIN[2]{\ifmmode\def\ZZ{}\else\def\ZZ{\null$\null}\fi \ZZ_{\def\W@rg{#2}\ifx\W@rg\W@zero{\bullet}\else\W@IN{#1}{#2}\fi}\ZZ} \gdef\W@IN#1#2{% \ifcase#1 \underline{\hbox{\sevenrm\Wmodtrans{#2}}}% Generic name (\.{@[}). [0] \or\hbox{\sevenrm\Wmodtrans{#2}}% Function name. [1] \or\underline{\hbox{\seventi\Wmodtrans{#2}}}% WEB macro. [2] \or\hbox{\seventi\Wmodtrans{#2}}% Outer macro. [3] \or\underline{\hbox{\sevenbf\Wmodtrans{#2}}}% \.{@`}. [4] \or\hbox{\sevenbf\Wmodtrans{#2}}% \&{typedef}. [5] \else{\Wmodtrans{#2}}% Error trap. \fi } \DRC\Wtypewriter[1]{\relax\ifmmode\gdef\YY{\null$\null}\else\gdef\YY{}\fi \YY{\leavevmode\W@INITSTR#1}\YY} \let\Wkeyword\Wtypewriter \let\WKEYWORD\Wtypewriter \let\.\Wtypewriter \def\W@INITSTR{% \extendedtex % Typewriter type for strings. (We don't say \let\\=\WBS % Backslash in a string: '\.\\'. \let\'=\WRQ % Right quote in a string: '\.\''. \let\`=\WLQ % Left quote in a string: '\.\`'. \let\{=\WLB % Left brace in a string: '\.\WLB'. \let\}=\WRB % Right brace in a string: '\.\WRB'. \let\~=\WTL % Tilde in a string: '\.\~'. \let\ =\WSP % Space in a string: '\.\ '. \let\_=\WUL % Underline in a string: '\.\_'. \let\&=\WAM % Ampersand in a string: '\.\&'. \def\0{\discretionary{\WBS}{}{}}% \FWEB\ inserts this automatically every % so often so very long strings will break. Broken strings will % be marked by a backslash. \def\1{,\0}% \FWEB\ replaces commas in strings by this, so strings % tend to break after commas. \let\2\space % Ordinary space after control sequences in \TeX. \def\3{\space\space}% Translation of a tab in \TeX. } \DRC\#{\hbox{\tt\char35}}% Parameter sign: '\#'. \DRC\${\hbox{\tt\char36}}% Dollar sign: '\$'. \DRC\%{\hbox{\tt\char37}}% Percent sign: '\%'. \DRC\^{\ifmmode\raise0.45ex\hbox{$\,\scriptstyle\mathchar"25E\,$}% \else\char`^ \fi}% Pointer or % hat: '\^'. % Circumflex accents can be obtained from |\^^D| instead of |\^|. \let\Caret\^% For proper indexing of |@c++ operator ^|. \def\AT!{@}% Knuth's abbreviation for the at sign for control text: '\AT!' \chardef\asterisk=`\* \chardef\WAM=`\&% Ampersand character in a string: '\.\&'. \chardef\WBS=`\\% Backslash in a string: '\.\\'. \DRC\WttBS{{\tt\WBS}}% Literal backslash: '\WttBS'. \chardef\WLB=`\{% Left brace in a string: '\.\WLB'. \DRC\WLQ{{\tt\char'22}}% Left quote in a string: '\.\`'. \chardef\WRB=`\}% Right brace in a string: '\.\WRB'. \DRC\WRQ{{\tt\char'23}}% Right quote in a string: '\.\''. \DRC\WSP{{\tt\char`\ }}% (Visible) space in a string: '\.\ '. \chardef\WTL=`\~% Tilde in a string: '\.\~'. \chardef\WUL=`\_% Underline character in a string: '\.\_'. \DRC\WLQx{\hbox{\WLQ}} \newbox\rulebox \newcount\ruleno \def\rules#1{\leavevmode \ruleno=0 \rlap{\vtop to 0pt{\null \def\R{\setbox0=\hbox{\the\ruleno}% \rlap{\vrule height0pt depth#1}% \kern-0.5\wd0\copy0\kern-0.5\wd0 \advance\ruleno by1 \hskip1em} \rlap{\R\R\R\R\R\R\R} \vss}}} \newdimen\notch \newcount\W@globalindent \W@globalindent=3 % Global indentation in notches. \newcount\W@ind % Current indentation in notches. \newcount\W@lastind % Used for preprocessor commands. \def\W@saveind{\global\W@lastind=\W@ind} \newbox\b@k \newbox\b@kk \def\W@setboxes#1{\notch=#1 \setbox\b@k=\hbox to -\notch{}% Backspace one notch. \setbox\b@kk=\hbox to -2\notch{}% Backspace two notches. } \newif\ifW@firstbreak \newcount\W@nBK \def\WBKo{}% NOT FINISHED YET! \def\WBK{\WBK@{0}} \def\WBK@#1{\hfil\break \ifW@firstbreak \W@nBK=\W@ind \advance\W@nBK by -#1 % Compensate for glob's outdented by 1 from body. \W@firstbreakfalse % Reset by |\6|. \fi \hangindent\W@nBK\notch \ignorespaces} \def\1{\global\advance\W@ind by1\hangindent\W@ind\notch}% Indent one more notch \def\2{\global\advance\W@ind by-1{}}% Indent one less notch \def\3#1{\hfil\penalty#10\hfilneg}% Optional break within a statement. \def\4{\copy\b@k \ignorespaces}% Backspace one notch \def\5{\hfil\penalty-1\hfilneg \kern2.5\notch\copy\b@kk \yskipfalse\ignorespaces} \def\6{\ifmmode\else\par \hangindent\W@ind\notch \noindent \kern\W@ind\notch \copy\b@kk \ignorespaces% \fi} \def\7{\WY\6}% Forced break and a little extra space. \def\8{\hskip-\W@ind\notch \hskip 2\notch} \newif\ifyskip \def\yskip{\medskip} \def\W@Hspace{\hbox{ }} \DRC\WPR[1]{\copy\b@kk \W@saveind% |\global\advance\W@ind by 2| \1\Wreserved{@#1}\W@Hspace} \DRC\WPs{\global\W@ind=\W@lastind} \def\W@point{!} \def\W@defin#1#2{\4\W@saveind \1\Wreserved{#1}% \def\W@temp{#2}% \ifx\W@temp\ast \ast \else\ifx\W@temp\W@point \W@point \else\hbox{$^{\mathrm{#2}}$}% \fi\fi \W@Hspace}% Begin @d, @m, or @f. \def\note#1#2.{\WY\noindent{\hangindent2em\baselineskip10pt\footnotesize #1 #2.\par}} \def\W@lapstar{\rlap{*}} \newif\ifW@modchanged \def\W@checkstar{\edef\W@temp{\noexpand\W@isstar\modstar\noexpand\*\relax}% \W@temp} \def\W@isstar#1\*#2\relax{\ifx#2\*\W@modchangedtrue\else\W@modchangedfalse\fi} \def\W@includefile{} \def\WIF#1{\gdef\W@includefile{#1}} \def\WIF@name{\ifx\W@includefile\empty \else \W@prninclude \fi} \def\W@prninclude{\ifLaTeXisloaded\else\ \fi \WIFfmt{\W@includefile} } \def\WIFfmt#1{[{\tt#1}]} \def\W@startsection{\WQ \W@checkstar {\let\*=\W@lapstar \ifLaTeXisloaded \leavevmode \else \noindent \bf\modstar.% \fi \WIF@name% Print name of current include file, if there is one. \ifLaTeXisloaded\else\quad\fi }} \def\W@skipbrace#1{\catcode`\{=1 } \DRC\WC{\W@cmnt{/\ast}{\W@finishcomment}}% Long comment. \DRC\Wc{\W@cmnt{//}{\XX}}% Short comment. \DRC\Wci{\W@cmnt{}{\XX}}% No comment symbol at all; for special effects. \def\W@cmnt#1#2{\ifmmode\gdef\XX{\null$\null}\else\gdef\XX{}\fi% C-style cmnt \XX\hfil\penalty-1\hfilneg \ifyskip\else\quad\fi$#1\,$% \bgroup\cmntfont % The user can redefine the comment font |\cmntfont|. \aftergroup#2% \catcode`\{=\other\W@skipbrace} \def\W@finishcomment{$\,\ast/$\XX} \def\Wx#1{\kern-0.5\notch\hbox{\tt\%}} \def\WCDIR#1{\WPR?\Wtypewriter{#1}\WPs} \DRC\WCD[1]{\ifmmode\hbox\fi{\ignorespaces#1}} \def\WD#1{\W@defin{@D}{#1}}% Outer macro definition: `\.{@D}' \def\Wd#1{\W@defin{@d}{#1}}% Outer macro definition: `\.{@d}' \def\WUd#1{\W@defin{@u}{#1}}% Undef outer macro: `\.{@u}'. \def\WMD{\W@defin{@M}}% WEB macro definition: `\.{@M}'. Second argument % supplied by \FWEAVE. \def\WMd{\W@defin{@m}}% WEB macro definition: `\.{@m}'. As above. \def\WE#1{\WPR{\##1}}% WEB preprocessor command: `\.{@\#if\dots}'. \def\Wf#1{\W@defin{@f}{#1}}% Format definition: `\.{@f}'. \def\WF#1{\W@defin{@F}{#1}}% Format definition: `\.{@F}'. \def\Wl#1{\W@defin{@l}{#1}}% Limbo text definition: `\.{@l}'. \def\Wv#1{\W@defin{@v}{#1}}% Operator overloading: `\.{@v}'. \def\WWW#1{\W@defin{@W}{#1}}% Identifier overloading: `\.{@W}'. \def\Ww#1{\W@defin{@w}{#1}}% Identifier overloading: `\.{@w}'. \newif\ifpagerefs% Page references or module-number references? \pagerefsfalse \newif\ifnumberTeX% Do we start the \TeX\ part of unnamed sections with \numberTeXfalse \newif\ifnumberdefs% As above, but for the definition part. \numberdefstrue \newif\ifnumbercode% As above, but for the code part. \numbercodetrue \newif\ifnumberunnamed% Number unnamed section? \numberunnamedfalse \newskip\Wuparindent \let\Wrefstepcounter\refstepcounter \newif\ifstripzeros \ifuseREVTeX \stripzerosfalse \else \stripzerostrue % By default, we're bold. \fi \def\W@modequate#1{\def\W@temp{#1}% \ifx\W@temp\empty\else \gdef#1{\Wmodtrans}% \fi} \newcount\W@ssmax% Maximum depth of the \.{@*}$n$ commands. \newcount\W@lsmax% Max. local (per section) depth of the \.{@*}$n$ commands. \def\W@maxdepth#1{{\count0=#1 \advance\count0 by\W@ssmin% \xdef\W@depth{\the\count0}}% \ifFWEBstandalone\else \immediate\write\@auxout{\string\@writefile{toc}% {\string\setcounter{tocdepth}{\W@depth}}}% \fi } \def\Wunnamed#1#2{\csname ifnumber#1\endcsname \gdef\Wnewoutname{#2}% \ifx\Woutname\Wnewoutname\else \8\Wtypewriter{"#2"} \Wscrap ${}\equiv{}$\6% \global\let\Woutname\Wnewoutname \fi\fi} \newcount\secpenalty \secpenalty=-500 % Strongly encourage breaks at sections. \def\W@Lvmode#1{% \if@minipage\else \if@nobreak\else \ifdim\lastskip=\z@ \vfil \penalty#1\relax \vfilneg \else \@tempskipb\lastskip \vskip-\lastskip \vfil \penalty#1 \vfilneg \vskip\@tempskipb \fi\fi\fi} \ifLaTeXisloaded \def\W@raggedbottom{\def\@textbottom{\vskip\z@ \vfil}% \let\@texttop\relax \@secpenalty=\secpenalty \ifnum\secpenalty<0 \def\addpenalty##1{% \ifvmode \W@Lvmode{##1}% \else \@noitemerr \fi} \fi } \newcounter{subsubsubsection} \gdef\thesubsubsubsection{\thesubsubsection.\arabic{subsubsubsection}} \gdef\cl@subsubsubsection{\@elt{paragraph}} \gdef\l@subsubsubsection{\@dottedtocline{4}{3.8em}{3.2em}} \gdef\subsubsubsectionmark#1{} \ifnoLaTeXe \gdef\paragraph{\@startsection{paragraph}{5}{\z@}{3.25ex plus1ex minus.2ex}{-1em}{\reset@font\normalsize\bf}} \fi \gdef\W@setsecdepth{% \@ifundefined{W@depth}{\gdef\W@depth{1}}{}% \setcounter{secnumdepth}{\W@depth}% \setcounter{tocdepth}{\W@depth}% \ifnumberunnamed \Wuparindent0pt \addtocounter{secnumdepth}{1}% \gdef\WRefstepcounter##1{}% \else \Wuparindent-\TeXindent \global\let\WRefstepcounter\Wrefstepcounter \fi \ifcase\W@depth % Level 0; should never happen. \or % Level 1 \def\subsection{\WRefstepcounter{subsection}% \@startsection{subsection}{2}{\z@}{-3.25ex plus-1ex minus-.2ex}{\Wuparindent} {\reset@font \normalsize \bf}}% \let\Wunnamedsect\subsection \def\W@subsect{subsection}% \or % Level 2 \def\subsubsection{\WRefstepcounter{subsubsection}% \@startsection{subsubsection}{3}{\z@}{-3.25ex plus-1ex minus-.2ex} {\Wuparindent}{\reset@font \normalsize \bf}}% \let\Wunnamedsect\subsubsection \def\W@subsect{subsubsection}% \or % Level 3 \def\subsubsubsection{% \WRefstepcounter{subsubsubsection}% \@startsection{subsubsubsection}{4}{\z@}{-3.25ex plus-1ex minus-.2ex} {\Wuparindent}{\reset@font \normalsize \bf}}% \let\Wunnamedsect\subsubsubsection \def\W@subsect{subsubsubsection}% \else \let\Wunnamedsect\paragraph \def\W@subsect{}% \fi } \gdef\Wmodtrans#1{\@ifundefined{r@#1} {\W@split{\##1}{\##1}{0}{0}} {\expandafter\expandafter\expandafter \W@split\csname r@#1\endcsname{#1}}% } \gdef\W@split#1#2#3#4{% \ifpagerefs #2% Just extract the page number. % Add a letter subscript if more than 1 sec. per page. \@ifundefined{W@#3}% {\setcounter{W@tempcounter}{#4}% \addtocounter{W@tempcounter}{-#3}% \ifnum\value{W@tempcounter}>25 \setcounter{W@tempcounter}{25}\fi \hbox{\alph{W@tempcounter}}} {}% \else % Section-number references (the default). \ifstripzeros \W@strip#1.,% \else #1% If we gave up and said |\stripzerosfalse|. \fi \fi } \def\W@strip#1.#2,{\W@first#1\relax \W@tempc{#1}{#2}} \def\W@first#1#2\relax{% \ifx#1\#% \def\W@tempc##1##2{##1}% \else \def\W@tempc##1##2{% \W@Strip{##1.##2}% { \@ifundefined{l@##1}% {0}% {\csname l@##1\endcsname}% }% }% \fi } \def\W@Strip#1#2{\W@STRIP#1\relax{#2}} \def\W@STRIP#1.\relax#2{{% \W@tk={}\W@count=0 \W@counta=\W@depth \advance\W@counta by-#2 % How many zeros to strip. \loop \ifnum\W@count<\W@counta \advance\W@count by1 \edef\next{\W@tk={\the\W@tk.0}}\next % Build template `\.{.0.0\dots}'. \repeat \let\eat\let \edef\next{\def\noexpand\reduce####1\the\W@tk####2\eat####3\eat {\noexpand\W@preface{####1}####2}}% \next \edef\next{\noexpand\reduce#1\eat\the\W@tk\eat\eat\relax}% \def\eat##1{}% \next}} \global\let\modno\empty \global\let\W@name\empty \def\W@preface#1{#1}% Redefined to |\W@getsection| in fwebinsert.sty. \def\W@getsection#1{% \let\W@Preface\empty% Just in case. \ifcase\W@ssmin\relax \W@xsection#1.\relax \def\W@Preface{\thesection}% Level 0 \or \def\W@Preface{\thesection.#1}% Level 1 \or \def\W@Preface{\thesubsection.#1}% Level 2 \or \def\W@Preface{\thesubsubsection.#1}% Level 3 \fi \W@Preface } \def\W@xsection#1.#2\relax{\c@section=\Wb@se \advance\c@section by#1} \def\WM#1.{\WMN#1.% \W@mark{{\oldmodno}{\oldWname}}{{\modno}{\W@name}}% \ifon \advance\W@ss by10 % \W@start{\ifnumberTeX\Wmodtrans{\modno}\fi}% ???? \advance\W@ss by-10 % \ignorespaces} \else % No \LaTeX; for \TeX, one just gets module numbers. \def\Wmodtrans#1{#1} \outer\def\WM#1.{\WMN#1.\W@mark\ifon\Wskip\W@startsection\ignorespaces} \fi % End of no \LaTeX. \newcount\W@ss % Counter for the dots. \newcount\W@lastsect % Level number of section immediately above. \newif\ifW@dotsafter % Do subsection dots come after or before the section %name? \W@dotsafterfalse \ifW@dotsafter % ``@* NAME...'' \def\W@before/#1.{\W@defname{#1}\W@dot}% \def\W@fter{\W@Nss}% \else % ``@*.. NAME.'' or ``@*2 NAME.'' \def\W@before/ {\futurelet\next\W@check}% \def\W@fter#1.{\W@defname{#1}\W@Nss}% Done after figuring out level. \def\W@fter@#1#2.{\W@defname{#2}\W@Nss}% |#1| eats the sectionnum. \fi \def\W@check{\ifx\next.\def\next{\W@dot.}% Count arbitrary dots. \else\ifx\next0\W@sectionnum{0}% \else\ifx\next1\W@sectionnum{1}% \else\ifx\next2\W@sectionnum{2}% Highest numerical level (subsubsect.) \else\ifx\next3\W@badlevel{3}% \else\ifx\next4\W@badlevel{4}% \else\ifx\next5\W@badlevel{5}% \else\ifx\next6\W@badlevel{6}% \else\ifx\next7\W@badlevel{7}% \else\ifx\next8\W@badlevel{8}% \else\ifx\next9\W@badlevel{9}% \else\let\next\W@fter \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next}% \def\W@badlevel#1{\errhelp=\b@dlevelhelp \errmessage{FWEBMAC WARNING: @*#1 changed to @*2}% \W@sectionnum{2}} \newhelp\b@dlevelhelp{Only the major-section (table-of-contents) commands @* (section), @*1 (subsection), and @*2 (subsubsection) are allowed.} \def\W@sectionnum#1{\W@ss#1% \advance\W@ss by\W@ssmin \let\next\W@fter@} \def\W@defname#1{\@ifnextchar[{\W@getname}{\W@getname[#1]}#1.} \def\W@getname[#1]#2.{\gdef\W@name{#1}% Running headline (short name). \gdef\W@longname{#2}}% Remember name of section (used in |\W@start|). \def\W@ssmin{0}% The lowest (top) level. \def\WN#1.{\WMN#1.\W@ss=\W@ssmin \W@before/}% Begin a starred section. \def\W@outlsmax#1{\if@filesw {% \ifLaTeXisloaded \expandafter\W@major\c@section.\relax \else \expandafter\W@major\@currentlabel.\relax \fi \advance\W@count by#1 \advance\W@count by-1 \advance\W@lsmax by1 \edef\@tempa{\ifFWEBstandalone \write\@auxout{\string\Lastdepth{\the\W@count}% {\the\W@lsmax}}% \fi}% \expandafter}\@tempa \fi \W@lsmax=0 } \ifLaTeXisloaded \def\W@major#1.#2\relax{\W@count=#1}% Get the major section. \def\Lastdepth#1#2{% \edef\@tempc{\gdef\expandafter\noexpand \csname l@#1\endcsname{#2}}% \@tempc% Define something like |\l@1| to be last max depth. } \else \def\W@outlsmax#1{} \fi \def\W@dot{\futurelet\next\W@Ns} \def\W@Ns{\ifx\next.% \advance\W@ss by 1 \let\next\W@next \else \let\next\W@fter \fi \next} \def\W@next#1{\W@dot} \ifLaTeXisloaded \let\Wsectionbreak\relax \else \def\Wsectionbreak{\ifcase\W@ss\vfil\eject\fi} \fi \def\rhead{\ifcase\W@ss \uppercase{\ignorespaces\W@name}% \else \ignorespaces\W@name% \fi}% Define running headline. \let\WZ\let % Now one can |\send| the control sequence |\WZ| \let\WIM\let % This macro is made temporarily unexpandable; see |\WZ|. \def\W@Llabel#1{\@bsphack \if@filesw {\let\thepage\relax \let\W@botmodno\relax \def\protect{\noexpand\noexpand\noexpand}% \edef\@tempa{\ifFWEBstandalone \write\@auxout{\string\Newlabel{#1}% {{\@currentlabel}{\thepage}}{\W@botmodno}}% \fi}% \expandafter}\@tempa \if@nobreak \ifvmode \nobreak \fi \fi \fi \@esphack} \ifLaTeXisloaded \gdef\NoIndex{NoIndex}% Written as arg to |\Wbegin| by \.{-xi}. \gdef\W@Nss{% {\let\protect\noexpand \xdef\Wupn@me{\W@name}}% \ifx\Wupn@me\INDEX \ifx\INDEX\NoIndex \onfalse% Don't print section heading. \else \W@mark{{\oldmodno}{\oldWname}}{{\oldmodno}{\oldWname}}% \fi \else% Emit mark before section break. \W@mark{{\oldmodno}{\oldWname}}{{\modno}{\W@name}}% \fi \message{*\modno}% Progress report to the terminal. \ifon% Start output of named section; explicit |\fi| \ifnum\W@ss>\W@ssmax \global\W@ssmax=\W@ss% Track max depth. \fi \ifnum\W@ss>\W@lsmax \global\W@lsmax=\W@ss% Maximum local depth. \fi \W@start{\W@longname}% \ignorespaces } \def\steppagemodule{\noexpand\expandafter\expandafter\expandafter {\addtocounter{pagemodule}{1}}\thepagemodule} \let\Wlabel\W@Llabel \gdef\beforeindex{% \ifx\multicols\undefined \twocolumn \else \ifFWEBstandalone \newpage \fi \fi } \gdef\W@start#1{% {\let\protect\noexpand \xdef\Wupn@me{\W@name}}% \ifx\Wupn@me\INDEX\beforeindex\fi \ifcase\W@ss \let\Wsect\section % Level 0 \W@lastsect\W@ss \or \let\Wsect\subsection % Level 1 \W@lastsect\W@ss \or \let\Wsect\subsubsection % Level 2 \W@lastsect\W@ss \else \let\Wsect\Wunnamedsect \fi \ifnum\W@lastsect>2 \W@setU \fi \Wsect{#1}% Execute LaTeX section heading. \ifnum\W@ss=0 % Check if major section. \W@outlsmax{0}% If so, write out |\Lastdepth| command. \fi \W@mark{{\modno}{\W@name}}{{\modno}{\W@name}}% \Wlabel{\modno}% Section number to aux file. \@ifundefined{r@\modno} {\expandafter\xdef\csname r@\modno\endcsname {{\@currentlabel}{\thepage}{-1}}} {}% For present run. \W@startsection } \else % No \LaTeX \def\W@Nss{% \let\protect\noexpand \W@mark%Can't put this in |\WMN| since |\rhead| must be defined first. \Wsectionbreak % Typeset the break between sections. \message{*\modno}% Progress report to the terminal. \ifon \ifcase\W@ss\else\Wskip\fi \W@startsection{\bf\ignorespaces\W@name.\quad}% {\def\WIN{\WIM}% \edef\next{\write\W@cont{\WZ{\the\W@ss}{\W@name}% {\modno}{\noexpand\the\pageno}}}\next}% % To contents file |CONTENTS.tex|. \ignorespaces} \fi \ifuseREVTeX \def\W@setu#1{\expandafter\def\csname p@\W@subsect\endcsname{#1} \expandafter\def\csname the\W@subsect\endcsname{\arabic{\W@subsect}}} \def\W@setU{ \ifcase\lastsect \W@setu{\thesection.}% \or \W@setu{\thesection\,\thesubsection.}% \or \W@setu{\thesection\,\thesubsection\,\thesubsubsection.}% \fi } \else \def\W@setU{} \fi \def\W@markN{\def\W@mark{{\def\WIN{\WIM}% \mark{\modno\noexpand\else\rhead}}}} \ifx\selectfont\undefined \W@markN \else \def\W@mark{{\def\WIN{\WIM}\let\protect\noexpand \mark{\modno\noexpand\else\rhead}}} \fi \def\Wmodno{\iftrue\topmark\fi}% Extracts the left-hand part of the mark. \def\Whead{{\let\WIM\WIN \expandafter\iffalse\topmark\fi}}% Extracts the right-hand part. \def\WMN#1.{\par \parskip=\pardimen % Reset to \TeX\ spacing \parindent=\TeXindent {\ifLaTeXisloaded \global\let\oldmodno\modno \global\let\oldWname\W@name \xdef\@currentlabel{\modno}% \global\let\Woutname\empty \addtocounter{pagemodule}{1}% \fi \xdef\modstar{#1}% \let\*=\empty \xdef\modno{#1}% }% \ifx\modno\modstar \global\onmaybe% For conditional listing of changed secs. \else \global\ontrue% Print this section. \fi } \def\Wscrap{{\footnotesize\Wmodtrans{\modno}% \ifW@modchanged*\fi}} {\gdef\@verbatim{\if@minipage \else \vskip \parskip \fi \leftskip \@totalleftmargin \rightskip \z@ \parindent \z@ \parfillskip \@flushglue \parskip \z@ \@@par \@tempswafalse \def \par {\if@tempswa \hbox {}\fi \@tempswatrue \@@par \penalty \interlinepenalty }\obeylines \tt \catcode ``=13 \@noligs \let \do \@makeother \dospecials}} {\catcode`/=0 /catcode`/\=12 /catcode`/^^I=13 /gdef/WBM{%/8/kern/notch /begingroup /parindent/W@globalindent/notch /advance/parindent by-1/notch /def/par{/endgraf/leavevmode}% /catcode`^^I=13 /def^^I{/leavevmode/penalty10000/ / / / / / / / }% /catcode``=13 /@noligs /tt /let/do/@makeother /dospecials /@vobeyspaces/frenchspacing/obeylines /W@M} /gdef/W@M#1\WEM{#1/endgroup}} \def\WDP#1{\ifx E#1\else{\tt#1}\fi}% Used in the exponent macro below. \DRC\WO[1]{% {% Make the next definitions local. \let\-\_% \let\d\$% \def\\{\let\_\-\let\$\d}% \def\?{\kern.2em}% \let\{\bgroup% Braces are inserted in \Fortran-90 by kind parameter. \let\}\egroup \def\###1{\kern0.1em{\tt \ifcase##1F\or L\or U\or UL\else?\fi}}%C~constant. \def\^##1{\cdot 10^{\aftergroup}\aftergroup\WDP\aftergroup##1}% Power of ten \def\_{_{\\\rm\aftergroup}}% Fortran-90 kind parameter. \def\%{{\rm H}\hbox{\aftergroup}\Wtypewriter{\aftergroup}}% Hollerith constant \def\&{0{\tt b}}% Binary constant. \def\~{\hbox{\rm\char'23\kern-.2em\it\aftergroup\?\aftergroup}}% Octal \def\`{\hbox{\rm\char"7D\tt\aftergroup}}% Double quotes for hex constant #1}} \def\WKINDCHAR#1\.#2{% \hbox{\Wtypewriter{#2}}_{\Wkindids \rm #1}} \DRC\Wkindids{\def\Wshort##1{##1}% \def\Wid##1{##1}% \def\WID##1{##1}} \def\WPr{\global\W@ind=\W@globalindent \1} \def\WP{\parskip=0pt \parindent=\notch \rightskip=0pt plus 100pt minus 10pt \sfcode`;=3000 \pretolerance 10000 \WPr \W@firstbreaktrue % Reset to true by |\6|. \leavevmode\kern\notch} \def\WQ{\rightskip=0pt \sfcode`;=1500 \pretolerance 200 \hyphenpenalty 50 \exhyphenpenalty 50 } \def\Wendd{\par}% End of definition part. \def\Wendc{\par}% End of code part. \def\WA{\note{See also}}% Cross-reference for multiply defined section names. % English! \def\Wauto[#1]{\Wtypewriter{[#1]}\ } \DRC\WB{\mathopen{\Wtypewriter{@/\ast}}}% Begin controlled comment. \let\WG\ge % Greater than or equal sign: '$\WG$'. \DRC\WI{\neq}% Unequal sign: '$\WI$'. (Better reserve |\ne| for the % electron density~$n_e$.) \DRC\WJ{\Wtypewriter{@\&}}% TANGLE's join operation: '\WJ'. \let\WK\gets % Left arrow: '$\WK$'. \let\Wlbl\llap \let\WL\le % Less than or equal sign: '$\WL$'. \let\WLA\langle % Opening of template: '$\WLA$'. \let\WRA\rangle % Closing of template: '$\WRA$'. \DRC\WTLD{\Wtypewriter{@\~}} \def\Wskip{\vfil\penalty-100\vfilneg \vskip12ptminus3pt}% See |\WM|, etc. \def\Wskipped#1{\8\mathhexbox278.\quad\Wtypewriter{@I "#1"}\ \ {\it Section(s) skipped}\dots\WP} \let\WPtr\Rightarrow % Fortran's stupid pointer assignment statement: % '$\WPtr$'. \let\WR=\lnot % Logical not: '$\WR$'. \let\WS=\equiv % Equivalence sign: '$\WS$'. \let\WSQ=\equiv % This symbol is used when defining a section name. \DRC\WSl{\ifmmode\mathbin{/}\else/\fi}% Division \DRC\WT{\mathclose{\Wtypewriter{@\ast/}}}% Terminate controlled comment. \def\WU{\note{This code is used in}}% Cross-reference for uses of sections. % English! \let\WV\lor % Logical or: '$\WV$'. \let\WW=\land % Logical and: '$\WW$'. \ifLaTeXisloaded \else \let\footnotesize\eightrm \fi \def\WX#1#2\X#3\X{\ifmmode\gdef\XX{\null$\null}\else\gdef\XX{}\fi \XX$\langle\,$#2{\footnotesize\kern.5em#1}% $\,\rangle^{\mathrm{#3}}$\XX} \def\WY{\par \yskip \parskip=0pt} \DRC\?{\mathrel?} \DRC\Colon{\ifmmode\colon\else\textcolon\fi} \DRC\WCC{\mathord{::}}% For C: '$x\WCC y$'. \DRC\WCF{{}\mathbin{::}{}}% For \Fortran: '$x\WCF y$'. \DRC\=[1]{\kern2pt\hbox{\vrule\vtop{\vbox{\hrule \hbox{\strut\kern2pt\Wtypewriter{#1}\kern2pt}} \hrule}\vrule}\kern2pt} \let\Wequals\= \let\~=\ignorespaces \let\*=* \def\WPQ{\mathrel{+\mathord\equiv}}% '$\WPQ$'. \def\W@LP{(}% Must be |\def|, not |\let|. \def\W@ISL#1#2]{\def\next{#1}} \DRC\WEE[1]{\W@ISL#1]\ifx\next\W@LP\WEXP[#1]\else\WEXP[(#1)]\fi} \def\WEXP[(#1)]{^{#1}} \DRC\WCMN[2]{\Wtypewriter{/#2/}} \let\WSlSl\parallel% Concatenation: '$\WSlSl$'. \DRC\WEQV{\mathrel{?{=}}}% `$x\WEQV y$'. \DRC\WNEQV{\not\equiv}% `$x\WNEQV y$'. \DRC\WLS{\mathopen{({/}\,}} \DRC\WSR{\mathclose{\,{/})}} \DRC\WFALSE{{\cal F}}% '$\WFALSE$'. \DRC\WTRUE{{\cal T}}% '$\WTRUE$'. \def\Wblock#1{\Wc\bgroup\ Block #1\egroup}% `\Wblock{99}' \def\WNN{\hbox{\#\#}}% '\WNN'. \def\WNP{\hbox{\#!}}% '\WNP'. \def\WNC{\hbox{\#:}}% '\WNC'. \def\WND{\hbox{\#.}}% '\WND'. \def\WNq{\hbox{\#\tt'}}% '\WNq'. \def\WNQ{\hbox{\#\tt"}}% '\WNQ'. \mathchardef\TLD="0218 % '$\TLD$'. \DRC\WPP{\mathord{++}}% '$\WPP$'. \DRC\WMM{\mathord{--}}% '$\WMM$'. \DRC\WMG{\mathord{\to}}% '$\WMG$'. \DRC\Wcp{\mathrel{+{=}}} \let\PE\Wcp % `$x\PE y$'. \DRC\Wcm{\mathrel{-{=}}} \let\ME\Wcm % `$x\ME y$'. \DRC\Wcs{\mathrel{\ast{=}}} \let\TE\Wcs % `$x\Wcs y$'. \DRC\Wcv{\mathrel{/{=}}} \let\FE\Wcv % `$x\FE y$'. \DRC\Wcd{\mathrel{\%{=}}} \let\CE\Wcd % `$x\Wcd y$'. \DRC\Wcx{\mathrel{\^\!{=}}}% `$x\Wcx y$'. \DRC\Wca{\mathrel{\amp{=}}}% `$x\Wca y$'. \DRC\Wco{\mathrel{\WOR{=}}}% `$x\Wco y$'. \DRC\Wcg{\mathrel{\WGG\!{=}}}% `$x\Wcg y$'. \DRC\Wcl{\mathrel{\WLL\!{=}}}% `$x\Wcl y$'. \DRC\WMOD{\mathrel{\%}}% `$x\WMOD y$'. \DRC\WOR{{\,|\,}}% `$x\WOR y$'. \DRC\WAND{{\,\amp\,}}% `$x\WAND y$. \DRC\WGG{\mathrel{>\!>}}% `$x\WGG y$'. \DRC\WLL{\mathrel{<\!<}}% `$x\WLL y$'. \DRC\WHE{\mathrel{\uparrow=}}% `$x\WHE y$'. \DRC\Woperator[1]{\Wreserved{operator}~\hbox{$#1$}\ignorespaces} \DRC\Woperatoro{\Wreserved{operator}~\ignorespaces} \let\openbraces=\{ \let\closebraces=\} \def\{{\ifmmode\openbraces\else$\openbraces$\fi} \def\}{\ifmmode\closebraces\else$\closebraces$\fi} \newif\ifop \newbox\dotbox \def\Wunknown#1{\={??#1??}}% For unknown dot constant. {\catcode`\_=11 \gdef\newop#1#2#3{% \edef\next{\def\expandafter\noexpand\csname _#1_#2\endcsname}% \next{#3}} \gdef\newbinop#1#2#3{% \edef\next{\def\expandafter\noexpand\csname _#1_#2\endcsname}% \next{\mathrel{#3}}} \gdef\newunop#1#2#3{% \edef\next{\def\expandafter\noexpand\csname _#1_#2\endcsname}% \next{\mathbin{#3}}} \gdef\Wop#1#2{\setbox\dotbox\hbox{\tt .#1.}% \edef\nxt{\expandafter\noexpand\csname _#1_#2\endcsname}% \edef\ifnxt{\noexpand\ifx\expandafter\noexpand\csname _#1_#2\endcsname}% \ifnxt\empty \def\next{\box\dotbox}% Macro not defined; just use \.{.NAME.}. \else \def\next{\futurelet\nextchar\W@q}% Be careful about |\WEE|. \fi \next}% } \global\let\Wb\Wop \global\let\Wu\Wop \let\Lbrace{ \def\W@q{\ifx\nextchar\Lbrace \let\next\nxt % There's an argument coming up. \else \ifop \def\next{\nxt{}\equiv\box\dotbox}% \else \let\next\nxt \fi \fi \opfalse \next} \DRC\WTeX[1]{\ [{\ifmmode\def\XX{}\else\def\XX{\null$\null}\fi \XX#1\XX}]\ } \newtoks\W@ARRAYarga \newtoks\W@ARRAYargb \DRC\WXA[1]{\begingroup \def\Wshort##1{##1}% \def\Wid##1{\mathit{##1\/\kern.05em}}% \global\W@ARRAYarga{#1}% \futurelet\W@next\WARRAYm} \def\WARRAYm{\ifx\W@next\WXA \global\let\W@next\WARRAYn% Multiple indices in C: a[i][j][k] \else \global\let\W@next\relax \WARRAY{\the\W@ARRAYarga}% Typeset the accumulated indices. \fi \endgroup \W@next} \def\WARRAYn#1#2{\W@ARRAYargb{#2}% \edef\W@next{\noexpand\WXA{\the\W@ARRAYarga,\the\W@ARRAYargb}}%Concatenate \W@next} \DRC\WARRAY[1]{[#1]}% Default definition. \DRC\WSUB[1]{_{\scriptstyle#1}}% E.g., subscript indices. \def\Wouto#1#2{\Wreserved{@#1}\W@Hspace\Wtypewriter{#2}} \def\Wout#1{\Wouto{o}{#1}} \def\WOut#1{\Wouto{O}{#1}} \def\WRCS#1#2{\langle\!\langle\,\Wtypewriter{#2}\,\rangle\!\rangle \ifnum#1=0 _{0}\fi} \def\modlabel#1{% \ifLaTeXisloaded \label{MOD#1}% \else \edef\next{\gdef\expandafter\noexpand\csname MOD#1\endcsname{\modno}}% \next \fi} \def\Wmodule#1{\ifLaTeXisloaded \ref{MOD#1}% \else \csname MOD#1\endcsname \fi} \def\WEBsection#1{section~\Wmodule{#1}}% |\section| is used by \LaTeX. \def\WEBmodule#1{module~\Wmodule{#1}} \let\module\WEBmodule% For backward compatibility. \def\strutdepth{\dp\strutbox} \def\W@marginal#1{\strut\vadjust{\kern-\strutdepth\W@specialmargin{#1}}} \def\W@specialmargin#1{\vtop to\strutdepth{ \baselineskip\strutdepth \vss\llap{#1 }\null}} \def\LANGUAGE#1{\W@marginal{\smash{\vtop{\hbox{% \hbox{\tt @L\lowercase{#1}\textcolon\enspace}}\null}}}\ignorespaces} \newif\ifon \def\onmaybe{\let\ifon=\maybe} \let\maybe=\iftrue \newif\iftitle \newif\ifpagesaved \newcount\contentspageno \def\Wmodhd#1{ [#1]} \newif\ifW@headers \W@headerstrue% Stand-alone setting (might be changed in fwebinsert.sty). \def\W@seczero{0} \def\WsetLmarks{ \def\Wsecrange##1##2{% \def\W@tempa{##1}\def\W@tempb{##2}% \ifx\W@tempa\W@tempb% Equal sec.\ nums; just print one. \W@S\Wmodtrans{##1}\Wmodhd{\###1}% \else\ifx\W@tempb\W@seczero \W@S\Wmodtrans{##1}\Wmodhd{\###1}% \else \W@S\Wmodtrans{##1}--\W@S\Wmodtrans{##2}% \Wmodhd{\###1--\###2}% \fi\fi} \gdef\@leftmark##1##2##3##4{% \let\protect\relax \let\\\ % \qquad\mainfont##2 \hfill \Wtitle\qquad \ifnum##1>0% \mainfont\Wsecrange{##1}{##3}% \fi } \gdef\@rightmark##1##2##3##4{% \let\protect\relax \let\\\ % \ifnum##1>0 \mainfont\Wsecrange{##1}{##3}\qquad% \fi \mainfont\Wtitle \hfill \mainfont##4\qquad } \gdef\leftmark{% \ifnoLaTeXe \else \let\protect\@unexpandable@protect \fi \edef\W@tempb{\expandafter\iftrue\botmark\fi}% \edef\W@tempa{\expandafter\iffalse\topmark\fi}% \expandafter\expandafter\expandafter\@leftmark\expandafter\W@tempa\W@tempb{}{}} \gdef\rightmark{% \ifnoLaTeXe \else \let\protect\@unexpandable@protect \fi \edef\W@tempb{\expandafter\iftrue\botmark\fi}% \edef\W@tempa{\expandafter\iffalse\topmark\fi}% \expandafter\expandafter\expandafter\@rightmark\expandafter\W@tempa% \W@tempb{}{}} \gdef\W@markN{\gdef\W@mark####1####2{{\def\WIN{\WIM}% \mark{####1\noexpand\else####2}}}} \ifx\selectfont\undefined \W@markN \else \gdef\W@mark##1##2{{%\def\WIN{\WIM}% \let\protect\@unexpandable@protect \mark{##1\noexpand\else##2}}} \fi } \ifLaTeXisloaded \else \def\lheader{\mainfont\the\pageno\eightrm\qquad\Whead\hfill\Wtitle\qquad \ifnum\pageno=\contentspageno\else \W@S\mainfont\Wmodno \fi} \def\rheader{\ifnum\pageno=\contentspageno\else \W@S\mainfont\Wmodno \fi \eightrm\qquad\Wtitle\hfill\Whead \qquad\mainfont\the\pageno} \fi \def\pagewidtho{6.5}% The width of each page \def\pageheighto{8.7}% The height of each page \def\fullpageheighto{9}% Page height including headlines \newdimen\pagewidth \pagewidth\pagewidtho in \newdimen\pageheight \pageheight\pageheighto in \newdimen\fullpageheight \fullpageheight\fullpageheighto in \newdimen\pageshift \pageshift=0in% Shift righthand pages wrt lefthand ones \def\setpage{\hsize\pagewidth \vsize\pageheight \ifLaTeXisloaded \oddsidemargin=0pt \evensidemargin=0pt \topmargin=0pt \setlength{\linewidth}{\pagewidth} \setlength{\textwidth}{\pagewidth} \setlength{\textheight}{\pageheight} \fi } \ifLaTeXisloaded \else \def\magnify#1{\mag=#1 \pagewidth\pagewidtho truein \pageheight\pageheighto truein \fullpageheight\fullpageheighto truein \setpage} \fi \def\page{\box255 } \newif\ifidenticalpageheads \def\normaloutput#1#2#3{ \ifodd\pageno\hoffset=\pageshift\fi \shipout\vbox { \vbox to\fullpageheight { \iftitle\global\titlefalse \else \hbox to\pagewidth {\vbox to10pt{}% \ifidenticalpageheads#2\else \ifodd\pageno #3% Pg nos alternate left \& right. \else#2\fi \fi }% \fi \vfill#1% Parameter |#1| is the page itself. } } \global\advance\pageno by1} \def\W@name{{FWEB} OUTPUT}% This section name is reset by starred sections. \newtoks\Woutput \Woutput\output% Remember \FWEB's definition. \newcount\minutes \newcount\hours \hours=\time \divide\hours by 60 \multiply\hours by 60 \minutes=\time \advance\minutes by -\hours \divide\hours by 60 \def\Time{\the\hours\textcolon\ifnum\minutes<10 0\fi\the\minutes} \def\Date{\ifcase\month\or January\or February\or March\or April\or May\or June\or July\or August\or September\or October\or November\or December\fi \space\number\day, \number\year} \def\Wtitle{}% Short title for running heads. Can redefine after |\Title|.j \def\Title{\@ifnextchar[\W@@Title\W@Title} \def\W@Title#1{\W@@Title[#1]{#1}} \def\W@@Title[#1]#2{\gdef\Wtitle{{\large\tt#1}}\title{{\ttitlefont#2}}} \ifLaTeXisloaded \def\topofcontents{}% We use \LaTeX's defaults. \else \def\topofcontents{\centerline{\titlefont\Wtitle} \vfill} % This is the default. \fi \ifLaTeXisloaded \def\botofcontents{} \else \def\botofcontents{\vfill \rightline{\Date} \rightline{\Time}} \fi \ifLaTeXisloaded \contentspageno=1 \pageno=\contentspageno \else \contentspageno=0% Default page number for table of contents \fi \newwrite\W@cont % For the table of contents. \ifLaTeXisloaded \def\Wfirst#1#2#3#4#5{#1} \def\W@output{\setcounter{pagemodule}{0}% \xdef\W@botmodno{\expandafter\Wfirst\botmark}} \def\W@botmodno{0} \def\Newlabel#1#2#3{% \ifFWEBstandalone \@ifundefined{r@#1}{}% {\@warning {Label `#1' multiply defined}} \fi \global\@namedef{r@#1}{#2{#3}}% |\@namedef| is from \LaTeX. \global\W@lpha=#3 \ifnum\W@lpha=\W@ref\global\advance\W@pmcount by1 \else \ifnum\W@pmcount=1 \edef\next{\gdef\csname W@\the\W@ref\endcsname{}}\next \fi \W@ref=\W@lpha \W@pmcount=1 \fi} \fi \newcount\W@ref \W@ref=-1 \newcount\W@lpha \newcount\W@pmcount \W@pmcount=1 \outer\def\Wbegin[#1]#2#3#4#5#6#7#8#9{\edef\contentsfile{#5}% \def\readcontents{\input\contentsfile}% \Wequate#6 \W@modequate{#7}% \edef\INDEX{#9}% \def\W@splitprms##1##2[##3;##4]{\def##1{##3}\def##2{##4}}% \W@splitprms\W@preamble\W@postamble[#8]% \ifLaTeXisloaded \ifFWEBstandalone \def\FWEBend{% \LaTeX\ redefines |\end|. \W@outlsmax{1}% The `1' is because sec. # % isn't incremented for the module list. \global\advance\W@ssmax by1 \immediate\write\@auxout{\string\W@maxdepth{\the\W@ssmax}}% \W@postamble \W@makeatend% Override |\makeatletter| \end{document}% }% \def\W@ssmin{0} \else% Insert mode; not stand-alone. \def\FWEBend{} % |\W@ssmin| isn't defined; it's set by |\fweblevel|. \fi \W@splitprms\W@prma\W@prmb[#1]% \W@splitprms\W@prmc\W@prmd[#2]% \ifusedocumentstyle \edef\W@temp{\noexpand\documentstyle[\W@prma]{\W@prmc}}% \W@temp \else \ifFWEBstandalone \documentclass[\W@prma]{\W@prmc}% \usepackage[\W@prmb]{\W@prmd}% \fi \fi \ifFWEBstandalone \textwidth\pagewidth \textheight\pageheight \fi \TeXindent#3 \title{}% \author{}% \date{\today\\[3pt]\Time}% \pagestyle{myheadings}% \ifx\c@pagemodule\undefined \newcounter{pagemodule}% \newcounter{W@tempcounter}% \fi \gdef\cl@section{\@elt{subsection}\cl@subsection} \gdef\cl@subsection{\@elt{subsubsection}\cl@subsubsection} \gdef\cl@subsubsection{\@elt{subsubsubsection}} \xdef\normaloutput##1##2##3{\the\output \noexpand\W@output}% \ifW@headers \WsetLmarks \else \def\W@markN{}% \def\W@mark##1##2{}% \fi \W@preamble \W@raggedbottom \ifFWEBstandalone \begin{document} \else \begingroup \makeatletter \@input{\jobname.aux} %|\jobname| is redefined in \.{fwebinsert.sty}. \endgroup \fi \W@setsecdepth \else % Plain \TeX. \immediate\openout\W@cont=\contentsfile \def\FWEBend{\W@postamble\end} \TeXindent#3 \W@preamble \fi \W@setboxes{#4}% Set dimensions of backspace boxes. \ifFWEBstandalone \output {\setbox0=\page% The first page is garbage \global\output{\normaloutput\page\lheader\rheader}% }% \setpage \vbox to \vsize{} \fi } \def\W@makeatend{\let\W@makeatletter\makeatletter \def\makeatletter{\def\Newlabel{\W@testdef r}% \W@makeatletter}} \def\W@testdef#1#2#3#4{\def\reserved@a{#3{#4}}% \expandafter\ifx\csname#1@#2\endcsname \reserved@a \else \@tempswatrue \fi } \def\Wch{\note{The following sections were changed by the change file:} \let\*=\relax}% English! \newbox\Sbox % Saved box preceding the index \newbox\Lbox % Lefthand column in the index \ifLaTeXisloaded \def\startindex{\ifx\multicols\undefined \medskip \else \begin{multicols}{2}% \fi } \else \def\startindex{\par\vskip6pt plus 1fil} \fi \def\Winx{\startindex \ifLaTeXisloaded \else \write\W@cont{ }% Ensure that the contents file isn't empty \closeout\W@cont % The contents information has been fully gathered \output{\ifpagesaved\normaloutput{\box\Sbox}\lheader\rheader\fi \global\setbox\Sbox=\page \global\pagesavedtrue} \pagesavedfalse \eject % Eject the page-so-far and predecessors \setbox\Sbox\vbox{\unvbox\Sbox}% Take it out of its box \vsize=\pageheight \advance\vsize by -\ht\Sbox % The remaining height \hsize=.5\pagewidth \advance\hsize by -10pt % Column width for the index (20pt between cols) \parfillskip 0pt plus .6\hsize % Try to avoid almost empty lines \def\lr{L}% This tells whether the left or right column is next \output{\if L\lr\global\setbox\Lbox=\page \gdef\lr{R} \else\normaloutput{\vbox to\pageheight{\box\Sbox\vss \hbox to\pagewidth{\box\Lbox\hfil\page}}}\lheader\rheader \global\vsize\pageheight\gdef\lr{L}\global\pagesavedfalse\fi} \fi \outer\def\:##1, {\par\hangindent2em\noindent##1\textcolon\kern1em}% Index %entry \def\[##1]{$\underline{##1}$}% Underlined index item \def\(##1){$^{\rm ##1}$}% Language marker \let\Windexspace\medskip % Spacing between letter groups in index. \rm {\ifFWEBstandalone\let\glbl\global\else\let\glbl\empty\fi \glbl\parskip 0pt plus .5pt \glbl\rightskip0pt plus 2.5em \glbl\tolerance 10000 \glbl\let\*=\W@lapstar \glbl\hyphenpenalty 10000 \glbl\parindent0pt } } \ifLaTeXisloaded \def\Wfin{\ifx\multicols\undefined\else\end{multicols}\fi} \else \let\Wfin\relax \fi \def\W@onecolumn{% \ifx\multicols\undefined \onecolumn% In case of insertions & no module list. \fi } \def\pgfmt#1{\uppercase\expandafter{\romannumeral#1}} \def\pg#1#2#3{\def\temp{#1}% \ifx\temp\empty% For the case where \.{idxmerge} hasn't been run. \else \pgfmt{#1}.% \fi #2{#3}% } \def\topofindex{} \def\botofindex{} \def\Wmods{% \def\W@name{Names of the Modules}% \ifLaTeXisloaded \W@outlsmax{1}% The `1' is because sec. # hasn't been incremented \edef\next{\noexpand\W@mark{{0}{\INDEX}} {{0}{\W@name}}}\next \onecolumn% This also starts a new page. \edef\next{\noexpand\W@mark{{0}{\W@name}}{{0}{\W@name}}}\next \parfillskip 0pt plus 1fil \else \par\vfill\eject \ifpagesaved\null\vfill\eject\fi % Output a null index column \if L\lr\else\null\vfill\eject\fi % Finish the current page \parfillskip 0pt plus 1fil \edef\rhead{\W@name}% \output{\normaloutput\page\lheader\rheader} \setpage \fi \def\note##1##2.{\quad{\footnotesize##1 ##2.}} \def\WU{\note{Used in}}% Cross-reference for uses of sections. English! \def\:{\par\hangindent 2em}\let\*=*% } \def\Winfo#1#2#3#4{% \bigskip \:{{\bf COMMAND LINE\textcolon}\ \ \Wtypewriter{#1}.}\smallskip \:{{\bf WEB FILE\textcolon}\ \ \Wtypewriter{#2}.}\smallskip \:{{\bf CHANGE FILE\textcolon}\ \ \Wtypewriter{#3}.}\smallskip \:{{\bf GLOBAL LANGUAGE\textcolon}\ \ {\rm #4}.}\bigskip } \def\Wkwds{\:{\leavevmode{\bf Global RCS-like keywords\textcolon}}\medskip} \def\Wkwd#1#2{\:{\leavevmode\quad{\bf \dollar#1\textcolon}\ \ % \Wtypewriter{"#2"}}} \ifLaTeXisloaded \def\W@settoc#1{}% \def\Wtoc#1{\begingroup \W@settoc{#1}% \def\Newlabel##1##2##3{}% \setcounter{tocdepth}{\W@depth}% \thispagestyle{empty}% \def\W@name{Table of Contents}% English! \edef\next{\noexpand\W@mark{{0}{\W@name}}{{0}{\W@name}}}% \next% \pagenumbering{roman}% \maketitle \topofcontents \tableofcontents \botofcontents \edef\next{\noexpand\W@mark{{1}{\W@name}}{{1}{}}}\next \gdef\W@name{}% \newpage% Break after TOC. \endgroup \pagenumbering{arabic}% \pageno=1 } \def\Wcon#1{\newpage \let\WIM\WIN % Restore the proper definition. \pageno=\contentspageno \Wtoc{#1}% } \def\FWEBtoc{% \ifFWEBstandalone \Wtoc{}% No toc for insertions. \fi \gdef\Wcon##1{% Redefinition! \W@onecolumn }% } \else \def\Wcon#1{\par\vfill\eject \rightskip 0pt \hyphenpenalty 50 \tolerance 200 \setpage \output{\normaloutput\page\lheader\rheader} \titletrue % Prepare to output the table of contents \pageno=\contentspageno \def\rhead{Table of Contents}% English! \topofcontents \catcode`\@=11 \hbox to\hsize{\hfil Section\hbox to3em{\hss Page}} \def\WZ##1##2##3##4{\hbox to\hsize{\kern##1em\ignorespaces##2 \leaders\hbox to .5em{.\hfil}\hfil\ ##3\hbox to3em{\hss##4}}} \let\WIM\WIN % Restore the proper definition. \readcontents\relax % Read the contents info. \botofcontents } \def\FWEBtoc{\message{! Front Table of Contents is only supported with LaTeX.}} \fi \newskip\ttglue \ttglue=0.5em plus 0.25em minus 0.15em \def\ttother{\catcode`\\=\other \catcode`\{=\other \catcode`\}=\other \catcode`\$=\other \catcode`\&=\other \catcode`\#=\other \catcode`\%=\other \catcode`\~=\other \catcode`\_=\other \catcode`\^=\other} \def\ttverbatim{\begingroup \ttother \obeyspaces \obeylines \tt} {\obeyspaces\gdef {\ }} \def\begintt{$$\let\par=\endgraf \ttverbatim \parskip=0pt \rightskip=-\parindent \ttfinish} \def\Begintt{\bgroup \let\par=\endgraf \ttverbatim \parskip=0pt \rightskip=-\parindent \ttFinish} {\catcode`\|=0 |catcode`|\=\other |obeylines% |gdef|ttfinish#1^^M#2\endtt{#1|vbox{#2}|endgroup$$}% |gdef|ttFinish#1\Endtt{#1|endgroup|egroup}} \let\verticalbar| \def\activebar{\catcode`\|=\active} {\activebar \gdef\normalbar{\activebar \let|\verticalbar}} {\obeylines% \gdef\ttbar{\activebar% {\obeylines\gdef|{\ttverbatim% \spaceskip=\ttglue% \let^^M=\ \let|=\endgroup}}}} \let\WCX\Begintt \catcode`\@=12 fweb-1.62/Manual/texinfo.tex100644 10061 1115 506045 6602703127 15204 0ustar krommesusers% texinfo.tex -- TeX macros to handle Texinfo files. % $Id: texinfo.tex,v 2.227 1998/02/25 22:54:34 karl Exp $ % % Copyright (C) 1985, 86, 88, 90, 91, 92, 93, 94, 95, 96, 97, 98 % Free Software Foundation, Inc. % % This texinfo.tex file is free software; you can redistribute it and/or % modify it under the terms of the GNU General Public License as % published by the Free Software Foundation; either version 2, or (at % your option) any later version. % % This texinfo.tex file 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 GNU % General Public License for more details. % % You should have received a copy of the GNU General Public License % along with this texinfo.tex file; see the file COPYING. If not, write % to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, % Boston, MA 02111-1307, USA. % % In other words, you are welcome to use, share and improve this program. % You are forbidden to forbid anyone else to use, share and improve % what you give them. Help stamp out software-hoarding! % % Please try the latest version of texinfo.tex before submitting bug % reports; you can get the latest version from: % ftp://ftp.cs.umb.edu/pub/tex/texinfo.tex % /home/gd/gnu/doc/texinfo.tex on the GNU machines. % % Send bug reports to bug-texinfo@gnu.org. % Please include a precise test case in each bug report, % including a complete document with which we can reproduce the problem. % % Texinfo macros (with @macro) are *not* supported by texinfo.tex. You % have to run makeinfo -E to expand macros first; the texi2dvi script % does this. % Make it possible to create a .fmt file just by loading this file: % if the underlying format is not loaded, start by loading it now. % Added by gildea November 1993. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi % This automatically updates the version number based on RCS. \def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}} \deftexinfoversion$Revision: 2.227 $ \message{Loading texinfo package [Version \texinfoversion]:} % If in a .fmt file, print the version number % and turn on active characters that we couldn't do earlier because % they might have appeared in the input file name. \everyjob{\message{[Texinfo version \texinfoversion]}\message{} \catcode`+=\active \catcode`\_=\active} % Save some parts of plain tex whose names we will redefine. \let\ptexb=\b \let\ptexbullet=\bullet \let\ptexc=\c \let\ptexcomma=\, \let\ptexdot=\. \let\ptexdots=\dots \let\ptexend=\end \let\ptexequiv=\equiv \let\ptexexclam=\! \let\ptexi=\i \let\ptexlbrace=\{ \let\ptexrbrace=\} \let\ptexstar=\* \let\ptext=\t % Be sure we're in horizontal mode when doing a tie, since we make space % equivalent to this in @example-like environments. Otherwise, a space % at the beginning of a line will start with \penalty -- and % since \penalty is valid in vertical mode, we'd end up putting the % penalty on the vertical list instead of in the new paragraph. {\catcode`@ = 11 % Avoid using \@M directly, because that causes trouble % if the definition is written into an index file. \global\let\tiepenalty = \@M \gdef\tie{\leavevmode\penalty\tiepenalty\ } } \message{Basics,} \chardef\other=12 % If this character appears in an error message or help string, it % starts a new line in the output. \newlinechar = `^^J % Set up fixed words for English. \ifx\putwordChapter\undefined{\gdef\putwordChapter{Chapter}}\fi% \def\putwordInfo{Info}% \ifx\putwordSee\undefined{\gdef\putwordSee{See}}\fi% \ifx\putwordsee\undefined{\gdef\putwordsee{see}}\fi% \ifx\putwordfile\undefined{\gdef\putwordfile{file}}\fi% \ifx\putwordpage\undefined{\gdef\putwordpage{page}}\fi% \ifx\putwordsection\undefined{\gdef\putwordsection{section}}\fi% \ifx\putwordSection\undefined{\gdef\putwordSection{Section}}\fi% \ifx\putwordTableofContents\undefined{\gdef\putwordTableofContents{Table of Contents}}\fi% \ifx\putwordShortContents\undefined{\gdef\putwordShortContents{Short Contents}}\fi% \ifx\putwordAppendix\undefined{\gdef\putwordAppendix{Appendix}}\fi% % Ignore a token. % \def\gobble#1{} \hyphenation{ap-pen-dix} \hyphenation{mini-buf-fer mini-buf-fers} \hyphenation{eshell} \hyphenation{white-space} % Margin to add to right of even pages, to left of odd pages. \newdimen \bindingoffset \newdimen \normaloffset \newdimen\pagewidth \newdimen\pageheight % Sometimes it is convenient to have everything in the transcript file % and nothing on the terminal. We don't just call \tracingall here, % since that produces some useless output on the terminal. % \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% \def\loggingall{\tracingcommands2 \tracingstats2 \tracingpages1 \tracingoutput1 \tracinglostchars1 \tracingmacros2 \tracingparagraphs1 \tracingrestores1 \showboxbreadth\maxdimen\showboxdepth\maxdimen }% % For @cropmarks command. % Do @cropmarks to get crop marks. % \newif\ifcropmarks \let\cropmarks = \cropmarkstrue % % Dimensions to add cropmarks at corners. % Added by P. A. MacKay, 12 Nov. 1986 % \newdimen\cornerlong \newdimen\cornerthick \newdimen\topandbottommargin \newdimen\outerhsize \newdimen\outervsize \cornerlong=1pc\cornerthick=.3pt % These set size of cropmarks \outerhsize=7in %\outervsize=9.5in % Alternative @smallbook page size is 9.25in \outervsize=9.25in \topandbottommargin=.75in % Main output routine. \chardef\PAGE = 255 \output = {\onepageout{\pagecontents\PAGE}} \newbox\headlinebox \newbox\footlinebox % \onepageout takes a vbox as an argument. Note that \pagecontents % does insertions, but you have to call it yourself. \def\onepageout#1{% \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi % \ifodd\pageno \advance\hoffset by \bindingoffset \else \advance\hoffset by -\bindingoffset\fi % % Do this outside of the \shipout so @code etc. will be expanded in % the headline as they should be, not taken literally (outputting ''code). \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% % {% % Have to do this stuff outside the \shipout because we want it to % take effect in \write's, yet the group defined by the \vbox ends % before the \shipout runs. % \escapechar = `\\ % use backslash in output files. \indexdummies % don't expand commands in the output. \normalturnoffactive % \ in index entries must not stay \, e.g., if % the page break happens to be in the middle of an example. \shipout\vbox{% \ifcropmarks \vbox to \outervsize\bgroup \hsize = \outerhsize \line{\ewtop\hfil\ewtop}% \nointerlineskip \line{% \vbox{\moveleft\cornerthick\nstop}% \hfill \vbox{\moveright\cornerthick\nstop}% }% \vskip\topandbottommargin \line\bgroup \hfil % center the page within the outer (page) hsize. \ifodd\pageno\hskip\bindingoffset\fi \vbox\bgroup \fi % \unvbox\headlinebox \pagebody{#1}% \ifdim\ht\footlinebox > 0pt % Only leave this space if the footline is nonempty. % (We lessened \vsize for it in \oddfootingxxx.) % The \baselineskip=24pt in plain's \makefootline has no effect. \vskip 2\baselineskip \unvbox\footlinebox \fi % \ifcropmarks \egroup % end of \vbox\bgroup \hfil\egroup % end of (centering) \line\bgroup \vskip\topandbottommargin plus1fill minus1fill \boxmaxdepth = \cornerthick \line{% \vbox{\moveleft\cornerthick\nsbot}% \hfill \vbox{\moveright\cornerthick\nsbot}% }% \nointerlineskip \line{\ewbot\hfil\ewbot}% \egroup % \vbox from first cropmarks clause \fi }% end of \shipout\vbox }% end of group with \turnoffactive \advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi } \newinsert\margin \dimen\margin=\maxdimen \def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} {\catcode`\@ =11 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi % marginal hacks, juha@viisa.uucp (Juha Takala) \ifvoid\margin\else % marginal info is present \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi \dimen@=\dp#1 \unvbox#1 \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi \ifr@ggedbottom \kern-\dimen@ \vfil \fi} } % Here are the rules for the cropmarks. Note that they are % offset so that the space between them is truly \outerhsize or \outervsize % (P. A. MacKay, 12 November, 1986) % \def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} \def\nstop{\vbox {\hrule height\cornerthick depth\cornerlong width\cornerthick}} \def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} \def\nsbot{\vbox {\hrule height\cornerlong depth\cornerthick width\cornerthick}} % Parse an argument, then pass it to #1. The argument is the rest of % the input line (except we remove a trailing comment). #1 should be a % macro which expects an ordinary undelimited TeX argument. % \def\parsearg#1{% \let\next = #1% \begingroup \obeylines \futurelet\temp\parseargx } % If the next token is an obeyed space (from an @example environment or % the like), remove it and recurse. Otherwise, we're done. \def\parseargx{% % \obeyedspace is defined far below, after the definition of \sepspaces. \ifx\obeyedspace\temp \expandafter\parseargdiscardspace \else \expandafter\parseargline \fi } % Remove a single space (as the delimiter token to the macro call). {\obeyspaces % \gdef\parseargdiscardspace {\futurelet\temp\parseargx}} {\obeylines % \gdef\parseargline#1^^M{% \endgroup % End of the group started in \parsearg. % % First remove any @c comment, then any @comment. % Result of each macro is put in \toks0. \argremovec #1\c\relax % \expandafter\argremovecomment \the\toks0 \comment\relax % % % Call the caller's macro, saved as \next in \parsearg. \expandafter\next\expandafter{\the\toks0}% }% } % Since all \c{,omment} does is throw away the argument, we can let TeX % do that for us. The \relax here is matched by the \relax in the call % in \parseargline; it could be more or less anything, its purpose is % just to delimit the argument to the \c. \def\argremovec#1\c#2\relax{\toks0 = {#1}} \def\argremovecomment#1\comment#2\relax{\toks0 = {#1}} % \argremovec{,omment} might leave us with trailing spaces, though; e.g., % @end itemize @c foo % will have two active spaces as part of the argument with the % `itemize'. Here we remove all active spaces from #1, and assign the % result to \toks0. % % This loses if there are any *other* active characters besides spaces % in the argument -- _ ^ +, for example -- since they get expanded. % Fortunately, Texinfo does not define any such commands. (If it ever % does, the catcode of the characters in questionwill have to be changed % here.) But this means we cannot call \removeactivespaces as part of % \argremovec{,omment}, since @c uses \parsearg, and thus the argument % that \parsearg gets might well have any character at all in it. % \def\removeactivespaces#1{% \begingroup \ignoreactivespaces \edef\temp{#1}% \global\toks0 = \expandafter{\temp}% \endgroup } % Change the active space to expand to nothing. % \begingroup \obeyspaces \gdef\ignoreactivespaces{\obeyspaces\let =\empty} \endgroup \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} %% These are used to keep @begin/@end levels from running away %% Call \inENV within environments (after a \begingroup) \newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi} \def\ENVcheck{% \ifENV\errmessage{Still within an environment. Type Return to continue.} \endgroup\fi} % This is not perfect, but it should reduce lossage % @begin foo is the same as @foo, for now. \newhelp\EMsimple{Type to continue.} \outer\def\begin{\parsearg\beginxxx} \def\beginxxx #1{% \expandafter\ifx\csname #1\endcsname\relax {\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else \csname #1\endcsname\fi} % @end foo executes the definition of \Efoo. % \def\end{\parsearg\endxxx} \def\endxxx #1{% \removeactivespaces{#1}% \edef\endthing{\the\toks0}% % \expandafter\ifx\csname E\endthing\endcsname\relax \expandafter\ifx\csname \endthing\endcsname\relax % There's no \foo, i.e., no ``environment'' foo. \errhelp = \EMsimple \errmessage{Undefined command `@end \endthing'}% \else \unmatchedenderror\endthing \fi \else % Everything's ok; the right environment has been started. \csname E\endthing\endcsname \fi } % There is an environment #1, but it hasn't been started. Give an error. % \def\unmatchedenderror#1{% \errhelp = \EMsimple \errmessage{This `@end #1' doesn't have a matching `@#1'}% } % Define the control sequence \E#1 to give an unmatched @end error. % \def\defineunmatchedend#1{% \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}% } % Single-spacing is done by various environments (specifically, in % \nonfillstart and \quotations). \newskip\singlespaceskip \singlespaceskip = 12.5pt \def\singlespace{% % Why was this kern here? It messes up equalizing space above and below % environments. --karl, 6may93 %{\advance \baselineskip by -\singlespaceskip %\kern \baselineskip}% \setleading \singlespaceskip } %% Simple single-character @ commands % @@ prints an @ % Kludge this until the fonts are right (grr). \def\@{{\tt \char '100}} % This is turned off because it was never documented % and you can use @w{...} around a quote to suppress ligatures. %% Define @` and @' to be the same as ` and ' %% but suppressing ligatures. %\def\`{{`}} %\def\'{{'}} % Used to generate quoted braces. \def\mylbrace {{\tt \char '173}} \def\myrbrace {{\tt \char '175}} \let\{=\mylbrace \let\}=\myrbrace \begingroup % Definitions to produce actual \{ & \} command in an index. \catcode`\{ = 12 \catcode`\} = 12 \catcode`\[ = 1 \catcode`\] = 2 \catcode`\@ = 0 \catcode`\\ = 12 @gdef@lbracecmd[\{]% @gdef@rbracecmd[\}]% @endgroup % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent % Others are defined by plain TeX: @` @' @" @^ @~ @= @v @H. \let\, = \c \let\dotaccent = \. \def\ringaccent#1{{\accent23 #1}} \let\tieaccent = \t \let\ubaraccent = \b \let\udotaccent = \d % Other special characters: @questiondown @exclamdown % Plain TeX defines: @AA @AE @O @OE @L (and lowercase versions) @ss. \def\questiondown{?`} \def\exclamdown{!`} % Dotless i and dotless j, used for accents. \def\imacro{i} \def\jmacro{j} \def\dotless#1{% \def\temp{#1}% \ifx\temp\imacro \ptexi \else\ifx\temp\jmacro \j \else \errmessage{@dotless can be used only with i or j}% \fi\fi } % @: forces normal size whitespace following. \def\:{\spacefactor=1000 } % @* forces a line break. \def\*{\hfil\break\hbox{}\ignorespaces} % @. is an end-of-sentence period. \def\.{.\spacefactor=3000 } % @! is an end-of-sentence bang. \def\!{!\spacefactor=3000 } % @? is an end-of-sentence query. \def\?{?\spacefactor=3000 } % @w prevents a word break. Without the \leavevmode, @w at the % beginning of a paragraph, when TeX is still in vertical mode, would % produce a whole line of output instead of starting the paragraph. \def\w#1{\leavevmode\hbox{#1}} % @group ... @end group forces ... to be all on one page, by enclosing % it in a TeX vbox. We use \vtop instead of \vbox to construct the box % to keep its height that of a normal line. According to the rules for % \topskip (p.114 of the TeXbook), the glue inserted is % max (\topskip - \ht (first item), 0). If that height is large, % therefore, no glue is inserted, and the space between the headline and % the text is small, which looks bad. % \def\group{\begingroup \ifnum\catcode13=\active \else \errhelp = \groupinvalidhelp \errmessage{@group invalid in context where filling is enabled}% \fi % % The \vtop we start below produces a box with normal height and large % depth; thus, TeX puts \baselineskip glue before it, and (when the % next line of text is done) \lineskip glue after it. (See p.82 of % the TeXbook.) Thus, space below is not quite equal to space % above. But it's pretty close. \def\Egroup{% \egroup % End the \vtop. \endgroup % End the \group. }% % \vtop\bgroup % We have to put a strut on the last line in case the @group is in % the midst of an example, rather than completely enclosing it. % Otherwise, the interline space between the last line of the group % and the first line afterwards is too small. But we can't put the % strut in \Egroup, since there it would be on a line by itself. % Hence this just inserts a strut at the beginning of each line. \everypar = {\strut}% % % Since we have a strut on every line, we don't need any of TeX's % normal interline spacing. \offinterlineskip % % OK, but now we have to do something about blank % lines in the input in @example-like environments, which normally % just turn into \lisppar, which will insert no space now that we've % turned off the interline space. Simplest is to make them be an % empty paragraph. \ifx\par\lisppar \edef\par{\leavevmode \par}% % % Reset ^^M's definition to new definition of \par. \obeylines \fi % % Do @comment since we are called inside an environment such as % @example, where each end-of-line in the input causes an % end-of-line in the output. We don't want the end-of-line after % the `@group' to put extra space in the output. Since @group % should appear on a line by itself (according to the Texinfo % manual), we don't worry about eating any user text. \comment } % % TeX puts in an \escapechar (i.e., `@') at the beginning of the help % message, so this ends up printing `@group can only ...'. % \newhelp\groupinvalidhelp{% group can only be used in environments such as @example,^^J% where each line of input produces a line of output.} % @need space-in-mils % forces a page break if there is not space-in-mils remaining. \newdimen\mil \mil=0.001in \def\need{\parsearg\needx} % Old definition--didn't work. %\def\needx #1{\par % %% This method tries to make TeX break the page naturally %% if the depth of the box does not fit. %{\baselineskip=0pt% %\vtop to #1\mil{\vfil}\kern -#1\mil\penalty 10000 %\prevdepth=-1000pt %}} \def\needx#1{% % Go into vertical mode, so we don't make a big box in the middle of a % paragraph. \par % % Don't add any leading before our big empty box, but allow a page % break, since the best break might be right here. \allowbreak \nointerlineskip \vtop to #1\mil{\vfil}% % % TeX does not even consider page breaks if a penalty added to the % main vertical list is 10000 or more. But in order to see if the % empty box we just added fits on the page, we must make it consider % page breaks. On the other hand, we don't want to actually break the % page after the empty box. So we use a penalty of 9999. % % There is an extremely small chance that TeX will actually break the % page at this \penalty, if there are no other feasible breakpoints in % sight. (If the user is using lots of big @group commands, which % almost-but-not-quite fill up a page, TeX will have a hard time doing % good page breaking, for example.) However, I could not construct an % example where a page broke at this \penalty; if it happens in a real % document, then we can reconsider our strategy. \penalty9999 % % Back up by the size of the box, whether we did a page break or not. \kern -#1\mil % % Do not allow a page break right after this kern. \nobreak } % @br forces paragraph break \let\br = \par % @dots{} output an ellipsis using the current font. % We do .5em per period so that it has the same spacing in a typewriter % font as three actual period characters. % \def\dots{\hbox to 1.5em{% \hskip 0pt plus 0.25fil minus 0.25fil .\hss.\hss.% \hskip 0pt plus 0.5fil minus 0.5fil }} % @enddots{} is an end-of-sentence ellipsis. % \def\enddots{% \hbox to 2em{% \hskip 0pt plus 0.25fil minus 0.25fil .\hss.\hss.\hss.% \hskip 0pt plus 0.5fil minus 0.5fil }% \spacefactor=3000 } % @page forces the start of a new page \def\page{\par\vfill\supereject} % @exdent text.... % outputs text on separate line in roman font, starting at standard page margin % This records the amount of indent in the innermost environment. % That's how much \exdent should take out. \newskip\exdentamount % This defn is used inside fill environments such as @defun. \def\exdent{\parsearg\exdentyyy} \def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}} % This defn is used inside nofill environments such as @example. \def\nofillexdent{\parsearg\nofillexdentyyy} \def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount \leftline{\hskip\leftskip{\rm#1}}}} % @inmargin{TEXT} puts TEXT in the margin next to the current paragraph. \def\inmargin#1{% \strut\vadjust{\nobreak\kern-\strutdepth \vtop to \strutdepth{\baselineskip\strutdepth\vss \llap{\rightskip=\inmarginspacing \vbox{\noindent #1}}\null}}} \newskip\inmarginspacing \inmarginspacing=1cm \def\strutdepth{\dp\strutbox} %\hbox{{\rm#1}}\hfil\break}} % @include file insert text of that file as input. % Allow normal characters that we make active in the argument (a file name). \def\include{\begingroup \catcode`\\=12 \catcode`~=12 \catcode`^=12 \catcode`_=12 \catcode`|=12 \catcode`<=12 \catcode`>=12 \catcode`+=12 \parsearg\includezzz} % Restore active chars for included file. \def\includezzz#1{\endgroup\begingroup % Read the included file in a group so nested @include's work. \def\thisfile{#1}% \input\thisfile \endgroup} \def\thisfile{} % @center line outputs that line, centered \def\center{\parsearg\centerzzz} \def\centerzzz #1{{\advance\hsize by -\leftskip \advance\hsize by -\rightskip \centerline{#1}}} % @sp n outputs n lines of vertical space \def\sp{\parsearg\spxxx} \def\spxxx #1{\vskip #1\baselineskip} % @comment ...line which is ignored... % @c is the same as @comment % @ignore ... @end ignore is another way to write a comment \def\comment{\catcode 64=\other \catcode 123=\other \catcode 125=\other% \parsearg \commentxxx} \def\commentxxx #1{\catcode 64=0 \catcode 123=1 \catcode 125=2 } \let\c=\comment % @paragraphindent is defined for the Info formatting commands only. \let\paragraphindent=\comment % Prevent errors for section commands. % Used in @ignore and in failing conditionals. \def\ignoresections{% \let\chapter=\relax \let\unnumbered=\relax \let\top=\relax \let\unnumberedsec=\relax \let\unnumberedsection=\relax \let\unnumberedsubsec=\relax \let\unnumberedsubsection=\relax \let\unnumberedsubsubsec=\relax \let\unnumberedsubsubsection=\relax \let\section=\relax \let\subsec=\relax \let\subsubsec=\relax \let\subsection=\relax \let\subsubsection=\relax \let\appendix=\relax \let\appendixsec=\relax \let\appendixsection=\relax \let\appendixsubsec=\relax \let\appendixsubsection=\relax \let\appendixsubsubsec=\relax \let\appendixsubsubsection=\relax \let\contents=\relax \let\smallbook=\relax \let\titlepage=\relax } % Used in nested conditionals, where we have to parse the Texinfo source % and so want to turn off most commands, in case they are used % incorrectly. % \def\ignoremorecommands{% \let\defcodeindex = \relax \let\defcv = \relax \let\deffn = \relax \let\deffnx = \relax \let\defindex = \relax \let\defivar = \relax \let\defmac = \relax \let\defmethod = \relax \let\defop = \relax \let\defopt = \relax \let\defspec = \relax \let\deftp = \relax \let\deftypefn = \relax \let\deftypefun = \relax \let\deftypevar = \relax \let\deftypevr = \relax \let\defun = \relax \let\defvar = \relax \let\defvr = \relax \let\ref = \relax \let\xref = \relax \let\printindex = \relax \let\pxref = \relax \let\settitle = \relax \let\setchapternewpage = \relax \let\setchapterstyle = \relax \let\everyheading = \relax \let\evenheading = \relax \let\oddheading = \relax \let\everyfooting = \relax \let\evenfooting = \relax \let\oddfooting = \relax \let\headings = \relax \let\include = \relax \let\lowersections = \relax \let\down = \relax \let\raisesections = \relax \let\up = \relax \let\set = \relax \let\clear = \relax \let\item = \relax } % Ignore @ignore ... @end ignore. % \def\ignore{\doignore{ignore}} % Ignore @ifinfo, @ifhtml, @ifnottex, @html, @menu, and @direntry text. % \def\ifinfo{\doignore{ifinfo}} \def\ifhtml{\doignore{ifhtml}} \def\ifnottex{\doignore{ifnottex}} \def\html{\doignore{html}} \def\menu{\doignore{menu}} \def\direntry{\doignore{direntry}} % Also ignore @macro ... @end macro. The user must run texi2dvi, % which runs makeinfo to do macro expansion. Ignore @unmacro, too. \def\macro{\doignore{macro}} \let\unmacro = \comment % @dircategory CATEGORY -- specify a category of the dir file % which this file should belong to. Ignore this in TeX. \let\dircategory = \comment % Ignore text until a line `@end #1'. % \def\doignore#1{\begingroup % Don't complain about control sequences we have declared \outer. \ignoresections % % Define a command to swallow text until we reach `@end #1'. \long\def\doignoretext##1\end #1{\enddoignore}% % % Make sure that spaces turn into tokens that match what \doignoretext wants. \catcode32 = 10 % % Ignore braces, too, so mismatched braces don't cause trouble. \catcode`\{ = 9 \catcode`\} = 9 % % And now expand that command. \doignoretext } % What we do to finish off ignored text. % \def\enddoignore{\endgroup\ignorespaces}% \newif\ifwarnedobs\warnedobsfalse \def\obstexwarn{% \ifwarnedobs\relax\else % We need to warn folks that they may have trouble with TeX 3.0. % This uses \immediate\write16 rather than \message to get newlines. \immediate\write16{} \immediate\write16{***WARNING*** for users of Unix TeX 3.0!} \immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).} \immediate\write16{If you are running another version of TeX, relax.} \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.} \immediate\write16{ Then upgrade your TeX installation if you can.} \immediate\write16{ (See ftp://ftp.gnu.ai.mit.edu/pub/gnu/TeX.README.)} \immediate\write16{If you are stuck with version 3.0, run the} \immediate\write16{ script ``tex3patch'' from the Texinfo distribution} \immediate\write16{ to use a workaround.} \immediate\write16{} \global\warnedobstrue \fi } % **In TeX 3.0, setting text in \nullfont hangs tex. For a % workaround (which requires the file ``dummy.tfm'' to be installed), % uncomment the following line: %%%%%\font\nullfont=dummy\let\obstexwarn=\relax % Ignore text, except that we keep track of conditional commands for % purposes of nesting, up to an `@end #1' command. % \def\nestedignore#1{% \obstexwarn % We must actually expand the ignored text to look for the @end % command, so that nested ignore constructs work. Thus, we put the % text into a \vbox and then do nothing with the result. To minimize % the change of memory overflow, we follow the approach outlined on % page 401 of the TeXbook: make the current font be a dummy font. % \setbox0 = \vbox\bgroup % Don't complain about control sequences we have declared \outer. \ignoresections % % Define `@end #1' to end the box, which will in turn undefine the % @end command again. \expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}% % % We are going to be parsing Texinfo commands. Most cause no % trouble when they are used incorrectly, but some commands do % complicated argument parsing or otherwise get confused, so we % undefine them. % % We can't do anything about stray @-signs, unfortunately; % they'll produce `undefined control sequence' errors. \ignoremorecommands % % Set the current font to be \nullfont, a TeX primitive, and define % all the font commands to also use \nullfont. We don't use % dummy.tfm, as suggested in the TeXbook, because not all sites % might have that installed. Therefore, math mode will still % produce output, but that should be an extremely small amount of % stuff compared to the main input. % \nullfont \let\tenrm = \nullfont \let\tenit = \nullfont \let\tensl = \nullfont \let\tenbf = \nullfont \let\tentt = \nullfont \let\smallcaps = \nullfont \let\tensf = \nullfont % Similarly for index fonts (mostly for their use in % smallexample) \let\indrm = \nullfont \let\indit = \nullfont \let\indsl = \nullfont \let\indbf = \nullfont \let\indtt = \nullfont \let\indsc = \nullfont \let\indsf = \nullfont % % Don't complain when characters are missing from the fonts. \tracinglostchars = 0 % % Don't bother to do space factor calculations. \frenchspacing % % Don't report underfull hboxes. \hbadness = 10000 % % Do minimal line-breaking. \pretolerance = 10000 % % Do not execute instructions in @tex \def\tex{\doignore{tex}}% } % @set VAR sets the variable VAR to an empty value. % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. % % Since we want to separate VAR from REST-OF-LINE (which might be % empty), we can't just use \parsearg; we have to insert a space of our % own to delimit the rest of the line, and then take it out again if we % didn't need it. Make sure the catcode of space is correct to avoid % losing inside @example, for instance. % \def\set{\begingroup\catcode` =10 \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR. \parsearg\setxxx} \def\setxxx#1{\setyyy#1 \endsetyyy} \def\setyyy#1 #2\endsetyyy{% \def\temp{#2}% \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted. \fi \endgroup } % Can't use \xdef to pre-expand #2 and save some time, since \temp or % \next or other control sequences that we've defined might get us into % an infinite loop. Consider `@set foo @cite{bar}'. \def\setzzz#1#2 \endsetzzz{\expandafter\gdef\csname SET#1\endcsname{#2}} % @clear VAR clears (i.e., unsets) the variable VAR. % \def\clear{\parsearg\clearxxx} \def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax} % @value{foo} gets the text saved in variable foo. % \def\value{\begingroup \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR. \valuexxx} \def\valuexxx#1{% \expandafter\ifx\csname SET#1\endcsname\relax {\{No value for ``#1''\}}% \else \csname SET#1\endcsname \fi \endgroup} % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined % with @set. % \def\ifset{\parsearg\ifsetxxx} \def\ifsetxxx #1{% \expandafter\ifx\csname SET#1\endcsname\relax \expandafter\ifsetfail \else \expandafter\ifsetsucceed \fi } \def\ifsetsucceed{\conditionalsucceed{ifset}} \def\ifsetfail{\nestedignore{ifset}} \defineunmatchedend{ifset} % @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been % defined with @set, or has been undefined with @clear. % \def\ifclear{\parsearg\ifclearxxx} \def\ifclearxxx #1{% \expandafter\ifx\csname SET#1\endcsname\relax \expandafter\ifclearsucceed \else \expandafter\ifclearfail \fi } \def\ifclearsucceed{\conditionalsucceed{ifclear}} \def\ifclearfail{\nestedignore{ifclear}} \defineunmatchedend{ifclear} % @iftex, @ifnothtml, @ifnotinfo always succeed; we read the text % following, through the first @end iftex (etc.). Make `@end iftex' % (etc.) valid only after an @iftex. % \def\iftex{\conditionalsucceed{iftex}} \def\ifnothtml{\conditionalsucceed{ifnothtml}} \def\ifnotinfo{\conditionalsucceed{ifnotinfo}} \defineunmatchedend{iftex} \defineunmatchedend{ifnothtml} \defineunmatchedend{ifnotinfo} % We can't just want to start a group at @iftex (for example) and end it % at @end iftex, since then @set commands inside the conditional have no % effect (they'd get reverted at the end of the group). So we must % define \Eiftex to redefine itself to be its previous value. (We can't % just define it to fail again with an ``unmatched end'' error, since % the @ifset might be nested.) % \def\conditionalsucceed#1{% \edef\temp{% % Remember the current value of \E#1. \let\nece{prevE#1} = \nece{E#1}% % % At the `@end #1', redefine \E#1 to be its previous value. \def\nece{E#1}{\let\nece{E#1} = \nece{prevE#1}}% }% \temp } % We need to expand lots of \csname's, but we don't want to expand the % control sequences after we've constructed them. % \def\nece#1{\expandafter\noexpand\csname#1\endcsname} % @asis just yields its argument. Used with @table, for example. % \def\asis#1{#1} % @math means output in math mode. % We don't use $'s directly in the definition of \math because control % sequences like \math are expanded when the toc file is written. Then, % we read the toc file back, the $'s will be normal characters (as they % should be, according to the definition of Texinfo). So we must use a % control sequence to switch into and out of math mode. % % This isn't quite enough for @math to work properly in indices, but it % seems unlikely it will ever be needed there. % \let\implicitmath = $ \def\math#1{\implicitmath #1\implicitmath} % @bullet and @minus need the same treatment as @math, just above. \def\bullet{\implicitmath\ptexbullet\implicitmath} \def\minus{\implicitmath-\implicitmath} \def\node{\ENVcheck\parsearg\nodezzz} \def\nodezzz#1{\nodexxx [#1,]} \def\nodexxx[#1,#2]{\gdef\lastnode{#1}} \let\nwnode=\node \let\lastnode=\relax \def\donoderef{\ifx\lastnode\relax\else \expandafter\expandafter\expandafter\setref{\lastnode}\fi \global\let\lastnode=\relax} \def\unnumbnoderef{\ifx\lastnode\relax\else \expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi \global\let\lastnode=\relax} \def\appendixnoderef{\ifx\lastnode\relax\else \expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi \global\let\lastnode=\relax} % @refill is a no-op. \let\refill=\relax % @setfilename is done at the beginning of every texinfo file. % So open here the files we need to have open while reading the input. % This makes it possible to make a .fmt file for texinfo. \def\setfilename{% \readauxfile \opencontents \openindices \fixbackslash % Turn off hack to swallow `\input texinfo'. \global\let\setfilename=\comment % Ignore extra @setfilename cmds. % % If texinfo.cnf is present on the system, read it. % Useful for site-wide @afourpaper, etc. % Just to be on the safe side, close the input stream before the \input. \openin 1 texinfo.cnf \ifeof1 \let\temp=\relax \else \def\temp{\input texinfo.cnf }\fi \closein1 \temp % \comment % Ignore the actual filename. } % @bye. \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} % \def\macro#1{\begingroup\ignoresections\catcode`\#=6\def\macrotemp{#1}\parsearg\macroxxx} % \def\macroxxx#1#2 \end macro{% % \expandafter\gdef\macrotemp#1{#2}% % \endgroup} %\def\linemacro#1{\begingroup\ignoresections\catcode`\#=6\def\macrotemp{#1}\parsearg\linemacroxxx} %\def\linemacroxxx#1#2 \end linemacro{% %\let\parsearg=\relax %\edef\macrotempx{\csname M\butfirst\expandafter\string\macrotemp\endcsname}% %\expandafter\xdef\macrotemp{\parsearg\macrotempx}% %\expandafter\gdef\macrotempx#1{#2}% %\endgroup} %\def\butfirst#1{} \message{fonts,} % Font-change commands. % Texinfo supports the sans serif font style, which plain TeX does not. % So we set up a \sf analogous to plain's \rm, etc. \newfam\sffam \def\sf{\fam=\sffam \tensf} \let\li = \sf % Sometimes we call it \li, not \sf. % We don't need math for this one. \def\ttsl{\tenttsl} % Use Computer Modern fonts at \magstephalf (11pt). \newcount\mainmagstep \mainmagstep=\magstephalf % Set the font macro #1 to the font named #2, adding on the % specified font prefix (normally `cm'). % #3 is the font's design size, #4 is a scale factor \def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4} % Use cm as the default font prefix. % To specify the font prefix, you must define \fontprefix % before you read in texinfo.tex. \ifx\fontprefix\undefined \def\fontprefix{cm} \fi % Support font families that don't use the same naming scheme as CM. \def\rmshape{r} \def\rmbshape{bx} %where the normal face is bold \def\bfshape{b} \def\bxshape{bx} \def\ttshape{tt} \def\ttbshape{tt} \def\ttslshape{sltt} \def\itshape{ti} \def\itbshape{bxti} \def\slshape{sl} \def\slbshape{bxsl} \def\sfshape{ss} \def\sfbshape{ss} \def\scshape{csc} \def\scbshape{csc} \ifx\bigger\relax \let\mainmagstep=\magstep1 \setfont\textrm\rmshape{12}{1000} \setfont\texttt\ttshape{12}{1000} \else \setfont\textrm\rmshape{10}{\mainmagstep} \setfont\texttt\ttshape{10}{\mainmagstep} \fi % Instead of cmb10, you many want to use cmbx10. % cmbx10 is a prettier font on its own, but cmb10 % looks better when embedded in a line with cmr10. \setfont\textbf\bfshape{10}{\mainmagstep} \setfont\textit\itshape{10}{\mainmagstep} \setfont\textsl\slshape{10}{\mainmagstep} \setfont\textsf\sfshape{10}{\mainmagstep} \setfont\textsc\scshape{10}{\mainmagstep} \setfont\textttsl\ttslshape{10}{\mainmagstep} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep % A few fonts for @defun, etc. \setfont\defbf\bxshape{10}{\magstep1} %was 1314 \setfont\deftt\ttshape{10}{\magstep1} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf} % Fonts for indices and small examples (9pt). % We actually use the slanted font rather than the italic, % because texinfo normally uses the slanted fonts for that. % Do not make many font distinctions in general in the index, since they % aren't very useful. \setfont\ninett\ttshape{9}{1000} \setfont\indrm\rmshape{9}{1000} \setfont\indit\slshape{9}{1000} \let\indsl=\indit \let\indtt=\ninett \let\indttsl=\ninett \let\indsf=\indrm \let\indbf=\indrm \setfont\indsc\scshape{10}{900} \font\indi=cmmi9 \font\indsy=cmsy9 % Fonts for title page: \setfont\titlerm\rmbshape{12}{\magstep3} \setfont\titleit\itbshape{10}{\magstep4} \setfont\titlesl\slbshape{10}{\magstep4} \setfont\titlett\ttbshape{12}{\magstep3} \setfont\titlettsl\ttslshape{10}{\magstep4} \setfont\titlesf\sfbshape{17}{\magstep1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\authorrm{\secrm} % Chapter (and unnumbered) fonts (17.28pt). \setfont\chaprm\rmbshape{12}{\magstep2} \setfont\chapit\itbshape{10}{\magstep3} \setfont\chapsl\slbshape{10}{\magstep3} \setfont\chaptt\ttbshape{12}{\magstep2} \setfont\chapttsl\ttslshape{10}{\magstep3} \setfont\chapsf\sfbshape{17}{1000} \let\chapbf=\chaprm \setfont\chapsc\scbshape{10}{\magstep3} \font\chapi=cmmi12 scaled \magstep2 \font\chapsy=cmsy10 scaled \magstep3 % Section fonts (14.4pt). \setfont\secrm\rmbshape{12}{\magstep1} \setfont\secit\itbshape{10}{\magstep2} \setfont\secsl\slbshape{10}{\magstep2} \setfont\sectt\ttbshape{12}{\magstep1} \setfont\secttsl\ttslshape{10}{\magstep2} \setfont\secsf\sfbshape{12}{\magstep1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep2} \font\seci=cmmi12 scaled \magstep1 \font\secsy=cmsy10 scaled \magstep2 % \setfont\ssecrm\bxshape{10}{\magstep1} % This size an font looked bad. % \setfont\ssecit\itshape{10}{\magstep1} % The letters were too crowded. % \setfont\ssecsl\slshape{10}{\magstep1} % \setfont\ssectt\ttshape{10}{\magstep1} % \setfont\ssecsf\sfshape{10}{\magstep1} %\setfont\ssecrm\bfshape{10}{1315} % Note the use of cmb rather than cmbx. %\setfont\ssecit\itshape{10}{1315} % Also, the size is a little larger than %\setfont\ssecsl\slshape{10}{1315} % being scaled magstep1. %\setfont\ssectt\ttshape{10}{1315} %\setfont\ssecsf\sfshape{10}{1315} %\let\ssecbf=\ssecrm % Subsection fonts (13.15pt). \setfont\ssecrm\rmbshape{12}{\magstephalf} \setfont\ssecit\itbshape{10}{1315} \setfont\ssecsl\slbshape{10}{1315} \setfont\ssectt\ttbshape{12}{\magstephalf} \setfont\ssecttsl\ttslshape{10}{1315} \setfont\ssecsf\sfbshape{12}{\magstephalf} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{\magstep1} \font\sseci=cmmi12 scaled \magstephalf \font\ssecsy=cmsy10 scaled 1315 % The smallcaps and symbol fonts should actually be scaled \magstep1.5, % but that is not a standard magnification. % In order for the font changes to affect most math symbols and letters, % we have to define the \textfont of the standard families. Since % texinfo doesn't allow for producing subscripts and superscripts, we % don't bother to reset \scriptfont and \scriptscriptfont (which would % also require loading a lot more fonts). % \def\resetmathfonts{% \textfont0 = \tenrm \textfont1 = \teni \textfont2 = \tensy \textfont\itfam = \tenit \textfont\slfam = \tensl \textfont\bffam = \tenbf \textfont\ttfam = \tentt \textfont\sffam = \tensf } % The font-changing commands redefine the meanings of \tenSTYLE, instead % of just \STYLE. We do this so that font changes will continue to work % in math mode, where it is the current \fam that is relevant in most % cases, not the current font. Plain TeX does \def\bf{\fam=\bffam % \tenbf}, for example. By redefining \tenbf, we obviate the need to % redefine \bf itself. \def\textfonts{% \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl \resetmathfonts} \def\titlefonts{% \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy \let\tenttsl=\titlettsl \resetmathfonts \setleading{25pt}} \def\titlefont#1{{\titlefonts\rm #1}} \def\chapfonts{% \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl \resetmathfonts \setleading{19pt}} \def\secfonts{% \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl \resetmathfonts \setleading{16pt}} \def\subsecfonts{% \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl \resetmathfonts \setleading{15pt}} \let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf? \def\indexfonts{% \let\tenrm=\indrm \let\tenit=\indit \let\tensl=\indsl \let\tenbf=\indbf \let\tentt=\indtt \let\smallcaps=\indsc \let\tensf=\indsf \let\teni=\indi \let\tensy=\indsy \let\tenttsl=\indttsl \resetmathfonts \setleading{12pt}} % Set up the default fonts, so we can use them for creating boxes. % \textfonts % Define these so they can be easily changed for other fonts. \def\angleleft{$\langle$} \def\angleright{$\rangle$} % Count depth in font-changes, for error checks \newcount\fontdepth \fontdepth=0 % Fonts for short table of contents. \setfont\shortcontrm\rmshape{12}{1000} \setfont\shortcontbf\bxshape{12}{1000} \setfont\shortcontsl\slshape{12}{1000} %% Add scribe-like font environments, plus @l for inline lisp (usually sans %% serif) and @ii for TeX italic % \smartitalic{ARG} outputs arg in italics, followed by an italic correction % unless the following character is such as not to need one. \def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi} \def\smartitalic#1{{\sl #1}\futurelet\next\smartitalicx} \let\i=\smartitalic \let\var=\smartitalic \let\dfn=\smartitalic \let\emph=\smartitalic \let\cite=\smartitalic \def\b#1{{\bf #1}} \let\strong=\b % We can't just use \exhyphenpenalty, because that only has effect at % the end of a paragraph. Restore normal hyphenation at the end of the % group within which \nohyphenation is presumably called. % \def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} \def\restorehyphenation{\hyphenchar\font = `- } \def\t#1{% {\tt \rawbackslash \frenchspacing #1}% \null } \let\ttfont=\t \def\samp#1{`\tclose{#1}'\null} \setfont\smallrm\rmshape{8}{1000} \font\smallsy=cmsy9 \def\key#1{{\smallrm\textfont2=\smallsy \leavevmode\hbox{% \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% \vbox{\hrule\kern-0.4pt \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% \kern-0.4pt\hrule}% \kern-.06em\raise0.4pt\hbox{\angleright}}}} % The old definition, with no lozenge: %\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null} \def\ctrl #1{{\tt \rawbackslash \hat}#1} \let\file=\samp % @code is a modification of @t, % which makes spaces the same size as normal in the surrounding text. \def\tclose#1{% {% % Change normal interword space to be same as for the current font. \spaceskip = \fontdimen2\font % % Switch to typewriter. \tt % % But `\ ' produces the large typewriter interword space. \def\ {\char`\ }% JAK % % Turn off hyphenation. \nohyphenation % \rawbackslash \frenchspacing #1% }% \null } % We *must* turn on hyphenation at `-' and `_' in \code. % Otherwise, it is too hard to avoid overfull hboxes % in the Emacs manual, the Library manual, etc. % Unfortunately, TeX uses one parameter (\hyphenchar) to control % both hyphenation at - and hyphenation within words. % We must therefore turn them both off (\tclose does that) % and arrange explicitly to hyphenate at a dash. % -- rms. { \catcode`\-=\active \catcode`\_=\active \catcode`\|=\active \global\def\code{\begingroup \catcode`\-=\active \let-\codedash \catcode`\_=\active \let_\codeunder \codex} % The following is used by \doprintindex to insure that long function names % wrap around. It is necessary for - and _ to be active before the index is % read from the file, as \entry parses the arguments long before \code is % ever called. -- mycroft % _ is always active; and it shouldn't be \let = to an _ that is a % subscript character anyway. Then, @cindex @samp{_} (for example) % fails. --karl \global\def\indexbreaks{% \catcode`\-=\active \let-\realdash } } \def\realdash{-} \def\codedash{-\discretionary{}{}{}} \def\codeunder{\ifusingtt{\normalunderscore\discretionary{}{}{}}{\_}} \def\codex #1{\tclose{#1}\endgroup} %\let\exp=\tclose %Was temporary % @kbd is like @code, except that if the argument is just one @key command, % then @kbd has no effect. % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), % `example' (@kbd uses ttsl only inside of @example and friends), % or `code' (@kbd uses normal tty font always). \def\kbdinputstyle{\parsearg\kbdinputstylexxx} \def\kbdinputstylexxx#1{% \def\arg{#1}% \ifx\arg\worddistinct \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% \else\ifx\arg\wordexample \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% \else\ifx\arg\wordcode \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% \fi\fi\fi } \def\worddistinct{distinct} \def\wordexample{example} \def\wordcode{code} % Default is kbdinputdistinct. (Too much of a hassle to call the macro, % the catcodes are wrong for parsearg to work.) \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl} \def\xkey{\key} \def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% \ifx\one\xkey\ifx\threex\three \key{#2}% \else{\tclose{\kbdfont\look}}\fi \else{\tclose{\kbdfont\look}}\fi} % @url. Quotes do not seem necessary, so use \code. \let\url=\code % @uref (abbreviation for `urlref') takes an optional second argument % specifying the text to display. First (mandatory) arg is the url. % Perhaps eventually put in a hypertex \special here. % \def\uref#1{\urefxxx #1,,\finish} \def\urefxxx#1,#2,#3\finish{% \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \unhbox0\ (\code{#1})% \else \code{#1}% \fi } % rms does not like the angle brackets --karl, 17may97. % So now @email is just like @uref. %\def\email#1{\angleleft{\tt #1}\angleright} \let\email=\uref % Check if we are currently using a typewriter font. Since all the % Computer Modern typewriter fonts have zero interword stretch (and % shrink), and it is reasonable to expect all typewriter fonts to have % this property, we can check that font parameter. % \def\ifmonospace{\ifdim\fontdimen3\font=0pt } % Typeset a dimension, e.g., `in' or `pt'. The only reason for the % argument is to make the input look right: @dmn{pt} instead of % @dmn{}pt. % \def\dmn#1{\thinspace #1} \def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par} % @l was never documented to mean ``switch to the Lisp font'', % and it is not used as such in any manual I can find. We need it for % Polish suppressed-l. --karl, 22sep96. %\def\l#1{{\li #1}\null} \def\r#1{{\rm #1}} % roman font % Use of \lowercase was suggested. \def\sc#1{{\smallcaps#1}} % smallcaps font \def\ii#1{{\it #1}} % italic font % @pounds{} is a sterling sign. \def\pounds{{\it\$}} \message{page headings,} \newskip\titlepagetopglue \titlepagetopglue = 1.5in \newskip\titlepagebottomglue \titlepagebottomglue = 2pc % First the title page. Must do @settitle before @titlepage. \newif\ifseenauthor \newif\iffinishedtitlepage \def\shorttitlepage{\parsearg\shorttitlepagezzz} \def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% \endgroup\page\hbox{}\page} \def\titlepage{\begingroup \parindent=0pt \textfonts \let\subtitlerm=\tenrm % I deinstalled the following change because \cmr12 is undefined. % This change was not in the ChangeLog anyway. --rms. % \let\subtitlerm=\cmr12 \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}% % \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}% % % Leave some space at the very top of the page. \vglue\titlepagetopglue % % Now you can print the title using @title. \def\title{\parsearg\titlezzz}% \def\titlezzz##1{\leftline{\titlefonts\rm ##1} % print a rule at the page bottom also. \finishedtitlepagefalse \vskip4pt \hrule height 4pt width \hsize \vskip4pt}% % No rule at page bottom unless we print one at the top with @title. \finishedtitlepagetrue % % Now you can put text using @subtitle. \def\subtitle{\parsearg\subtitlezzz}% \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}% % % @author should come last, but may come many times. \def\author{\parsearg\authorzzz}% \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi {\authorfont \leftline{##1}}}% % % Most title ``pages'' are actually two pages long, with space % at the top of the second. We don't want the ragged left on the second. \let\oldpage = \page \def\page{% \iffinishedtitlepage\else \finishtitlepage \fi \oldpage \let\page = \oldpage \hbox{}}% % \def\page{\oldpage \hbox{}} } \def\Etitlepage{% \iffinishedtitlepage\else \finishtitlepage \fi % It is important to do the page break before ending the group, % because the headline and footline are only empty inside the group. % If we use the new definition of \page, we always get a blank page % after the title page, which we certainly don't want. \oldpage \endgroup \HEADINGSon } \def\finishtitlepage{% \vskip4pt \hrule height 2pt width \hsize \vskip\titlepagebottomglue \finishedtitlepagetrue } %%% Set up page headings and footings. \let\thispage=\folio \newtoks \evenheadline % Token sequence for heading line of even pages \newtoks \oddheadline % Token sequence for heading line of odd pages \newtoks \evenfootline % Token sequence for footing line of even pages \newtoks \oddfootline % Token sequence for footing line of odd pages % Now make Tex use those variables \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline \else \the\evenheadline \fi}} \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline \else \the\evenfootline \fi}\HEADINGShook} \let\HEADINGShook=\relax % Commands to set those variables. % For example, this is what @headings on does % @evenheading @thistitle|@thispage|@thischapter % @oddheading @thischapter|@thispage|@thistitle % @evenfooting @thisfile|| % @oddfooting ||@thisfile \def\evenheading{\parsearg\evenheadingxxx} \def\oddheading{\parsearg\oddheadingxxx} \def\everyheading{\parsearg\everyheadingxxx} \def\evenfooting{\parsearg\evenfootingxxx} \def\oddfooting{\parsearg\oddfootingxxx} \def\everyfooting{\parsearg\everyfootingxxx} {\catcode`\@=0 % \gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish} \gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{% \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish} \gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{% \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \gdef\everyheadingxxx#1{\oddheadingxxx{#1}\evenheadingxxx{#1}}% \gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish} \gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{% \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish} \gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{% \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% % % Leave some space for the footline. Hopefully ok to assume % @evenfooting will not be used by itself. \global\advance\pageheight by -\baselineskip \global\advance\vsize by -\baselineskip } \gdef\everyfootingxxx#1{\oddfootingxxx{#1}\evenfootingxxx{#1}} % }% unbind the catcode of @. % @headings double turns headings on for double-sided printing. % @headings single turns headings on for single-sided printing. % @headings off turns them off. % @headings on same as @headings double, retained for compatibility. % @headings after turns on double-sided headings after this page. % @headings doubleafter turns on double-sided headings after this page. % @headings singleafter turns on single-sided headings after this page. % By default, they are off at the start of a document, % and turned `on' after @end titlepage. \def\headings #1 {\csname HEADINGS#1\endcsname} \def\HEADINGSoff{ \global\evenheadline={\hfil} \global\evenfootline={\hfil} \global\oddheadline={\hfil} \global\oddfootline={\hfil}} \HEADINGSoff % When we turn headings on, set the page number to 1. % For double-sided printing, put current file name in lower left corner, % chapter name on inside top of right hand pages, document % title on inside top of left hand pages, and page numbers on outside top % edge of all pages. \def\HEADINGSdouble{ \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \let\contentsalignmacro = \chappager % For single-sided printing, chapter title goes across top left of page, % page number on top right. \def\HEADINGSsingle{ \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } \def\HEADINGSon{\HEADINGSdouble} \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} \let\HEADINGSdoubleafter=\HEADINGSafter \def\HEADINGSdoublex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} \def\HEADINGSsinglex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } % Subroutines used in generating headings % Produces Day Month Year style of output. \def\today{\number\day\space \ifcase\month\or January\or February\or March\or April\or May\or June\or July\or August\or September\or October\or November\or December\fi \space\number\year} % Use this if you want the Month Day, Year style of output. %\def\today{\ifcase\month\or %January\or February\or March\or April\or May\or June\or %July\or August\or September\or October\or November\or December\fi %\space\number\day, \number\year} % @settitle line... specifies the title of the document, for headings % It generates no output of its own \def\thistitle{No Title} \def\settitle{\parsearg\settitlezzz} \def\settitlezzz #1{\gdef\thistitle{#1}} \message{tables,} % @tabs -- simple alignment % These don't work. For one thing, \+ is defined as outer. % So these macros cannot even be defined. %\def\tabs{\parsearg\tabszzz} %\def\tabszzz #1{\settabs\+#1\cr} %\def\tabline{\parsearg\tablinezzz} %\def\tablinezzz #1{\+#1\cr} %\def\&{&} % Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x). % default indentation of table text \newdimen\tableindent \tableindent=.8in % default indentation of @itemize and @enumerate text \newdimen\itemindent \itemindent=.3in % margin between end of table item and start of table text. \newdimen\itemmargin \itemmargin=.1in % used internally for \itemindent minus \itemmargin \newdimen\itemmax % Note @table, @vtable, and @vtable define @item, @itemx, etc., with % these defs. % They also define \itemindex % to index the item name in whatever manner is desired (perhaps none). \newif\ifitemxneedsnegativevskip \def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} \def\internalBitem{\smallbreak \parsearg\itemzzz} \def\internalBitemx{\itemxpar \parsearg\itemzzz} \def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz} \def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz} \def\internalBkitem{\smallbreak \parsearg\kitemzzz} \def\internalBkitemx{\itemxpar \parsearg\kitemzzz} \def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}% \itemzzz {#1}} \def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}% \itemzzz {#1}} \def\itemzzz #1{\begingroup % \advance\hsize by -\rightskip \advance\hsize by -\tableindent \setbox0=\hbox{\itemfont{#1}}% \itemindex{#1}% \nobreak % This prevents a break before @itemx. % % Be sure we are not still in the middle of a paragraph. %{\parskip = 0in %\par %}% % % If the item text does not fit in the space we have, put it on a line % by itself, and do not allow a page break either before or after that % line. We do not start a paragraph here because then if the next % command is, e.g., @kindex, the whatsit would get put into the % horizontal list on a line by itself, resulting in extra blank space. \ifdim \wd0>\itemmax % % Make this a paragraph so we get the \parskip glue and wrapping, % but leave it ragged-right. \begingroup \advance\leftskip by-\tableindent \advance\hsize by\tableindent \advance\rightskip by0pt plus1fil \leavevmode\unhbox0\par \endgroup % % We're going to be starting a paragraph, but we don't want the % \parskip glue -- logically it's part of the @item we just started. \nobreak \vskip-\parskip % % Stop a page break at the \parskip glue coming up. Unfortunately % we can't prevent a possible page break at the following % \baselineskip glue. \nobreak \endgroup \itemxneedsnegativevskipfalse \else % The item text fits into the space. Start a paragraph, so that the % following text (if any) will end up on the same line. Since that % text will be indented by \tableindent, we make the item text be in % a zero-width box. \noindent \rlap{\hskip -\tableindent\box0}\ignorespaces% \endgroup% \itemxneedsnegativevskiptrue% \fi } \def\item{\errmessage{@item while not in a table}} \def\itemx{\errmessage{@itemx while not in a table}} \def\kitem{\errmessage{@kitem while not in a table}} \def\kitemx{\errmessage{@kitemx while not in a table}} \def\xitem{\errmessage{@xitem while not in a table}} \def\xitemx{\errmessage{@xitemx while not in a table}} %% Contains a kludge to get @end[description] to work \def\description{\tablez{\dontindex}{1}{}{}{}{}} \def\table{\begingroup\inENV\obeylines\obeyspaces\tablex} {\obeylines\obeyspaces% \gdef\tablex #1^^M{% \tabley\dontindex#1 \endtabley}} \def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex} {\obeylines\obeyspaces% \gdef\ftablex #1^^M{% \tabley\fnitemindex#1 \endtabley \def\Eftable{\endgraf\afterenvbreak\endgroup}% \let\Etable=\relax}} \def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex} {\obeylines\obeyspaces% \gdef\vtablex #1^^M{% \tabley\vritemindex#1 \endtabley \def\Evtable{\endgraf\afterenvbreak\endgroup}% \let\Etable=\relax}} \def\dontindex #1{} \def\fnitemindex #1{\doind {fn}{\code{#1}}}% \def\vritemindex #1{\doind {vr}{\code{#1}}}% {\obeyspaces % \gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup% \tablez{#1}{#2}{#3}{#4}{#5}{#6}}} \def\tablez #1#2#3#4#5#6{% \aboveenvbreak % \begingroup % \def\Edescription{\Etable}% Necessary kludge. \let\itemindex=#1% \ifnum 0#3>0 \advance \leftskip by #3\mil \fi % \ifnum 0#4>0 \tableindent=#4\mil \fi % \ifnum 0#5>0 \advance \rightskip by #5\mil \fi % \def\itemfont{#2}% \itemmax=\tableindent % \advance \itemmax by -\itemmargin % \advance \leftskip by \tableindent % \exdentamount=\tableindent \parindent = 0pt \parskip = \smallskipamount \ifdim \parskip=0pt \parskip=2pt \fi% \def\Etable{\endgraf\afterenvbreak\endgroup}% \let\item = \internalBitem % \let\itemx = \internalBitemx % \let\kitem = \internalBkitem % \let\kitemx = \internalBkitemx % \let\xitem = \internalBxitem % \let\xitemx = \internalBxitemx % } % This is the counter used by @enumerate, which is really @itemize \newcount \itemno \def\itemize{\parsearg\itemizezzz} \def\itemizezzz #1{% \begingroup % ended by the @end itemsize \itemizey {#1}{\Eitemize} } \def\itemizey #1#2{% \aboveenvbreak % \itemmax=\itemindent % \advance \itemmax by -\itemmargin % \advance \leftskip by \itemindent % \exdentamount=\itemindent \parindent = 0pt % \parskip = \smallskipamount % \ifdim \parskip=0pt \parskip=2pt \fi% \def#2{\endgraf\afterenvbreak\endgroup}% \def\itemcontents{#1}% \let\item=\itemizeitem} % Set sfcode to normal for the chars that usually have another value. % These are `.?!:;,' \def\frenchspacing{\sfcode46=1000 \sfcode63=1000 \sfcode33=1000 \sfcode58=1000 \sfcode59=1000 \sfcode44=1000 } % \splitoff TOKENS\endmark defines \first to be the first token in % TOKENS, and \rest to be the remainder. % \def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% % Allow an optional argument of an uppercase letter, lowercase letter, % or number, to specify the first label in the enumerated list. No % argument is the same as `1'. % \def\enumerate{\parsearg\enumeratezzz} \def\enumeratezzz #1{\enumeratey #1 \endenumeratey} \def\enumeratey #1 #2\endenumeratey{% \begingroup % ended by the @end enumerate % % If we were given no argument, pretend we were given `1'. \def\thearg{#1}% \ifx\thearg\empty \def\thearg{1}\fi % % Detect if the argument is a single token. If so, it might be a % letter. Otherwise, the only valid thing it can be is a number. % (We will always have one token, because of the test we just made. % This is a good thing, since \splitoff doesn't work given nothing at % all -- the first parameter is undelimited.) \expandafter\splitoff\thearg\endmark \ifx\rest\empty % Only one token in the argument. It could still be anything. % A ``lowercase letter'' is one whose \lccode is nonzero. % An ``uppercase letter'' is one whose \lccode is both nonzero, and % not equal to itself. % Otherwise, we assume it's a number. % % We need the \relax at the end of the \ifnum lines to stop TeX from % continuing to look for a . % \ifnum\lccode\expandafter`\thearg=0\relax \numericenumerate % a number (we hope) \else % It's a letter. \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax \lowercaseenumerate % lowercase letter \else \uppercaseenumerate % uppercase letter \fi \fi \else % Multiple tokens in the argument. We hope it's a number. \numericenumerate \fi } % An @enumerate whose labels are integers. The starting integer is % given in \thearg. % \def\numericenumerate{% \itemno = \thearg \startenumeration{\the\itemno}% } % The starting (lowercase) letter is in \thearg. \def\lowercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more lowercase letters in @enumerate; get a bigger alphabet}% \fi \char\lccode\itemno }% } % The starting (uppercase) letter is in \thearg. \def\uppercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more uppercase letters in @enumerate; get a bigger alphabet} \fi \char\uccode\itemno }% } % Call itemizey, adding a period to the first argument and supplying the % common last two arguments. Also subtract one from the initial value in % \itemno, since @item increments \itemno. % \def\startenumeration#1{% \advance\itemno by -1 \itemizey{#1.}\Eenumerate\flushcr } % @alphaenumerate and @capsenumerate are abbreviations for giving an arg % to @enumerate. % \def\alphaenumerate{\enumerate{a}} \def\capsenumerate{\enumerate{A}} \def\Ealphaenumerate{\Eenumerate} \def\Ecapsenumerate{\Eenumerate} % Definition of @item while inside @itemize. \def\itemizeitem{% \advance\itemno by 1 {\let\par=\endgraf \smallbreak}% \ifhmode \errmessage{In hmode at itemizeitem}\fi {\parskip=0in \hskip 0pt \hbox to 0pt{\hss \itemcontents\hskip \itemmargin}% \vadjust{\penalty 1200}}% \flushcr} % @multitable macros % Amy Hendrickson, 8/18/94, 3/6/96 % % @multitable ... @end multitable will make as many columns as desired. % Contents of each column will wrap at width given in preamble. Width % can be specified either with sample text given in a template line, % or in percent of \hsize, the current width of text on page. % Table can continue over pages but will only break between lines. % To make preamble: % % Either define widths of columns in terms of percent of \hsize: % @multitable @columnfractions .25 .3 .45 % @item ... % % Numbers following @columnfractions are the percent of the total % current hsize to be used for each column. You may use as many % columns as desired. % Or use a template: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item ... % using the widest term desired in each column. % % For those who want to use more than one line's worth of words in % the preamble, break the line within one argument and it % will parse correctly, i.e., % % @multitable {Column 1 template} {Column 2 template} {Column 3 % template} % Not: % @multitable {Column 1 template} {Column 2 template} % {Column 3 template} % Each new table line starts with @item, each subsequent new column % starts with @tab. Empty columns may be produced by supplying @tab's % with nothing between them for as many times as empty columns are needed, % ie, @tab@tab@tab will produce two empty columns. % @item, @tab, @multitable or @end multitable do not need to be on their % own lines, but it will not hurt if they are. % Sample multitable: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item first col stuff @tab second col stuff @tab third col % @item % first col stuff % @tab % second col stuff % @tab % third col % @item first col stuff @tab second col stuff % @tab Many paragraphs of text may be used in any column. % % They will wrap at the width determined by the template. % @item@tab@tab This will be in third column. % @end multitable % Default dimensions may be reset by user. % @multitableparskip is vertical space between paragraphs in table. % @multitableparindent is paragraph indent in table. % @multitablecolmargin is horizontal space to be left between columns. % @multitablelinespace is space to leave between table items, baseline % to baseline. % 0pt means it depends on current normal line spacing. % \newskip\multitableparskip \newskip\multitableparindent \newdimen\multitablecolspace \newskip\multitablelinespace \multitableparskip=0pt \multitableparindent=6pt \multitablecolspace=12pt \multitablelinespace=0pt % Macros used to set up halign preamble: % \let\endsetuptable\relax \def\xendsetuptable{\endsetuptable} \let\columnfractions\relax \def\xcolumnfractions{\columnfractions} \newif\ifsetpercent % 2/1/96, to allow fractions to be given with more than one digit. \def\pickupwholefraction#1 {\global\advance\colcount by1 % \expandafter\xdef\csname col\the\colcount\endcsname{.#1\hsize}% \setuptable} \newcount\colcount \def\setuptable#1{\def\firstarg{#1}% \ifx\firstarg\xendsetuptable\let\go\relax% \else \ifx\firstarg\xcolumnfractions\global\setpercenttrue% \else \ifsetpercent \let\go\pickupwholefraction % In this case arg of setuptable % is the decimal point before the % number given in percent of hsize. % We don't need this so we don't use it. \else \global\advance\colcount by1 \setbox0=\hbox{#1 }% Add a normal word space as a separator; % typically that is always in the input, anyway. \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% \fi% \fi% \ifx\go\pickupwholefraction\else\let\go\setuptable\fi% \fi\go} % multitable syntax \def\tab{&\hskip1sp\relax} % 2/2/96 % tiny skip here makes sure this column space is % maintained, even if it is never used. % @multitable ... @end multitable definitions: \def\multitable{\parsearg\dotable} \def\dotable#1{\bgroup \vskip\parskip \let\item\crcr \tolerance=9500 \hbadness=9500 \setmultitablespacing \parskip=\multitableparskip \parindent=\multitableparindent \overfullrule=0pt \global\colcount=0 \def\Emultitable{\global\setpercentfalse\cr\egroup\egroup}% % % To parse everything between @multitable and @item: \setuptable#1 \endsetuptable % % \everycr will reset column counter, \colcount, at the end of % each line. Every column entry will cause \colcount to advance by one. % The table preamble % looks at the current \colcount to find the correct column width. \everycr{\noalign{% % % \filbreak%% keeps underfull box messages off when table breaks over pages. % Maybe so, but it also creates really weird page breaks when the table % breaks over pages. Wouldn't \vfil be better? Wait until the problem % manifests itself, so it can be fixed for real --karl. \global\colcount=0\relax}}% % % This preamble sets up a generic column definition, which will % be used as many times as user calls for columns. % \vtop will set a single line and will also let text wrap and % continue for many paragraphs if desired. \halign\bgroup&\global\advance\colcount by 1\relax \multistrut\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname % % In order to keep entries from bumping into each other % we will add a \leftskip of \multitablecolspace to all columns after % the first one. % % If a template has been used, we will add \multitablecolspace % to the width of each template entry. % % If the user has set preamble in terms of percent of \hsize we will % use that dimension as the width of the column, and the \leftskip % will keep entries from bumping into each other. Table will start at % left margin and final column will justify at right margin. % % Make sure we don't inherit \rightskip from the outer environment. \rightskip=0pt \ifnum\colcount=1 % The first column will be indented with the surrounding text. \advance\hsize by\leftskip \else \ifsetpercent \else % If user has not set preamble in terms of percent of \hsize % we will advance \hsize by \multitablecolspace. \advance\hsize by \multitablecolspace \fi % In either case we will make \leftskip=\multitablecolspace: \leftskip=\multitablecolspace \fi % Ignoring space at the beginning and end avoids an occasional spurious % blank line, when TeX decides to break the line at the space before the % box from the multistrut, so the strut ends up on a line by itself. % For example: % @multitable @columnfractions .11 .89 % @item @code{#} % @tab Legal holiday which is valid in major parts of the whole country. % Is automatically provided with highlighting sequences respectively marking % characters. \noindent\ignorespaces##\unskip\multistrut}\cr } \def\setmultitablespacing{% test to see if user has set \multitablelinespace. % If so, do nothing. If not, give it an appropriate dimension based on % current baselineskip. \ifdim\multitablelinespace=0pt %% strut to put in table in case some entry doesn't have descenders, %% to keep lines equally spaced \let\multistrut = \strut %% Test to see if parskip is larger than space between lines of %% table. If not, do nothing. %% If so, set to same dimension as multitablelinespace. \else \gdef\multistrut{\vrule height\multitablelinespace depth\dp0 width0pt\relax} \fi \ifdim\multitableparskip>\multitablelinespace \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller %% than skip between lines in the table. \fi% \ifdim\multitableparskip=0pt \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller %% than skip between lines in the table. \fi} \message{indexing,} % Index generation facilities % Define \newwrite to be identical to plain tex's \newwrite % except not \outer, so it can be used within \newindex. {\catcode`\@=11 \gdef\newwrite{\alloc@7\write\chardef\sixt@@n}} % \newindex {foo} defines an index named foo. % It automatically defines \fooindex such that % \fooindex ...rest of line... puts an entry in the index foo. % It also defines \fooindfile to be the number of the output channel for % the file that accumulates this index. The file's extension is foo. % The name of an index should be no more than 2 characters long % for the sake of vms. \def\newindex #1{ \expandafter\newwrite \csname#1indfile\endcsname% Define number for output file \openout \csname#1indfile\endcsname \jobname.#1 % Open the file \expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex \noexpand\doindex {#1}} } % @defindex foo == \newindex{foo} \def\defindex{\parsearg\newindex} % Define @defcodeindex, like @defindex except put all entries in @code. \def\newcodeindex #1{ \expandafter\newwrite \csname#1indfile\endcsname% Define number for output file \openout \csname#1indfile\endcsname \jobname.#1 % Open the file \expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex \noexpand\docodeindex {#1}} } \def\defcodeindex{\parsearg\newcodeindex} % @synindex foo bar makes index foo feed into index bar. % Do this instead of @defindex foo if you don't want it as a separate index. \def\synindex #1 #2 {% \expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname \expandafter\let\csname#1indfile\endcsname=\synindexfoo \expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex \noexpand\doindex {#2}}% } % @syncodeindex foo bar similar, but put all entries made for index foo % inside @code. \def\syncodeindex #1 #2 {% \expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname \expandafter\let\csname#1indfile\endcsname=\synindexfoo \expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex \noexpand\docodeindex {#2}}% } % Define \doindex, the driver for all \fooindex macros. % Argument #1 is generated by the calling \fooindex macro, % and it is "foo", the name of the index. % \doindex just uses \parsearg; it calls \doind for the actual work. % This is because \doind is more useful to call from other macros. % There is also \dosubind {index}{topic}{subtopic} % which makes an entry in a two-level index such as the operation index. \def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} \def\singleindexer #1{\doind{\indexname}{#1}} % like the previous two, but they put @code around the argument. \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} \def\indexdummies{% % Take care of the plain tex accent commands. \def\"{\realbackslash "}% \def\`{\realbackslash `}% \def\'{\realbackslash '}% \def\^{\realbackslash ^}% \def\~{\realbackslash ~}% \def\={\realbackslash =}% \def\b{\realbackslash b}% \def\c{\realbackslash c}% \def\d{\realbackslash d}% \def\u{\realbackslash u}% \def\v{\realbackslash v}% \def\H{\realbackslash H}% % Take care of the plain tex special European modified letters. \def\oe{\realbackslash oe}% \def\ae{\realbackslash ae}% \def\aa{\realbackslash aa}% \def\OE{\realbackslash OE}% \def\AE{\realbackslash AE}% \def\AA{\realbackslash AA}% \def\o{\realbackslash o}% \def\O{\realbackslash O}% \def\l{\realbackslash l}% \def\L{\realbackslash L}% \def\ss{\realbackslash ss}% % Take care of texinfo commands likely to appear in an index entry. % (Must be a way to avoid doing expansion at all, and thus not have to % laboriously list every single command here.) \def\@{@}% will be @@ when we switch to @ as escape char. %\let\{ = \lbracecmd %\let\} = \rbracecmd \def\_{{\realbackslash _}}% \def\w{\realbackslash w }% \def\bf{\realbackslash bf }% %\def\rm{\realbackslash rm }% \def\sl{\realbackslash sl }% \def\sf{\realbackslash sf}% \def\tt{\realbackslash tt}% \def\gtr{\realbackslash gtr}% \def\less{\realbackslash less}% \def\hat{\realbackslash hat}% %\def\char{\realbackslash char}% \def\TeX{\realbackslash TeX}% \def\dots{\realbackslash dots }% \def\result{\realbackslash result}% \def\equiv{\realbackslash equiv}% \def\expansion{\realbackslash expansion}% \def\print{\realbackslash print}% \def\error{\realbackslash error}% \def\point{\realbackslash point}% \def\copyright{\realbackslash copyright}% \def\tclose##1{\realbackslash tclose {##1}}% \def\code##1{\realbackslash code {##1}}% \def\dotless##1{\realbackslash dotless {##1}}% \def\samp##1{\realbackslash samp {##1}}% \def\,##1{\realbackslash ,{##1}}% \def\t##1{\realbackslash t {##1}}% \def\r##1{\realbackslash r {##1}}% \def\i##1{\realbackslash i {##1}}% \def\b##1{\realbackslash b {##1}}% \def\sc##1{\realbackslash sc {##1}}% \def\cite##1{\realbackslash cite {##1}}% \def\key##1{\realbackslash key {##1}}% \def\file##1{\realbackslash file {##1}}% \def\var##1{\realbackslash var {##1}}% \def\kbd##1{\realbackslash kbd {##1}}% \def\dfn##1{\realbackslash dfn {##1}}% \def\emph##1{\realbackslash emph {##1}}% \def\value##1{\realbackslash value {##1}}% \unsepspaces } % If an index command is used in an @example environment, any spaces % therein should become regular spaces in the raw index file, not the % expansion of \tie (\\leavevmode \penalty \@M \ ). {\obeyspaces \gdef\unsepspaces{\obeyspaces\let =\space}} % \indexnofonts no-ops all font-change commands. % This is used when outputting the strings to sort the index by. \def\indexdummyfont#1{#1} \def\indexdummytex{TeX} \def\indexdummydots{...} \def\indexnofonts{% % Just ignore accents. \let\,=\indexdummyfont \let\"=\indexdummyfont \let\`=\indexdummyfont \let\'=\indexdummyfont \let\^=\indexdummyfont \let\~=\indexdummyfont \let\==\indexdummyfont \let\b=\indexdummyfont \let\c=\indexdummyfont \let\d=\indexdummyfont \let\u=\indexdummyfont \let\v=\indexdummyfont \let\H=\indexdummyfont \let\dotless=\indexdummyfont % Take care of the plain tex special European modified letters. \def\oe{oe}% \def\ae{ae}% \def\aa{aa}% \def\OE{OE}% \def\AE{AE}% \def\AA{AA}% \def\o{o}% \def\O{O}% \def\l{l}% \def\L{L}% \def\ss{ss}% \let\w=\indexdummyfont \let\t=\indexdummyfont \let\r=\indexdummyfont \let\i=\indexdummyfont \let\b=\indexdummyfont \let\emph=\indexdummyfont \let\strong=\indexdummyfont \let\cite=\indexdummyfont \let\sc=\indexdummyfont %Don't no-op \tt, since it isn't a user-level command % and is used in the definitions of the active chars like <, >, |... %\let\tt=\indexdummyfont \let\tclose=\indexdummyfont \let\code=\indexdummyfont \let\file=\indexdummyfont \let\samp=\indexdummyfont \let\kbd=\indexdummyfont \let\key=\indexdummyfont \let\var=\indexdummyfont \let\TeX=\indexdummytex \let\dots=\indexdummydots \def\@{@}% } % To define \realbackslash, we must make \ not be an escape. % We must first make another character (@) an escape % so we do not become unable to do a definition. {\catcode`\@=0 \catcode`\\=\other @gdef@realbackslash{\}} \let\indexbackslash=0 %overridden during \printindex. \let\SETmarginindex=\relax %initialize! % workhorse for all \fooindexes % #1 is name of index, #2 is stuff to put there \def\doind #1#2{% % Put the index entry in the margin if desired. \ifx\SETmarginindex\relax\else \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}% \fi {% \count255=\lastpenalty {% \indexdummies % Must do this here, since \bf, etc expand at this stage \escapechar=`\\ {% \let\folio=0% We will expand all macros now EXCEPT \folio. \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now % so it will be output as is; and it will print as backslash. % % First process the index-string with all font commands turned off % to get the string to sort by. {\indexnofonts \xdef\indexsorttmp{#2}}% % % Now produce the complete index entry, with both the sort key and the % original text, including any font commands. \toks0 = {#2}% \edef\temp{% \write\csname#1indfile\endcsname{% \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}% }% \temp }% }% \penalty\count255 }% } \def\dosubind #1#2#3{% {\count10=\lastpenalty % {\indexdummies % Must do this here, since \bf, etc expand at this stage \escapechar=`\\% {\let\folio=0% \def\rawbackslashxx{\indexbackslash}% % % Now process the index-string once, with all font commands turned off, % to get the string to sort the index by. {\indexnofonts \xdef\temp1{#2 #3}% }% % Now produce the complete index entry. We process the index-string again, % this time with font commands expanded, to get what to print in the index. \edef\temp{% \write \csname#1indfile\endcsname{% \realbackslash entry {\temp1}{\folio}{#2}{#3}}}% \temp }% }\penalty\count10}} % The index entry written in the file actually looks like % \entry {sortstring}{page}{topic} % or % \entry {sortstring}{page}{topic}{subtopic} % The texindex program reads in these files and writes files % containing these kinds of lines: % \initial {c} % before the first topic whose initial is c % \entry {topic}{pagelist} % for a topic that is used without subtopics % \primary {topic} % for the beginning of a topic that is used with subtopics % \secondary {subtopic}{pagelist} % for each subtopic. % Define the user-accessible indexing commands % @findex, @vindex, @kindex, @cindex. \def\findex {\fnindex} \def\kindex {\kyindex} \def\cindex {\cpindex} \def\vindex {\vrindex} \def\tindex {\tpindex} \def\pindex {\pgindex} \def\cindexsub {\begingroup\obeylines\cindexsub} {\obeylines % \gdef\cindexsub "#1" #2^^M{\endgroup % \dosubind{cp}{#2}{#1}}} % Define the macros used in formatting output of the sorted index material. % @printindex causes a particular index (the ??s file) to get printed. % It does not print any chapter heading (usually an @unnumbered). % \def\printindex{\parsearg\doprintindex} \def\doprintindex#1{\begingroup \dobreak \chapheadingskip{10000}% % \indexfonts \rm \tolerance = 9500 \indexbreaks % % See if the index file exists and is nonempty. % Change catcode of @ here so that if the index file contains % \initial {@} % as its first line, TeX doesn't complain about mismatched braces % (because it thinks @} is a control sequence). \catcode`\@ = 11 \openin 1 \jobname.#1s \ifeof 1 % \enddoublecolumns gets confused if there is no text in the index, % and it loses the chapter title and the aux file entries for the % index. The easiest way to prevent this problem is to make sure % there is some text. (Index is nonexistent) \else % % If the index file exists but is empty, then \openin leaves \ifeof % false. We have to make TeX try to read something from the file, so % it can discover if there is anything in it. \read 1 to \temp \ifeof 1 (Index is empty) \else % Index files are almost Texinfo source, but we use \ as the escape % character. It would be better to use @, but that's too big a change % to make right now. \def\indexbackslash{\rawbackslashxx}% \catcode`\\ = 0 \escapechar = `\\ \begindoublecolumns \input \jobname.#1s \enddoublecolumns \fi \fi \closein 1 \endgroup} % These macros are used by the sorted index file itself. % Change them to control the appearance of the index. % Same as \bigskipamount except no shrink. % \balancecolumns gets confused if there is any shrink. \newskip\initialskipamount \initialskipamount 12pt plus4pt \def\initial #1{% {\let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt \ifdim\lastskip<\initialskipamount \removelastskip \penalty-200 \vskip \initialskipamount\fi \line{\secbf#1\hfill}\kern 2pt\penalty10000}} % This typesets a paragraph consisting of #1, dot leaders, and then #2 % flush to the right margin. It is used for index and table of contents % entries. The paragraph is indented by \leftskip. % \def\entry #1#2{\begingroup % % Start a new paragraph if necessary, so our assignments below can't % affect previous text. \par % % Do not fill out the last line with white space. \parfillskip = 0in % % No extra space above this paragraph. \parskip = 0in % % Do not prefer a separate line ending with a hyphen to fewer lines. \finalhyphendemerits = 0 % % \hangindent is only relevant when the entry text and page number % don't both fit on one line. In that case, bob suggests starting the % dots pretty far over on the line. Unfortunately, a large % indentation looks wrong when the entry text itself is broken across % lines. So we use a small indentation and put up with long leaders. % % \hangafter is reset to 1 (which is the value we want) at the start % of each paragraph, so we need not do anything with that. \hangindent=2em % % When the entry text needs to be broken, just fill out the first line % with blank space. \rightskip = 0pt plus1fil % % Start a ``paragraph'' for the index entry so the line breaking % parameters we've set above will have an effect. \noindent % % Insert the text of the index entry. TeX will do line-breaking on it. #1% % The following is kludged to not output a line of dots in the index if % there are no page numbers. The next person who breaks this will be % cursed by a Unix daemon. \def\tempa{{\rm }}% \def\tempb{#2}% \edef\tempc{\tempa}% \edef\tempd{\tempb}% \ifx\tempc\tempd\ \else% % % If we must, put the page number on a line of its own, and fill out % this line with blank space. (The \hfil is overwhelmed with the % fill leaders glue in \indexdotfill if the page number does fit.) \hfil\penalty50 \null\nobreak\indexdotfill % Have leaders before the page number. % % The `\ ' here is removed by the implicit \unskip that TeX does as % part of (the primitive) \par. Without it, a spurious underfull % \hbox ensues. \ #2% The page number ends the paragraph. \fi% \par \endgroup} % Like \dotfill except takes at least 1 em. \def\indexdotfill{\cleaders \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill} \def\primary #1{\line{#1\hfil}} \newskip\secondaryindent \secondaryindent=0.5cm \def\secondary #1#2{ {\parfillskip=0in \parskip=0in \hangindent =1in \hangafter=1 \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\par }} % Define two-column mode, which we use to typeset indexes. % Adapted from the TeXbook, page 416, which is to say, % the manmac.tex format used to print the TeXbook itself. \catcode`\@=11 \newbox\partialpage \newdimen\doublecolumnhsize \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns % Grab any single-column material above us. \output = {\global\setbox\partialpage = \vbox{% % % Here is a possibility not foreseen in manmac: if we accumulate a % whole lot of material, we might end up calling this \output % routine twice in a row (see the doublecol-lose test, which is % essentially a couple of indexes with @setchapternewpage off). In % that case, we must prevent the second \partialpage from % simply overwriting the first, causing us to lose the page. % This will preserve it until a real output routine can ship it % out. Generally, \partialpage will be empty when this runs and % this will be a no-op. \unvbox\partialpage % % Unvbox the main output page. \unvbox255 \kern-\topskip \kern\baselineskip }}% \eject % % Use the double-column output routine for subsequent pages. \output = {\doublecolumnout}% % % Change the page size parameters. We could do this once outside this % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 % format, but then we repeat the same computation. Repeating a couple % of assignments once per index is clearly meaningless for the % execution time, so we may as well do it in one place. % % First we halve the line length, less a little for the gutter between % the columns. We compute the gutter based on the line length, so it % changes automatically with the paper format. The magic constant % below is chosen so that the gutter has the same value (well, +-<1pt) % as it did when we hard-coded it. % % We put the result in a separate register, \doublecolumhsize, so we % can restore it in \pagesofar, after \hsize itself has (potentially) % been clobbered. % \doublecolumnhsize = \hsize \advance\doublecolumnhsize by -.04154\hsize \divide\doublecolumnhsize by 2 \hsize = \doublecolumnhsize % % Double the \vsize as well. (We don't need a separate register here, % since nobody clobbers \vsize.) \vsize = 2\vsize } \def\doublecolumnout{% \splittopskip=\topskip \splitmaxdepth=\maxdepth % Get the available space for the double columns -- the normal % (undoubled) page height minus any material left over from the % previous page. \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage % box0 will be the left-hand column, box2 the right. \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ \onepageout\pagesofar \unvbox255 \penalty\outputpenalty } \def\pagesofar{% % Re-output the contents of the output page -- any previous material, % followed by the two boxes we just split. \unvbox\partialpage \hsize = \doublecolumnhsize \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}% } \def\enddoublecolumns{% \output = {\balancecolumns}\eject % split what we have \endgroup % started in \begindoublecolumns % % Back to normal single-column typesetting, but take account of the % fact that we just accumulated some stuff on the output page. \pagegoal = \vsize } \def\balancecolumns{% % Called at the end of the double column material. \setbox0 = \vbox{\unvbox255}% \dimen@ = \ht0 \advance\dimen@ by \topskip \advance\dimen@ by-\baselineskip \divide\dimen@ by 2 \splittopskip = \topskip % Loop until we get a decent breakpoint. {\vbadness=10000 \loop \global\setbox3=\copy0 \global\setbox1=\vsplit3 to\dimen@ \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt \repeat}% \setbox0=\vbox to\dimen@{\unvbox1}% \setbox2=\vbox to\dimen@{\unvbox3}% \pagesofar } \catcode`\@ = \other \message{sectioning,} % Define chapters, sections, etc. \newcount\chapno \newcount\secno \secno=0 \newcount\subsecno \subsecno=0 \newcount\subsubsecno \subsubsecno=0 % This counter is funny since it counts through charcodes of letters A, B, ... \newcount\appendixno \appendixno = `\@ \def\appendixletter{\char\the\appendixno} \newwrite\contentsfile % This is called from \setfilename. \def\opencontents{\openout\contentsfile = \jobname.toc } % Each @chapter defines this as the name of the chapter. % page headings and footings can use it. @section does likewise \def\thischapter{} \def\thissection{} \def\seccheck#1{\ifnum \pageno<0 \errmessage{@#1 not allowed after generating table of contents}% \fi} \def\chapternofonts{% \let\rawbackslash=\relax \let\frenchspacing=\relax \def\result{\realbackslash result}% \def\equiv{\realbackslash equiv}% \def\expansion{\realbackslash expansion}% \def\print{\realbackslash print}% \def\TeX{\realbackslash TeX}% \def\dots{\realbackslash dots}% \def\result{\realbackslash result}% \def\equiv{\realbackslash equiv}% \def\expansion{\realbackslash expansion}% \def\print{\realbackslash print}% \def\error{\realbackslash error}% \def\point{\realbackslash point}% \def\copyright{\realbackslash copyright}% \def\tt{\realbackslash tt}% \def\bf{\realbackslash bf}% \def\w{\realbackslash w}% \def\less{\realbackslash less}% \def\gtr{\realbackslash gtr}% \def\hat{\realbackslash hat}% \def\char{\realbackslash char}% \def\tclose##1{\realbackslash tclose{##1}}% \def\code##1{\realbackslash code{##1}}% \def\samp##1{\realbackslash samp{##1}}% \def\r##1{\realbackslash r{##1}}% \def\b##1{\realbackslash b{##1}}% \def\key##1{\realbackslash key{##1}}% \def\file##1{\realbackslash file{##1}}% \def\kbd##1{\realbackslash kbd{##1}}% % These are redefined because @smartitalic wouldn't work inside xdef. \def\i##1{\realbackslash i{##1}}% \def\cite##1{\realbackslash cite{##1}}% \def\var##1{\realbackslash var{##1}}% \def\emph##1{\realbackslash emph{##1}}% \def\dfn##1{\realbackslash dfn{##1}}% } \newcount\absseclevel % used to calculate proper heading level \newcount\secbase\secbase=0 % @raise/lowersections modify this count % @raisesections: treat @section as chapter, @subsection as section, etc. \def\raisesections{\global\advance\secbase by -1} \let\up=\raisesections % original BFox name % @lowersections: treat @chapter as section, @section as subsection, etc. \def\lowersections{\global\advance\secbase by 1} \let\down=\lowersections % original BFox name % Choose a numbered-heading macro % #1 is heading level if unmodified by @raisesections or @lowersections % #2 is text for heading \def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 \ifcase\absseclevel \chapterzzz{#2} \or \seczzz{#2} \or \numberedsubseczzz{#2} \or \numberedsubsubseczzz{#2} \else \ifnum \absseclevel<0 \chapterzzz{#2} \else \numberedsubsubseczzz{#2} \fi \fi } % like \numhead, but chooses appendix heading levels \def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 \ifcase\absseclevel \appendixzzz{#2} \or \appendixsectionzzz{#2} \or \appendixsubseczzz{#2} \or \appendixsubsubseczzz{#2} \else \ifnum \absseclevel<0 \appendixzzz{#2} \else \appendixsubsubseczzz{#2} \fi \fi } % like \numhead, but chooses numberless heading levels \def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 \ifcase\absseclevel \unnumberedzzz{#2} \or \unnumberedseczzz{#2} \or \unnumberedsubseczzz{#2} \or \unnumberedsubsubseczzz{#2} \else \ifnum \absseclevel<0 \unnumberedzzz{#2} \else \unnumberedsubsubseczzz{#2} \fi \fi } \def\thischaptername{No Chapter Title} \outer\def\chapter{\parsearg\chapteryyy} \def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz \def\chapterzzz #1{\seccheck{chapter}% \secno=0 \subsecno=0 \subsubsecno=0 \global\advance \chapno by 1 \message{\putwordChapter \the\chapno}% \chapmacro {#1}{\the\chapno}% \gdef\thissection{#1}% \gdef\thischaptername{#1}% % We don't substitute the actual chapter name into \thischapter % because we don't want its macros evaluated now. \xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}% {\chapternofonts% \toks0 = {#1}% \edef\temp{{\realbackslash chapentry{\the\toks0}{\the\chapno}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \donoderef % \global\let\section = \numberedsec \global\let\subsection = \numberedsubsec \global\let\subsubsection = \numberedsubsubsec }} \outer\def\appendix{\parsearg\appendixyyy} \def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz \def\appendixzzz #1{\seccheck{appendix}% \secno=0 \subsecno=0 \subsubsecno=0 \global\advance \appendixno by 1 \message{Appendix \appendixletter}% \chapmacro {#1}{\putwordAppendix{} \appendixletter}% \gdef\thissection{#1}% \gdef\thischaptername{#1}% \xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}% {\chapternofonts% \toks0 = {#1}% \edef\temp{{\realbackslash chapentry{\the\toks0}% {\putwordAppendix{} \appendixletter}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \appendixnoderef % \global\let\section = \appendixsec \global\let\subsection = \appendixsubsec \global\let\subsubsection = \appendixsubsubsec }} % @centerchap is like @unnumbered, but the heading is centered. \outer\def\centerchap{\parsearg\centerchapyyy} \def\centerchapyyy #1{{\let\unnumbchapmacro=\centerchapmacro \unnumberedyyy{#1}}} \outer\def\top{\parsearg\unnumberedyyy} \outer\def\unnumbered{\parsearg\unnumberedyyy} \def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz \def\unnumberedzzz #1{\seccheck{unnumbered}% \secno=0 \subsecno=0 \subsubsecno=0 % % This used to be simply \message{#1}, but TeX fully expands the % argument to \message. Therefore, if #1 contained @-commands, TeX % expanded them. For example, in `@unnumbered The @cite{Book}', TeX % expanded @cite (which turns out to cause errors because \cite is meant % to be executed, not expanded). % % Anyway, we don't want the fully-expanded definition of @cite to appear % as a result of the \message, we just want `@cite' itself. We use % \the to achieve this: TeX expands \the only once, % simply yielding the contents of the . \toks0 = {#1}\message{(\the\toks0)}% % \unnumbchapmacro {#1}% \gdef\thischapter{#1}\gdef\thissection{#1}% {\chapternofonts% \toks0 = {#1}% \edef\temp{{\realbackslash unnumbchapentry{\the\toks0}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \unnumbnoderef % \global\let\section = \unnumberedsec \global\let\subsection = \unnumberedsubsec \global\let\subsubsection = \unnumberedsubsubsec }} \outer\def\numberedsec{\parsearg\secyyy} \def\secyyy #1{\numhead1{#1}} % normally calls seczzz \def\seczzz #1{\seccheck{section}% \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % \gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}% {\chapternofonts% \toks0 = {#1}% \edef\temp{{\realbackslash secentry % {\the\toks0}{\the\chapno}{\the\secno}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \donoderef % \penalty 10000 % }} \outer\def\appendixsection{\parsearg\appendixsecyyy} \outer\def\appendixsec{\parsearg\appendixsecyyy} \def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz \def\appendixsectionzzz #1{\seccheck{appendixsection}% \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % \gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}% {\chapternofonts% \toks0 = {#1}% \edef\temp{{\realbackslash secentry % {\the\toks0}{\appendixletter}{\the\secno}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \appendixnoderef % \penalty 10000 % }} \outer\def\unnumberedsec{\parsearg\unnumberedsecyyy} \def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz \def\unnumberedseczzz #1{\seccheck{unnumberedsec}% \plainsecheading {#1}\gdef\thissection{#1}% {\chapternofonts% \toks0 = {#1}% \edef\temp{{\realbackslash unnumbsecentry{\the\toks0}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \unnumbnoderef % \penalty 10000 % }} \outer\def\numberedsubsec{\parsearg\numberedsubsecyyy} \def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz \def\numberedsubseczzz #1{\seccheck{subsection}% \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % \subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}% {\chapternofonts% \toks0 = {#1}% \edef\temp{{\realbackslash subsecentry % {\the\toks0}{\the\chapno}{\the\secno}{\the\subsecno}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \donoderef % \penalty 10000 % }} \outer\def\appendixsubsec{\parsearg\appendixsubsecyyy} \def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz \def\appendixsubseczzz #1{\seccheck{appendixsubsec}% \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % \subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}% {\chapternofonts% \toks0 = {#1}% \edef\temp{{\realbackslash subsecentry % {\the\toks0}{\appendixletter}{\the\secno}{\the\subsecno}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \appendixnoderef % \penalty 10000 % }} \outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy} \def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz \def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}% \plainsubsecheading {#1}\gdef\thissection{#1}% {\chapternofonts% \toks0 = {#1}% \edef\temp{{\realbackslash unnumbsubsecentry{\the\toks0}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \unnumbnoderef % \penalty 10000 % }} \outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy} \def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz \def\numberedsubsubseczzz #1{\seccheck{subsubsection}% \gdef\thissection{#1}\global\advance \subsubsecno by 1 % \subsubsecheading {#1} {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}% {\chapternofonts% \toks0 = {#1}% \edef\temp{{\realbackslash subsubsecentry{\the\toks0} {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno} {\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \donoderef % \penalty 10000 % }} \outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy} \def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz \def\appendixsubsubseczzz #1{\seccheck{appendixsubsubsec}% \gdef\thissection{#1}\global\advance \subsubsecno by 1 % \subsubsecheading {#1} {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}% {\chapternofonts% \toks0 = {#1}% \edef\temp{{\realbackslash subsubsecentry{\the\toks0}% {\appendixletter} {\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \appendixnoderef % \penalty 10000 % }} \outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy} \def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz \def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}% \plainsubsubsecheading {#1}\gdef\thissection{#1}% {\chapternofonts% \toks0 = {#1}% \edef\temp{{\realbackslash unnumbsubsubsecentry{\the\toks0}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \unnumbnoderef % \penalty 10000 % }} % These are variants which are not "outer", so they can appear in @ifinfo. % Actually, they should now be obsolete; ordinary section commands should work. \def\infotop{\parsearg\unnumberedzzz} \def\infounnumbered{\parsearg\unnumberedzzz} \def\infounnumberedsec{\parsearg\unnumberedseczzz} \def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz} \def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz} \def\infoappendix{\parsearg\appendixzzz} \def\infoappendixsec{\parsearg\appendixseczzz} \def\infoappendixsubsec{\parsearg\appendixsubseczzz} \def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz} \def\infochapter{\parsearg\chapterzzz} \def\infosection{\parsearg\sectionzzz} \def\infosubsection{\parsearg\subsectionzzz} \def\infosubsubsection{\parsearg\subsubsectionzzz} % These macros control what the section commands do, according % to what kind of chapter we are in (ordinary, appendix, or unnumbered). % Define them by default for a numbered chapter. \global\let\section = \numberedsec \global\let\subsection = \numberedsubsec \global\let\subsubsection = \numberedsubsubsec % Define @majorheading, @heading and @subheading % NOTE on use of \vbox for chapter headings, section headings, and % such: % 1) We use \vbox rather than the earlier \line to permit % overlong headings to fold. % 2) \hyphenpenalty is set to 10000 because hyphenation in a % heading is obnoxious; this forbids it. % 3) Likewise, headings look best if no \parindent is used, and % if justification is not attempted. Hence \raggedright. \def\majorheading{\parsearg\majorheadingzzz} \def\majorheadingzzz #1{% {\advance\chapheadingskip by 10pt \chapbreak }% {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #1\hfill}}\bigskip \par\penalty 200} \def\chapheading{\parsearg\chapheadingzzz} \def\chapheadingzzz #1{\chapbreak % {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #1\hfill}}\bigskip \par\penalty 200} % @heading, @subheading, @subsubheading. \def\heading{\parsearg\plainsecheading} \def\subheading{\parsearg\plainsubsecheading} \def\subsubheading{\parsearg\plainsubsubsecheading} % These macros generate a chapter, section, etc. heading only % (including whitespace, linebreaking, etc. around it), % given all the information in convenient, parsed form. %%% Args are the skip and penalty (usually negative) \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} \def\setchapterstyle #1 {\csname CHAPF#1\endcsname} %%% Define plain chapter starts, and page on/off switching for it % Parameter controlling skip before chapter headings (if needed) \newskip\chapheadingskip \def\chapbreak{\dobreak \chapheadingskip {-4000}} \def\chappager{\par\vfill\supereject} \def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi} \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} \def\CHAPPAGoff{ \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chapbreak \global\let\pagealignmacro=\chappager} \def\CHAPPAGon{ \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chappager \global\let\pagealignmacro=\chappager \global\def\HEADINGSon{\HEADINGSsingle}} \def\CHAPPAGodd{ \global\let\contentsalignmacro = \chapoddpage \global\let\pchapsepmacro=\chapoddpage \global\let\pagealignmacro=\chapoddpage \global\def\HEADINGSon{\HEADINGSdouble}} \CHAPPAGon \def\CHAPFplain{ \global\let\chapmacro=\chfplain \global\let\unnumbchapmacro=\unnchfplain \global\let\centerchapmacro=\centerchfplain} % Plain chapter opening. % #1 is the text, #2 the chapter number or empty if unnumbered. \def\chfplain#1#2{% \pchapsepmacro {% \chapfonts \rm \def\chapnum{#2}% \setbox0 = \hbox{#2\ifx\chapnum\empty\else\enspace\fi}% \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright \hangindent = \wd0 \centerparametersmaybe \unhbox0 #1\par}% }% \nobreak\bigskip % no page break after a chapter title \nobreak } % Plain opening for unnumbered. \def\unnchfplain#1{\chfplain{#1}{}} % @centerchap -- centered and unnumbered. \let\centerparametersmaybe = \relax \def\centerchfplain#1{{% \def\centerparametersmaybe{% \advance\rightskip by 3\rightskip \leftskip = \rightskip \parfillskip = 0pt }% \chfplain{#1}{}% }} \CHAPFplain % The default \def\unnchfopen #1{% \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\raggedright \rm #1\hfill}}\bigskip \par\penalty 10000 % } \def\chfopen #1#2{\chapoddpage {\chapfonts \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% \par\penalty 5000 % } \def\centerchfopen #1{% \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt \hfill {\rm #1}\hfill}}\bigskip \par\penalty 10000 % } \def\CHAPFopen{ \global\let\chapmacro=\chfopen \global\let\unnumbchapmacro=\unnchfopen \global\let\centerchapmacro=\centerchfopen} % Section titles. \newskip\secheadingskip \def\secheadingbreak{\dobreak \secheadingskip {-1000}} \def\secheading#1#2#3{\sectionheading{sec}{#2.#3}{#1}} \def\plainsecheading#1{\sectionheading{sec}{}{#1}} % Subsection titles. \newskip \subsecheadingskip \def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}} \def\subsecheading#1#2#3#4{\sectionheading{subsec}{#2.#3.#4}{#1}} \def\plainsubsecheading#1{\sectionheading{subsec}{}{#1}} % Subsubsection titles. \let\subsubsecheadingskip = \subsecheadingskip \let\subsubsecheadingbreak = \subsecheadingbreak \def\subsubsecheading#1#2#3#4#5{\sectionheading{subsubsec}{#2.#3.#4.#5}{#1}} \def\plainsubsubsecheading#1{\sectionheading{subsubsec}{}{#1}} % Print any size section title. % % #1 is the section type (sec/subsec/subsubsec), #2 is the section % number (maybe empty), #3 the text. \def\sectionheading#1#2#3{% {% \expandafter\advance\csname #1headingskip\endcsname by \parskip \csname #1headingbreak\endcsname }% {% % Switch to the right set of fonts. \csname #1fonts\endcsname \rm % % Only insert the separating space if we have a section number. \def\secnum{#2}% \setbox0 = \hbox{#2\ifx\secnum\empty\else\enspace\fi}% % \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright \hangindent = \wd0 % zero if no section number \unhbox0 #3}% }% \ifdim\parskip<10pt \nobreak\kern10pt\nobreak\kern-\parskip\fi \nobreak } \message{toc printing,} % Finish up the main text and prepare to read what we've written % to \contentsfile. \newskip\contentsrightmargin \contentsrightmargin=1in \def\startcontents#1{% % If @setchapternewpage on, and @headings double, the contents should % start on an odd page, unlike chapters. Thus, we maintain % \contentsalignmacro in parallel with \pagealignmacro. % From: Torbjorn Granlund \contentsalignmacro \immediate\closeout \contentsfile \ifnum \pageno>0 \pageno = -1 % Request roman numbered pages. \fi % Don't need to put `Contents' or `Short Contents' in the headline. % It is abundantly clear what they are. \unnumbchapmacro{#1}\def\thischapter{}% \begingroup % Set up to handle contents files properly. \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11 % We can't do this, because then an actual ^ in a section % title fails, e.g., @chapter ^ -- exponentiation. --karl, 9jul97. %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi \raggedbottom % Worry more about breakpoints than the bottom. \advance\hsize by -\contentsrightmargin % Don't use the full line length. } % Normal (long) toc. \outer\def\contents{% \startcontents{\putwordTableofContents}% \input \jobname.toc \endgroup \vfill \eject } % And just the chapters. \outer\def\summarycontents{% \startcontents{\putwordShortContents}% % \let\chapentry = \shortchapentry \let\unnumbchapentry = \shortunnumberedentry % We want a true roman here for the page numbers. \secfonts \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl \rm \hyphenpenalty = 10000 \advance\baselineskip by 1pt % Open it up a little. \def\secentry ##1##2##3##4{} \def\unnumbsecentry ##1##2{} \def\subsecentry ##1##2##3##4##5{} \def\unnumbsubsecentry ##1##2{} \def\subsubsecentry ##1##2##3##4##5##6{} \def\unnumbsubsubsecentry ##1##2{} \input \jobname.toc \endgroup \vfill \eject } \let\shortcontents = \summarycontents % These macros generate individual entries in the table of contents. % The first argument is the chapter or section name. % The last argument is the page number. % The arguments in between are the chapter number, section number, ... % Chapter-level things, for both the long and short contents. \def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}} % See comments in \dochapentry re vbox and related settings \def\shortchapentry#1#2#3{% \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno{#3}}% } % Typeset the label for a chapter or appendix for the short contents. % The arg is, e.g. `Appendix A' for an appendix, or `3' for a chapter. % We could simplify the code here by writing out an \appendixentry % command in the toc file for appendices, instead of using \chapentry % for both, but it doesn't seem worth it. \setbox0 = \hbox{\shortcontrm \putwordAppendix } \newdimen\shortappendixwidth \shortappendixwidth = \wd0 \def\shortchaplabel#1{% % We typeset #1 in a box of constant width, regardless of the text of % #1, so the chapter titles will come out aligned. \setbox0 = \hbox{#1}% \dimen0 = \ifdim\wd0 > \shortappendixwidth \shortappendixwidth \else 0pt \fi % % This space should be plenty, since a single number is .5em, and the % widest letter (M) is 1em, at least in the Computer Modern fonts. % (This space doesn't include the extra space that gets added after % the label; that gets put in by \shortchapentry above.) \advance\dimen0 by 1.1em \hbox to \dimen0{#1\hfil}% } \def\unnumbchapentry#1#2{\dochapentry{#1}{#2}} \def\shortunnumberedentry#1#2{\tocentry{#1}{\doshortpageno{#2}}} % Sections. \def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}} \def\unnumbsecentry#1#2{\dosecentry{#1}{#2}} % Subsections. \def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}} \def\unnumbsubsecentry#1#2{\dosubsecentry{#1}{#2}} % And subsubsections. \def\subsubsecentry#1#2#3#4#5#6{% \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}} \def\unnumbsubsubsecentry#1#2{\dosubsubsecentry{#1}{#2}} % This parameter controls the indentation of the various levels. \newdimen\tocindent \tocindent = 3pc % Now for the actual typesetting. In all these, #1 is the text and #2 is the % page number. % % If the toc has to be broken over pages, we want it to be at chapters % if at all possible; hence the \penalty. \def\dochapentry#1#2{% \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip \begingroup \chapentryfonts \tocentry{#1}{\dopageno{#2}}% \endgroup \nobreak\vskip .25\baselineskip plus.1\baselineskip } \def\dosecentry#1#2{\begingroup \secentryfonts \leftskip=\tocindent \tocentry{#1}{\dopageno{#2}}% \endgroup} \def\dosubsecentry#1#2{\begingroup \subsecentryfonts \leftskip=2\tocindent \tocentry{#1}{\dopageno{#2}}% \endgroup} \def\dosubsubsecentry#1#2{\begingroup \subsubsecentryfonts \leftskip=3\tocindent \tocentry{#1}{\dopageno{#2}}% \endgroup} % Final typesetting of a toc entry; we use the same \entry macro as for % the index entries, but we want to suppress hyphenation here. (We % can't do that in the \entry macro, since index entries might consist % of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.) \def\tocentry#1#2{\begingroup \vskip 0pt plus1pt % allow a little stretch for the sake of nice page breaks % Do not use \turnoffactive in these arguments. Since the toc is % typeset in cmr, so characters such as _ would come out wrong; we % have to do the usual translation tricks. \entry{#1}{#2}% \endgroup} % Space between chapter (or whatever) number and the title. \def\labelspace{\hskip1em \relax} \def\dopageno#1{{\rm #1}} \def\doshortpageno#1{{\rm #1}} \def\chapentryfonts{\secfonts \rm} \def\secentryfonts{\textfonts} \let\subsecentryfonts = \textfonts \let\subsubsecentryfonts = \textfonts \message{environments,} % Since these characters are used in examples, it should be an even number of % \tt widths. Each \tt character is 1en, so two makes it 1em. % Furthermore, these definitions must come after we define our fonts. \newbox\dblarrowbox \newbox\longdblarrowbox \newbox\pushcharbox \newbox\bullbox \newbox\equivbox \newbox\errorbox %{\tentt %\global\setbox\dblarrowbox = \hbox to 1em{\hfil$\Rightarrow$\hfil} %\global\setbox\longdblarrowbox = \hbox to 1em{\hfil$\mapsto$\hfil} %\global\setbox\pushcharbox = \hbox to 1em{\hfil$\dashv$\hfil} %\global\setbox\equivbox = \hbox to 1em{\hfil$\ptexequiv$\hfil} % Adapted from the manmac format (p.420 of TeXbook) %\global\setbox\bullbox = \hbox to 1em{\kern.15em\vrule height .75ex width .85ex % depth .1ex\hfil} %} % @point{}, @result{}, @expansion{}, @print{}, @equiv{}. \def\point{$\star$} \def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} \def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}} \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} \def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}} % Adapted from the TeXbook's \boxit. {\tentt \global\dimen0 = 3em}% Width of the box. \dimen2 = .55pt % Thickness of rules % The text. (`r' is open on the right, `e' somewhat less so on the left.) \setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt} \global\setbox\errorbox=\hbox to \dimen0{\hfil \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. \advance\hsize by -2\dimen2 % Rules. \vbox{ \hrule height\dimen2 \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. \kern3pt\vrule width\dimen2}% Space to right. \hrule height\dimen2} \hfil} % The @error{} command. \def\error{\leavevmode\lower.7ex\copy\errorbox} % @tex ... @end tex escapes into raw Tex temporarily. % One exception: @ is still an escape character, so that @end tex works. % But \@ or @@ will get a plain tex @ character. \def\tex{\begingroup \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 \catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie \catcode `\%=14 \catcode 43=12 % plus \catcode`\"=12 \catcode`\==12 \catcode`\|=12 \catcode`\<=12 \catcode`\>=12 \escapechar=`\\ % \let\b=\ptexb \let\bullet=\ptexbullet \let\c=\ptexc \let\,=\ptexcomma \let\.=\ptexdot \let\dots=\ptexdots \let\equiv=\ptexequiv \let\!=\ptexexclam \let\i=\ptexi \let\{=\ptexlbrace \let\}=\ptexrbrace \let\*=\ptexstar \let\t=\ptext % \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% \def\@{@}% \let\Etex=\endgroup} % Define @lisp ... @endlisp. % @lisp does a \begingroup so it can rebind things, % including the definition of @endlisp (which normally is erroneous). % Amount to narrow the margins by for @lisp. \newskip\lispnarrowing \lispnarrowing=0.4in % This is the definition that ^^M gets inside @lisp, @example, and other % such environments. \null is better than a space, since it doesn't % have any width. \def\lisppar{\null\endgraf} % Make each space character in the input produce a normal interword % space in the output. Don't allow a line break at this space, as this % is used only in environments like @example, where each line of input % should produce a line of output anyway. % {\obeyspaces % \gdef\sepspaces{\obeyspaces\let =\tie}} % Define \obeyedspace to be our active space, whatever it is. This is % for use in \parsearg. {\sepspaces% \global\let\obeyedspace= } % This space is always present above and below environments. \newskip\envskipamount \envskipamount = 0pt % Make spacing and below environment symmetrical. We use \parskip here % to help in doing that, since in @example-like environments \parskip % is reset to zero; thus the \afterenvbreak inserts no space -- but the % start of the next paragraph will insert \parskip % \def\aboveenvbreak{{\advance\envskipamount by \parskip \endgraf \ifdim\lastskip<\envskipamount \removelastskip \penalty-50 \vskip\envskipamount \fi}} \let\afterenvbreak = \aboveenvbreak % \nonarrowing is a flag. If "set", @lisp etc don't narrow margins. \let\nonarrowing=\relax %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \cartouche: draw rectangle w/rounded corners around argument \font\circle=lcircle10 \newdimen\circthick \newdimen\cartouter\newdimen\cartinner \newskip\normbskip\newskip\normpskip\newskip\normlskip \circthick=\fontdimen8\circle % \def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth \def\ctr{{\hskip 6pt\circle\char'010}} \def\cbl{{\circle\char'012\hskip -6pt}} \def\cbr{{\hskip 6pt\circle\char'011}} \def\carttop{\hbox to \cartouter{\hskip\lskip \ctl\leaders\hrule height\circthick\hfil\ctr \hskip\rskip}} \def\cartbot{\hbox to \cartouter{\hskip\lskip \cbl\leaders\hrule height\circthick\hfil\cbr \hskip\rskip}} % \newskip\lskip\newskip\rskip \long\def\cartouche{% \begingroup \lskip=\leftskip \rskip=\rightskip \leftskip=0pt\rightskip=0pt %we want these *outside*. \cartinner=\hsize \advance\cartinner by-\lskip \advance\cartinner by-\rskip \cartouter=\hsize \advance\cartouter by 18pt % allow for 3pt kerns on either % side, and for 6pt waste from % each corner char \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip % Flag to tell @lisp, etc., not to narrow margin. \let\nonarrowing=\comment \vbox\bgroup \baselineskip=0pt\parskip=0pt\lineskip=0pt \carttop \hbox\bgroup \hskip\lskip \vrule\kern3pt \vbox\bgroup \hsize=\cartinner \kern3pt \begingroup \baselineskip=\normbskip \lineskip=\normlskip \parskip=\normpskip \vskip -\parskip \def\Ecartouche{% \endgroup \kern3pt \egroup \kern3pt\vrule \hskip\rskip \egroup \cartbot \egroup \endgroup }} % This macro is called at the beginning of all the @example variants, % inside a group. \def\nonfillstart{% \aboveenvbreak \inENV % This group ends at the end of the body \hfuzz = 12pt % Don't be fussy \sepspaces % Make spaces be word-separators rather than space tokens. \singlespace \let\par = \lisppar % don't ignore blank lines \obeylines % each line of input is a line of output \parskip = 0pt \parindent = 0pt \emergencystretch = 0pt % don't try to avoid overfull boxes % @cartouche defines \nonarrowing to inhibit narrowing % at next level down. \ifx\nonarrowing\relax \advance \leftskip by \lispnarrowing \exdentamount=\lispnarrowing \let\exdent=\nofillexdent \let\nonarrowing=\relax \fi } % To ending an @example-like environment, we first end the paragraph % (via \afterenvbreak's vertical glue), and then the group. That way we % keep the zero \parskip that the environments set -- \parskip glue % will be inserted at the beginning of the next paragraph in the % document, after the environment. % \def\nonfillfinish{\afterenvbreak\endgroup}% \def\lisp{\begingroup \nonfillstart \let\Elisp = \nonfillfinish \tt % Make @kbd do something special, if requested. \let\kbdfont\kbdexamplefont \rawbackslash % have \ input char produce \ char from current font \gobble } % Define the \E... control sequence only if we are inside the % environment, so the error checking in \end will work. % % We must call \lisp last in the definition, since it reads the % return following the @example (or whatever) command. % \def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp} \def\smallexample{\begingroup \def\Esmallexample{\nonfillfinish\endgroup}\lisp} \def\smalllisp{\begingroup \def\Esmalllisp{\nonfillfinish\endgroup}\lisp} % @smallexample and @smalllisp. This is not used unless the @smallbook % command is given. Originally contributed by Pavel@xerox. % \def\smalllispx{\begingroup \nonfillstart \let\Esmalllisp = \nonfillfinish \let\Esmallexample = \nonfillfinish % % Smaller fonts for small examples. \indexfonts \tt \rawbackslash % make \ output the \ character from the current font (tt) \gobble } % This is @display; same as @lisp except use roman font. % \def\display{\begingroup \nonfillstart \let\Edisplay = \nonfillfinish \gobble } % This is @format; same as @display except don't narrow margins. % \def\format{\begingroup \let\nonarrowing = t \nonfillstart \let\Eformat = \nonfillfinish \gobble } % @flushleft (same as @format) and @flushright. % \def\flushleft{\begingroup \let\nonarrowing = t \nonfillstart \let\Eflushleft = \nonfillfinish \gobble } \def\flushright{\begingroup \let\nonarrowing = t \nonfillstart \let\Eflushright = \nonfillfinish \advance\leftskip by 0pt plus 1fill \gobble} % @quotation does normal linebreaking (hence we can't use \nonfillstart) % and narrows the margins. % \def\quotation{% \begingroup\inENV %This group ends at the end of the @quotation body {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip \singlespace \parindent=0pt % We have retained a nonzero parskip for the environment, since we're % doing normal filling. So to avoid extra space below the environment... \def\Equotation{\parskip = 0pt \nonfillfinish}% % % @cartouche defines \nonarrowing to inhibit narrowing at next level down. \ifx\nonarrowing\relax \advance\leftskip by \lispnarrowing \advance\rightskip by \lispnarrowing \exdentamount = \lispnarrowing \let\nonarrowing = \relax \fi } \message{defuns,} % Define formatter for defuns % First, allow user to change definition object font (\df) internally \def\setdeffont #1 {\csname DEF#1\endcsname} \newskip\defbodyindent \defbodyindent=.4in \newskip\defargsindent \defargsindent=50pt \newskip\deftypemargin \deftypemargin=12pt \newskip\deflastargmargin \deflastargmargin=18pt \newcount\parencount % define \functionparens, which makes ( and ) and & do special things. % \functionparens affects the group it is contained in. \def\activeparens{% \catcode`\(=\active \catcode`\)=\active \catcode`\&=\active \catcode`\[=\active \catcode`\]=\active} % Make control sequences which act like normal parenthesis chars. \let\lparen = ( \let\rparen = ) {\activeparens % Now, smart parens don't turn on until &foo (see \amprm) % Be sure that we always have a definition for `(', etc. For example, % if the fn name has parens in it, \boldbrax will not be in effect yet, % so TeX would otherwise complain about undefined control sequence. \global\let(=\lparen \global\let)=\rparen \global\let[=\lbrack \global\let]=\rbrack \gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 } \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} % This is used to turn on special parens % but make & act ordinary (given that it's active). \gdef\boldbraxnoamp{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb\let&=\ampnr} % Definitions of (, ) and & used in args for functions. % This is the definition of ( outside of all parentheses. \gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested \global\advance\parencount by 1 } % % This is the definition of ( when already inside a level of parens. \gdef\opnested{\char`\(\global\advance\parencount by 1 } % \gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0. % also in that case restore the outer-level definition of (. \ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi \global\advance \parencount by -1 } % If we encounter &foo, then turn on ()-hacking afterwards \gdef\amprm#1 {{\rm\}\let(=\oprm \let)=\clrm\ } % \gdef\normalparens{\boldbrax\let&=\ampnr} } % End of definition inside \activeparens %% These parens (in \boldbrax) actually are a little bolder than the %% contained text. This is especially needed for [ and ] \def\opnr{{\sf\char`\(}\global\advance\parencount by 1 } \def\clnr{{\sf\char`\)}\global\advance\parencount by -1 } \def\ampnr{\&} \def\lbrb{{\bf\char`\[}} \def\rbrb{{\bf\char`\]}} % First, defname, which formats the header line itself. % #1 should be the function name. % #2 should be the type of definition, such as "Function". \def\defname #1#2{% % Get the values of \leftskip and \rightskip as they were % outside the @def... \dimen2=\leftskip \advance\dimen2 by -\defbodyindent \dimen3=\rightskip \advance\dimen3 by -\defbodyindent \noindent % \setbox0=\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}% \dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line \dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuations \parshape 2 0in \dimen0 \defargsindent \dimen1 % % Now output arg 2 ("Function" or some such) % ending at \deftypemargin from the right margin, % but stuck inside a box of width 0 so it does not interfere with linebreaking {% Adjust \hsize to exclude the ambient margins, % so that \rightline will obey them. \advance \hsize by -\dimen2 \advance \hsize by -\dimen3 \rlap{\rightline{{\rm #2}\hskip \deftypemargin}}}% % Make all lines underfull and no complaints: \tolerance=10000 \hbadness=10000 \advance\leftskip by -\defbodyindent \exdentamount=\defbodyindent {\df #1}\enskip % Generate function name } % Actually process the body of a definition % #1 should be the terminating control sequence, such as \Edefun. % #2 should be the "another name" control sequence, such as \defunx. % #3 should be the control sequence that actually processes the header, % such as \defunheader. \def\defparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody \medbreak % % Define the end token that this defining construct specifies % so that it will exit this group. \def#1{\endgraf\endgroup\medbreak}% \def#2{\begingroup\obeylines\activeparens\spacesplit#3}% \parindent=0in \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent \exdentamount=\defbodyindent \begingroup % \catcode 61=\active % 61 is `=' \obeylines\activeparens\spacesplit#3} \def\defmethparsebody #1#2#3#4 {\begingroup\inENV % \medbreak % % Define the end token that this defining construct specifies % so that it will exit this group. \def#1{\endgraf\endgroup\medbreak}% \def#2##1 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}% \parindent=0in \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent \exdentamount=\defbodyindent \begingroup\obeylines\activeparens\spacesplit{#3{#4}}} \def\defopparsebody #1#2#3#4#5 {\begingroup\inENV % \medbreak % % Define the end token that this defining construct specifies % so that it will exit this group. \def#1{\endgraf\endgroup\medbreak}% \def#2##1 ##2 {\def#4{##1}% \begingroup\obeylines\activeparens\spacesplit{#3{##2}}}% \parindent=0in \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent \exdentamount=\defbodyindent \begingroup\obeylines\activeparens\spacesplit{#3{#5}}} % These parsing functions are similar to the preceding ones % except that they do not make parens into active characters. % These are used for "variables" since they have no arguments. \def\defvarparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody \medbreak % % Define the end token that this defining construct specifies % so that it will exit this group. \def#1{\endgraf\endgroup\medbreak}% \def#2{\begingroup\obeylines\spacesplit#3}% \parindent=0in \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent \exdentamount=\defbodyindent \begingroup % \catcode 61=\active % \obeylines\spacesplit#3} % This is used for \def{tp,vr}parsebody. It could probably be used for % some of the others, too, with some judicious conditionals. % \def\parsebodycommon#1#2#3{% \begingroup\inENV % \medbreak % % Define the end token that this defining construct specifies % so that it will exit this group. \def#1{\endgraf\endgroup\medbreak}% \def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}% \parindent=0in \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent \exdentamount=\defbodyindent \begingroup\obeylines } \def\defvrparsebody#1#2#3#4 {% \parsebodycommon{#1}{#2}{#3}% \spacesplit{#3{#4}}% } % This loses on `@deftp {Data Type} {struct termios}' -- it thinks the % type is just `struct', because we lose the braces in `{struct % termios}' when \spacesplit reads its undelimited argument. Sigh. % \let\deftpparsebody=\defvrparsebody % % So, to get around this, we put \empty in with the type name. That % way, TeX won't find exactly `{...}' as an undelimited argument, and % won't strip off the braces. % \def\deftpparsebody #1#2#3#4 {% \parsebodycommon{#1}{#2}{#3}% \spacesplit{\parsetpheaderline{#3{#4}}}\empty } % Fine, but then we have to eventually remove the \empty *and* the % braces (if any). That's what this does. % \def\removeemptybraces\empty#1\relax{#1} % After \spacesplit has done its work, this is called -- #1 is the final % thing to call, #2 the type name (which starts with \empty), and #3 % (which might be empty) the arguments. % \def\parsetpheaderline#1#2#3{% #1{\removeemptybraces#2\relax}{#3}% }% \def\defopvarparsebody #1#2#3#4#5 {\begingroup\inENV % \medbreak % % Define the end token that this defining construct specifies % so that it will exit this group. \def#1{\endgraf\endgroup\medbreak}% \def#2##1 ##2 {\def#4{##1}% \begingroup\obeylines\spacesplit{#3{##2}}}% \parindent=0in \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent \exdentamount=\defbodyindent \begingroup\obeylines\spacesplit{#3{#5}}} % Split up #2 at the first space token. % call #1 with two arguments: % the first is all of #2 before the space token, % the second is all of #2 after that space token. % If #2 contains no space token, all of it is passed as the first arg % and the second is passed as empty. {\obeylines \gdef\spacesplit#1#2^^M{\endgroup\spacesplitfoo{#1}#2 \relax\spacesplitfoo}% \long\gdef\spacesplitfoo#1#2 #3#4\spacesplitfoo{% \ifx\relax #3% #1{#2}{}\else #1{#2}{#3#4}\fi}} % So much for the things common to all kinds of definitions. % Define @defun. % First, define the processing that is wanted for arguments of \defun % Use this to expand the args and terminate the paragraph they make up \def\defunargs #1{\functionparens \sl % Expand, preventing hyphenation at `-' chars. % Note that groups don't affect changes in \hyphenchar. \hyphenchar\tensl=0 #1% \hyphenchar\tensl=45 \ifnum\parencount=0 \else \errmessage{Unbalanced parentheses in @def}\fi% \interlinepenalty=10000 \advance\rightskip by 0pt plus 1fil \endgraf\penalty 10000\vskip -\parskip\penalty 10000% } \def\deftypefunargs #1{% % Expand, preventing hyphenation at `-' chars. % Note that groups don't affect changes in \hyphenchar. % Use \boldbraxnoamp, not \functionparens, so that & is not special. \boldbraxnoamp \tclose{#1}% avoid \code because of side effects on active chars \interlinepenalty=10000 \advance\rightskip by 0pt plus 1fil \endgraf\penalty 10000\vskip -\parskip\penalty 10000% } % Do complete processing of one @defun or @defunx line already parsed. % @deffn Command forward-char nchars \def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader} \def\deffnheader #1#2#3{\doind {fn}{\code{#2}}% \begingroup\defname {#2}{#1}\defunargs{#3}\endgroup % \catcode 61=\other % Turn off change made in \defparsebody } % @defun == @deffn Function \def\defun{\defparsebody\Edefun\defunx\defunheader} \def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index \begingroup\defname {#1}{Function}% \defunargs {#2}\endgroup % \catcode 61=\other % Turn off change made in \defparsebody } % @deftypefun int foobar (int @var{foo}, float @var{bar}) \def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader} % #1 is the data type. #2 is the name and args. \def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax} % #1 is the data type, #2 the name, #3 the args. \def\deftypefunheaderx #1#2 #3\relax{% \doind {fn}{\code{#2}}% Make entry in function index \begingroup\defname {\defheaderxcond#1\relax$$$#2}{Function}% \deftypefunargs {#3}\endgroup % \catcode 61=\other % Turn off change made in \defparsebody } % @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar}) \def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader} % \defheaderxcond#1\relax$$$ % puts #1 in @code, followed by a space, but does nothing if #1 is null. \def\defheaderxcond#1#2$$${\ifx#1\relax\else\code{#1#2} \fi} % #1 is the classification. #2 is the data type. #3 is the name and args. \def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax} % #1 is the classification, #2 the data type, #3 the name, #4 the args. \def\deftypefnheaderx #1#2#3 #4\relax{% \doind {fn}{\code{#3}}% Make entry in function index \begingroup \normalparens % notably, turn off `&' magic, which prevents % at least some C++ text from working \defname {\defheaderxcond#2\relax$$$#3}{#1}% \deftypefunargs {#4}\endgroup % \catcode 61=\other % Turn off change made in \defparsebody } % @defmac == @deffn Macro \def\defmac{\defparsebody\Edefmac\defmacx\defmacheader} \def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index \begingroup\defname {#1}{Macro}% \defunargs {#2}\endgroup % \catcode 61=\other % Turn off change made in \defparsebody } % @defspec == @deffn Special Form \def\defspec{\defparsebody\Edefspec\defspecx\defspecheader} \def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index \begingroup\defname {#1}{Special Form}% \defunargs {#2}\endgroup % \catcode 61=\other % Turn off change made in \defparsebody } % This definition is run if you use @defunx % anywhere other than immediately after a @defun or @defunx. \def\deffnx #1 {\errmessage{@deffnx in invalid context}} \def\defunx #1 {\errmessage{@defunx in invalid context}} \def\defmacx #1 {\errmessage{@defmacx in invalid context}} \def\defspecx #1 {\errmessage{@defspecx in invalid context}} \def\deftypefnx #1 {\errmessage{@deftypefnx in invalid context}} \def\deftypemethodx #1 {\errmessage{@deftypemethodx in invalid context}} \def\deftypeunx #1 {\errmessage{@deftypeunx in invalid context}} % @defmethod, and so on % @defop {Funny Method} foo-class frobnicate argument \def\defop #1 {\def\defoptype{#1}% \defopparsebody\Edefop\defopx\defopheader\defoptype} \def\defopheader #1#2#3{% \dosubind {fn}{\code{#2}}{on #1}% Make entry in function index \begingroup\defname {#2}{\defoptype{} on #1}% \defunargs {#3}\endgroup % } % @deftypemethod foo-class return-type foo-method args % \def\deftypemethod{% \defmethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader} % % #1 is the class name, #2 the data type, #3 the method name, #4 the args. \def\deftypemethodheader#1#2#3#4{% \deftypefnheaderx{Method on #1}{#2}#3 #4\relax } % @defmethod == @defop Method \def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader} \def\defmethodheader #1#2#3{% \dosubind {fn}{\code{#2}}{on #1}% entry in function index \begingroup\defname {#2}{Method on #1}% \defunargs {#3}\endgroup % } % @defcv {Class Option} foo-class foo-flag \def\defcv #1 {\def\defcvtype{#1}% \defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype} \def\defcvarheader #1#2#3{% \dosubind {vr}{\code{#2}}{of #1}% Make entry in var index \begingroup\defname {#2}{\defcvtype{} of #1}% \defvarargs {#3}\endgroup % } % @defivar == @defcv {Instance Variable} \def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader} \def\defivarheader #1#2#3{% \dosubind {vr}{\code{#2}}{of #1}% Make entry in var index \begingroup\defname {#2}{Instance Variable of #1}% \defvarargs {#3}\endgroup % } % These definitions are run if you use @defmethodx, etc., % anywhere other than immediately after a @defmethod, etc. \def\defopx #1 {\errmessage{@defopx in invalid context}} \def\defmethodx #1 {\errmessage{@defmethodx in invalid context}} \def\defcvx #1 {\errmessage{@defcvx in invalid context}} \def\defivarx #1 {\errmessage{@defivarx in invalid context}} % Now @defvar % First, define the processing that is wanted for arguments of @defvar. % This is actually simple: just print them in roman. % This must expand the args and terminate the paragraph they make up \def\defvarargs #1{\normalparens #1% \interlinepenalty=10000 \endgraf\penalty 10000\vskip -\parskip\penalty 10000} % @defvr Counter foo-count \def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader} \def\defvrheader #1#2#3{\doind {vr}{\code{#2}}% \begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup} % @defvar == @defvr Variable \def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader} \def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index \begingroup\defname {#1}{Variable}% \defvarargs {#2}\endgroup % } % @defopt == @defvr {User Option} \def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader} \def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index \begingroup\defname {#1}{User Option}% \defvarargs {#2}\endgroup % } % @deftypevar int foobar \def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader} % #1 is the data type. #2 is the name, perhaps followed by text that % is actually part of the data type, which should not be put into the index. \def\deftypevarheader #1#2{% \dovarind#2 \relax% Make entry in variables index \begingroup\defname {\defheaderxcond#1\relax$$$#2}{Variable}% \interlinepenalty=10000 \endgraf\penalty 10000\vskip -\parskip\penalty 10000 \endgroup} \def\dovarind#1 #2\relax{\doind{vr}{\code{#1}}} % @deftypevr {Global Flag} int enable \def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader} \def\deftypevrheader #1#2#3{\dovarind#3 \relax% \begingroup\defname {\defheaderxcond#2\relax$$$#3}{#1} \interlinepenalty=10000 \endgraf\penalty 10000\vskip -\parskip\penalty 10000 \endgroup} % This definition is run if you use @defvarx % anywhere other than immediately after a @defvar or @defvarx. \def\defvrx #1 {\errmessage{@defvrx in invalid context}} \def\defvarx #1 {\errmessage{@defvarx in invalid context}} \def\defoptx #1 {\errmessage{@defoptx in invalid context}} \def\deftypevarx #1 {\errmessage{@deftypevarx in invalid context}} \def\deftypevrx #1 {\errmessage{@deftypevrx in invalid context}} % Now define @deftp % Args are printed in bold, a slight difference from @defvar. \def\deftpargs #1{\bf \defvarargs{#1}} % @deftp Class window height width ... \def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader} \def\deftpheader #1#2#3{\doind {tp}{\code{#2}}% \begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup} % This definition is run if you use @deftpx, etc % anywhere other than immediately after a @deftp, etc. \def\deftpx #1 {\errmessage{@deftpx in invalid context}} \message{cross reference,} % Define cross-reference macros \newwrite \auxfile \newif\ifhavexrefs % True if xref values are known. \newif\ifwarnedxrefs % True if we warned once that they aren't known. % @inforef is simple. \def\inforef #1{\inforefzzz #1,,,,**} \def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, node \samp{\ignorespaces#1{}}} % \setref{foo} defines a cross-reference point named foo. \def\setref#1{% \dosetq{#1-title}{Ytitle}% \dosetq{#1-pg}{Ypagenumber}% \dosetq{#1-snt}{Ysectionnumberandtype}} \def\unnumbsetref#1{% \dosetq{#1-title}{Ytitle}% \dosetq{#1-pg}{Ypagenumber}% \dosetq{#1-snt}{Ynothing}} \def\appendixsetref#1{% \dosetq{#1-title}{Ytitle}% \dosetq{#1-pg}{Ypagenumber}% \dosetq{#1-snt}{Yappendixletterandtype}} % \xref, \pxref, and \ref generate cross-references to specified points. % For \xrefX, #1 is the node name, #2 the name of the Info % cross-reference, #3 the printed node name, #4 the name of the Info % file, #5 the name of the printed manual. All but the node name can be % omitted. % \def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} \def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} \def\ref#1{\xrefX[#1,,,,,,,]} \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup \def\printedmanual{\ignorespaces #5}% \def\printednodename{\ignorespaces #3}% \setbox1=\hbox{\printedmanual}% \setbox0=\hbox{\printednodename}% \ifdim \wd0 = 0pt % No printed node name was explicitly given. \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax % Use the node name inside the square brackets. \def\printednodename{\ignorespaces #1}% \else % Use the actual chapter/section title appear inside % the square brackets. Use the real section title if we have it. \ifdim \wd1>0pt% % It is in another manual, so we don't have it. \def\printednodename{\ignorespaces #1}% \else \ifhavexrefs % We know the real title if we have the xref values. \def\printednodename{\refx{#1-title}{}}% \else % Otherwise just copy the Info node name. \def\printednodename{\ignorespaces #1}% \fi% \fi \fi \fi % % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not % insert empty discretionaries after hyphens, which means that it will % not find a line break at a hyphen in a node names. Since some manuals % are best written with fairly long node names, containing hyphens, this % is a loss. Therefore, we give the text of the node name again, so it % is as if TeX is seeing it for the first time. \ifdim \wd1 > 0pt \putwordsection{} ``\printednodename'' in \cite{\printedmanual}% \else % _ (for example) has to be the character _ for the purposes of the % control sequence corresponding to the node, but it has to expand % into the usual \leavevmode...\vrule stuff for purposes of % printing. So we \turnoffactive for the \refx-snt, back on for the % printing, back off for the \refx-pg. {\turnoffactive \refx{#1-snt}{}}% \space [\printednodename],\space \turnoffactive \putwordpage\tie\refx{#1-pg}{}% \fi \endgroup} % \dosetq is the interface for calls from other macros % Use \turnoffactive so that punctuation chars such as underscore % work in node names. \def\dosetq #1#2{{\let\folio=0 \turnoffactive \edef\next{\write\auxfile{\internalsetq {#1}{#2}}}% \next}} % \internalsetq {foo}{page} expands into % CHARACTERS 'xrdef {foo}{...expansion of \Ypage...} % When the aux file is read, ' is the escape character \def\internalsetq #1#2{'xrdef {#1}{\csname #2\endcsname}} % Things to be expanded by \internalsetq \def\Ypagenumber{\folio} \def\Ytitle{\thissection} \def\Ynothing{} \def\Ysectionnumberandtype{% \ifnum\secno=0 \putwordChapter\xreftie\the\chapno % \else \ifnum \subsecno=0 \putwordSection\xreftie\the\chapno.\the\secno % \else \ifnum \subsubsecno=0 % \putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno % \else % \putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno % \fi \fi \fi } \def\Yappendixletterandtype{% \ifnum\secno=0 \putwordAppendix\xreftie'char\the\appendixno{}% \else \ifnum \subsecno=0 \putwordSection\xreftie'char\the\appendixno.\the\secno % \else \ifnum \subsubsecno=0 % \putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno % \else % \putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno % \fi \fi \fi } \gdef\xreftie{'tie} % Use TeX 3.0's \inputlineno to get the line number, for better error % messages, but if we're using an old version of TeX, don't do anything. % \ifx\inputlineno\thisisundefined \let\linenumber = \empty % Non-3.0. \else \def\linenumber{\the\inputlineno:\space} \fi % Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. % If its value is nonempty, SUFFIX is output afterward. \def\refx#1#2{% \expandafter\ifx\csname X#1\endcsname\relax % If not defined, say something at least. \angleleft un\-de\-fined\angleright \ifhavexrefs \message{\linenumber Undefined cross reference `#1'.}% \else \ifwarnedxrefs\else \global\warnedxrefstrue \message{Cross reference values unknown; you must run TeX again.}% \fi \fi \else % It's defined, so just use it. \csname X#1\endcsname \fi #2% Output the suffix in any case. } % This is the macro invoked by entries in the aux file. % \def\xrdef#1{\begingroup % Reenable \ as an escape while reading the second argument. % \catcode`\\ = 0 % JAK \afterassignment\endgroup \expandafter\gdef\csname X#1\endcsname } % Read the last existing aux file, if any. No error if none exists. \def\readauxfile{\begingroup \catcode`\^^@=\other \catcode`\^^A=\other \catcode`\^^B=\other \catcode`\^^C=\other \catcode`\^^D=\other \catcode`\^^E=\other \catcode`\^^F=\other \catcode`\^^G=\other \catcode`\^^H=\other \catcode`\^^K=\other \catcode`\^^L=\other \catcode`\^^N=\other \catcode`\^^P=\other \catcode`\^^Q=\other \catcode`\^^R=\other \catcode`\^^S=\other \catcode`\^^T=\other \catcode`\^^U=\other \catcode`\^^V=\other \catcode`\^^W=\other \catcode`\^^X=\other \catcode`\^^Z=\other \catcode`\^^[=\other \catcode`\^^\=\other \catcode`\^^]=\other \catcode`\^^^=\other \catcode`\^^_=\other \catcode`\@=\other \catcode`\^=\other % It was suggested to define this as 7, which would allow ^^e4 etc. % in xref tags, i.e., node names. But since ^^e4 notation isn't % supported in the main text, it doesn't seem desirable. Furthermore, % that is not enough: for node names that actually contain a ^ % character, we would end up writing a line like this: 'xrdef {'hat % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first % argument, and \hat is not an expandable control sequence. It could % all be worked out, but why? Either we support ^^ or we don't. % % The other change necessary for this was to define \auxhat: % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter % and then to call \auxhat in \setq. % \catcode`\~=\other \catcode`\[=\other \catcode`\]=\other \catcode`\"=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\$=\other \catcode`\#=\other \catcode`\&=\other % `\+ does not work, so use 43. \catcode43=\other % Make the characters 128-255 be printing characters {% \count 1=128 \def\loop{% \catcode\count 1=\other \advance\count 1 by 1 \ifnum \count 1<256 \loop \fi }% }% % The aux file uses ' as the escape (for now). % Turn off \ as an escape so we do not lose on % entries which were dumped with control sequences in their names. % For example, 'xrdef {$\leq $-fun}{page ...} made by @defun ^^ % Reference to such entries still does not work the way one would wish, % but at least they do not bomb out when the aux file is read in. \catcode`\{=1 \catcode`\}=2 \catcode`\%=\other \catcode`\'=0 \catcode`\\=\other % \openin 1 \jobname.aux \ifeof 1 \else \closein 1 \input \jobname.aux \global\havexrefstrue \global\warnedobstrue \fi % Open the new aux file. TeX will close it automatically at exit. \openout\auxfile=\jobname.aux \endgroup} % Footnotes. \newcount \footnoteno % The trailing space in the following definition for supereject is % vital for proper filling; pages come out unaligned when you do a % pagealignmacro call if that space before the closing brace is % removed. (Generally, numeric constants should always be followed by a % space to prevent strange expansion errors.) \def\supereject{\par\penalty -20000\footnoteno =0 } % @footnotestyle is meaningful for info output only. \let\footnotestyle=\comment \let\ptexfootnote=\footnote {\catcode `\@=11 % % Auto-number footnotes. Otherwise like plain. \gdef\footnote{% \global\advance\footnoteno by \@ne \edef\thisfootno{$^{\the\footnoteno}$}% % % In case the footnote comes at the end of a sentence, preserve the % extra spacing after we do the footnote number. \let\@sf\empty \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi % % Remove inadvertent blank space before typesetting the footnote number. \unskip \thisfootno\@sf \footnotezzz }% % Don't bother with the trickery in plain.tex to not require the % footnote text as a parameter. Our footnotes don't need to be so general. % % Oh yes, they do; otherwise, @ifset and anything else that uses % \parseargline fail inside footnotes because the tokens are fixed when % the footnote is read. --karl, 16nov96. % \long\gdef\footnotezzz{\insert\footins\bgroup % We want to typeset this text as a normal paragraph, even if the % footnote reference occurs in (for example) a display environment. % So reset some parameters. \interlinepenalty\interfootnotelinepenalty \splittopskip\ht\strutbox % top baseline for broken footnotes \splitmaxdepth\dp\strutbox \floatingpenalty\@MM \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip \parindent\defaultparindent % % Hang the footnote text off the number. \hang \textindent{\thisfootno}% % % Don't crash into the line above the footnote text. Since this % expands into a box, it must come within the paragraph, lest it % provide a place where TeX can split the footnote. \footstrut \futurelet\next\fo@t } \def\fo@t{\ifcat\bgroup\noexpand\next \let\next\f@@t \else\let\next\f@t\fi \next} \def\f@@t{\bgroup\aftergroup\@foot\let\next} \def\f@t#1{#1\@foot} \def\@foot{\strut\egroup} }%end \catcode `\@=11 % Set the baselineskip to #1, and the lineskip and strut size % correspondingly. There is no deep meaning behind these magic numbers % used as factors; they just match (closely enough) what Knuth defined. % \def\lineskipfactor{.08333} \def\strutheightpercent{.70833} \def\strutdepthpercent {.29167} % \def\setleading#1{% \normalbaselineskip = #1\relax \normallineskip = \lineskipfactor\normalbaselineskip \normalbaselines \setbox\strutbox =\hbox{% \vrule width0pt height\strutheightpercent\baselineskip depth \strutdepthpercent \baselineskip }% } % @| inserts a changebar to the left of the current line. It should % surround any changed text. This approach does *not* work if the % change spans more than two lines of output. To handle that, we would % have adopt a much more difficult approach (putting marks into the main % vertical list for the beginning and end of each change). % \def\|{% % \vadjust can only be used in horizontal mode. \leavevmode % % Append this vertical mode material after the current line in the output. \vadjust{% % We want to insert a rule with the height and depth of the current % leading; that is exactly what \strutbox is supposed to record. \vskip-\baselineskip % % \vadjust-items are inserted at the left edge of the type. So % the \llap here moves out into the left-hand margin. \llap{% % % For a thicker or thinner bar, change the `1pt'. \vrule height\baselineskip width1pt % % This is the space between the bar and the text. \hskip 12pt }% }% } % For a final copy, take out the rectangles % that mark overfull boxes (in case you have decided % that the text looks ok even though it passes the margin). % \def\finalout{\overfullrule=0pt} % @image. We use the macros from epsf.tex to support this. % If epsf.tex is not installed and @image is used, we complain. % % Check for and read epsf.tex up front. If we read it only at @image % time, we might be inside a group, and then its definitions would get % undone and the next image would fail. \openin 1 = epsf.tex \ifeof 1 \else \closein 1 \def\epsfannounce{\toks0 = }% do not bother showing banner \input epsf.tex \fi % \newif\ifwarnednoepsf \newhelp\noepsfhelp{epsf.tex must be installed for images to work. It is also included in the Texinfo distribution, or you can get it from ftp://ftp.tug.org/tex/epsf.tex.} % % Only complain once about lack of epsf.tex. \def\image#1{% \ifx\epsfbox\undefined \ifwarnednoepsf \else \errhelp = \noepsfhelp \errmessage{epsf.tex not found, images will be ignored}% \global\warnednoepsftrue \fi \else \imagexxx #1,,,\finish \fi } % % Arguments to @image: % #1 is (mandatory) image filename; we tack on .eps extension. % #2 is (optional) width, #3 is (optional) height. % #4 is just the usual extra ignored arg for parsing this stuff. \def\imagexxx#1,#2,#3,#4\finish{% % \epsfbox itself resets \epsf?size at each figure. \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi \epsfbox{#1.eps}% } % End of control word definitions. \message{and turning on texinfo input format.} \def\openindices{% \newindex{cp}% \newcodeindex{fn}% \newcodeindex{vr}% \newcodeindex{tp}% \newcodeindex{ky}% \newcodeindex{pg}% } % Set some numeric style parameters, for 8.5 x 11 format. \hsize = 6in \hoffset = .25in \newdimen\defaultparindent \defaultparindent = 15pt \parindent = \defaultparindent \parskip 3pt plus 2pt minus 1pt \setleading{13.2pt} \advance\topskip by 1.2cm \chapheadingskip = 15pt plus 4pt minus 2pt \secheadingskip = 12pt plus 3pt minus 2pt \subsecheadingskip = 9pt plus 2pt minus 2pt % Prevent underfull vbox error messages. \vbadness=10000 % Following George Bush, just get rid of widows and orphans. \widowpenalty=10000 \clubpenalty=10000 % Use TeX 3.0's \emergencystretch to help line breaking, but if we're % using an old version of TeX, don't do anything. We want the amount of % stretch added to depend on the line length, hence the dependence on % \hsize. This makes it come to about 9pt for the 8.5x11 format. % \ifx\emergencystretch\thisisundefined % Allow us to assign to \emergencystretch anyway. \def\emergencystretch{\dimen0}% \else \emergencystretch = \hsize \divide\emergencystretch by 45 \fi % Use @smallbook to reset parameters for 7x9.5 format (or else 7x9.25) \def\smallbook{ \global\chapheadingskip = 15pt plus 4pt minus 2pt \global\secheadingskip = 12pt plus 3pt minus 2pt \global\subsecheadingskip = 9pt plus 2pt minus 2pt % \global\lispnarrowing = 0.3in \setleading{12pt} \advance\topskip by -1cm \global\parskip 2pt plus 1pt \global\hsize = 5in \global\vsize=7.5in \global\tolerance=700 \global\hfuzz=1pt \global\contentsrightmargin=0pt \global\deftypemargin=0pt \global\defbodyindent=.5cm % \global\pagewidth=\hsize \global\pageheight=\vsize % \global\let\smalllisp=\smalllispx \global\let\smallexample=\smalllispx \global\def\Esmallexample{\Esmalllisp} } % Use @afourpaper to print on European A4 paper. \def\afourpaper{ \global\tolerance=700 \global\hfuzz=1pt \setleading{12pt} \global\parskip 15pt plus 1pt \global\vsize= 53\baselineskip \advance\vsize by \topskip %\global\hsize= 5.85in % A4 wide 10pt \global\hsize= 6.5in \global\outerhsize=\hsize \global\advance\outerhsize by 0.5in \global\outervsize=\vsize \global\advance\outervsize by 0.6in \global\pagewidth=\hsize \global\pageheight=\vsize } \bindingoffset=0pt \normaloffset=\hoffset \pagewidth=\hsize \pageheight=\vsize % Allow control of the text dimensions. Parameters in order: textheight; % textwidth; voffset; hoffset; binding offset; topskip. % All require a dimension; % header is additional; added length extends the bottom of the page. \def\changepagesizes#1#2#3#4#5#6{ \global\vsize= #1 \global\topskip= #6 \advance\vsize by \topskip \global\voffset= #3 \global\hsize= #2 \global\outerhsize=\hsize \global\advance\outerhsize by 0.5in \global\outervsize=\vsize \global\advance\outervsize by 0.6in \global\pagewidth=\hsize \global\pageheight=\vsize \global\normaloffset= #4 \global\bindingoffset= #5} % A specific text layout, 24x15cm overall, intended for A4 paper. Top margin % 29mm, hence bottom margin 28mm, nominal side margin 3cm. \def\afourlatex {\global\tolerance=700 \global\hfuzz=1pt \setleading{12pt} \global\parskip 15pt plus 1pt \advance\baselineskip by 1.6pt \changepagesizes{237mm}{150mm}{3.6mm}{3.6mm}{3mm}{7mm} } % Use @afourwide to print on European A4 paper in wide format. \def\afourwide{\afourpaper \changepagesizes{9.5in}{6.5in}{\hoffset}{\normaloffset}{\bindingoffset}{7mm}} % Define macros to output various characters with catcode for normal text. \catcode`\"=\other \catcode`\~=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\+=\other \def\normaldoublequote{"} \def\normaltilde{~} \def\normalcaret{^} \def\normalunderscore{_} \def\normalverticalbar{|} \def\normalless{<} \def\normalgreater{>} \def\normalplus{+} % This macro is used to make a character print one way in ttfont % where it can probably just be output, and another way in other fonts, % where something hairier probably needs to be done. % % #1 is what to print if we are indeed using \tt; #2 is what to print % otherwise. Since all the Computer Modern typewriter fonts have zero % interword stretch (and shrink), and it is reasonable to expect all % typewriter fonts to have this, we can check that font parameter. % \def\ifusingtt#1#2{\ifdim \fontdimen3\the\font=0pt #1\else #2\fi} % Turn off all special characters except @ % (and those which the user can use as if they were ordinary). % Most of these we simply print from the \tt font, but for some, we can % use math or other variants that look better in normal text. \catcode`\"=\active \def\activedoublequote{{\tt \char '042}} \let"=\activedoublequote \catcode`\~=\active \def~{{\tt \char '176}} \chardef\hat=`\^ \catcode`\^=\active \def^{{\tt \hat}} \catcode`\_=\active \def_{\ifusingtt\normalunderscore\_} % Subroutine for the previous macro. \def\_{\leavevmode \kern.06em \vbox{\hrule width.3em height.1ex}} \catcode`\|=\active \def|{{\tt \char '174}} \chardef \less=`\< \catcode`\<=\active \def<{{\tt \less}} \chardef \gtr=`\> \catcode`\>=\active \def>{{\tt \gtr}} \catcode`\+=\active \def+{{\tt \char 43}} %\catcode 27=\active %\def^^[{$\diamondsuit$} % Set up an active definition for =, but don't enable it most of the time. {\catcode`\==\active \global\def={{\tt \char 61}}} \catcode`+=\active \catcode`\_=\active % If a .fmt file is being used, characters that might appear in a file % name cannot be active until we have parsed the command line. % So turn them off again, and have \everyjob (or @setfilename) turn them on. % \otherifyactive is called near the end of this file. \def\otherifyactive{\catcode`+=\other \catcode`\_=\other} \catcode`\@=0 % \rawbackslashxx output one backslash character in current font \global\chardef\rawbackslashxx=`\\ %{\catcode`\\=\other %@gdef@rawbackslashxx{\}} % \rawbackslash redefines \ as input to do \rawbackslashxx. {\catcode`\\=\active @gdef@rawbackslash{@let\=@rawbackslashxx }} % \normalbackslash outputs one backslash in fixed width font. \def\normalbackslash{{\tt\rawbackslashxx}} % Say @foo, not \foo, in error messages. \escapechar=`\@ % \catcode 17=0 % Define control-q \catcode`\\=\active % Used sometimes to turn off (effectively) the active characters % even after parsing them. @def@turnoffactive{@let"=@normaldoublequote @let\=@realbackslash @let~=@normaltilde @let^=@normalcaret @let_=@normalunderscore @let|=@normalverticalbar @let<=@normalless @let>=@normalgreater @let+=@normalplus} @def@normalturnoffactive{@let"=@normaldoublequote @let\=@normalbackslash @let~=@normaltilde @let^=@normalcaret @let_=@normalunderscore @let|=@normalverticalbar @let<=@normalless @let>=@normalgreater @let+=@normalplus} % Make _ and + \other characters, temporarily. % This is canceled by @fixbackslash. @otherifyactive % If a .fmt file is being used, we don't want the `\input texinfo' to show up. % That is what \eatinput is for; after that, the `\' should revert to printing % a backslash. % @gdef@eatinput input texinfo{@fixbackslash} @global@let\ = @eatinput % On the other hand, perhaps the file did not have a `\input texinfo'. Then % the first `\{ in the file would cause an error. This macro tries to fix % that, assuming it is called before the first `\' could plausibly occur. % Also back turn on active characters that might appear in the input % file name, in case not using a pre-dumped format. % @gdef@fixbackslash{@ifx\@eatinput @let\ = @normalbackslash @fi @catcode`+=@active @catcode`@_=@active} %% These look ok in all fonts, so just make them not special. The @rm below %% makes sure that the current font starts out as the newly loaded cmr10 @catcode`@$=@other @catcode`@%=@other @catcode`@&=@other @catcode`@#=@other @textfonts @rm @c Local variables: @c page-delimiter: "^\\\\message" @c End: fweb-1.62/Web/ 40755 10061 1115 0 6602703257 12143 5ustar krommesusersfweb-1.62/Web/READ_ME.WEB100644 10061 1115 724 6602703127 13652 0ustar krommesusers --- FWEB SOURCE CODE --- This subdirectory Fweb/Web contains the source code for the FWEB processors, both the original web sources and the tangled results *.c and *.h. Please refer to INSTALL_FWEB.tex for descriptions of the files, although that should not be necessary for usual installations. To compile these files, use the Makefile if possible. To install FWEB, Unix users should run ./configure. Please refer to ../READ_ME.FWEB for further instructions. fweb-1.62/Web/Makefile100644 10061 1115 45432 6602703127 13724 0ustar krommesusers # --- FWEB MAKE FILE (v. 1.60) --- # Unix users should first type ``./configure'' for compiling a new version. # See the more detailed instructions below. # PLEASE REPORT ANY DIFFICULTIES WITH USING THIS MAKE FILE OR WITH ANY # OTHER ASPECT OF COMPILING OR RUNNING FWEB: krommes@princeton.edu. # You should PREFACE ALL MAJOR OPERATIONS with # make -n ... # This tells you what will happen without actually performing the operations. # --- PRINCIPAL ENTRY POINTS --- # The principal entry points to this make file can be determined by saying # ``make help''. (See the help: target below.) # BEFORE USING THIS MAKE FILE: # (1) If you are a Unix user, do the following: # cd Web # ./configure [--prefix=path] [--exec-prefix=path] # (This generates the following files appropriate to your system: # defaults.mk from defaults.mk.in; # config.h from config.h.in; # custom.h from custom.h.in.) # make # (log on as root) # make install # If you are not a Unix user, DO NOT PROCEED for v1.50 or above, as the # following system-specific bootstrap procedures have not been tested and # upgraded for this version. # (2) Select a boot subdirectory (containing system-specific files) most # relevant to your machine; call that $(BOOT_D). For example, # BOOT_D = boot/unix/ansi. # (3) Copy $(BOOT_D)/defaults.mk to the web subdirectory. # (4) Verify the system-specific definitions in defaults.mk. An example # of defaults.mk is provided in each bootstrap subdirectory. The possible # things that you may put into defaults.mk are discussed in # $(MANUAL)/INSTALL_FWEB.tex. # (4) Copy $(BOOT_D)/custom.h to the web subdirectory. This file # contains definitions of various machine- or operating-system-dependent # flags. It will be included into the *.c files by the C compiler. # --- INCLUDING FILES into the Makefile --- # The file defaults.mk customizes the operation of Makefile for your # compiler environment. # NOTE: Not all makes include files in identical ways; you may need to # modify the next line: include defaults.mk # Unix # ! include "defaults.mk" # Borland/Microsoft # --------------------- DON'T TOUCH LINES BELOW HERE!!! -------------------- # Experts will note that this file sometimes doesn't use the full power of # make (let alone gmake). This is because some of the makes on the personal # computers didn't work correctly with some of the more sophisticated commands. # Here we set up the command-line options for the FWEB processors. Those # options are as follows: # COMPILER --- Either CC or GCC. Presently only GCC is relevant, and then # only for the Sun. # FILE --- Should more properly be called PATH. The directory # specification for the output file. # HOME_MACHINE --- The machine on which you're tangling. See custom.web or # custom.h for a list of the possible macros to use here. # MACHINE --- The machine for which you're generating C code. # DEBUGGING --- Used by the developer. # STAT --- Optional additional commands, e.g., the statistics option -s; # sometimes used by the developer. # UNDEF --- Used by the developer. # # You can override macros such as MACHINE and FILE from the command line, # in the form, e.g., # make MACHINE=SGI FILE="$HOME/fweb/v1.1/unix/sgi" UNDEF = DEBUGGING = STAT = # In $(OPTIONS), # the -u option is used to cancel out a possible +m command in the .fweb # ini file. For the use of CUSTOM_OPTIONS, see custom.web. # To kill off line numbers, say ``STAT = -\#'' for many makes, or # ``STAT = -^#'' for the Microsoft nmake. OPTIONS = -u$(HOME_MACHINE) -m$(MACHINE) $(DEBUGGING)\ $(UNDEF) -m$(COMPILER) $(STAT) -=$(FILE)$(@) # Other upper-case macros, such as OS_HWEB, are used to express hidden # dependencies because of files that are @i'd or #included. # For more discussion of the various files, please see INSTALL_FWEB.tex. # Set up the directory macros. (top_srcdir and srcdir should be set in # defaults.mk. If they are not, one must say `top_srcdir=..', `srcdir=.') # --- Top-level--- FWEB0 = $(top_srcdir) # --- The bootstrap directory tree --- BOOT = $(FWEB0)/Boot # --- Where the demo programs are kept --- DEMOS = $(FWEB0)/Demos # --- Where the user manual and fwebmac.sty are kept --- MANUAL = $(FWEB0)/Manual # --- Where *.web, *.hweb, *.c, and *.h are kept --- WEB = $(srcdir) # If you just say ``make'' or ``make bootstrap'', the source files are # touched first so they're sure to be newer than the web files. If you don't # have a 'touch' facility, try saying ``make -t ...'' all bootstrap boot: tch_src both $(MANUAL)/fweb.info tch_src: $(TOUCH) $(WEB)/typedefs.hweb $(WEB)/*.h $(WEB)/*.c # --- This entry makes both FWEB processors from the FWEB sources. --- both: ftangle fweave idxmerge # --- The ``make bootstrap'' command assumes that the WEB files are there. # However, if you're just compiling you shouldn't need the WEB files. In the # absence of a WEB file, the null .DEFAULT command ``rebuilds'' the WEB file. # Then make will try to invoke ftangle. That shouldn't be there either, # but if it is, it will try to tangle a non-existent file. The .IGNORE # command tells make to continue anyway; then it will just compile. # (Unfortunately, these commands don't work with all makes, so they're # commented out.) #.DEFAULT: #.IGNORE: # --- Remake things if the make commands themselves change --- # .KEEP_STATE: # --- CUSTOMIZATION FILE --- $(WEB)/custom.h $(WEB)/custom.h.in: $(WEB)/custom.web ./ftangle $(WEB)/custom $(OPTIONS) $(CUSTOM_OPTIONS) -# -v # --- EXTRA MACRO FILE --- $(WEB)/strmac.h: $(WEB)/strmac.web $(WEB)/os.$(HWEB) ./ftangle $(WEB)/strmac $(OPTIONS) # --- #INCLUDEs --- INCLUDES_H = $(WEB)/os.h $(WEB)/config.h $(WEB)/custom.h $(WEB)/strmac.h D_TYPE_H = $(WEB)/d_type.h $(INCLUDES_H) Y_TYPE_H = $(WEB)/y_type.h $(INCLUDES_H) C_TYPE_H = $(WEB)/c_type.h $(Y_TYPE_H) $(D_TYPE_H) A_TYPE_H = $(WEB)/a_type.h $(INCLUDES_H) S_TYPE_H = $(WEB)/s_type.h $(A_TYPE_H) M_TYPE_H = $(WEB)/m_type.h $(INCLUDES_H) E_TYPE_H = $(WEB)/e_type.h $(C_TYPE_H) R_TYPE_H = $(WEB)/r_type.h $(C_TYPE_H) T_TYPE_H = $(WEB)/t_type.h\ $(S_TYPE_H) $(R_TYPE_H) $(E_TYPE_H) $(M_TYPE_H) P_TYPE_H = $(WEB)/p_type.h $(INCLUDES_H) W_TYPE_H = $(WEB)/w_type.h\ $(P_TYPE_H) $(C_TYPE_H) $(S_TYPE_H) $(D_TYPE_H) TYPEDEFS_H = $(WEB)/typedefs.h $(WEB)/os.h MAP_H = $(WEB)/map.h $(C_TYPE_H) $(S_TYPE_H) # --- PORTABILITY ISSUES are mostly localized here. --- OS_HWEB = $(WEB)/os.$(HWEB) $(WEB)/sfile.$(HWEB) INCLUDES_HWEB = $(WEB)/sfile.$(HWEB) $(WEB)/includes.$(HWEB)\ $(WEB)/proto.$(HWEB) $(WEB)/time.$(HWEB) COMMON_HWEB = $(OS_HWEB) $(WEB)/typedefs.$(HWEB) $(WEB)/mem.$(HWEB) $(WEB)/os.h: $(WEB)/os.web $(INCLUDES_HWEB) ./ftangle $(WEB)/os $(OPTIONS) -# # --- The fundamental macro packages: --- $(WEB)/typedefs.hweb $(WEB)/typedefs.h: $(WEB)/typedefs.web ./ftangle $(WEB)/typedefs $(OPTIONS) --F -# -=$(FILE)typedefs.h $(WEB)/map.h: $(WEB)/map.web ./ftangle $(WEB)/map $(OPTIONS) # --- COMMON (Routines common to both ftangle and fweave) --- COMMON = $(INCLUDES_HWEB) $(OS_HWEB)\ $(WEB)/typedefs.$(HWEB)\ $(WEB)/mem.$(HWEB) $(WEB)/trunc.$(HWEB) COMMON_WEB = $(WEB)/common.web $(COMMON) $(WEB)/common.c: $(COMMON_WEB) ./ftangle $(WEB)/common $(OPTIONS) C_TYPE_WEB = $(WEB)/c_type.web $(OS_HWEB) $(WEB)/c_type.h: $(C_TYPE_WEB) ./ftangle $(WEB)/c_type $(OPTIONS) Y_TYPE_WEB = $(WEB)/y_type.web $(OS_HWEB) $(WEB)/y_type.h: $(Y_TYPE_WEB) ./ftangle $(WEB)/y_type $(OPTIONS) COMMON_C = $(WEB)/common.c $(TYPEDEFS_H) $(MAP_H) COMMONS = common.$(O) $(COMMON2) commons: $(COMMONS) common.$(O): $(COMMON_C) $(COMPILE) $(PART1) $(WEB)/common.c common2.$(O): $(COMMON_C) $(COMPILE) $(PART2) $(WEB)/common.c # --- STYLE (Reading the style file; also needed for both ftangle and # fweave) --- S_TYPE_WEB = $(WEB)/s_type.web $(WEB)/s_type.h: $(S_TYPE_WEB) ./ftangle $(WEB)/s_type $(OPTIONS) STYLE = $(OS_HWEB) $(INCLUDES_HWEB)\ $(WEB)/typedefs.$(HWEB) $(WEB)/mem.$(HWEB) STYLE_WEB = $(WEB)/style.web $(STYLE) $(WEB)/style.c: $(STYLE_WEB) ./ftangle $(WEB)/style $(OPTIONS) style.$(O): $(WEB)/style.c $(TYPEDEFS_H) $(MAP_H) $(COMPILE) $(WEB)/style.c # --- TERMCAP (Dummy termcap routines) --- A_TYPE_WEB = $(WEB)/a_type.web $(OS_HWEB) $(WEB)/a_type.h: $(A_TYPE_WEB) ./ftangle $(WEB)/a_type $(OPTIONS) TERMCAP0_WEB = $(WEB)/termcap0.web $(WEB)/termcap0.c: $(TERMCAP0_WEB) ./ftangle $(WEB)/termcap0 $(OPTIONS) termcap0.$(O): $(WEB)/termcap0.c $(A_TYPE_H) $(COMPILE) $(WEB)/termcap0.c # --- RESERVED WORDS --- D_TYPE_WEB = $(WEB)/d_type.web $(OS_HWEB) $(WEB)/d_type.h: $(D_TYPE_WEB) ./ftangle $(WEB)/d_type $(OPTIONS) RESERVED_WEB = $(WEB)/reserved.web $(COMMON_HWEB)\ $(WEB)/ccodes.$(HWEB) $(WEB)/xrefs.$(HWEB) $(WEB)/reserved.c: $(RESERVED_WEB) ./ftangle $(WEB)/reserved $(OPTIONS) RESERVED_C = $(WEB)/reserved.c $(TYPEDEFS_H) $(C_TYPE_H) RESERVES = reserved.$(O) $(RESERVED2) reserves: $(RESERVES) reserved.$(O): $(RESERVED_C) $(COMPILE) $(PART1) $(WEB)/reserved.c reservd2.$(O): $(RESERVED_C) $(COMPILE) $(PART2) $(WEB)/reserved.c # --- MACS (Macro processing for ftangle) --- M_TYPE_WEB = $(WEB)/m_type.web $(OS_HWEB) $(WEB)/m_type.h: $(M_TYPE_WEB) ./ftangle $(WEB)/m_type $(OPTIONS) MACS = $(COMMON_HWEB) $(WEB)/macs.$(HWEB) $(WEB)/t_codes.$(HWEB)\ $(WEB)/texts.$(HWEB) $(WEB)/stacks.$(HWEB)\ $(WEB)/val.$(HWEB) $(WEB)/trunc.$(HWEB) MACS_WEB = $(WEB)/macs.web $(MACS) $(WEB)/macs.c: $(MACS_WEB) ./ftangle $(WEB)/macs $(OPTIONS) macs.$(O): $(WEB)/macs.c $(T_TYPE_H) $(TYPEDEFS_H) $(MAP_H) $(COMPILE) $(WEB)/macs.c # --- RATFOR (Implementing the Ratfor language for ftangle) --- RATFOR = $(COMMON_HWEB) $(WEB)/t_codes.$(HWEB) $(WEB)/texts.$(HWEB)\ $(WEB)/stacks.$(HWEB) $(WEB)/val.$(HWEB)\ $(WEB)/macs.$(HWEB)\ $(WEB)/trunc.$(HWEB) RATFOR_WEB = $(WEB)/ratfor.web $(RATFOR) $(WEB)/ratfor.c: $(RATFOR_WEB) ./ftangle $(WEB)/ratfor $(OPTIONS) R_TYPE_WEB = $(WEB)/r_type.web $(OS_HWEB) $(WEB)/r_type.h: $(R_TYPE_WEB) ./ftangle $(WEB)/r_type $(OPTIONS) RATFOR_C = $(WEB)/ratfor.c $(T_TYPE_H) $(TYPEDEFS_H) $(MAP_H) RATFORS = ratfor$(LOAD_RATFOR).$(O) $(RATFOR2) ratfors: $(RATFORS) ratfor.$(O): $(RATFOR_C) $(COMPILE) $(PART1) $(WEB)/ratfor.c ratfor2.$(O): $(RATFOR_C) $(COMPILE) $(PART2) $(WEB)/ratfor.c RATFOR0_WEB = $(WEB)/ratfor0.web $(RATFOR) $(WEB)/ratfor0.c: $(RATFOR0_WEB) ./ftangle $(WEB)/ratfor0 $(OPTIONS) ratfor0.$(O): $(WEB)/ratfor0.c $(T_TYPE_H) $(COMPILE) $(WEB)/ratfor0.c # --- EVAL (Expression evaluation) --- EVAL = $(COMMON_HWEB) $(WEB)/val.$(HWEB) $(WEB)/os.$(HWEB)\ $(WEB)/t_codes.$(HWEB) EVAL_WEB = $(WEB)/eval.web $(EVAL) $(WEB)/eval.c: $(EVAL_WEB) ./ftangle $(WEB)/eval $(OPTIONS) E_TYPE_WEB = $(WEB)/e_type.web $(OS_HWEB) $(WEB)/e_type.h: $(E_TYPE_WEB) ./ftangle $(WEB)/e_type $(OPTIONS) eval.$(O): $(WEB)/eval.c $(E_TYPE_H) $(TYPEDEFS_H) $(COMPILE) $(WEB)/eval.c # --- FTANGLE (The ftangle processor) --- FTANGLE = $(COMMON_HWEB) $(WEB)/macs.$(HWEB) $(WEB)/t_codes.$(HWEB)\ $(WEB)/texts.$(HWEB) $(WEB)/stacks.$(HWEB)\ $(WEB)/val.$(HWEB) $(WEB)/trunc.$(HWEB) FTANGLE_WEB = $(WEB)/ftangle.web $(FTANGLE) $(WEB)/ftangle.c: $(FTANGLE_WEB) ./ftangle $(WEB)/ftangle $(OPTIONS) T_TYPE_WEB = $(WEB)/t_type.web $(OS_HWEB) $(WEB)/t_type.h: $(T_TYPE_WEB) ./ftangle $(WEB)/t_type $(OPTIONS) FTANGLE_C = $(WEB)/ftangle.c $(T_TYPE_H) $(TYPEDEFS_H) $(MAP_H) FTANGLES = ftangle.$(O) $(FTANGLE2) $(FTANGLE3) ftangles: $(FTANGLES) ftangle.$(O): $(FTANGLE_C) $(COMPILE) $(PART1) $(WEB)/ftangle.c ftangle2.$(O): $(FTANGLE_C) $(COMPILE) $(PART2) $(WEB)/ftangle.c ftangle3.$(O): $(FTANGLE_C) $(COMPILE) $(PART3) $(WEB)/ftangle.c # In the following, ftangle0 is used when making with LOAD_RATFOR=0. ftangle ftangle0 ftangle.exe: $(FTANGLES)\ $(COMMONS) $(RATFORS) $(RESERVES) \ eval.$(O) macs.$(O) style.$(O) $(TERMCAP0) $(LINK) ftangle$(OBJ) $(FTANGLE2) $(FTANGLE3)\ common$(OBJ) $(COMMON2)\ reserved$(OBJ) $(RESERVED2)\ ratfor$(LOAD_RATFOR)$(OBJ) $(RATFOR2)\ eval$(OBJ) macs$(OBJ) style$(OBJ) $(TERMCAP0)\ $(LIBS) # --- PROD (The ``productions'' for fweave) --- P_TYPE_WEB = $(WEB)/p_type.web $(OS_HWEB) $(WEB)/p_type.h: $(P_TYPE_WEB) ./ftangle $(WEB)/p_type $(OPTIONS) PROD = $(COMMON_HWEB) $(WEB)/xrefs.$(HWEB) $(WEB)/tokens.$(HWEB)\ $(WEB)/ccodes.$(HWEB) $(WEB)/output.$(HWEB)\ $(WEB)/scraps.$(HWEB) PROD_WEB = $(WEB)/prod.web $(PROD) $(WEB)/prod.c: $(PROD_WEB) ./ftangle $(WEB)/prod $(OPTIONS) PROD_C = $(WEB)/prod.c $(P_TYPE_H) $(TYPEDEFS_H) $(MAP_H) PRODS = prod.$(O) $(PROD2) prods: $(PRODS) prod.$(O): $(PROD_C) $(COMPILE) $(PART1) $(WEB)/prod.c prod2.$(O): $(PROD_C) $(COMPILE) $(PART2) $(WEB)/prod.c # --- FWEAVE (The fweave processor) --- W_TYPE_WEB = $(WEB)/w_type.web $(OS_HWEB) $(WEB)/w_type.h: $(W_TYPE_WEB) ./ftangle $(WEB)/w_type $(OPTIONS) FWEAVE = $(COMMON_HWEB) $(WEB)/xrefs.$(HWEB) $(WEB)/tokens.$(HWEB)\ $(WEB)/ccodes.$(HWEB) $(WEB)/output.$(HWEB)\ $(WEB)/scraps.$(HWEB) FWEAVE_WEB = $(WEB)/fweave.web $(FWEAVE) $(WEB)/fweave.c: $(FWEAVE_WEB) ./ftangle $(WEB)/fweave $(OPTIONS) FWEAVE_C = $(WEB)/fweave.c $(W_TYPE_H) $(TYPEDEFS_H) $(MAP_H) FWEAVES = fweave.$(O) $(FWEAVE2) $(FWEAVE3) fweaves: $(FWEAVES) fweave.$(O): $(FWEAVE_C) $(COMPILE) $(PART1) $(WEB)/fweave.c fweave2.$(O): $(FWEAVE_C) $(COMPILE) $(PART2) $(WEB)/fweave.c fweave3.$(O): $(FWEAVE_C) $(COMPILE) $(PART3) $(WEB)/fweave.c fweave fweave.exe: $(FWEAVES)\ $(COMMONS) $(PRODS) ratfor0.$(O) $(RESERVES) style.$(O)\ $(TERMCAP0) $(LINK) fweave$(OBJ) $(FWEAVE2) $(FWEAVE3)\ common$(OBJ) $(COMMON2)\ prod$(OBJ) $(PROD2)\ reserved$(OBJ) $(RESERVED2)\ style$(OBJ) ratfor0$(OBJ) $(TERMCAP0)\ $(LIBS) # --- IDXMERGE (utility for merging several indexes) --- $(WEB)/idxmerge.c: $(WEB)/idxmerge.web ./ftangle $(WEB)/idxmerge $(OPTIONS) idxmerge.$(O): $(WEB)/idxmerge.c $(COMPILE) $(WEB)/idxmerge.c idxmerge idxmerge.exe: idxmerge.$(O) $(LINK) idxmerge$(OBJ) #------------------------------------------------------------------------------ # --- DOCUMENTATION --- FWEB_TEX = $(FWEB0)fweb.tex # This file is included for all documentation. # --- We can handle all the dvi files with a generalized suffix rule. --- # If your make (e.g., Borland) doesn't like the following line, try just # commenting it out. .SUFFIXES: .tex .dvi .tex.dvi: latex $* $(PRINT_DVI) $(@) # In the following, note the occasional use of the -i command-line option # to fweave. This prevents repeated printing of the header files that are # included via @I. fwebmac.tex: $(MANUAL)/fwebmac.web ./fweave $(MANUAL)/fwebmac custom.tex: $(WEB)/custom.web $(WEB)/formats.$(HWEB) ./fweave $(WEB)/custom strmac.tex: $(WEB)/strmac.web $(OS_HWEB) $(WEB)/formats.$(HWEB) ./fweave $(WEB)/strmac -i y_type.tex: $(Y_TYPE_WEB) $(WEB)/formats.$(HWEB) ./fweave $(WEB)/y_type -i c_type.tex: $(C_TYPE_WEB) $(WEB)/formats.$(HWEB) ./fweave $(WEB)/c_type -i common.tex: $(COMMON_WEB) ./fweave $(WEB)/common e_type.tex: $(E_TYPE_WEB) $(WEB)/formats.$(HWEB) ./fweave $(WEB)/e_type -i eval.tex: $(EVAL_WEB) ./fweave $(WEB)/eval -i m_type.tex: $(M_TYPE_WEB) $(WEB)/formats.$(HWEB) ./fweave $(WEB)/m_type -i macs.tex: $(MACS_WEB) ./fweave $(WEB)/macs -i p_type.tex: $(P_TYPE_WEB) $(WEB)/formats.$(HWEB) ./fweave $(WEB)/p_type -i prod.tex: $(PROD_WEB) ./fweave $(WEB)/prod -i r_type.tex: $(R_TYPE_WEB) $(WEB)/formats.$(HWEB) ./fweave $(WEB)/r_type -i ratfor.tex: $(RATFOR_WEB) ./fweave $(WEB)/ratfor -i ratfor0.tex: $(RATFOR0_WEB) ./fweave $(WEB)/ratfor0 -i d_type.tex: $(D_TYPE_WEB) $(WEB)/formats.$(HWEB) ./fweave $(WEB)/d_type -i reserved.tex: $(RESERVED_WEB) ./fweave $(WEB)/reserved -i -ykw750 t_type.tex: $(T_TYPE_WEB) $(WEB)/formats.$(HWEB) ./fweave $(WEB)/t_type -i ftangle.tex: $(FTANGLE_WEB) ./fweave $(WEB)/ftangle -i s_type.tex: $(S_TYPE_WEB) $(WEB)/formats.$(HWEB) ./fweave $(WEB)/s_type -i style.tex: $(STYLE_WEB) ./fweave $(WEB)/style -i a_type.tex: $(A_TYPE_WEB) $(WEB)/formats.$(HWEB) ./fweave $(WEB)/a_type -i termcap0.tex: $(TERMCAP0_WEB) ./fweave $(WEB)/termcap0 -i w_type.tex: $(W_TYPE_WEB) $(WEB)/formats.$(HWEB) ./fweave $(WEB)/w_type -i fweave.tex: $(FWEAVE_WEB) ./fweave $(WEB)/fweave -i #------------------------------------------------------------------------------ # --- INSTALLATION of the processors --- install: both idxmerge $(MANUAL)/fweb.info @echo "" @echo "If any changes need to be made to the default directories," @echo "please use --prefix and/or --exec-prefix options to configure," @echo " or edit ./defaults.mk.in, then rerun ./configure." @echo "" $(INSTALL_PROGRAM) ftangle $(bindir)/ftangle $(INSTALL_PROGRAM) fweave $(bindir)/fweave $(INSTALL_PROGRAM) idxmerge $(bindir)/idxmerge test -d $(texdir) || mkdir -p $(texdir) $(INSTALL_DATA) $(MANUAL)/fwebmac.sty $(texdir)/fwebmac.sty $(INSTALL_DATA) $(MANUAL)/fweb.tex $(texdir)/fweb.tex $(INSTALL_DATA) $(MANUAL)/fweb.1 $(mandir)/fweb.$(manext) $(INSTALL_DATA) $(MANUAL)/fweb.info $(infodir)/fweb.info $(INSTALL_DATA) $(MANUAL)/fweb.info-1 $(infodir)/fweb.info-1 $(INSTALL_DATA) $(MANUAL)/fweb.info-2 $(infodir)/fweb.info-2 $(INSTALL_DATA) $(MANUAL)/fweb.info-3 $(infodir)/fweb.info-3 $(INSTALL_DATA) $(MANUAL)/fweb.info-4 $(infodir)/fweb.info-4 $(INSTALL_DATA) $(MANUAL)/fweb.info-5 $(infodir)/fweb.info-5 $(INSTALL_DATA) $(MANUAL)/fweb.info-6 $(infodir)/fweb.info-6 $(INSTALL_DATA) $(MANUAL)/fweb.info-7 $(infodir)/fweb.info-7 $(INSTALL_DATA) $(MANUAL)/fweb.info-8 $(infodir)/fweb.info-8 $(INSTALL_DATA) $(MANUAL)/fweb.info-9 $(infodir)/fweb.info-9 $(INSTALL_DATA) $(MANUAL)/fweb.texi $(texinfodir)/fweb.texi @echo "" @echo "DON'T FORGET TO RECORD THE PRESENCE OF fweb.info BY EDITING $(infodir)/dir." uninstall: @echo "Sorry, uninstall is not implemented yet!" $(MANUAL)/fweb.info: $(MANUAL)/fweb.texi cd $(MANUAL) && makeinfo --fill-column=70 fweb.texi # --- CLEANUP --- all_clean very_clean: clean clean_man clean_install # --- Clean up the OBJECT FILES --- clean: $(RM) -f ftangle fweave *.o core mostlyclean: clean distclean: clean $(RM) -f defaults.mk config.cache config.log config.status realclean: distclean # --- HELP --- help: @echo "Important targets for this Makefile:" @echo "" @echo " all --- Touch *.c and *.h, then compile and link" @echo " ftangle and fweave." @echo " both --- Tangle, compile, and link ftangle and" @echo " fweave from the FWEB sources." @echo " clean --- Removes the FWEB processors and object files." @echo " distclean --- Like clean, but also deletes defaults.mk," @echo " config.cache, config.log, and config.status." @echo " ftangle --- Tangle, compile, and link ftangle." @echo " fweave --- Tangle, compile, and link fweave." @echo " help --- Obtain help about this Makefile." @echo " install --- Install the processors (you must be root)." @echo " *.tex --- Woven documentation for FWEB source code." @echo " *.dvi --- Document AND PRINT FWEB source code." @echo " (To prevent a dvi file from being printed" @echo " automatically, uncomment the #ECHO = line in" @echo " defaults.mk.in.)" fweb-1.62/Web/configure100755 10061 1115 165762 6602703130 14216 0ustar krommesusers#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated automatically using autoconf version 2.12 # Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. # Defaults: ac_help= ac_default_prefix=/usr/local # Any additions from configure.in: # Initialize some variables set by options. # The variables have the same names as the options, with # dashes changed to underlines. build=NONE cache_file=./config.cache exec_prefix=NONE host=NONE no_create= nonopt=NONE no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= target=NONE verbose= x_includes=NONE x_libraries=NONE bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' # Initialize some other variables. subdirs= MFLAGS= MAKEFLAGS= # Maximum number of lines to put in a shell here document. ac_max_here_lines=12 ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi case "$ac_option" in -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; *) ac_optarg= ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case "$ac_option" in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir="$ac_optarg" ;; -build | --build | --buil | --bui | --bu) ac_prev=build ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build="$ac_optarg" ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file="$ac_optarg" ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir="$ac_optarg" ;; -disable-* | --disable-*) ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } fi ac_feature=`echo $ac_feature| sed 's/-/_/g'` eval "enable_${ac_feature}=no" ;; -enable-* | --enable-*) ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } fi ac_feature=`echo $ac_feature| sed 's/-/_/g'` case "$ac_option" in *=*) ;; *) ac_optarg=yes ;; esac eval "enable_${ac_feature}='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix="$ac_optarg" ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he) # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat << EOF Usage: configure [options] [host] Options: [defaults in brackets after descriptions] Configuration: --cache-file=FILE cache test results in FILE --help print this message --no-create do not create output files --quiet, --silent do not print \`checking...' messages --version print the version of autoconf that created configure Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [same as prefix] --bindir=DIR user executables in DIR [EPREFIX/bin] --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] --libexecdir=DIR program executables in DIR [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data in DIR [PREFIX/share] --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data in DIR [PREFIX/com] --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] --libdir=DIR object code libraries in DIR [EPREFIX/lib] --includedir=DIR C header files in DIR [PREFIX/include] --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] --infodir=DIR info documentation in DIR [PREFIX/info] --mandir=DIR man documentation in DIR [PREFIX/man] --srcdir=DIR find the sources in DIR [configure dir or ..] --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names EOF cat << EOF Host type: --build=BUILD configure for building on BUILD [BUILD=HOST] --host=HOST configure for HOST [guessed] --target=TARGET configure for TARGET [TARGET=HOST] Features and packages: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR EOF if test -n "$ac_help"; then echo "--enable and --with options recognized:$ac_help" fi exit 0 ;; -host | --host | --hos | --ho) ac_prev=host ;; -host=* | --host=* | --hos=* | --ho=*) host="$ac_optarg" ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir="$ac_optarg" ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir="$ac_optarg" ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir="$ac_optarg" ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir="$ac_optarg" ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir="$ac_optarg" ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir="$ac_optarg" ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir="$ac_optarg" ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix="$ac_optarg" ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix="$ac_optarg" ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix="$ac_optarg" ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name="$ac_optarg" ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir="$ac_optarg" ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir="$ac_optarg" ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site="$ac_optarg" ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir="$ac_optarg" ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir="$ac_optarg" ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target="$ac_optarg" ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers) echo "configure generated by autoconf version 2.12" exit 0 ;; -with-* | --with-*) ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } fi ac_package=`echo $ac_package| sed 's/-/_/g'` case "$ac_option" in *=*) ;; *) ac_optarg=yes ;; esac eval "with_${ac_package}='$ac_optarg'" ;; -without-* | --without-*) ac_package=`echo $ac_option|sed -e 's/-*without-//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } fi ac_package=`echo $ac_package| sed 's/-/_/g'` eval "with_${ac_package}=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes="$ac_optarg" ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries="$ac_optarg" ;; -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } ;; *) if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then echo "configure: warning: $ac_option: invalid host type" 1>&2 fi if test "x$nonopt" != xNONE; then { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } fi nonopt="$ac_option" ;; esac done if test -n "$ac_prev"; then { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } fi trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 # File descriptor usage: # 0 standard input # 1 file creation # 2 errors and warnings # 3 some systems may open it to /dev/tty # 4 used on the Kubota Titan # 6 checking for... messages and results # 5 compiler messages saved in config.log if test "$silent" = yes; then exec 6>/dev/null else exec 6>&1 fi exec 5>./config.log echo "\ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. " 1>&5 # Strip out --no-create and --no-recursion so they do not pile up. # Also quote any args containing shell metacharacters. ac_configure_args= for ac_arg do case "$ac_arg" in -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c) ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) ac_configure_args="$ac_configure_args '$ac_arg'" ;; *) ac_configure_args="$ac_configure_args $ac_arg" ;; esac done # NLS nuisances. # Only set LANG and LC_ALL to C if already set. # These must not be set unconditionally because not all systems understand # e.g. LANG=C (notably SCO). if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi if test "${LANG+set}" = set; then LANG=C; export LANG; fi # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo > confdefs.h # A filename unique to this package, relative to the directory that # configure is in, which we can look for to find out if srcdir is correct. ac_unique_file=READ_ME.WEB # Set various FWEB environment variables. if test -z "$CONFIGURE_INI"; then CONFIGURE_INI=./configure.ini fi . $CONFIGURE_INI # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_prog=$0 ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } else { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } fi fi srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then echo "loading site script $ac_site_file" . "$ac_site_file" fi done if test -r "$cache_file"; then echo "loading cache $cache_file" . $cache_file else echo "creating cache $cache_file" > $cache_file fi ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then ac_n= ac_c=' ' ac_t=' ' else ac_n=-n ac_c= ac_t= fi else ac_n= ac_c='\c' ac_t= fi # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:529: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_CC="gcc" break fi done IFS="$ac_save_ifs" fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:558: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" ac_prog_rejected=no for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" break fi done IFS="$ac_save_ifs" if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# -gt 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift set dummy "$ac_dir/$ac_word" "$@" shift ac_cv_prog_CC="$@" fi fi fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 echo "configure:606: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then ac_cv_prog_cc_cross=no else ac_cv_prog_cc_cross=yes fi else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_cv_prog_cc_works=no fi rm -fr conftest* echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 echo "configure:640: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 echo "configure:645: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no fi fi echo "$ac_t""$ac_cv_prog_gcc" 1>&6 if test $ac_cv_prog_gcc = yes; then GCC=yes ac_test_CFLAGS="${CFLAGS+set}" ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 echo "configure:669: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else echo 'void f(){}' > conftest.c if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then ac_cv_prog_cc_g=yes else ac_cv_prog_cc_g=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 if test "$ac_test_CFLAGS" = set; then CFLAGS="$ac_save_CFLAGS" elif test $ac_cv_prog_cc_g = yes; then CFLAGS="-g -O2" else CFLAGS="-O2" fi else GCC= test "${CFLAGS+set}" = set || CFLAGS="-g" fi if test -n "$GCC"; then CFLAGS=$_GCCFLAGS_ else CFLAGS=$_CFLAGS_ fi echo CFLAGS = $CFLAGS echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 echo "configure:703: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else # This must be in double quotes, not single quotes, because CPP may get # substituted into the Makefile and "${CC-cc}" will confuse make. CPP="${CC-cc} -E" # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:724: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:741: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* CPP=/lib/cpp fi rm -f conftest* fi rm -f conftest* ac_cv_prog_CPP="$CPP" fi CPP="$ac_cv_prog_CPP" else ac_cv_prog_CPP="$CPP" fi echo "$ac_t""$CPP" 1>&6 cat >> confdefs.h <&2; exit 1; } fi ac_config_guess=$ac_aux_dir/config.guess ac_config_sub=$ac_aux_dir/config.sub ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 echo "configure:797: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do # Account for people who put trailing slashes in PATH elements. case "$ac_dir/" in /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. for ac_prog in ginstall installbsd scoinst install; do if test -f $ac_dir/$ac_prog; then if test $ac_prog = install && grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. # OSF/1 installbsd also uses dspmsg, but is usable. : else ac_cv_path_install="$ac_dir/$ac_prog -c" break 2 fi fi done ;; esac done IFS="$ac_save_IFS" fi if test "${ac_cv_path_install+set}" = set; then INSTALL="$ac_cv_path_install" else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL="$ac_install_sh" fi fi echo "$ac_t""$INSTALL" 1>&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 echo "configure:847: checking for ANSI C header files" >&5 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include #include #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:860: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* ac_cv_header_stdc=yes else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "memchr" >/dev/null 2>&1; then : else rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat > conftest.$ac_ext < EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "free" >/dev/null 2>&1; then : else rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') #define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } EOF if { (eval echo configure:927: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null then : else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -fr conftest* ac_cv_header_stdc=no fi rm -fr conftest* fi fi fi echo "$ac_t""$ac_cv_header_stdc" 1>&6 if test $ac_cv_header_stdc = yes; then cat >> confdefs.h <<\EOF #define STDC_HEADERS 1 EOF fi echo $ac_n "checking for common stdio.h prototypes""... $ac_c" 1>&6 echo "configure:951: checking for common stdio.h prototypes" >&5 cat > conftest.$ac_ext < EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "fputc" >/dev/null 2>&1; then rm -rf conftest* echo "$ac_t""YES" 1>&6 cat >> confdefs.h <<\EOF #define HAVE_STD_PROTOTYPES 1 EOF else rm -rf conftest* echo "$ac_t""NO---fputc not prototyped; assuming others such as printf aren't as well" 1>&6 fi rm -f conftest* for ac_hdr in stdlib.h stdarg.h stddef.h string.h memory.h limits.h values.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 echo "configure:975: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:985: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` cat >> confdefs.h <&6 fi done for ac_hdr in float.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 echo "configure:1015: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1025: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` cat >> confdefs.h <&6 fi done # SGI's /bin/cc from Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. echo $ac_n "checking for ANSI ctype.h""... $ac_c" 1>&6 echo "configure:1053: checking for ANSI ctype.h" >&5 if test "$cross_compiling" = yes; then { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') #define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #define XOR(e,f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } EOF if { (eval echo configure:1069: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null then echo "$ac_t""YES" 1>&6 cat >> confdefs.h <<\EOF #define ANSI_CTYPE_H 1 EOF else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -fr conftest* echo "$ac_t""NO" 1>&6 fi rm -fr conftest* fi echo $ac_n "checking for size_t""... $ac_c" 1>&6 echo "configure:1086: checking for size_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS #include #include #endif EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then rm -rf conftest* ac_cv_type_size_t=yes else rm -rf conftest* ac_cv_type_size_t=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_type_size_t" 1>&6 if test $ac_cv_type_size_t = no; then cat >> confdefs.h <<\EOF #define size_t unsigned EOF fi echo $ac_n "checking for clock_t""... $ac_c" 1>&6 echo "configure:1119: checking for clock_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_clock_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS #include #include #endif EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "clock_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then rm -rf conftest* ac_cv_type_clock_t=yes else rm -rf conftest* ac_cv_type_clock_t=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_type_clock_t" 1>&6 if test $ac_cv_type_clock_t = no; then cat >> confdefs.h <<\EOF #define clock_t long EOF fi for ac_func in getenv tempnam tmpnam strerror do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 echo "configure:1154: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else $ac_func(); #endif ; return 0; } EOF if { (eval echo configure:1182: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_$ac_func=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` cat >> confdefs.h <&6 fi done HAVE_GETTIME="" echo $ac_n "checking for gettimeofday""... $ac_c" 1>&6 echo "configure:1208: checking for gettimeofday" >&5 if eval "test \"`echo '$''{'ac_cv_func_gettimeofday'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char gettimeofday(); int main() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_gettimeofday) || defined (__stub___gettimeofday) choke me #else gettimeofday(); #endif ; return 0; } EOF if { (eval echo configure:1236: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_gettimeofday=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_func_gettimeofday=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'gettimeofday`\" = yes"; then echo "$ac_t""yes" 1>&6 cat >> confdefs.h <<\EOF #define HAVE_GETTIMEOFDAY 1 EOF HAVE_GETTIME=y else echo "$ac_t""no" 1>&6 fi if [ ! "$HAVE_GETTIME" ] then for ac_hdr in sys/timeb.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 echo "configure:1265: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1275: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` cat >> confdefs.h <&6 fi done fi echo $ac_n "checking for working const""... $ac_c" 1>&6 echo "configure:1303: checking for working const" >&5 if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; } ; return 0; } EOF if { (eval echo configure:1357: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_const=yes else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* ac_cv_c_const=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_c_const" 1>&6 if test $ac_cv_c_const = no; then cat >> confdefs.h <<\EOF #define const EOF fi echo $ac_n "checking for working void""... $ac_c" 1>&6 echo "configure:1378: checking for working void" >&5 if test "$cross_compiling" = yes; then { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null then echo "$ac_t""YES" 1>&6 else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -fr conftest* echo "$ac_t""NO" 1>&6 cat >> confdefs.h <<\EOF #define NO_VOID 1 EOF fi rm -fr conftest* fi echo $ac_n "checking for working backslash continuations""... $ac_c" 1>&6 echo "configure:1413: checking for working backslash continuations" >&5 cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* echo "$ac_t""YES" 1>&6 else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* echo "$ac_t""NO" 1>&6 cat >> confdefs.h <<\EOF #define FANCY_SPLIT 1 EOF fi rm -f conftest* echo $ac_n "checking for new-style prototypes""... $ac_c" 1>&6 echo "configure:1440: checking for new-style prototypes" >&5 if test "$cross_compiling" = yes; then { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null then echo "$ac_t""YES" 1>&6 else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -fr conftest* echo "$ac_t""NO" 1>&6 cat >> confdefs.h <<\EOF #define OLD_PROTOTYPES 1 EOF fi rm -fr conftest* fi echo $ac_n "checking for ANSI sprintf""... $ac_c" 1>&6 echo "configure:1470: checking for ANSI sprintf" >&5 if test "$cross_compiling" = yes; then { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext < #define TEST "abc" main() { char temp[4]; int n; n = sprintf(temp,TEST); if(n == strlen(TEST)) exit(0); else exit(1); } EOF if { (eval echo configure:1492: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null then echo "$ac_t""YES" 1>&6 cat >> confdefs.h <<\EOF #define ANSI_SPRINTF 1 EOF else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -fr conftest* echo "$ac_t""NO---doesn't return number of characters written" 1>&6 fi rm -fr conftest* fi echo $ac_n "checking for ANSI sscanf""... $ac_c" 1>&6 echo "configure:1509: checking for ANSI sscanf" >&5 if test "$cross_compiling" = yes; then { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext < main() { char temp[] = "{12}{{1.11}{5}}{10}"; int n; char smodno[10], smodno0[10], spageno[10], ssecno[10]; n = sscanf(temp,"%*c%[^}]%*3c%[^}]%*2c%[^}]%*3c%[^}]", smodno, ssecno, spageno, smodno0); if(n != 4) exit(1); if(strcmp(smodno,"12") || strcmp(ssecno,"1.11") || strcmp(spageno,"5") || strcmp(smodno0,"10")) exit(2); exit(0); } EOF if { (eval echo configure:1532: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null then echo "$ac_t""YES" 1>&6 cat >> confdefs.h <<\EOF #define ANSI_SSCANF 1 EOF else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -fr conftest* echo "$ac_t""NO---doesn't handle scansets correctly" 1>&6 fi rm -fr conftest* fi if test -d "/usr/local/lib/texmf/tex"; then _TEXSUBDIR_=lib/texmf/tex/fweb else _TEXSUBDIR_=lib/tex/inputs fi _INFO_PROG_="" for ac_prog in info do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:1559: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog__INFO_PROG_'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$_INFO_PROG_"; then ac_cv_prog__INFO_PROG_="$_INFO_PROG_" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog__INFO_PROG_="$ac_prog" break fi done IFS="$ac_save_ifs" fi fi _INFO_PROG_="$ac_cv_prog__INFO_PROG_" if test -n "$_INFO_PROG_"; then echo "$ac_t""$_INFO_PROG_" 1>&6 else echo "$ac_t""no" 1>&6 fi test -n "$_INFO_PROG_" && break done if [ -n "$_INFO_PROG_" ] then cat >> confdefs.h <<\EOF #define HAVE_INFO 1 EOF fi echo $ac_n "checking for tputs in -ltermcap""... $ac_c" 1>&6 echo "configure:1594: checking for tputs in -ltermcap" >&5 ac_lib_var=`echo termcap'_'tputs | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-ltermcap $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 TERMCAP0= LIBS="$LIBS -ltermcap" else echo "$ac_t""no" 1>&6 TERMCAP0=termcap0."$(O)" fi trap '' 1 2 15 cat > confcache <<\EOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs. It is not useful on other systems. # If it contains results you don't want to keep, you may remove or edit it. # # By default, configure uses ./config.cache as the cache file, # creating it if it does not exist already. You can give configure # the --cache-file=FILE option to use a different cache file; that is # what configure does when it calls configure scripts in # subdirectories, so they share the cache. # Giving --cache-file=/dev/null disables caching, for debugging configure. # config.status only pays attention to the cache file if you give it the # --recheck option to rerun configure. # EOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. (set) 2>&1 | case `(ac_space=' '; set) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote substitution # turns \\\\ into \\, and sed turns \\ into \). sed -n \ -e "s/'/'\\\\''/g" \ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' ;; esac >> confcache if cmp -s $cache_file confcache; then : else if test -w $cache_file; then echo "updating cache $cache_file" cat confcache > $cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Any assignment to VPATH causes Sun make to only execute # the first set of double-colon rules, so remove it if not needed. # If there is a colon in the path, we need to keep it. if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' fi trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 DEFS=-DHAVE_CONFIG_H # Without the "./", some shells look in PATH for config.status. : ${CONFIG_STATUS=./config.status} echo creating $CONFIG_STATUS rm -f $CONFIG_STATUS cat > $CONFIG_STATUS </dev/null | sed 1q`: # # $0 $ac_configure_args # # Compiler output produced by configure, useful for debugging # configure, is in ./config.log if it exists. ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" for ac_option do case "\$ac_option" in -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; -version | --version | --versio | --versi | --vers | --ver | --ve | --v) echo "$CONFIG_STATUS generated by autoconf version 2.12" exit 0 ;; -help | --help | --hel | --he | --h) echo "\$ac_cs_usage"; exit 0 ;; *) echo "\$ac_cs_usage"; exit 1 ;; esac done ac_given_srcdir=$srcdir ac_given_INSTALL="$INSTALL" trap 'rm -fr `echo "defaults.mk custom.h config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 EOF cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF $ac_vpsub $extrasub s%@CFLAGS@%$CFLAGS%g s%@CPPFLAGS@%$CPPFLAGS%g s%@CXXFLAGS@%$CXXFLAGS%g s%@DEFS@%$DEFS%g s%@LDFLAGS@%$LDFLAGS%g s%@LIBS@%$LIBS%g s%@exec_prefix@%$exec_prefix%g s%@prefix@%$prefix%g s%@program_transform_name@%$program_transform_name%g s%@CC@%$CC%g s%@CPP@%$CPP%g s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g s%@INSTALL_DATA@%$INSTALL_DATA%g s%@_INFO_PROG_@%$_INFO_PROG_%g s%@_COMMON2_@%$_COMMON2_%g s%@_COMPILE_@%$_COMPILE_%g s%@_COMPILER_@%$_COMPILER_%g s%@_CPPFLAGS_@%$_CPPFLAGS_%g s%@_FTANGLE2_@%$_FTANGLE2_%g s%@_FTANGLE3_@%$_FTANGLE3_%g s%@_FWEAVE2_@%$_FWEAVE2_%g s%@_FWEAVE3_@%$_FWEAVE3_%g s%@_HOME_MACHINE_@%$_HOME_MACHINE_%g s%@_HWEB_@%$_HWEB_%g s%@_LDFLAGS_@%$_LDFLAGS_%g s%@_LINK_@%$_LINK_%g s%@_LIBS_@%$_LIBS_%g s%@_LOCAL_DEFS_@%$_LOCAL_DEFS_%g s%@_MACHINE_@%$_MACHINE_%g s%@_MAKE_@%$_MAKE_%g s%@_MV_@%$_MV_%g s%@_O_@%$_O_%g s%@_OBJ_@%$_OBJ_%g s%@_OPTIMIZE_@%$_OPTIMIZE_%g s%@_PART1_@%$_PART1_%g s%@_PART2_@%$_PART2_%g s%@_PART3_@%$_PART3_%g s%@_PRINT_DVI_@%$_PRINT_DVI_%g s%@_PROD2_@%$_PROD2_%g s%@_RATFOR2_@%$_RATFOR2_%g s%@_RESERVED2_@%$_RESERVED2_%g s%@_RM_@%$_RM_%g s%@TERMCAP0@%$TERMCAP0%g s%@_TEXSUBDIR_@%$_TEXSUBDIR_%g s%@_TOUCH_@%$_TOUCH_%g s%@_UNSIGNED_CHAR_@%$_UNSIGNED_CHAR_%g CEOF EOF cat >> $CONFIG_STATUS <<\EOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. ac_file=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_cmds # Line after last line for current file. ac_more_lines=: ac_sed_cmds="" while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file else sed "${ac_end}q" conftest.subs > conftest.s$ac_file fi if test ! -s conftest.s$ac_file; then ac_more_lines=false rm -f conftest.s$ac_file else if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f conftest.s$ac_file" else ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" fi ac_file=`expr $ac_file + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_cmds` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case "$ac_file" in *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; *) ac_file_in="${ac_file}.in" ;; esac # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. # Remove last slash and all that follows it. Not all systems have dirname. ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then # The file is in a subdirectory. test ! -d "$ac_dir" && mkdir "$ac_dir" ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" # A "../" for each directory in $ac_dir_suffix. ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` else ac_dir_suffix= ac_dots= fi case "$ac_given_srcdir" in .) srcdir=. if test -z "$ac_dots"; then top_srcdir=. else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; *) # Relative path. srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" top_srcdir="$ac_dots$ac_given_srcdir" ;; esac case "$ac_given_INSTALL" in [/$]*) INSTALL="$ac_given_INSTALL" ;; *) INSTALL="$ac_dots$ac_given_INSTALL" ;; esac echo creating "$ac_file" rm -f "$ac_file" configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." case "$ac_file" in *Makefile*) ac_comsub="1i\\ # $configure_input" ;; *) ac_comsub= ;; esac ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` sed -e "$ac_comsub s%@configure_input@%$configure_input%g s%@srcdir@%$srcdir%g s%@top_srcdir@%$top_srcdir%g s%@INSTALL@%$INSTALL%g " $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file fi; done rm -f conftest.s* # These sed commands are passed to sed as "A NAME B NAME C VALUE D", where # NAME is the cpp macro being defined and VALUE is the value it is being given. # # ac_d sets the value in "#define NAME VALUE" lines. ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' ac_dC='\3' ac_dD='%g' # ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ac_uB='\([ ]\)%\1#\2define\3' ac_uC=' ' ac_uD='\4%g' # ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ac_eB='$%\1#\2define\3' ac_eC=' ' ac_eD='%g' if test "${CONFIG_HEADERS+set}" != set; then EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF fi for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case "$ac_file" in *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; *) ac_file_in="${ac_file}.in" ;; esac echo creating $ac_file rm -f conftest.frag conftest.in conftest.out ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` cat $ac_file_inputs > conftest.in EOF # Transform confdefs.h into a sed script conftest.vals that substitutes # the proper values into config.h.in to produce config.h. And first: # Protect against being on the right side of a sed subst in config.status. # Protect against being in an unquoted here document in config.status. rm -f conftest.vals cat > conftest.hdr <<\EOF s/[\\&%]/\\&/g s%[\\$`]%\\&%g s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp s%ac_d%ac_u%gp s%ac_u%ac_e%gp EOF sed -n -f conftest.hdr confdefs.h > conftest.vals rm -f conftest.hdr # This sed command replaces #undef with comments. This is necessary, for # example, in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. cat >> conftest.vals <<\EOF s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% EOF # Break up conftest.vals because some shells have a limit on # the size of here documents, and old seds have small limits too. rm -f conftest.tail while : do ac_lines=`grep -c . conftest.vals` # grep -c gives empty output for an empty file on some AIX systems. if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi # Write a limited-size here document to conftest.frag. echo ' cat > conftest.frag <> $CONFIG_STATUS sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS echo 'CEOF sed -f conftest.frag conftest.in > conftest.out rm -f conftest.in mv conftest.out conftest.in ' >> $CONFIG_STATUS sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail rm -f conftest.vals mv conftest.tail conftest.vals done rm -f conftest.vals cat >> $CONFIG_STATUS <<\EOF rm -f conftest.frag conftest.h echo "/* $ac_file. Generated automatically by configure. */" > conftest.h cat conftest.in >> conftest.h rm -f conftest.in if cmp -s $ac_file conftest.h 2>/dev/null; then echo "$ac_file is unchanged" rm -f conftest.h else # Remove last slash and all that follows it. Not all systems have dirname. ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then # The file is in a subdirectory. test ! -d "$ac_dir" && mkdir "$ac_dir" fi rm -f $ac_file mv conftest.h $ac_file fi fi; done EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF exit 0 EOF chmod +x $CONFIG_STATUS rm -fr confdefs* $ac_clean_files test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 fweb-1.62/Web/configure.ini100644 10061 1115 4612 6602703130 14713 0ustar krommesusers# CONFIG prototype (read by ./configure) for configuration of defaults.mk. # Names without underscores are figured out automatically by ./configure. # --- TYPE of MACHINE --- _HOME_MACHINE_=CONFIG _MACHINE_=CONFIG # --- TOP-LEVEL FWEB SOURCE DIRECTORY --- unset srcdir # --- COMPILING --- unset CC # An FWEB flag, either CC or GCC. This flag isn't used for bootstrapping; it # is required for properly regenerating custom.h by tangling custom.web. If # you're on the Sun and working with gcc, say ``_COMPILER_ = GCC''. _COMPILER_=GCC # CFLAGS: Debugging and optimization options for the C compiler. _CFLAGS_='-O' _GCCFLAGS_='-O2 -g -ansi -pedantic' # CPPFLAGS: Header file search directory (-Idir) and any other # miscellaneous options for the C preprocessor and compiler. _CPPFLAGS_='-I.' # DEFS: -D options to pass to the C compiler; set by ./configure. # _LOCAL_DEFS_ is tacked unto the end of DEFS. unset DEFS _LOCAL_DEFS_= _COMPILE_='$(CC) -c $(CFLAGS) $(CPPFLAGS) $(DEFS)' # --- LINKING --- # --- Extensions for object files --- # $(O) is used for targets in the Makefile. $(OBJ) is the suffix used in # the link line. (Sometimes $(OBJ) can be null if the compiler understands # defaults and the length of the command line is an issue, as it is on some # personal computers.) _O_=o _OBJ_='.$(O)' # TERMCAP0 is either a file name, or null. Generally you should use the stub # termcap0.$(O). If you are going to use the system termcap library (only # relevant for color, an experiment that isn't completed yet) make # TERMCAP0 null and include ``-ltermcap'' in the LIBS line below. #_TERMCAP0_='termcap0.$(O)' #_TERMCAP0_= # Stripping (-s) and other miscellaneous options for the linker. _LDFLAGS_='-g' # Library options -l and -L to pass to the linker. _LIBS_=-lm #_LIBS_='-lm -ltermcap' # --- FWEB file suffixes --- # (For IBM-PC, shorten to ``hwe'') _HWEB_=hweb # --- The actual link command used by the Makefile. --- # TRY NOT TO CHANGE THIS LINE. _LINK_='$(CC) $(LDFLAGS) -o $(@)' # --- Names of system commands --- # (Used in the Makefile and possibly internally to FWEB.) _MAKE_=make _MV_=mv _RM_=rm _TOUCH_=touch # --- MISCELLANEOUS --- _PRINT_DVI_='$(ECHO) lpr -d' # --- SPLITTING LARGE SOURCES INTO SEVERAL PARTS --- _PART1_= _PART2_= _PART3_= _FTANGLE2_= _FTANGLE3_= _FWEAVE2_= _FWEAVE3_= _RESERVED2_= _COMMON2_= # --- INSTALLATION --- unset INSTALL unset INSTALL_PROGRAM unset INSTALL_DATA fweb-1.62/Web/config.h.in100644 10061 1115 4044 6602703130 14253 0ustar krommesusers /* Define to empty if the keyword does not work. */ #undef const /* Define if the header file is ANSI-compliant. */ #define ANSI_CTYPE_H 0 /* Define if the |sprintf| function is ANSI-compliant (returns number of characters written). */ #define ANSI_SPRINTF 0 /* Define if the |sscanf| function is ANSI-compliant (in particular, handles scansets correctly. */ #define ANSI_SSCANF 0 /* Define if |clock_t| isn't defined/typedefed. */ #undef clock_t /* Define if backslash continuations don't work correctly. */ #define FANCY_SPLIT 0 /* Define if you have the |getenv| function. */ #define HAVE_GETENV 0 #define HAVE_GETTIMEOFDAY 0 /* Define if you have the |strerror| function. */ #define HAVE_STRERROR 0 /* Define if you have the |tempnam| function. */ #define HAVE_TEMPNAM 0 /* Define if you have the |tmpnam| function. */ #define HAVE_TMPNAM 0 /* Define if you have the header file. */ #define HAVE_FLOAT_H 0 /* Define if you have the header file. */ #define HAVE_LIMITS_H 0 /* Define if you have the header file. */ #define HAVE_MEMORY_H 0 /* Define if you have the header file. */ #define HAVE_STDARG_H 0 /* Define if you have the header file. */ #define HAVE_STDDEF_H 0 /* Define if you have the header file. */ #define HAVE_STDLIB_H 0 /* Define if common prototypes are included. */ #define HAVE_STD_PROTOTYPES 0 /* Define if you have the header file. */ #define HAVE_STRING_H 0 /* Define if you have the header file. */ #define HAVE_SYS_TIMEB_H 0 /* Define if you have the header file. */ #define HAVE_VALUES_H 0 /* Define if |void| isn't understood. */ #define NO_VOID 0 /* Define if the new-style prototypes are not accepted. */ #define OLD_PROTOTYPES 0 /* Define if |size_t| isn't typedefed. */ #undef size_t /* Define if you have the ANSI C header files. */ #define STDC_HEADERS 0 /* Define if the info program is installed. */ #define HAVE_INFO 0 /* How to run the C preprocessor. */ #define RUN_CPP 0 fweb-1.62/Web/defaults.mk.in100644 10061 1115 10116 6602703130 15012 0ustar krommesusers# --- START of SYSTEM CONFIGURATION SECTION --- # @configure_input@ # --- Supporting VPATH --- top_srcdir = @srcdir@/.. srcdir = @srcdir@ VPATH = @srcdir@ # --- Names of system commands --- # (Used in the Makefile and possibly internally to FWEB.) MAKE = @_MAKE_@ MV = @_MV_@ RM = @_RM_@ TOUCH = @_TOUCH_@ # --- COMPILING --- # --- Compiler name --- CC = @CC@ # An FWEB flag, either CC or GCC. This flag isn't used for bootstrapping; it # is required for properly regenerating custom.h by tangling custom.web. If # you're on the Sun and working with gcc, say ``COMPILER = GCC''. COMPILER = @_COMPILER_@ # --- Compiler options --- # Debugging and optimization options for the C compiler. CFLAGS = @CFLAGS@ # How to run the C preprocessor CPP = @CPP@ # Header file search directory (-Idir) and any other miscellaneous options # for the C preprocessor and compiler. CPPFLAGS = @_CPPFLAGS_@ # (Compiler macro definitions. In addition, see the discussion of PARTn # below.) DEFS = @DEFS@ @_LOCAL_DEFS_@ # --- The actual compile command used by the Makefile. --- COMPILE = @_COMPILE_@ # --- LINKING --- # --- Extensions for object files --- # $(O) is used for targets in the Makefile. $(OBJ) is the suffix used in # the link line. (Sometimes $(OBJ) can be null if the compiler understands # defaults and the length of the command line is an issue, as it is on some # personal computers.) O = @_O_@ OBJ = @_OBJ_@ # TERMCAP0 is either a file name, or null. If the termcap library is # available, TERMCAP0 should be null and LIBS should include -ltermcap. # If the termcap library is not available, TERMCAP0 should be termcap0.$(O). TERMCAP0 = @TERMCAP0@ # --- Linker options --- # Stripping (-s) and other miscellaneous options for the linker. LDFLAGS = @_LDFLAGS_@ # Library options -l and -L to pass to the linker. LIBS = @_LIBS_@ @LIBS@ # --- The actual link command used by the Makefile. --- # TRY NOT TO CHANGE THIS LINE. LINK = @_LINK_@ # --- MISCELLANEOUS --- # --- How to print a dvi file --- ECHO = echo # Use this to prevent actual printing. PRINT_DVI = @_PRINT_DVI_@ # --- FWEB flags indicating type of machine on which you're tangling # (HOME_MACHINE) and for which machine you're generating C code. --- HOME_MACHINE = @_HOME_MACHINE_@ MACHINE = @_MACHINE_@ # --- FWEB file suffixes --- # (For IBM-PC, shorten to ``hwe'') HWEB = @_HWEB_@ # --- Splitting FTANGLE & FWEAVE into several parts, especially for small # compilers on personal computers. Here's an example for the IBM-PC, # Microsoft compiler --- # --------------------------------------------------------------------------- #PART1 = /Dpart=1 #PART2 = /Dpart=2 #PART3 = /Dpart=3 #FTANGLE2 = ftangle2.$(O) #FTANGLE3 = ftangle3.$(O) #FWEAVE2 = fweave2.$(O) #FWEAVE3 = fweave3.$(O) #PROD2 = prod2.$(O) #RATFOR2 = ratfor2.$(O) #RESERVED2 = reservd2.$(O) #COMMON2 = common2.$(O) # --------------------------------------------------------------------------- # The PARTn macros are compiler options that define the macro |part| #to be n, for example ``-Dpart=2'' PART1 = @_PART1_@ PART2 = @_PART2_@ PART3 = @_PART3_@ # Here are the names of the second and third parts of the object files. FTANGLE2 = @_FTANGLE2_@ FTANGLE3 = @_FTANGLE3_@ FWEAVE2 = @_FWEAVE2_@ FWEAVE3 = @_FWEAVE3_@ PROD2 = @_PROD2_@ RATFOR2 = @_RATFOR2_@ RESERVED2 = @_RESERVED2_@ COMMON2 = @_COMMON2_@ # --- INSTALLATION INFORMATION --- INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ # Top-level path for executable binaries (usually /usr/local): exec_prefix = @exec_prefix@ # Where the processors go: bindir = $(exec_prefix)/bin # Top-level path for everything else (usually /usr/local) prefix = @prefix@ doc_prefix = $(prefix) # Where the Unix man pages go: manext = 1 mandir = $(doc_prefix)/man/man$(manext) # Where the emacs info* files go: infodir = $(doc_prefix)/info # Where the source file fweb.texinfo goes: texinfodir = $(infodir) # Where the fwebmac.sty macro package used by FWEAVE goes, as well as the # file fweb.tex needed for weaving the FWEB source code, go: texdir = $(prefix)/@_TEXSUBDIR_@ # --- END of SYSTEM CONFIGURATION SECTION --- fweb-1.62/Web/.make.state100644 10061 1115 261 6602703257 14254 0ustar krommesusers.MAKE_VERSION: VERSION-1.0 .BUILT_LAST_MAKE_RUN: clean: rm -f ftangle fweave *.o core .BUILT_LAST_MAKE_RUN: distclean: rm -f defaults.mk config.cache config.log config.status fweb-1.62/Web/install-sh100644 10061 1115 11244 6602703130 14251 0ustar krommesusers#! /bin/sh # # install - install a program, script, or datafile # This comes from X11R5. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. # # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" tranformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 fweb-1.62/Web/fweb.sty100644 10061 1115 3134 6602703130 13713 0ustar krommesusers% --- STYLE FILE fweb.sty USED FOR WEAVING the FWEB SOURCES --- % (For a more extensive example, see Fweb/Manual/fweb.sty.) % NOTE: If you are not using this file to typeset the FWEB sources, % comment out the next command!!! % Include typesetting and page-layout macros for FWEB sources. limbo.begin "\\input fweb" % Input fweb.tex automatically. % Get LaTeX2e to include the optional file `twoside.sty'. LaTeX.class.options "twoside" % Activate several packages. Multicol is used for the Index. LaTeX.package "indentfirst,multicol" % Here's how to get the entire document in two-column format. (One must % include `multicol' in `LaTeX.package'.) % limbo.end "\\def\\beforeindex{\\end{multicols}\\newpage}\n\ %\\begin{multicols}{2}\n\ %\\raggedcolumns" % Use the following for two-column format, or for generally tightening up % the manuscript. doc.preamble "\\secpenalty0" % Pretty up the documentation. named.preamble "\\7" % Empty line after module name. % Non-default names for the TeX output files. index.tex "#.ndx" modules.tex "#.mds" contents.tex "#.cts" % Separate index entries by \letter{...}. See `fweb.tex' for a sample % definition of \letter. lethead.prefix "\\letter{" lethead.suffix "}\n" lethead.flag -1 % Use lower case letters. % Subscript symbols with the section number where they were defined. With % this setting, function names will be subscripted with cross-reference % information. To turn off all such subscripting, use the command-line % option `-f'. mark_defined.fcn_name 1 mark_defined.WEB_macro 0 mark_defined.outer_macro 0 mark_defined.exp_type 0 mark_defined.typedef_name 0 fweb-1.62/Web/ccodes.hweb100644 10061 1115 10105 6602703131 14353 0ustar krommesusers@z --- ccodes.hweb --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- @ Here is a list of the category codes that scraps can have. @U expr @D expr 1 // An expression, including perhaps a single identifier. @U unop @D unop 2 // A unary operator. @U binop @D binop 3 // A binary operator. @D unorbinop 4 // An operator that can be unary or binary, depending on context. @D cast 5 // A cast. @D question 6 // A question mark and possibly the expressions flanking it. @D lbrace 7 // A left brace. @D rbrace 8 // A right brace. @D decl_hd 9 // An incomplete declaration. @D comma 10 // A comma. @D lpar 11 // A left parenthesis. @D rpar 12 // A right parenthesis. @D lbracket 13 // A left bracket. @D rbracket 14 // A right bracket. @D new_like 17 // \Cpp: |new|, |delete|. @D exp_op 18 // Exponentiation. @D max_math 19 // Category codes less than this can only be printed in math mode. @D struct_hd 21 // The beginning of a structure specifier. @D decl 20 // A complete declaration. @D label 22 // Fortran statement label. @D stmt 23 // A complete statement. @D functn 24 // A complete function. @D fn_decl 25 // A function declarator. @D else_like 26 // The beginning of a conditional. @D semi 27 // A semicolon. @D colon 28 // A colon. @D tag 29 // A statement label. @D if_hd 30 // The beginning of a conditional. @D common_hd 31 @D read_hd 32 @D slashes 33 @D implicit_hd 34 @D lproc 35 // Begins a preprocessor command. @D rproc 36 // Ends a preprocessor command. @D ignore_scrap 37 // A full preprocessor command. @D for_hd 38 @D newline 39 @D language_scrap 40 // So we can change languages during translation. @D do_like 55 // \&{do}. @D for_like 56 // \&{for}, \&{switch}. @D if_like 57 // \&{if}, \&{while}, \&{ifdef}, \&{ifndef}, \&{endif}. @D int_like 58 // \&{int}, \&{char}, \&{extern}, \dots. @D case_like 59 // \&{return}, \&{goto}, \&{break}, \&{continue}. @D sizeof_like 60 // \&{sizeof}. @D struct_like 61 // \&{struct}. @D typedef_like 62 // \&{typedef}. @D define_like 63 // \&{define}. @D common_like 64 // \&{common}, \&{save}, \&{namelist} . @D read_like 65 /* \&{read}, \&{write}, \&{print}, \&{backspace}, \&{rewind}, \&{open}, \&{close}, \&{endfile}, \&{inquire}, \&{decode}, \&{encode}. */ @D entry_like 66 // \&{entry} . @D implicit_like 67 // \&{implicit}. @D assign_like 68 // \&{assign}. @D built_in 69 /* \&{changequote}, \&{define}, \&{divert}, \&{eval}, \&{ifdef}, \&{ifdef}, \&{incr}, \&{len}, \&{undefine}, \&{undivert}. */ @D Rdo_like 70 // \Ratfor\ \&{do}. @D endif_like 71 // \&{endif}, \&{enddo}. @D end_like 72 // \&{end}. @D END_like 73 @D go_like 74 // \&{go}. @D no_order 75 // \&{include}. @D until_like 76 // \&{until}. @D IF_like 77 @D IF_top 78 @D else_hd 79 @D ELSE_like 80 @D space 81 // For C~preprocessor. @D LPROC 82 @D UNOP 83 // ``\.{{\it unop}\ }''. @D BINOP 84 // ``\.{\ {\it binop}\ }''. @D COMMA 85 // ``\.{\ {\it comma}\ }''. @D _EXPR 86 // ``\.{\ {\it expr}}''. @D _EXPR_ 87 // ``\.{\ {\it expr}\ }''. @D EXPR_ 88 // ''\.{{\it expr}\ }''. @D Decl_hd 89 @D key_wd 90 // May be unused now. @D program_like 91 // |@r program|, |@r subroutine|, |@r function|. @D CASE_like 92 @D modifier 93 // |const|, |volatile|. @D class_like 94 // \Cpp: |class|. @D op_like 95 // \Cpp: |operator|. @D proc_like 97 // \Fortran-90: |@r procedure|. @D private_like 98 // \Fortran-90: |@r private|, |@r public|, |@r sequence|. @D slash_like 99 // \Fortran: slash in |@r data| statement. @D fcn_hd 100 // \Fortran: Beginning of function. @D END_stmt 101 // \Fortran: |@r end;|. @D huge_like 102 // For |huge|. @D imp_reserved 103 // The result of~\.{@@`}. @D extern_like 104 // |extern|. @D while_do 105 // |while| after |do|. @D template 106 // |@c++ template| @D langle 107 // A '\.<'. @D tstart 108 // The '\.<' beginning a template list. @D tlist 109 // |@c++ int| @D rangle 110 // A '\.>'. @D namespace 111 // |@c++ namespace| @D virtual 112 // |@c++ virtual| @D reference 113 // |@c++ int& ref;| @D kill_newlines 114 // \.{@@s} @A @e@; fweb-1.62/Web/common.hweb100644 10061 1115 27334 6602703131 14417 0ustar krommesusers@z --- common.hweb --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- @i typedefs.hwb @* DEFINITIONS for TANGLE and WEAVE. Here's stuff required for \.{tangle.web} and \.{weave.web}. @ As much as possible, we adhere to ANSI conventions. However, to support pre-ANSI compilers such as \.{gcc}, we must make some modifications. It is assumed that the compilers predefine macros such as |vax|, |sun|, or |mac|, in \It{lower case}; if they do not, then these macros must be defined from the command line. In addition, the \WEB\ files must be tangled with \It{upper case} macros such as |VAX|, |SUN|, or |MAC| defined from the command line, as in \.{ftangle tangle -m"SUN"}. It is conventional to put the machine macro command into the ini file \.{.fweb}, as in ``\.{+mSUN}''. @i os.hweb // System-dependent definitions. @ The following flag is used for \Cpp. (??) @= EXTERN boolean long_comment; @ Code related to the character set. \It{Mess around here only at your own risk.} @D and_and OCTAL(4) // `|&&|'. @D star_star OCTAL(5) // `|@r x**y|' . @D colon_colon OCTAL(11) // \Cpp\ and \Fortran--90: `$\CF$'. /* The next two only occur in different languages, so they can have the same value. */ @D neqv OCTAL(10) // `|@r .neqv.|'. @D ellipsis neqv // `|...|'. @D stmt_label OCTAL(30) @D slash_slash OCTAL(26) // Concatenation `|@r \/|' . @D bell OCTAL(7) // |ASCII| code for ringing the bell. @D tab_mark @'\t' // |ASCII| code used as tab-skip. @D line_feed OCTAL(12) /* |ASCII| code thrown away at end of line; $\equiv$ \.{'\\n'}. */ @D form_feed OCTAL(14) // |ASCII| code used at end of page. @D carriage_return OCTAL(15) // |ASCII| code used at end of line. @D gt_gt OCTAL(20) // `|>>|'; this doesn't exist in MIT. @D lt_lt OCTAL(22) // `|<<|'; this doesn't exist in MIT. @D plus_plus OCTAL(13) // `|++|'; this corresponds to MIT's up-arrow. @D minus_minus OCTAL(1) // `|--|'; this corresponds to MIT's down-arrow. @D minus_gt OCTAL(31) // `|->|'. @D eqv minus_gt // `|@r .eqv.|'. @D not_eq OCTAL(32) // `|!=|'. @D paste OCTAL(33) // `|##|'. @D lt_eq OCTAL(34) // `|<=|'. @D gt_eq OCTAL(35) // `|>=|'. @D eq_eq OCTAL(36) // `|==|'. @D or_or OCTAL(37) // `||| |'. @D begin_language OCTAL(16) // Mark a language switch. @D left_array OCTAL(21) // `$\LS$'. @D right_array OCTAL(25) // `$\SR$'. @D interior_semi OCTAL(24) // `\.;'. @= IN_COMMON ASCII xord[]; // specifies conversion of input characters. @#ifdef scramble_ASCII IN_COMMON ASCII xxord[]; @#endif IN_COMMON outer_char xchr[]; // specifies conversion of output characters. @ Code related to input routines: @= IN_COMMON BUF_SIZE buf_size; // Used for \FWEAVE; see \.{common.web}. IN_COMMON ASCII HUGE *loc; /* points to the next character to be read from the buffer*/ @ Code related to identifier and module name storage: @d ID_FLAG 10240 // \bf DON'T MONKEY WITH THIS NUMBER!. @d length(c) (c+1)->byte_start-(c)->byte_start // the length of a name. @d llink link // left link in binary search tree for module names. @d root name_dir->rlink /* the root of the binary search tree for module names */ @d is_intrinsic(n) (n->intrinsic_word & (boolean)language) @d is_keyword(n) (n->keyword & (boolean)language) @= IN_COMMON name_pointer name_ptr; // first unused position in |byte_start|. IN_COMMON ASCII HUGE *byte_ptr; // first unused position in |byte_mem|. typedef name_pointer HUGE *hash_pointer; IN_COMMON hash_pointer hash, /* heads of hash lists */ hash_end, /* end of |hash| */ h; /* index into hash-head array */ @ To distinguish between the constructions \.{@@<\dots@@>} and \.{\#<\dots@@>}, both of which return |module_name|, we introduce the flag |mac_mod_name|. @= EXTERN boolean mac_mod_name; @ Code related to module numbers: @= IN_COMMON sixteen_bits module_count; // The current module number. IN_COMMON boolean HUGE *chngd_module; // Dynamic array: Is the module changed? IN_COMMON boolean prn_where; // Tells \.{TANGLE} to print line and file info. @ Code relating to output: @d UPDATE_TERMINAL fflush(stdout) // Empty the terminal output buffer. @d new_line putchar('\n') @d putxchar putchar @d ASCII_write(p0,n) fflush(stdout), ASCII_file_write(stdout,p0,(int)(n))@; /* Write on the standard output, converting from |ASCII|. */ @ For FORTRAN, \&{format} commands are annoying, because the use of slashes doesn't fit with the rest of the \Fortran\ syntax. Thus, we'll deal with the |format| statement something like a preprocessor statement, in that we'll raise a special flag when we're inside it, and issue special tokens to indicate the start and the end of the statement. @D begin_format_stmt OCTAL(171) @D end_format_stmt OCTAL(172) @ For~C, getting an identifier is simple. For FORTRAN, we treat \&{format} statements much like C's preprocessor statement. However, there's no special character to start a \&{format} line; we have to actually check the identifier. Furthermore, it looks nicer if constructions such as \\{f6.2} are treated as one identifier, so when we're inside a \&{format} statement we allow the period to be an acceptable (internal) character for an identifier. @d is_identifier(c) (isAlpha(c) || c==@'_' || c==@'$' || (c==@'%' && language!=C && !Fortran88) ) /* This defines the starting character of an identifier. */ @d is_kind(c) (isDigit(c) || isAlpha(c) || c==@'_' || c==@'$') /* \Fortran-90 kind parameter. */ @= @{ IN_COMMON ASCII HUGE *pformat, HUGE *pdata; @% IN_COMMON ASCII HUGE *pdefault, HUGE *pcontains; get_identifier: id_first = --loc; /* Scan over subsequent elements of an identifier. */ for(++loc; isAlpha(*loc) || isDigit(*loc) || *loc==@'_' || *loc==@'$' || (in_format && *loc==@'.'); loc++) ; id_loc=loc; /* End plus one of the identifier. */ if(FORTRAN_LIKE(language)) { if(web_strcmp(pformat,pformat+6,id_first,id_loc) == EQUAL) { /* Raise special flag to say we're inside a |@r format| statement. */ in_format = YES; return begin_format_stmt; } else if(program==weave) { if(web_strcmp(pdata,pdata+4,id_first,id_loc) == EQUAL) { // Inside a |@r data| statement. in_data = YES; return identifier; } else if(at_beginning && *loc==@':' && !is_in(non_labels,id_first,id_loc)) return stmt_label; } } if(is_include_like()) sharp_include_line = YES; return identifier; } @ Here we obtain the file name after an \.{@@o}~command. @= { while(*loc == @' ' || *loc == tab_mark) { loc++; if(loc > limit) return ignore; } id_first = loc; while(*loc != @' ' && *loc != tab_mark) loc++; // Absorb file name. id_loc = loc; if(*id_first == @'"') id_first++; if(*(id_loc-1) == @'"') id_loc--; if(id_loc - id_first >= MAX_FILE_NAME_LENGTH) { err_print(T,"Output file name too long; allowed only %d characters", MAX_FILE_NAME_LENGTH - 1); id_loc = id_first + MAX_FILE_NAME_LENGTH - 1; } } @ These tables are initialized during |common_init|. @= #undef expr #define expr 1 #undef unop #define unop 2 #undef binop #define binop 3 extern DOTS HUGE *dots; /* The dynamic table; see \.{common.web}. */ #ifdef _FWEB_h EXTERN DOTS dots0[] #if(part == 0 || part == 1) = { {(ASCII *)"@@@@@@",3,dot_const,expr,0}, /* Dummy */ {(ASCII *)"AND",3,dot_const,binop,and_and}, /* |and_and| */ {(ASCII *)"EQ",2,dot_const,binop,eq_eq}, /* |eq_eq| */ {(ASCII *)"EQV",3,dot_const,binop,eqv}, /* |eqv| */ {(ASCII *)"FALSE",5,dot_const,expr,0}, {(ASCII *)"GE",2,dot_const,binop,gt_eq}, /* |gt_eq| */ {(ASCII *)"GT",2,dot_const,binop,@'>'}, /* |@'>'| */ {(ASCII *)"LE",2,dot_const,binop,lt_eq}, /* |lt_eq| */ {(ASCII *)"LT",2,dot_const,binop,@'<'}, /* |@'<'| */ {(ASCII *)"NE",2,dot_const,binop,not_eq}, /* |not_eq| */ {(ASCII *)"NEQV",4,dot_const,binop,neqv}, /* |neqv| */ {(ASCII *)"NOT",3,dot_const,unop,@'!'}, /* |@'!'| */ {(ASCII *)"OR",2,dot_const,binop,or_or}, /* |or_or| */ {(ASCII *)"TRUE",4,dot_const,expr,1}, {(ASCII *)"XOR",3,dot_const,binop,neqv}, /* |neqv| */ {(ASCII *)"",0,0,0,0} } #endif /* |part == 1| */ ; #endif /* |_FWEB_h| */ @ The preprocessor commands have a similar format. @= #ifdef _FWEB_h EXTERN DOTS mcmds[] #if(part ==0 || part == 1) = { {(ASCII *)"define",6,WEB_definition}, {(ASCII *)"elif",4,m_elif}, {(ASCII *)"elseif",6,m_elif}, {(ASCII *)"else",4,m_else}, {(ASCII *)"endfor",6,m_endfor}, {(ASCII *)"endif",5,m_endif}, {(ASCII *)"for",3,m_for}, {(ASCII *)"if",2,m_if}, {(ASCII *)"ifdef",5,m_ifdef}, {(ASCII *)"ifndef",6,m_ifndef}, {(ASCII *)"pragma",6,m_pragma}, {(ASCII *)"undef",5,m_undef}, {(ASCII *)"",0,0} } #endif /* |part == 1| */ ; #endif /* |_FWEB_h| */ @ The preprocessor commands are piggy-backed on the \.{@@\#} command. If there's text after that command, then we hunt through the above table. Otherwise, it's a |big_line_break|. @= @{ boolean mcode; @b *limit = @' '; /* Terminator for identifier search. */ id_first = loc; while(isAlpha(*loc)) loc++; /* Find end of identifier. */ if((mcode=is_mcmd(mcmds,id_first,loc)) != 0) return mcode; loc = id_first; /* Failed to recognize preprocessor command. */ } @i mem.hweb /* Macros for memory allocation. */ @ Miscellaneous definitions. @#ifndef _FWEAVE_ @D MCHECK0(n,reason) mcheck0((unsigned long)(n),(outer_char *)reason) @d EVALUATE(val,p0,p1) {unsigned long nbytes; val_ptr = val_heap = GET_MEM("val_heap",nbytes=2*((p1)-(p0)),VAL); evaluate(&val,p0,p1); if(val_heap) FREE_MEM(val_heap,"val_heap",nbytes,VAL); } @d DONE_LEVEL (cur_byte >= cur_end) /* Do we need to pop? */ @#endif /* |_FWEAVE_| */ @= /* The shorter length here is primarily to keep the stack under control. Now that |N_MSGBUF| is used dynamically, maybe this statement isn't necessary. */ #ifdef SMALL_MEMORY #define N_MSGBUF 2000 #else #define N_MSGBUF 10000 #endif @ The following helps insert spaces in the output. @= @#ifndef _FWEAVE_ typedef enum { MISCELLANEOUS, /* ``normal'' state */ NUM_OR_ID, /* state associated with numbers and identifiers */ UNBREAKABLE, /* state associated with \.{@@\&} */ VERBATIM /* state in the middle of a string */ } OUTPUT_STATE; @#endif /* |_FWEAVE_| */ @ For debugging and error messages, we need a routine that gives the name of a control code. @m CN(code) case code: return (outer_char *)#code @A @#if defined _FWEAVE_ || defined _FTANGLE_ #if(part == 0 || part == 1) @[outer_char *ccode_name FCN((code)) eight_bits code C1("")@; { switch(code) { CN(begin_FORTRAN); CN(begin_RATFOR); CN(begin_C); CN(ascii_constant); CN(big_line_break); CN(begin_meta); CN(end_meta); CN(TeX_string); CN(xref_roman); CN(xref_typewriter); CN(xref_wildcard); CN(formatt); CN(definition); CN(WEB_definition); CN(begin_code); CN(module_name); CN(new_module); CN(m_ifdef); CN(m_ifndef); CN(m_if); CN(m_else); CN(m_elif); CN(m_endif); CN(m_undef); @#ifdef _FTANGLE_ CN(begin_vcmnt); CN(begin_bp); CN(insert_bp); CN(control_text); @#endif /* |_FTANGLE_| */ @#ifdef _FWEAVE_ CN(dont_expand); CN(auto_label); CN(macro_module_name); CN(switch_math_flag); CN(underline); CN(thin_space); CN(math_break); CN(line_break); CN(ln_break_outdent); CN(no_line_break); CN(pseudo_semi); CN(macro_space); CN(copy_mode); CN(toggle_output); CN(pseudo_expr); CN(pseudo_colon); CN(trace); @#endif /* |_FWEAVE_| */ default: return OC("UNKNOWN"); } } #endif /* |part == 1| */ @#endif /* |defined _FWEAVE_ || defined _FTANGLE_| */ @ This dummy module avoids warning messages from \FWEAVE\ if the indicated modules aren't actually used. @= @@; @@; fweb-1.62/Web/formats.hweb100644 10061 1115 2200 6602703131 14543 0ustar krommesusers@z --- formats.hweb --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- @ Here are \FWEB\ formats to help out the header files. @f ASCII char @f BP int @f BUF_SIZE int @f BUILT_IN int @f C0 $_EXPR @f C1 $_EXPR @f C2 $_EXPR @f CASE int @f CASE_TYPE int @f CC_BUF int @f CMD int @f COLOR int @f CONST static @f CUR_PRMS int @f DOTS int @f FCN $_EXPR @f GOTO_CODE int @f HUGE huge @f INPUT_PRMS int @f INPUT_PRMS0 int @f LANGUAGE int @f LEXI int @f LINE_NUMBER int @f MEM int @f NAME_INFO int @f NAME_TYPE int @f OPEN_FILE int @f PARAMS int @f PARGS int @f PARSE_PARAMS int @f PARSING_MODE int @f PART int @f PRECEDENCE int @f PROGRAM int @f RESERVED_WORD int @f S_MAP int @f SEQUENCES int @f SRTN void @f SPEC int @f STMT_LBL int @f STY_TYPE int @f TRUNC int @f TYPE int @f VAL int @f WORD_TYPE int @f X_FCN int @f XIDS int @f boolean char @f eight_bits char @f name_pointer char @f outer_char char @f scrap_pointer int @f sixteen_bits char @f stack_pointer int @f text_pointer char @f Token char fweb-1.62/Web/includes.hweb100644 10061 1115 10730 6602703131 14725 0ustar krommesusers@z --- includes.hweb --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- @ This file is included immediately after \.{custom.h}. It contains logic based on the flags set in \.{custom.h}, includes some extra files that are pretty well standard, and includes the timing macros. First, we try to ensure the preprocessor doesn't get annoyed. @= /* SYSTEM LOGIC based on \.{custom.h}, and additional include files. */ #ifndef ANSI_CTYPE_H #define ANSI_CTYPE_H 0 #endif #ifndef ANSI_SPRINTF #define ANSI_SPRINTF 0 #endif #ifndef ANSI_SSCANF #define ANSI_SSCANF 0 #endif #ifndef ANSI_SYSTEM #define ANSI_SYSTEM 0 #endif #ifndef DEBUG_XCHR #define DEBUG_XCHR 0 #endif #ifndef FCN_CALLS #define FCN_CALLS 0 #endif #ifndef FANCY_SPLIT #define FANCY_SPLIT 0 #endif #ifndef HAVE_ERROR #define HAVE_ERROR 0 #endif #ifndef HAVE_GETENV #define HAVE_GETENV 0 #endif #ifndef HAVE_GETTIMEOFDAY #define HAVE_GETTIMEOFDAY 0 #endif #ifndef HAVE_LIMITS_H #define HAVE_LIMITS_H 0 #endif #ifndef HAVE_SYS_TIMEB_H #define HAVE_SYS_TIMEB_H 0 #endif #ifndef HAVE_STDARG_H #define HAVE_STDARG_H 0 #endif #ifndef HAVE_STDDEF_H #define HAVE_STDDEF_H 0 #endif #ifndef HAVE_STDLIB_H #define HAVE_STDLIB_H 0 #endif #ifndef HAVE_STD_PROTOTYPES #define HAVE_STD_PROTOTYPES 0 #endif #ifndef HAVE_STRERROR #define HAVE_STRERROR 0 #endif #ifndef HAVE_VALUES_H #define HAVE_VALUES_H 0 #endif #ifndef HUGE_POINTERS #define HUGE_POINTERS 0 #endif #ifndef KEEP_CONST #define KEEP_CONST 0 #endif #ifndef NEW_DIFFTIME #define NEW_DIFFTIME 0 #endif #ifndef NO_VOID #define NO_VOID 0 #endif #ifndef NON_ANSI_CALLOC #define NON_ANSI_CALLOC 0 #endif #ifndef OLD_PROTOTYPES #define OLD_PROTOTYPES 0 #endif #ifndef PRINT_AVAILABLE_MEMORY #define PRINT_AVAILABLE_MEMORY 0 #endif #ifndef SIZE_T_DEFINED #define SIZE_T_DEFINED 0 #endif #ifndef TIMING #define TIMING 0 #endif #ifndef TRANSLATE_ASCII #define TRANSLATE_ASCII 0 #endif #ifndef UNIX_PATH #define UNIX_PATH 0 #endif @ Next, we start conditional processing. @= #if HAVE_STDARG_H #include #else #include #endif #if HAVE_STDLIB_H #include #endif #if !HAVE_STD_PROTOTYPES #include "stdlib0.h" #endif #if HAVE_STDDEF_H #include #endif #if HAVE_LIMITS_H #include // ANSI: Numerical limits. #else #if HAVE_VALUES_H #define INT_MAX MAXINT #define LONG_MAX MAXLONG #else #define INT_MAX 0x7FFF #define LONG_MAX INT_MAX #endif #define INT_MIN (~(INT_MAX)) #define LONG_MIN (~(LONG_MAX)) #define ULONG_MAX (MAXLONG | (~(MAXLONG))) /* E.g., |0x7FFF @t\OR@> 0x8000|. */ #endif #if HAVE_FLOAT_H #include #else #ifndef DBL_DIG #define DBL_DIG 10 #endif #endif #if !NON_ANSI_CALLOC #define CALLOC calloc #define REALLOC(old_ptr, new_size, old_size) realloc(old_ptr, new_size) #define FREE free #endif // |ANSI_CALLOC| /* Some compilers can't handle |unsigned long| constants of the form |123UL|. Thus, these constants are declared via the following macro. */ #define UL(num) ((unsigned long)(num)) #include // ANSI: STDIO routines. #include /* We use only ANSI write routines. */ #define FWRITE(buf,len,fp) fwrite((CONST void *)(buf),(size_t)(len),\ (size_t)(1),fp) #define WRITE1(buf,len) \ {\ int _k;\ outer_char *_p;\ for(_p=buf,_k=(int)(len); _k>0; _k--)\ {\ PUTC(*_p);\ _p++;\ }\ } /* The following is courtesy of the autoconf Info file. */ #if STDC_HEADERS || HAVE_STRING_H #include // ANSI: String manipulation routines. #if !STDC_HEADERS && HAVE_MEMORY_H #include #endif #else #include #endif #include // ANSI: Character classification macros. /* The following works only for |ASCII| machines. Furthermore, it's slower than the usual procedure involving ANDing a |_ctype| array with various bit flags. However, that procedure isn't portable across machines. Caution: This solution evaluates |c| more than once, so watch out for side effects! */ #if !ANSI_CTYPE_H #undef isalpha #undef isupper #undef islower #define isupper(c) ('A' <= (unsigned)(c) && (unsigned)(c) <= 'Z') #define islower(c) ('a' <= (unsigned)(c) && (unsigned)(c) <= 'z') #define isalpha(c) (isupper(c) || islower(c)) #endif #include // ANSI: |longjmp| and |setjmp|. @I time.hweb // Timing's quite an annoyance. fweb-1.62/Web/macs.hweb100644 10061 1115 3253 6602703131 14024 0ustar krommesusers@z --- macs.hweb --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- @ Definitions for macros used in macro processing, especially in \.{macs.web}. @d semi 01 /* Kludge! */ @d SILENT (boolean)NO @d COMPLAIN (boolean)YES @d OUTER_MACRO 0xFF @d OUTER_UNMACRO 0xFE @d UNDEFINED_MACRO 0xFD @d MAX_XLEVELS 200 @d equiv equiv_or_xref // Info corresponding to names. @d EQUIV ASCII HUGE * // For casting into the above field. /* Note that the following function retrieves not only regular \WEB\ macros, but also built-in functions. */ @d MAC_LOOKUP(cur_val) (cur_val < MODULE_NAME ? (text_pointer)(name_dir+(cur_val))->equiv : NULL) @d macro 0 // For appending a macro; distinguishes from a module. /* The following are the values of the |macro_type| field of |name_pointer|s. */ @d NOT_DEFINED 0 @d DEFERRED_MACRO 1 /* Numbers chosen so that |DEFERRED_MACRO + scanning_defn| gives the two choices. */ @d IMMEDIATE_MACRO 2 @d FILE_NAME 3 // Used to prevent truncations from affecting file names. /* Guard against overflow of the macro buffer. */ @d MCHECK(n,reason) if(mp+(n) > macrobuf_end) mbuf_full((unsigned long)(n),(outer_char *)reason)@; @#if 0 @d MCHECK mcheck // This speeds things up a bit. @#endif @= typedef struct { sixteen_bits token[MAX_XLEVELS]; int level; } XIDS; @ @= IN_COMMON STMT_LBL max_stmt; /* See \.{common.web}. */ EXTERN sixteen_bits outp_line[NUM_LANGUAGES] #ifdef _FTANGLE_h #if(part == 0 || part == 1) = {1,1,1,1,1,1,1,1} #endif /* |part == 1| */ #endif /* |_FTANGLE_h| */ ; fweb-1.62/Web/mem.hweb100644 10061 1115 460 6602703132 13635 0ustar krommesusers@z --- mem.hweb --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- @= #ifndef C_TYPES #include SFILE(y_type.h) #endif /* |C_TYPES| */ fweb-1.62/Web/os.hweb100644 10061 1115 1011 6602703132 13511 0ustar krommesusers@z --- os.hweb --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- @I formats.hweb @i sfile.hweb // Web macros for file includes. @ This file takes care of stuff that is somewhat compiler- or operating-system-dependent. Bootstrapping is taken care of by editing the file \.{custom.h}. @= #include "os.h" // Allegedly all system-specific stuff. fweb-1.62/Web/output.hweb100644 10061 1115 6550 6602703132 14445 0ustar krommesusers@z --- output.hweb --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- @ The token lists for translated \TeX\ output contain some special control symbols as well as ordinary characters. These control symbols are interpreted by \.{WEAVE} before they are written to the output file. \yskip\hang |break_space| denotes an optional line break or an en space; \yskip\hang |force| denotes a line break; \yskip\hang |big_force| denotes a line break with additional vertical space; \yskip\hang |opt| denotes an optional line break (with the continuation line indented two ems with respect to the normal starting position)---this code is followed by an integer~|n|, and the break will occur with penalty~$10n$; \yskip\hang |backup| denotes a backspace of one em; \yskip\hang |cancel| obliterates any |break_space| or |force| or |big_force| tokens that immediately precede or follow it and also cancels any |backup| tokens that follow it; \yskip\hang |indent| causes future lines to be indented one more em; \yskip\hang |outdent| causes future lines to be indented one less em. \yskip\noindent All of these tokens are removed from the \TeX\ output that comes from \cee\ text between \Cb\ signs; |break_space| and |force| and |big_force| become single spaces in this mode. The translation of other \cee\ texts results in \TeX\ control sequences~\.{\\1}, \.{\\2}, \.{\\3}, \.{\\4}, \.{\\5}, \.{\\6}, and~\.{\\7} corresponding respectively to |indent|, |outdent|, |opt|, |backup|, |break_space|, |force|, and |big_force|. However, a sequence of consecutive~`\.\ ', |break_space|, |force|, and/or |big_force| tokens is first replaced by a single token (the maximum of the given ones). The tokens |math_rel| and |math_bin| will be translated into \.{\\mathrel\{} and \.{\\mathbin\{}, respectively. Other control sequences in the \TeX\ output will be `\.{\\\vertbar}', which prefaces single-letter identifiers, `\.{\\\\\{}$\,\ldots\,$\.\}' surrounding identifiers, `\.{\\\&\{}$\,\ldots\,$\.\}' surrounding reserved words, `\.{\\\@@\{\dots\}}' surrounding names of intrinsic functions, `\.{\\.\{}$\,\ldots\,$\.\}' surrounding strings, `\.{\\WC\{}$\,\ldots\,$\.\}$\,$|force|' surrounding comments, and `\.{\\WX$n$:}$\,\ldots\,$\.{\\X}\.{\ }$\ell$\.{\\X}' surrounding module names, where |n|~is the module number and $\ell$~is the language symbol. @d math_bin OCTAL(345) @d math_rel OCTAL(346) @d toggle_meta OCTAL(347) /* --- Non-math tokens (see |big_app| in \.{prod.web}) --- */ @d big_cancel OCTAL(360) // Like |cancel|; also overrides spaces. @d cancel OCTAL(361) // Override |backup|, |break_space|, |force|, |big_force|. /* \bf The numerical order of the following must be preserved!! */ @d indent OCTAL(362) // One more tab (\.{\\1}). @d outdent OCTAL(363) // One less tab (\.{\\2}). @d opt OCTAL(364) // Optional break in mid-statement (\.{\\3}). @d backup OCTAL(365) // Stick out one unit to the left (\.{\\4}). @d break_space OCTAL(366) // Optional break between statements (\.{\\5}). @d force OCTAL(367) // Forced break between statements (\.{\\6}). @d big_force OCTAL(370) // Forced break with additional space (\.{\\7}). @d out_force OCTAL(371) // Output biggest force command to this point. @d end_translation OCTAL(377) // Special sentinel token at end of list. fweb-1.62/Web/proto.hweb100644 10061 1115 6074 6602703132 14251 0ustar krommesusers@z --- proto.hweb --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- @ In this header we handle stuff related to function prototypes. @ The |PROTO| macro is used in \.{?\_type.hweb}. @f PROTO $_EXPR @= #if OLD_PROTOTYPES #define PROTO(args) () // Old-style. #else #define PROTO(args) args // New-style. #endif // |PROTOTYPES| @ Here we deal with variable arguments. @f ELLIPSIS $_EXPR @f VA_ARGS $_EXPR @f VA_LIST int @= #if(0) /* Sun's system is hopeless. */ #if(NUM_VA_ARGS == 1) #undef NUM_VA_ARGS #define NUM_VA_ARGS 2 #endif #endif #if VARIABLE_ARGUMENTS #define ELLIPSIS ,... /* ANSI standard; VAX allows for old-style declarations. */ #define VA_ARGS #define VA_start #if(NUM_VA_ARGS == 1) #define VA_ALIST(args) (va_alist) // Sun's way. #define VA_DCL(args) va_dcl #define VA_START(a,n) va_start(a) #else #define VA_ALIST(args) args // ANSI way. #define VA_DCL(args) args #define VA_START(a,n) va_start(a,n) #endif #define VA_LIST(a) va_list a; #else #define ELLIPSIS /* Not permitted by \.{gcc} for old-style declarations. */ #define VA_ARGS ,arg_ptr #define arg_ptr arg1,arg2,arg3,arg4,arg5,arg6,\ arg7,arg8,arg9,arg10,arg11,arg12,arg13 #define VA_start outer_char *arg1,*arg2,*arg3,*arg4,*arg5,*arg6,\ *arg7,*arg8,*arg9,*arg10,*arg11,*arg12,*arg13; #define VA_ALIST(args) args #define VA_DCL(args) args #define VA_LIST(a) #define VA_START(a,n) #ifdef va_arg #undef va_arg #define va_arg(a,type) (type)"KLUDGE for va_arg" #endif #define va_end(a) #define vprintf printf #define vsprintf sprintf #endif /* ANSI variable arguments. */ @ The compilers have various understandings of |void| and |const|. @f SRTN void /* Identifies functions that return |void|. */ @f CONST static /* Identifies things that aren't changed by function calls, or that can be placed in read-only memory. */ @= #if !NO_VOID /* \.{Machine-dependent}: For machines that understand about |void *| or |void fcn()|. */ #define VOID void #define SRTN void #else #define VOID /* For use in function declarations. */ #define void char #define SRTN int #endif /* |void| stuff. */ #if KEEP_CONST #define CONST const #else #define CONST #endif @ The following macros make either old- or new-style function declarations. @f FCN $_EXPR @f C0 $_EXPR @f C1 $_EXPR @f C2 $_EXPR @f RPAR $_EXPR @= #if OLD_PROTOTYPES /* Old-style declarations. */ #define FCN(args) args #define C0(cmnt) ; #define C1(cmnt) ; #define C2(cmnt) ;VA_start #else /* New-style declarations. To use these macros, function declarations should have form |main FCN((num_args,args))|. See one of the \FWEB\ sources for examples of the use of~|C0|, |C1|, and~|C2|. */ #define FCN(args) ( #define C0(cmnt) , /* Intermediate comments. */ #define C1(cmnt) ) /* Comment on last argument. */ #define C2(cmnt) ,...) /* Variable args. */ #endif // |PROTOTYPES| fweb-1.62/Web/scraps.hweb100644 10061 1115 12220 6602703132 14407 0ustar krommesusers@z --- scraps.hweb --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- @* IMPLEMENTING the PRODUCTIONS. For the actual grammar implemented by \FWEB, see \.{prod.web}. This was split off in order to shorten the length of \FWEAVE. More specifically, a scrap is a structure consisting of a category |cat| and a |text_pointer| |trans|, which points to the translation in |tok_start|. When \cee\ text is to be processed with the grammar above, we form an array |scrap_info| containing the initial scraps. Our production rules have the nice property that the right-hand side is never longer than the left-hand side. Therefore it is convenient to use sequential allocation for the current sequence of scraps. Five pointers are used to manage the parsing: \yskip\hang |pp| is a pointer into |scrap_info|. We will try to match the category codes |pp->cat| |(pp+1)->cat|,\dots to the left-hand sides of productions. \yskip\hang |scrap_base|, |lo_ptr|, |hi_ptr|, and |scrap_ptr| are such that the current sequence of scraps appears in positions |scrap_base| through |lo_ptr| and |hi_ptr| through |scrap_ptr|, inclusive, in the |cat| and |trans| arrays. Scraps located between |scrap_base| and |lo_ptr| have been examined, while those in positions $\ge$~|hi_ptr| have not yet been looked at by the parsing process. \yskip\noindent Initially |scrap_ptr| is set to the position of the final scrap to be parsed, and it doesn't change its value. The parsing process makes sure that |lo_ptr>=pp+3|, since productions have as many as four terms, by moving scraps from |hi_ptr| to |lo_ptr|. If there are fewer than |pp+3| scraps left, the positions up to |pp+3| are filled with blanks that will not match in any productions. Parsing stops when |pp=lo_ptr+1| and |hi_ptr=scrap_ptr+1|. Since the |scrap| structure will later be used for other purposes, we declare its second element as unions. @= typedef struct { eight_bits cat; /* Category. It would be nice to |enum| this, but that would turn it into an |int|, which could be as much as four times bigger. */ eight_bits mathness; union { text_pointer Trans; @@; } trans_plus; } scrap; typedef scrap HUGE *scrap_pointer; @ @d trans trans_plus.Trans /* translation texts of scraps */ @d no_math 2 @d yes_math 1 @d maybe_math 0 @= EXTERN long max_scraps; /* Length of the next array. */ EXTERN scrap HUGE *scrp_info; /* Dynamic memory array for scraps */ EXTERN scrap_pointer scrp_end; /* end of |scrap_info|. */ EXTERN scrap_pointer pp; /* current position for reducing productions */ EXTERN scrap_pointer scrp_base; /* beginning of the current scrap sequence */ EXTERN scrap_pointer scrp_ptr; /* ending of the current scrap sequence */ EXTERN scrap_pointer lo_ptr; /* last scrap that has been examined */ EXTERN scrap_pointer hi_ptr; /* first scrap that has not been examined */ EXTERN scrap_pointer mx_scr_ptr; /* largest value assumed by |scrap_ptr| */ @ Token lists in |@_tok_mem| are composed of the following kinds of items for \TeX\ output. \begin{itemize} \item ASCII codes and special codes like |force| and |math_rel| represent themselves; \item |id_flag+p| represents \.{\\\\\{{\rm identifier $p$}\}}; \item |res_flag+p| represents \.{\\\&\{{\rm identifier $p$}\}}; \item |mod_flag+p| represents module name |p|; \item |tok_flag+p| represents token list number |p|; \item |inner_tok_flag+p| represents token list number |p|, to be translated without line-break controls. (This is used for code between vertical bars.) \end{itemize} /* In the following, note that the casts are absolutely essential on machines with sixteen-bit integers.) */ @d id_flag ID_FLAG // Signifies an identifier. @d res_flag 2*id_flag // Signifies a reserved word. @d mod_flag ((sixteen_bits)(3*(sixteen_bits)id_flag)) // Signifies a module name. @d tok_flag ((sixteen_bits)(4*(sixteen_bits)id_flag)) // signifies a token list. @d inner_tok_flag ((sixteen_bits)(5*(sixteen_bits)id_flag)) // Signifies a token list in `\Cb'. @ The `|freeze_text|' macro is used to give official status to a token list. Before saying |freeze_text|, items are appended to the current token list, and we know that the eventual number of this token list will be the current value of |text_ptr|. But no list of that number really exists as yet, because no ending point for the current list has been stored in the |tok_start| array. After saying |freeze_text|, the old current token list becomes legitimate, and its number is the current value of |text_ptr-1| since |text_ptr| has been increased. The new current token list is empty and ready to be appended to. Note that |freeze_text| does not check to see that |text_ptr| hasn't gotten too large, since it is assumed that this test was done beforehand. @d freeze_text *(++text_ptr)=tok_ptr @ If \.{WEAVE} is being run in debugging mode, the production numbers and current stack categories will be printed out when |tracing| is set to~|VERBOSE|; a sequence of two or more irreducible scraps will be printed out when |tracing| is set to~|BRIEF|. fweb-1.62/Web/sfile.hweb100644 10061 1115 5175 6602703133 14212 0ustar krommesusers@z --- sfile.hweb --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- @ Now we deal with the possibility that we will be including files from other than the current directory. Line commands may change the apparent directory, so an include intended to be from the current directory may not succeed. Here we'll code in the actual \FWEB\ directory structure, defining two macros |VFILE| and |SFILE| to generate a file name from the top-level directory or a specific subdirectory, respectively. In doing this, we use the environmental built-in macro |_HOME|. We construct the file name in Unix format, even for~VMS. We do this in a special way so that we can then use the |$TRANSLIT| built-in in two different ways depending on whether we're on the VAX or a Unix system. @m VFILE(name) #name @m SFILE(name) #name @#if 0 @#ifndef FWEB_HOME @m FWEB_HOME _HOME/fweb/v1 /* E.g., \.{/u/krommes/fweb/v1}. */ @#endif @#ifndef SDIR /* One might override this from the command line or ini file. */ /* \.{Machine-dependent}: Specify location of the bootstrap code. */ @#if ANSI @m SDIR FWEB_HOME/unix/ansi @#elif APOLLO @m SDIR FWEB_HOME/unix/apollo @#elif IBMPC @m SDIR FWEB_HOME/pc @#elif DSU @m SDIR FWEB_HOME/unix/dsu @#elif MAC @m SDIR FWEB_HOME/unix/mac @#elif MISC @m SDIR FWEB_HOME/misc @#elif SGI @m SDIR FWEB_HOME/unix/sgi @#elif SUN @m SDIR FWEB_HOME/unix/sun @#elif VAX @m SDIR FWEB_HOME/vax @#else @m SDIR . /* Current directory. */ @#endif /* Bootstrap locations. */ @#endif /* |SDIR| */ @#ifdef VFILE @m VFILE(name) FL_NM_FMT(FWEB_HOME,#!name) /* File in top-level directory. */ @#else @m VFILE(name) #name @#endif /* |VFILE| */ @#ifdef SFILE @m SFILE(name) FL_NM_FMT(SDIR,#!name) /* File in specific subdirectory. */ @#else @m SFILE(name) #name @#endif /* |SFILE| */ @m FL_NM_FMT(sub,name) FL_NM_FMT0(sub>#!name) /* \.{Machine-dependent}: Translate file-name formats. */ @#if VAX @m FL_NM_FMT0(name) $STRING($TRANSLIT(#name,"/>]",".]")) /* \.] is deleted. */ @#elif IBMPC @m FL_NM_FMT0(name) $STRING($TRANSLIT(#name,">","\\")) /* The PC is perverse, using backslashes. */ @#else @m FL_NM_FMT0(name) $STRING($TRANSLIT(#name,">","/")) /* Standard Unix, with forward slashes. */ @#endif /* File-name format translations. */ /* \.{Machine-dependent}: The |SYS_PATH| macro is used for such things as \.{sys/types.h} that have slashes in them. */ @#if IBMPC @m SYS_PATH(name) <$TRANSLIT(#name,"/","\\")> @#else @m SYS_PATH(name) <#!name> @#endif /* |IBMPC| */ @#endif fweb-1.62/Web/stacks.hweb100644 10061 1115 7017 6602703133 14375 0ustar krommesusers@z --- stacks.hweb --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- @* STACKS for OUTPUT. The output process uses a stack to keep track of what is going on at different ``levels'' as the modules are being written out. Entries on this stack have a number of parts: \yskip\hang |end_field| is the |tok_mem| location where the replacement text of a particular level will end; \hang |byte_field| is the |tok_mem| location from which the next token on a particular level will be read; \hang |name_field| points to the name corresponding to a particular level; \hang |repl_field| points to the replacement text currently being read at a particular level. \hang |mod_field| is the module number, or zero if this is a macro. \hang |global_Language| is the overriding language for the module and its extensions. \hang |Language| is the current language for the module. It will differ from |global_Language| if a language command was encountered in the middle of the module. \hang |macro_buf| is the current scratch space for the macro processor; |macro_buf_end| is its end. \yskip\noindent The current values of these nine quantities are referred to quite frequently, so they are stored in a separate place (|cur_state|) instead of in the |stack| array. We call the current values |cur_end|, |cur_byte|, |cur_name|, |cur_repl|, |cur_mod|, |cur_global_language|, and |cur_language|. The global variable |stack_ptr| tells how many levels of output are currently in progress. The end of all output occurs when the stack is empty, i.e., when |stack_ptr=stack|. @= typedef struct { eight_bits HUGE *end_field; // Ending location of replacement text. eight_bits HUGE *byte_field; // Present location within replacement text. name_pointer name_field; // |byte_start| index for text being output. text_pointer repl_field; // |tok_start| index for text being output. sixteen_bits mod_field; // Module number, or zero if not a module. PARAMS global_params,params; // Various flags. eight_bits HUGE *macro_buf, HUGE *mp, HUGE *macro_buf_end; // Current macro buffer. } output_state; typedef output_state HUGE *stack_pointer; @ Here are the synonyms for the current values of the stack. @d cur_end cur_state.end_field // Current ending location in |tok_mem|. @d cur_byte cur_state.byte_field // Location of next output byte in |tok_mem|. @d cur_name cur_state.name_field // Pointer to current name being expanded. @d cur_repl cur_state.repl_field // Pointer to current replacement text. @d cur_mod cur_state.mod_field // Current module number being expanded. @d cur_language cur_state.language // Current language. @d cur_global_language cur_state.global_params.Language // Global language for this level. /* Current flags. */ @d cur_params cur_state.params // Local flags. @d cur_global_params cur_state.global_params // Global flags. /* Current macro buffer params. */ @d macrobuf cur_state.macro_buf @d cur_mp cur_state.mp @d macrobuf_end cur_state.macro_buf_end @= EXTERN output_state cur_state; /* |cur_end|, |cur_byte|, |cur_name|, |cur_repl|, |cur_mod|, |cur_global_language|, and |cur_language|. */ EXTERN long stck_size; // Number of simultaneous levels of macro expansion. EXTERN output_state HUGE *stack; // Dynamic array: Info for non-current levels. EXTERN stack_pointer stck_end; // End of |stack|. EXTERN stack_pointer stck_ptr; // First unused loc.\ in the output state stack. fweb-1.62/Web/t_codes.hweb100644 10061 1115 23316 6602703133 14545 0ustar krommesusers@z --- t_codes.hweb --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- @ If the first byte of a token is less than $|0200| \equiv |ID0|$, the token occupies a single byte. Another way of saying this is that codes less than $|0200| \equiv |0x80| \equiv |0177| \equiv 128 \equiv 2^7$ are 7-bit ASCII codes that represent themselves. In particular, a single-character identifier like~`|x|' will be a one-byte token, while all longer identifiers will occupy two bytes. We shall use the macro |TOKEN1| to help us test for such a token, as in `|if(TOKEN1(a))@;|\dots'. Some of the 7-bit ASCII codes will not be present, however, so we can use them for special purposes. The following symbolic names are used: \yskip \hang |join| denotes the concatenation of adjacent items with no space or line breaks allowed between them (the \.{@@\&} operation of \.{WEB}). \hang |stringg| denotes the beginning or end of a string or verbatim construction; \hang |constant| denotes the beginning or end of a numerical constant. @^ASCII code@> @D stringg OCTAL(2) /* Extended ASCII alpha should not appear. (The funny spelling is to avoid conflict with the VAX' \.{stdlib}.) */ @D constant OCTAL(3) // Numerical constant. @D begin_Xmeta or_or @D end_Xmeta star_star @D cdir OCTAL(6) // Brackets compiler directive.. @D colon_colon OCTAL(11) // \Cpp\ and \Fortran--90: `$\WCF$'. @D join OCTAL(177) // |ASCII| delete will not appear. @d ID0 0200 // $128 =$ end of the 7-bit ASCII codes. @d TOKEN1(a) ((a) < ID0) // Is |a|~a single-byte token? @ Otherwise we make a sixteen-bit token by combining two consecutive bytes~|a| and~|b|. If $|0200| <= a < |0250| \equiv |MOD0|$, then $(a-|0200|) \times 2^8 + |b|$ corresponds to an identifier; we shall introduce the macro |IDENTIFIER(a,b)| to perform this construction. (This means that there must be fewer than 10,240 identifiers, since $|050|\times 2^8 = 10,240$.) If $|0250<=a<0320| \equiv |MOD1|$, then $(a-|0250|) \times 2^8 +|b|$ points to a module name. (Thus, there must be fewer than 10,240 module names.) Otherwise, i.e., if |0320<=a<0400|, then $(a-|0320|) \times 2^8 +|b|$ is the number of the module in which the current replacement text appears. If that number is~0 (i.e., if $|a| \equiv |MOD1|$ and $|b| \equiv 0$, we have the |LINE_NUM| identifier, which signifies four more bytes of line-number info upcoming. Notice that these conventions allow more module numbers than module names. Thus, we can use the tokens between~|0370| and~|0377| for other purposes. For example, see the definition of |MACRO_ARGUMENT|. @m MOD0 0250 @m MOD1 0320 @d MACRO_ARGUMENT 0377 /* See the related definition and discussion of |MOD0|. */ @d BASE2 0400 /* |0xFF + 1 = 0x100 = 256| */ @d MODULE_NAME $EVAL((MOD0-0200)<<8) /* |024000= 10240 = (0250-0200)*0400| */ @d MODULE_NUM $EVAL((MOD1-0200)<<8) /* |050000 = 20480 = (0320-0200)*0400| */ @d LINE_NUM $EVAL(MOD1<<8)@&L /* |0150000==0320*0400| */ @d IDENTIFIER(left,right) ((sixteen_bits)( ((left)-ID0)*BASE2 + (sixteen_bits)(right) )) /* Construct two-byte token out of its constituents. */ @d LEFT(a,id) ((eight_bits)(((a)/BASE2 + (id)))) /* Make left-hand byte out of |sixteen_bits|. */ @d RIGHT(a) ((eight_bits)(((a) % BASE2))) /* Make right-hand byte. */ @ Control codes in \.{WEB} begin with `\.{@@}', and the next character identifies the code. Some of these are of interest only to \.{WEAVE}, so \.{TANGLE} ignores them; the others are converted by \.{TANGLE} into internal code numbers by the |control_code| table below. The ordering of these internal code numbers has been chosen to simplify the program logic; larger numbers are given to the control codes that denote more significant milestones. The following table shows the assignments: $$\def\:{\char\count255\global\advance\count255 by 1} \def\Hrule{\noalign{\hrule}}\def\HHrule{\noalign{\hrule height2pt}} \def\Width{60pt} \count255='40 \vbox{ \hbox{\hbox to \Width{\it\hfill0\/\hfill}% \hbox to \Width{\it\hfill1\/\hfill}% \hbox to \Width{\it\hfill2\/\hfill}% \hbox to \Width{\it\hfill3\/\hfill}% \hbox to \Width{\it\hfill4\/\hfill}% \hbox to \Width{\it\hfill5\/\hfill}% \hbox to \Width{\it\hfill6\/\hfill}% \hbox to \Width{\it\hfill7\/\hfill}} \vskip 4pt \hrule \def\!{\vrule height 10.5pt depth 4.5pt} \halign{\hbox to 0pt{\hskip -24pt\WO{\~#}\hfill}&\! \hbox to \Width{\hfill$#$\hfill\!}& &\hbox to \Width{\hfill$#$\hfill\!}\cr 00&\\{ignore}&\WMM &\\{verbatim}&\\{force\_line}&\WW &** &\WCC &\\{bell}\cr\Hrule 01&\dots &\\{begin\_cmnt}&\\{lf} &\WPP &\\{ff} &\\{cr} &\\{begin\_lang} &\\{begin\_meta} \cr\Hrule 02&\WGG &\WLS &\WLL &\.{.DOT.}&; &\WSR &\WSlSl &\\{end\_meta} \cr\Hrule 03&\\{stmt\_label}&\WMG &\WI &\WL &\WNN &\WG &\WS &\WV \cr\HHrule 04& &\WR & &\# & &\WMOD &\amp & \cr\Hrule 05& & &\ast &+ & &- & &/ \cr\Hrule 06& & & & & & & & \cr\Hrule 07& & & & &< &= &> &? \cr\Hrule 10&\Wcp &\Wcm &\Wcs &\Wcv &\Wcd &\Wcx &\Wca &\Wco \cr\Hrule 11&\Wcg &\Wcl & & & & & & \cr\Hrule 12& & & & & & & & \cr\Hrule 13& & & & & & &\^ & \cr\Hrule 14& & & & & & & & \cr\Hrule 15& & & & & & & & \cr\Hrule 16& & & & & & & & \cr\Hrule 17& & & & &\WOR &\.{@@\$}&\.{@@\_},\WTL&\\{join}\cr\HHrule 20&\.{L$l$}&\.{C} &\.{R} &\.{N} &\.{M} &\.{X} & & \cr\Hrule 21&\WNP &\WNC &\.{\#<}&\WPtr &\WCC & & & \cr\Hrule 22& & & & & & & & \cr\Hrule 23&\\{constant}&\\{stringg}&\\{identifier}&\.{@@\^}&\.{@@9} &\.{@@.} &\.{@@t} &\.{@@'} \cr\Hrule 24&\.{@@\&}&\.{@@,} &\.{@@\char'174}&\.{@@/} &\.{@@\#} &\.{@@+} &\.{@@;}& \cr\Hrule 25&\.{@@(} &\.{@@)} &\.{\ } &\\{copy\_mode}&\\{toggle\_output}&\.{@@e}&\.{@@:}& \cr\Hrule 26& & &\.{@@!} & & &\.{@@0} &\.{@@1} &\.{@@2} \cr\Hrule 27&\.{@@f} &\.{@@\%}& & &\.{@@l} &\.{@@o} &\.{@@d} &\.{@@m} \cr\Hrule 30&\.{@@\#ifdef}&\.{@@\#ifndef}&\.{@@\#if}&\.{@@\#else}&\.{@@\#elif}&\.{@@\#endif} &\.{@@\#pragma} &\.{@@\#undef}\cr\Hrule 31&\.{@@a} &\.{@@<} &\.{@@\ }& & & & & \cr\Hrule 32& & & & & & & & \cr\Hrule 33& & & & & & & & \cr\Hrule 34& & & & & & & & \cr\Hrule 35& & & & & & & & \cr\Hrule 36& & & & & & & & \cr\Hrule 37& & & & & & &\\{begin\_cmnt0}& \cr} \hrule width 480pt}$$ @D ignore 0 // Control code of no interest to \.{TANGLE}. @d begin_comment0 HEX(FE) // Sent from |input_ln|; marker for long comment. @d begin_comment1 HEX(FD) // As above; marker for short comment. @D module_number OCTAL(201) // Code returned by |get_output| for mod.\ numbers. @D identifier OCTAL(202) // Code returned by |get_output| for identifiers. @D id_keyword OCTAL(203) // As above, but for expandable keyword. @D L_switch OCTAL(257) // Control code for `\.{@@L}'. @D begin_FORTRAN OCTAL(260) @D begin_RATFOR OCTAL(261) @D begin_C OCTAL(262) @D begin_LITERAL OCTAL(263) @D verbatim OCTAL(264) /* Can't be~|02| as for \.{fweave}, because |stringg| is defined to be that. */ @D invisible_cmnt OCTAL(265) // Control code for `\.{@@\%}'. @D compiler_directive OCTAL(266) // No longer used. @D Compiler_Directive OCTAL(267) // Control code for `\.{@@?}'. @D keyword_name OCTAL(270) // Control code for `\.{@@k}'. @D no_index OCTAL(300) // Control code for `\.{@@-}'. @D yes_index OCTAL(301) // Control code for `\.{@@+}'. @D ascii_constant OCTAL(302) // Control code for `\.{@@'}'. @D begin_vcmnt OCTAL(303) // Control code for `\.{@@\slashstar}'. @D big_line_break OCTAL(304) // Control code for `\.{@@\#}'. @D begin_bp OCTAL(305) @D insert_bp OCTAL(306) @D begin_meta OCTAL(17) // Control code for |"@@("|. @D end_meta OCTAL(27) @D TeX_string OCTAL(307) @D xref_roman OCTAL(310) @D xref_typewriter OCTAL(311) @D xref_wildcard OCTAL(312) @D control_text OCTAL(313) // Control code for `\.{@@t}', `\.{@@\^}', etc. @D begin_nuweb OCTAL(314) @D no_mac_expand OCTAL(315) // Control code for `\.{@@\~}' @D set_line_info OCTAL(316) // Expt'l control code for `\.{@@Q}'. @D short_fcn OCTAL(317) // Control code for `\.{@@\lb}'. @D formatt OCTAL(320) // Control code for `\.{@@f}'. @D limbo_text OCTAL(323) // Control code for `\.{@@l}'. @D op_def OCTAL(324) // Control code for `\.{@@v}'. @D macro_def OCTAL(325) // Control code for `\.{@@W}'. @D ignore_defn OCTAL(327)// Stuff to here should be ignored when scanning defn. @D new_output_file OCTAL(331) // Control code for `\.{@@o}'. @D definition OCTAL(332) // Control code for `\.{@@d}'. @D undefinition OCTAL(333) // Control code for `\.{@@u}'. @D WEB_definition OCTAL(334) // Control code for `\.{@@m}'. @D m_ifdef OCTAL(335) @D m_ifndef OCTAL(336) @D m_if OCTAL(337) @D m_else OCTAL(340) @D m_elif OCTAL(341) @D m_endif OCTAL(342) @D m_for OCTAL(343) @D m_endfor OCTAL(344) @D m_line OCTAL(345) @D m_undef OCTAL(346) @D end_of_buffer OCTAL(347) @D begin_code OCTAL(350) // Control code for `\.{@@a}'. @D module_name OCTAL(351) // Control code for `\.{@@<}'. @D new_module OCTAL(352) // Control code for `\.{@@\ }' and `\.{@@*}'. fweb-1.62/Web/texts.hweb100644 10061 1115 10174 6602703133 14272 0ustar krommesusers@z --- texts.hweb --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- @* DATA STRUCTURES EXCLUSIVE to FTANGLE. We've already seen that the |byte_mem| array holds the names of identifiers, strings, and modules; the |tok_mem| array holds the replacement texts for modules. It also serves as a temporary storage place for macros. Allocation is sequential, since things are deleted only during Phase II, and only in a last-in-first-out manner. A \&{text} variable is a structure containing a pointer |tok_start| into |tok_mem|, which tells where the corresponding text starts, and an integer |text_link|, which, as we shall see later, is used to connect pieces of text that have the same name. Additional entries keep track of the language that referenced the name (|Language|), the number |nargs| of arguments if it is a macro, and the offset |moffset| of the macro replacement text from the start (namely, after the right paren of the argument list or after the blank space if there are no arguments). All the \&{text}s are stored in the array |text_info|, and we use a |text_pointer| variable to refer to them. The first position of |tok_mem| that is unoccupied by replacement text is called |tok_ptr|, and the first unused location of |text_info| is called |text_ptr|. Thus we usually have the identity |text_ptr->tok_start=tok_ptr|. Macro tokens are temperarily appended to |tok_mem|. However, when they're all there, permanent space is allocated from the heap and the macro is copied into that. This way, that space can be easily freed if the macro is ever undefined. In fact, there are two kinds of macros, immediate and deferred. The immediate ones are defined in the definition section and are processed during phase~1; these can be entered sequentially into |tok_mem|. The deferred ones, however, are not processed until phase~2, after the code has been shuffled around. Since they must be read during phase~1, however, they must be stored somewhere, and it is convenient to put them into a separate place---the deferred pool---than the code text that is being built at the moment the deferred macro definition is encountered. Thus, we have the deferred variables |text_infod|, |tok_memd|, etc. @= typedef struct { eight_bits HUGE *tok_start; /* Pointer into |tok_mem| (for a module or regular macro). For an internal macro, points to the internal function. */ sixteen_bits text_link; // Relates replacement texts (0 for a macro). boolean Language; // Which language referenced this name. eight_bits nargs; // Number of macro arguments. unsigned@\ moffset:8, // Offset to macro replacement text from start. recursive:1, // Is this macro allowed to be recursive? var_args:1, // Can it have variable number of arguments? module_text:1, // Distinguishes from preprocessor fragment. built_in:1, // Is it a built-in function (internal macro)? protected:1, // Is it protected (not redefinable)? nbytes:19; // Length of macro or text. $2^{19} \approx (10^6)/2$. } text; typedef text HUGE *text_pointer; @ @= EXTERN long max_texts; // Number of replacement texts, must be $< 10240$. EXTERN text HUGE *text_info; // Dynamic array. EXTERN text_pointer text_end; // End of above. EXTERN long dtexts_max; // Number of deferred replacement texts. EXTERN text HUGE *txt_dinfo; // Dynamic array. EXTERN text_pointer textd_end; EXTERN text_pointer text_ptr,txt_dptr; /* First unused position in |text_info| and in |txt_dinfo|. */ EXTERN long max_toks; // Number of bytes in compressed code. EXTERN eight_bits HUGE *tok_mem; // Dynamic array. EXTERN eight_bits HUGE *tok_m_end; EXTERN long max_dtoks; // Number of bytes in deferred macros. EXTERN eight_bits HUGE *tok_dmem; // Dynamic array. EXTERN eight_bits HUGE *tokd_end; EXTERN eight_bits HUGE *tok_ptr, HUGE *tok_dptr; /* First unused position in |tok_mem| and in |tok_dmem|. */ EXTERN eight_bits HUGE *mx_tok_ptr, HUGE *mx_dtok_ptr; /* Largest value assumed by |tok_ptr| and |tok_ptrd|; for statistics. */ EXTERN text_pointer macro_text; fweb-1.62/Web/time.hweb100644 10061 1115 4211 6602703133 14034 0ustar krommesusers@z --- time.hweb --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- @ This file is included into \.{includes.hweb}. It takes care of the details of cpu and wall clock timing. @= /* --- TIMING --- */ /* The compiler-line macro |timing_width| overrides the default format for the time output; it's the number of \.x's in \.{n.xx} seconds. (See \.{custom.web}.) */ #ifndef TIMING_WIDTH #define TIMING_WIDTH 1 // We ensure that it's defined to something. #endif /* |TIMING_WIDTH| */ #include /* ANSI: Time-conversion routines. (For non-ANSI machines, defines |struct tm|.) */ #if TIMING /* We like wall-clock timing more precise than seconds. */ /* \.{Machine-dependent}: Non-ANSI timing: */ #if HAVE_GETTIMEOFDAY /* uSec timing */ #include #undef NEW_DIFFTIME #define NEW_DIFFTIME 1 #define TIME_T struct timeval #ifdef _COMMON_h struct timezone tz_dummy; #endif int gettimeofday PROTO((struct timeval *tp, struct timezone *tzp)); #define TIME(p) gettimeofday(p, &tz_dummy) #else #if HAVE_SYS_TIMEB_H /* mSec timing */ #include #undef NEW_DIFFTIME #define NEW_DIFFTIME 1 #define TIME_T struct timeb #define TIME(p) ftime(p) #else /* ANSI timing */ #define TIME_T time_t #define TIME(p) time(p) #endif // |HAVE_SYS_TIMEB_H| #endif // |HAVE_GETTIMEOFDAY| #if NEW_DIFFTIME #define DIFFTIME diff_time /* We supply our own version of |difftime| when we don't like the ANSI version. See \.{common.web}. (We can't just call our new version |difftime| because if that's already been prototyped the compiler will complain about a prototype mismatch.) */ #else #define DIFFTIME difftime /* Use the ANSI routine. */ #endif // |NEW_DIFFTIME| clock_t clock PROTO((VOID)); // Not defined on some machines. #ifndef CLOCKS_PER_SEC #ifdef CLK_TCK #define CLOCKS_PER_SEC CLK_TCK // Some use older name. #else #define CLOCKS_PER_SEC 1000000 /* Guess at default: $\mu$sec timing. */ #endif // |CLK_TCK| #endif // |CLOCKS_PER_SEC| #endif // |TIMING| fweb-1.62/Web/tokens.hweb100644 10061 1115 4035 6602703134 14406 0ustar krommesusers@z --- tokens.hweb --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- @ A third large area of memory is used for sixteen-bit `tokens', which appear in short lists similar to the strings of characters in |byte_mem|. Token lists are used to contain the result of \cee\ code translated into \TeX\ form; further details about them will be explained later. A \&{text\_pointer} variable is an index into |tok_start|. @D app(a) *(tok_ptr++)=a /* Ordinary token */ @m APP_FLAG(type,top,base) app(type##_flag + PTR_DIFF(sixteen_bits,top,base)) @d APP_ID APP_FLAG(id,id_lookup(id_first,id_loc,normal),name_dir) @D app1(a) APP_FLAG(tok,(a)->trans,tok_start) /* Store translation as token list; should translate to the following: */ @#if 0 @d app1(a) *(tok_ptr++)=tok_flag+(a)->trans-tok_start @#endif @f token_pointer int @f text_pointer int @= typedef sixteen_bits Token; typedef Token HUGE *token_pointer; typedef token_pointer HUGE *text_pointer; @ The first position of |tok_mem| that is unoccupied by replacement text is called |tok_ptr|, and the first unused location of |tok_start| is called |text_ptr|. Thus, we usually have |tok_start[text_ptr]=tok_ptr|. @= EXTERN long max_toks; /* number of symbols in \cee\ texts being parsed; must be less than |@r 65536 == 2^16|. */ EXTERN Token HUGE *tok_mem; // Dynamic array of tokens. EXTERN token_pointer tok_m_end; // End of |tok_mem|. EXTERN long max_texts; /* number of phrases in \cee\ texts being parsed; must be less than |ID_FLAG|. */ EXTERN token_pointer HUGE *tok_start; // Dynamic directory into |tok_mem|. EXTERN text_pointer tok_end; // End of |tok_start|. EXTERN token_pointer tok_ptr; // First unused position in |tok_mem|. EXTERN text_pointer text_ptr; // First unused position in |tok_start|. EXTERN token_pointer mx_tok_ptr; // Largest value of |tok_ptr|. EXTERN text_pointer mx_text_ptr; // Largest value of |text_ptr|. fweb-1.62/Web/trunc.hweb100644 10061 1115 3006 6602703134 14233 0ustar krommesusers@z --- trunc.hweb --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- @ Various structure definitions for identifier truncation. @d BP_MARKER 1 @d PROPER_END(end) end = (np+1)->byte_start; if(*end == BP_MARKER && np != npmax) end = ((BP *)end)->byte_start@; @d MAX_ID_LENGTH 32 // Truncated identifiers can't be longer than this. @= #if(0) IN_COMMON boolean truncate_ids; /* Truncate identifers? */ IN_COMMON unsigned short tr_max[]; /* Truncate to this length. */ IN_COMMON name_pointer npmax; /* |name_ptr - 1|. */ #endif /* Back-pointer structure points back to the original name in |name_dir|. */ typedef struct Bp { ASCII c; // Dummy byte that always remains~|BP_MARKER|. LANGUAGE Language; CONST ASCII HUGE *byte_start,HUGE *byte_end; /* Points to original, untruncated name. */ struct Bp HUGE *next; /* Links to next back-pointer structure, in case a truncated name came from more than one original name. */ struct Trunc HUGE *Root; } BP; /* Info about a truncated identifier. */ typedef struct Trunc { boolean Language; // All languages associated with this name. size_t num[NUM_LANGUAGES]; // \# of instances of the truncated name. ASCII HUGE *id, HUGE *id_end; // Truncated variable name. BP HUGE *first, HUGE *last; // First and last back-pointer structures. struct Trunc HUGE *next; // Next structure in truncated chain. } TRUNC; fweb-1.62/Web/typedefs.hweb100644 10061 1115 23077 6602703134 14755 0ustar krommesusers @I formats.hweb @ The actual names of the processors. @m TANGLE "FTANGLE" @m WEAVE "FWEAVE" @ Some compilers can't handle files as large as \.{ftangle} or \.{fweave}. Therefore, if the C~preprocessor macros |part| are defined from the compiler's command line to have the value~1, 2, or~3, the other parts of those files are commented out. @= #ifndef part #define part 0 /* Standard value, when the files aren't split. */ #else #if(part != 1 && part != 2 && part != 3) #define part 1 /* Should issue error message here. */ #endif #endif /* |part| */ @ @F EXTERN extern @f IN_TANGLE extern @f IN_COMMON extern @f IN_RATFOR extern @f IN_EVAL extern @f IN_MACS extern @f IN_PROD extern @f IN_STYLE extern @f SET $_EXPR @f CSET $_EXPR @= #if(part == 0 || part == 1) #define part1_or_extern #define SET1(stuff) @e = stuff #define TSET1(stuff) @e = stuff #else #define part1_or_extern extern #define SET1(stuff) #define TSET1(stuff) #endif @ Here's a somewhat sophisticated use of \WEB\ macros. @f WHILE while @f ptr_equals $EXPR_ @m OCTAL0(n) $ASCII(#'n) /* Single-quote the argument and send to \.{\$ASCII}. */ @m OCTAL(n) (eight_bits)OCTAL0(\@&n) /* Make octal constant. */ @m HEX(n) (eight_bits)OCTAL0(\@&x##n) /* Make hex constant. */ @ @m IS_NEXT(c0,keyword) { eight_bits c; if((c=next_byte()) != c0) { didnt_expand(c0,c,#*keyword); return; } } @m IS_NEXT_PAREN(keyword) IS_NEXT('(',keyword) @ @= case begin_C: case begin_RATFOR: case begin_FORTRAN: case begin_LITERAL@: @; @ @f @<|ASCII| cases for |C|@> case @f @<|ASCII| cases for |RATFOR|@> case @f @<|ASCII| cases for |FORTRAN|@> case @f @<|ASCII| cases for |TEX|@> case @f @<|ASCII| cases for |LITERAL|@> case @<|ASCII| cases for |C|@>= case @'c'@: @; @ @<|ASCII| cases for |RATFOR|@>= case @'r'@: @; @ @<|ASCII| cases for |FORTRAN|@>= case @'n'@: @; @ @<|ASCII| cases for |TEX|@>= case @'x'@: @; @ @<|ASCII| cases for |LITERAL|@>= case @'v'@: @; @ @f @<|outer_char| cases for |C|@> case @f @<|outer_char| cases for |RATFOR|@> case @f @<|outer_char| cases for |FORTRAN|@> case @f @<|outer_char| cases for |TEX|@> case @f @<|outer_char| cases for |LITERAL|@> case @<|outer_char| cases for |C|@>= case 'c'@: @; @ @<|outer_char| cases for |RATFOR|@>= case 'r'@: @; @ @<|outer_char| cases for |FORTRAN|@>= case 'n'@: @; @ @<|outer_char| cases for |TEX|@>= case 'x'@: @; @ @<|outer_char| cases for |LITERAL|@>= case 'v'@: @; @ Read the basic language letter and set the language. We must check for dialects before we call |opt_args| because the first thing that does is to set the language based on the values of the dialect flags. @= { ASCII l = *loc++; /* The basic language letter. */ switch(l) { @<|ASCII| cases for |C|@>: Cpp = BOOLEAN(*loc == @'+'); break; @<|ASCII| cases for |RATFOR|@>: @<|ASCII| cases for |FORTRAN|@>: Fortran88 = BOOLEAN(*loc == @'9'); break; @<|ASCII| cases for |LITERAL|@>: @<|ASCII| cases for |TEX|@>: break; default: err_print(C,"! Invalid language command `@@L%c' ignored",XCHR(l)); break; } opt_args(l); /* Set the language, and parse optional arguments after language command. */ } @ @m UPPER(var) smin0(MAX_VAL(ABBREV(var))),ABBREV(var) @ A simple error message with no arguments is used frequently. Error messages now carry an indication of their origin. @m err_print(origin,msg,...) err0_print(ERR_##origin,OC(msg),#0,#.) @m err_print_(origin,msg,...) err0_print(ERR_##origin,OC(msg),-1-#0,#.) @m ERR_PRINT(origin,msg) err_print(origin,msg) @m MACRO_ERR(msg,trail,...) macro_err(OC(msg),trail,#.) @ FORTRAN uses constructions such as~|@r .true.| or~|@r .and.|, which we have to parse separately. @m PREDEFINED_DOTS 14 /* \# of pre-initialized entries in the |dots| table. */ @ @f HUGE_FCN_PTR huge @= { /* We allocate |MOD_INFO| structures only for module names, not for identifiers. */ node->mod_info = GET_MEM("mod_info",1,MOD_INFO); node->mod_info->Ilk = expr; node->mod_info->params = params; /* Freeze parameters at this point in time. */ node->mod_info->params.uses = 0; /* Uses are counted in |new_mod_xref|. */ node->Language = (boolean)language; /* Redundant. */ } @ For initializing |ccodes|. @m INI_CCODE(defaults,code) ini_ccode((outer_char *)#code,(outer_char *)defaults,code) /* We use the same keyword name as the \FWEB\ code. */ @m REASSIGNABLE(d,c) INI_CCODE(d,c) /* For stuff that must later be reassigned for \FTANGLE. */ @m SAME_CCODE(d,c) INI_CCODE(d,c) @ Macros to guard against overflow during |sprintf| or |vprintf|. The function |nsprintf| is defined in \.{common.web} to handle non-ANSI return values from |sprintf|. @m NSPRINTF(buf_name,fmt,...) nsprintf(buf_name,OC(fmt),#0,#.) @m NVSPRINTF(buf_name,fmt,...) nvsprintf(buf_name,OC(fmt),#0,#.) @m SPRINTF(nmax,buf_name,args) if(NSPRINTF(buf_name,args) >= (int)(nmax)) OVERFLW(#buf_name,"")@; @m VSPRINTF(nmax,buf_name,args) if(NVSPRINTF(buf_name,args) >= (int)(nmax)) OVERFLW(#buf_name,"")@; @m vsprintf_(out,fmt,arg_ptr) $P if(NUM_VA_ARGS == 1) { char *fmt0 = va_arg(arg_ptr,char *); va_arg(arg_ptr,int); /* Skip over~$n$. */ vsprintf((char *)out,fmt0,arg_ptr); } $P else vsprintf(out,fmt,arg_ptr); $P endif @m vprintf_(fmt,arg_ptr) $P if(NUM_VA_ARGS == 1) { char *fmt0 = va_arg(arg_ptr,char *); va_arg(arg_ptr,int); vprintf(out,fmt0,arg_ptr); } $P else vprintf(fmt,arg_ptr); $P endif @f VA_ARGS $_EXPR @f VA_DECL int @f VA_LIST int @ Abbreviations for buffer allocations. @m ABBREV(name) V_##name @m V_buf_size "bs" @m V_C_buf_size "cb" @m V_cmd_fsize "cf" @m V_cmd_size "cg" @m V_delta_dots "d" @m V_line_length "ll" @m V_longest_name "ln" @m V_max_bytes "b" @m V_dtexts_max "dx" @m V_max_dtoks "dt" @m V_max_expr_chars "lx" @m V_max_lbls "lb" @m V_max_margs "ma" @m V_max_ifiles "if" @m V_max_include_depth "id" @m V_max_keywords "rk" @m V_max_modules "m" @m V_max_names "n" @m V_max_refs "r" @m V_max_scraps "s" @m V_max_texts "x" @m V_max_toks_t "tt" @m V_max_toks_w "tw" @m V_mbuf_size "mb" @m V_op_entries "op" @m V_num_files "nf" @m V_sbuf_len "sb" @m V_stck_size_t "kt" @m V_stck_size_w "kw" @m V_X_buf_size "xb" @ @f X_FCN void @m RAT_ERROR(err_type, msg, n, ...) RAT_error(err_type, OC(msg), n, #.) @m CONFUSION(where, fmt0, ...) confusion(OC(where), OC(fmt0), #.) @m FATAL(origin, msg1, fmt, ...) fatal(ERR_##origin, OC(msg1), OC(fmt), #.) @ For~C, getting an identifier is simple. For FORTRAN, we treat \&{format} statements much like C's preprocessor statement. However, there's no special character to start a \&{format} line; we have to actually check the identifier. Furthermore, it looks nicer if constructions such as \\{f6.2} are treated as one identifier, so when we're inside a \&{format} statement we allow the period to be an acceptable (internal) character for an identifier. @= { IN_COMMON ASCII HUGE *pformat, HUGE *pdata; get_identifier: @@; if(FORTRAN_LIKE(language)) { if(web_strcmp(pformat,pformat+6,id_first,id_loc) == EQUAL) { /* Raise special flag to say we're inside a |@r format| statement. */ in_format = YES; return begin_format_stmt; } else if(program==weave) { if(web_strcmp(pdata,pdata+4,id_first,id_loc) == EQUAL) { /* Inside a |@r data| statement. */ in_data = YES; return identifier; } else if(at_beginning && *loc==':' && !is_in(non_labels,id_first,id_loc)) return stmt_label; } } if(is_include_like()) sharp_include_line = YES; return identifier; } @ @= { id_first = --loc; /* Scan over subsequent elements of an identifier. */ for(++loc; isAlpha(*loc) || isDigit(*loc) || *loc==@'_' || *loc==@'$' || (in_format && *loc==@'.'); loc++) ; upcoming_kind = BOOLEAN(Fortran88 && (*loc == '"' || *loc == '\'') && loc[-1] == '_'); id_loc = loc - upcoming_kind; /* End plus one of the identifier. If a kind subscript is coming up, don't include the underscore. */ } @ Here we obtain the file name after an \.{@@o}~command. @= { while(*loc == ' ' || *loc == tab_mark) { loc++; if(loc > limit) return ignore; } id_first = loc; while(*loc != ' ' && *loc != tab_mark) loc++; /* Absorb file name. */ id_loc = loc; if(*id_first == '"') id_first++; if(*(id_loc-1) == '"') id_loc--; if(id_loc - id_first >= MAX_FILE_NAME_LENGTH) { err_print(T,"Output file name too long; allowed only %d characters", MAX_FILE_NAME_LENGTH - 1); id_loc = id_first + MAX_FILE_NAME_LENGTH - 1; } } @ The preprocessor commands are piggy-backed on the \.{@@\#} command. If there's text after that command, then we hunt through the above table. If we find a processor command, any subsequent white space is skipped. (This was added for nuweb mode, which otherwise takes each blank one at a time.) Otherwise, it's a |big_line_break|. @= { boolean mcode; *limit = ' '; /* Terminator for identifier search. */ id_first = loc; while(isAlpha(*loc)) loc++; /* Find end of identifier. */ if((mcode=is_mcmd(mcmds,id_first,loc)) != 0) { while(loc < limit && (*loc == @' ' || *loc == tab_mark)) loc++; #ifdef _FWEAVE_h defd_switch = NO; /* Don't let \.{@@[} propagate. */ #endif return mcode; } loc = id_first; /* Failed to recognize preprocessor command. */ } @ @= /* The shorter length here is primarily to keep the stack under control. Now that |N_MSGBUF| is used dynamically, maybe this statement isn't necessary. */ #ifdef SMALL_MEMORY #define N_MSGBUF 2000 #else #define N_MSGBUF 10000 #endif @ @= #include "typedefs.h" fweb-1.62/Web/val.hweb100644 10061 1115 2446 6602703134 13671 0ustar krommesusers@z --- val.hweb --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- @ Here are declarations needed for \.{eval.web}. @= /* Precedence of the various operators. */ typedef enum {BAD_TOKEN,OR_OR,AND_AND,BIT_OR,BIT_XOR,BIT_AND,LOG_EQ,LOG_LT, BIT_SHIFT,PLUS_MINUS,TIMES,EXP,UNARY,HIGHEST_UNARY} @]PRECEDENCE; /* An operator, together with its precedence. */ typedef struct { eight_bits token; PRECEDENCE precedence; } @]OP; /* The actual data value. */ typedef union { long i; // All integers are long, to humor the pc people. double d; // We handle just one floating-point type. sixteen_bits id; // An identifier token. OP op; } @]VALUE; /* Type of the data value. The relative order must be preserved here, because it is used in the type promotion routine |promote|. */ typedef enum {Int,Double,Id,Op} @]TYPE; /* Complete data structure for the token; includes links to the next and last |VAL| structures. */ typedef struct val { VALUE value; // The actual data value or operator token. TYPE type; // The type of value stored in |value|. struct val HUGE *last, HUGE *next;// Link to the last and next values. } @]VAL; fweb-1.62/Web/xrefs.hweb100644 10061 1115 11567 6602703134 14262 0ustar krommesusers@z --- xrefs.hweb --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- @* DATA STRUCTURES EXCLUSIVE to WEAVE. As explained in \.{common.web}, the field of a |name_info| structure that contains the |rlink| of a module name is used for a completely different purpose in the case of identifiers. It is then called the |ilk| of the identifier, and it is used to distinguish between various types of identifiers, as follows: {\narrower\narrower\everypar={\noindent\hang} |normal| identifiers are part of the \cee\ program; they will appear in \It{italic type}. |roman| identifiers are index entries that appear after \.{@@\^} in the \.{WEB} file. |wildcard| identifiers are index entries that appear after \.{@@9} in the \.{WEB} file; they will appear in a format controlled by the user-defined macro~\.{\\9}. |typewriter| identifiers are index entries that appear after \.{@@.} in the \.{WEB} file; they will appear in \.{typewriter type}. |do_like| \dots\ identifiers are reserved words whose |ilk| explains how they are to be treated when code is being formatted. } @d normal 0 /* ordinary identifiers have |normal| ilk */ @d roman 1 /* normal index entries have |roman| ilk */ @d wildcard 2 /* user-formatted index entries have |wildcard| ilk */ @d typewriter 3 /* `typewriter type' entries have |typewriter| ilk */ @d is_reserved(a) (a->ilk>typewriter) /* tells if a name is a reserved word */ @ We keep track of the current module number in |module_count|, which is the total number of modules that have started. Modules which have been altered by a change file entry have their |chngd_module| flag turned on during the first phase. @= EXTERN boolean change_exists; /* has any module changed? */ @ The other large memory area in \WEAVE\ keeps the cross-reference data. All uses of the name~|p| are recorded in a linked list beginning at |p->xref|, which points into the |xmem| array. The elements of |xmem| are structures consisting of an integer~|num| and a pointer~|xlink| to another element of |xmem|. If |x=p->xref| is a pointer into |xmem|, the value of |x->num| is either a module number where |p|~is used, or it is |def_flag| plus a module number where |p|~is defined; and |x->xlink| points to the next such cross-reference for~|p|, if any. This list of cross-references is in decreasing order by module number. The next unused slot in |xmem| is |xref_ptr|. The global variable |xref_switch| is set either to |def_flag| or to zero, depending on whether the next cross-reference to an identifier is to be underlined or not in the index. This switch is set to |def_flag| when \.{@@\_}, \.{@@[}, \.{@@]},\.{@@d}, \.{@@m}, or \.{@@f} is scanned, and it is cleared to zero when the next identifier or index entry cross-reference has been made. Similarly, the global variable |mod_xref_switch| is either |def_flag| or zero, depending on whether a module name is being defined or used. @d append_xref(c) if (xref_ptr==xmem_end) OVERFLW("cross-references",ABBREV(max_refs)); else { (++xref_ptr)->num=c; xref_ptr->Language = (boolean) language; } @= typedef struct xref_info0 { sixteen_bits num; /* module number plus zero or |def_flag| */ struct xref_info0 HUGE *xlink; /* pointer to the previous cross-reference */ boolean Language; /* Language in force for this module. */ } xref_info; typedef xref_info HUGE *xref_pointer; typedef ASCII HUGE *XREF_POINTER; /* For assignments like |name_dir->xref = (XREF_POINTER)xref_ptr|. See the comment immediately below about~|xref|. */ @ The integer |def_flag| is added to a module number when that module is defined. For variable names, a different approach is taken. If a name (especially a function name) is preceded by~\.{@@[}, the switch |defd_switch| is set to |YES|. Then when |new_xref| is called, the module number of that name is entered into the |defined_in| field. @d def_flag ID_FLAG /* must be strictly larger than |max_modules| */ @d xref equiv_or_xref /* The trouble with this is that |xref| is a |xref_pointer| whereas |equiv_or_xref| is |ASCII|. This means that lots of casting needs to be done to keep the compiler happy. Hence the previous |typedef|. */ @f XREF_POINTER int @= #ifndef COMMON_FCNS_ IN_COMMON BUF_SIZE max_modules; /* Size allocated in \.{common.web}. */ #endif EXTERN BUF_SIZE max_refs; EXTERN xref_info HUGE *xmem; /* contains cross-reference information */ EXTERN xref_pointer xmem_end; EXTERN xref_pointer xref_ptr; /* the largest occupied position in |xmem| */ EXTERN sixteen_bits xref_switch,mod_xref_switch; // either zero or |def_flag|. EXTERN boolean defd_switch; // Set by `\.{@@[}'. EXTERN NAME_TYPE defd_type SET(NEVER_DEFINED); EXTERN boolean typd_switch; // Set by `\.{@@]}'. EXTERN boolean index_short; // Set by `\.{@@+}'. fweb-1.62/Web/a_type.web100644 10061 1115 1375 6602703135 14221 0ustar krommesusers@z --- a_type.web --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- \Title{A\_TYPE.WEB} % Prototypes for dummy termcap routines. @c @* INTRODUCTION. @I formats.hweb @I os.hweb @ The make file produces \.{a\_type.h} from these prototypes. @a int tgetent PROTO((outer_char *buffer,CONST outer_char *name)); int tgetflag PROTO((CONST outer_char *id)); int tgetnum PROTO((CONST outer_char *id)); outer_char *tgetstr PROTO((CONST outer_char *id,outer_char **area)); outer_char *tgoto PROTO((CONST outer_char *cm,int destcol,int destline)); SRTN tputs PROTO((outer_char *cp,int affcnt,int (*outc)(int))); fweb-1.62/Web/c_type.web100644 10061 1115 23435 6602703135 14244 0ustar krommesusers@z --- c_type.web --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- \Title{C\_TYPE.WEB} % Prototypes for COMMON. @c @* PROTOTYPES for {\tt COMMON.WEB}. The function prototypes are macroed up so that if |PROTOTYPES==1| (see \.{proto.hweb}) one gets full function prototyping; otherwise just old-style declarations. @I formats.hweb @I os.hweb @ The make file produces \.{c\_type.h} from these prototypes. @a #ifndef C_TYPES /* Make sure it gets loaded only once. */ #define C_TYPES #include SFILE(y_type.h) // Prototypes for memory allocation. #include SFILE(d_type.h) // Prototypes for reserved words. #ifdef mcc unsigned long _hmemavl PROTO((VOID)); void HUGE *hrealloc PROTO((void HUGE *old_ptr, unsigned long new_size, unsigned long old_size)); #endif SRTN ASCII_file_write PROTO((FILE *file_ptr,CONST ASCII HUGE *p0,size_t n)); SRTN FR_args PROTO((LANGUAGE Language)); SRTN acopy PROTO((outer_char c,outer_char HUGE **a,int n)); SRTN add_keyword PROTO((ASCII HUGE *pk, ASCII HUGE *pk_end, ASCII HUGE *pt, ASCII HUGE *pt_end)); SRTN add_prefix PROTO((outer_char HUGE *file_name)); SRTN anlz_cmnts PROTO((VOID)); SRTN bad_lcmd PROTO((CONST char*type,CONST outer_char HUGE *pa0)); SRTN bad_loption PROTO((LANGUAGE Language)); SRTN bad_option PROTO((VOID)); SRTN banner PROTO((VOID)); char beep PROTO((int n)); boolean bscn_cmnt PROTO((VOID)); boolean bscn_white PROTO((VOID)); boolean buf_chk PROTO((CONST outer_char *file_name,unsigned buf_len, unsigned needed)); SRTN cant_negate PROTO((outer_char HUGE *s)); outer_char *ccode_name PROTO((eight_bits code)); SRTN chk_args PROTO((outer_char *name,int num,int n,PARGS pargs)); SRTN chk_change PROTO((VOID)); SRTN chk_complete PROTO((VOID)); SRTN chk_override PROTO((LANGUAGE language0)); int chr_cnt PROTO((outer_char *s, outer_char c)); SRTN cls_files PROTO((VOID)); outer_char HUGE *cmd_line PROTO((int num_args,outer_char *args[])); SRTN set_color PROTO((COLOR clr)); outer_char *commas PROTO((unsigned long l)); SRTN common_init PROTO((VOID)); int confusion PROTO((CONST outer_char where[], CONST outer_char fmt0[] ELLIPSIS)); SRTN conv_bi PROTO((BUILT_IN HUGE *b)); SRTN conv_dot PROTO((DOTS HUGE *d)); #if TIMING double diff_time PROTO((TIME_T t1,TIME_T t0)); #endif // |TIMING| SRTN divert PROTO((ASCII HUGE *buffer,ASCII HUGE *end, boolean stop)); SRTN do_args PROTO((boolean doing_cmd_line,int argc,outer_char HUGE *argv[], boolean HUGE *pfound_web,outer_char wbflnm[], boolean HUGE *pfound_change)); eight_bits dot_code PROTO((DOTS HUGE *d0,CONST ASCII HUGE *p0, CONST ASCII HUGE *p1,eight_bits new_code)); SRTN err0_print PROTO((ERR_ORIGIN err_origin,CONST outer_char *fmt, int n ELLIPSIS)); unsigned esc_file_name PROTO((outer_char *esc_name,unsigned max_length, outer_char *name)); outer_char HUGE *xpn_name PROTO((outer_char HUGE *HUGE *out_name,int buf_len, CONST outer_char *in_name,CONST outer_char wbflnm[])); int fatal PROTO((ERR_ORIGIN err_origin, CONST outer_char s1[], CONST outer_char fmt[] ELLIPSIS)); MEM HUGE *find_abbrev PROTO((CONST outer_char abbrev[])); SRTN fin_language PROTO((VOID)); SRTN find_keywords PROTO((ASCII HUGE *p, ASCII HUGE *p_end)); sixteen_bits find_id PROTO((eight_bits a0,eight_bits a1)); sixteen_bits find_n PROTO((sixteen_bits n)); sixteen_bits find_s PROTO((CONST outer_char *s)); unsigned find_prefix PROTO((outer_char s[])); SRTN flags3 PROTO((boolean not)); SRTN free_buf PROTO((BUF *p)); SRTN frz_params PROTO((VOID)); outer_char *get_arg PROTO((outer_char *result, outer_char *s, outer_char ldelim, outer_char rdelim)); boolean get_fname PROTO((outer_char HUGE *file_name)); boolean get_line PROTO((VOID)); SRTN help PROTO((VOID)); SRTN id_info PROTO((name_pointer np,long n,CONST outer_char *s, CONST RSRVD HUGE *prsrvd)); name_pointer id_lookup PROTO((CONST ASCII HUGE *first, CONST ASCII HUGE *last,eight_bits t)); boolean ignored_cmnts PROTO((VOID)); /* The following function should be superceded by ANSI's |strchr|. However, there's replacement code in \.{common.web} if necessary. */ #if(0) char HUGE *index PROTO((char HUGE *s,char c)); #endif boolean ini_input_prms PROTO((int ilevel,outer_char HUGE *path, boolean quit_on_error)); boolean ini0_input_prms PROTO((INPUT_PRMS0 HUGE *p0,outer_char HUGE *path, outer_char file_type[],boolean quit_on_error,SEQUENCES *extensions)); SRTN ini0_language PROTO((VOID)); SRTN ini_language PROTO((ASCII l)); SRTN ini_node PROTO((CONST name_pointer node)); SRTN ini_p PROTO((name_pointer p,eight_bits t)); SRTN ini_program PROTO((PROGRAM program0)); SRTN ini_timer PROTO((VOID)); SRTN init_buf PROTO((BUF *p, int num)); boolean input_ln PROTO((INPUT_PRMS0 HUGE *p0)); name_pointer install_node PROTO((name_pointer parent,int crl, CONST ASCII HUGE *j,int name_len)); boolean is_dot PROTO((VOID)); boolean is_in PROTO((CONST BUILT_IN b0[],CONST ASCII HUGE *p0, CONST ASCII HUGE *p1)); boolean is_include_like PROTO((VOID)); eight_bits is_mcmd PROTO((DOTS HUGE *d0,CONST ASCII HUGE *p0, CONST ASCII HUGE *p1)); LANGUAGE lan_enum PROTO((int num)); int lan_index PROTO((LANGUAGE Language)); int lan_num PROTO((LANGUAGE Language)); LANGUAGE lcase PROTO((LANGUAGE l0,outer_char c0,LANGUAGE l1,outer_char c1, outer_char HUGE * HUGE *pp)); int Length PROTO((name_pointer np)); SRTN macro_err PROTO((CONST outer_char s[],int trail ELLIPSIS)); SRTN mem_avail PROTO((int iswitch)); char *mk_fname PROTO((outer_char *buffer,unsigned buf_len, CONST outer_char *env_var, boolean print_msg, CONST outer_char *file_name)); SRTN mfree PROTO((VOID)); name_pointer mod_lookup PROTO((CONST ASCII HUGE *k,CONST ASCII HUGE *l)); outer_char HUGE *mod_trans PROTO((outer_char *prefix, sixteen_bits modno)); SRTN more_includes PROTO((INCL_PATHS *pincl, outer_char *incl_list0)); MEM HUGE *msearch PROTO((CONST outer_char abbrev[],BUF_SIZE nunits)); boolean names_match PROTO((name_pointer p, CONST ASCII HUGE *first,int l,eight_bits t)); SRTN multi_chars PROTO((outer_char c, int )); SRTN new_fname PROTO((outer_char HUGE * HUGE *pname,outer_char *name, outer_char *ext)); SRTN new_sprm PROTO((CONST outer_char name[], int value)); SRTN no_arg PROTO((outer_char c, CONST outer_char *letters)); int nsprintf PROTO((outer_char *s,CONST outer_char *fmt,int n ELLIPSIS)); int nvsprintf PROTO((outer_char *s,CONST outer_char *fmt,int n ELLIPSIS)); SRTN ntrunc PROTO((VOID)); SRTN open_tex_file PROTO((VOID)); SRTN opt_args PROTO((ASCII l)); SRTN out_error PROTO((CONST outer_char fcn[])); SRTN overflow PROTO((CONST outer_char msg[],CONST outer_char abbrev[])); name_pointer prefix_lookup PROTO((CONST ASCII HUGE *k,CONST ASCII HUGE *l)); SRTN pr_lan PROTO((CONST char *name,boolean b)); SRTN predefine_macros PROTO((void)); SRTN prime_the_change_buffer PROTO((VOID)); SRTN prn_codes PROTO((VOID)); unsigned prn_id PROTO((name_pointer np)); unsigned long prn_nd PROTO((VOID)); SRTN progress PROTO((VOID)); SRTN prn_time PROTO((VOID)); SRTN ptr_range PROTO((void HUGE *p,unsigned long nbytes)); outer_char *push_buf PROTO((BUF *p, outer_char *s)); boolean rd_Fortran PROTO((VOID)); boolean rd_free_form PROTO((VOID)); boolean rd_Ratfor PROTO((VOID)); SRTN read_aux PROTO((VOID)); SRTN reading PROTO((CONST outer_char *in_name,boolean emit_newline)); SRTN redirect_output PROTO((VOID)); SRTN rst_input PROTO((VOID)); SRTN save_macro PROTO((CONST outer_char HUGE *cmd,outer_char HUGE *t)); SRTN scan_args PROTO((VOID)); SRTN scan_for_cmnts PROTO((VOID)); SRTN see_statistics PROTO((VOID)); SRTN set_args PROTO((int HUGE *pargc,outer_char HUGE * HUGE * *pargv)); SRTN set_filter PROTO((LANGUAGE Language)); SRTN set_fname PROTO((LANGUAGE l,outer_char HUGE *sf,boolean check)); SRTN set_name PROTO((LANGUAGE l,outer_char *output_ext)); SRTN show_alloc PROTO((outer_char c,CONST outer_char why[], unsigned long nunits, unsigned long nsize,unsigned long nbytes, void HUGE *p,unsigned long total_mem)); boolean skip_Ftext PROTO((VOID)); boolean skip_Rtext PROTO((VOID)); boolean skp_cmnt PROTO((VOID)); BUF_SIZE smin0 PROTO((BUF_SIZE abs_max_num)); SRTN spurious PROTO((outer_char HUGE *pa1)); SRTN stat0 PROTO((CONST outer_char *name,size_t size,unsigned long num,unsigned long max_num,unsigned long abs_max_num,CONST outer_char *abbrev, CONST outer_char *ctrl_chars)); #if !HAVE_STRERROR char *strerror PROTO((int errnum)); #endif CONST outer_char * the_cdate PROTO((CONST struct tm *t)); CONST outer_char * the_day PROTO((CONST struct tm *t)); struct tm * the_localtime PROTO((VOID)); CONST outer_char * the_time PROTO((CONST struct tm *t)); int to_args PROTO((outer_char HUGE *arg_buffer,outer_char HUGE *args[], int max_args)); ASCII HUGE *to_ASCII PROTO((outer_char HUGE *p0)); ASCII HUGE *x_to_ASCII PROTO((CONST outer_char HUGE *p0)); ASCII HUGE *x__to_ASCII PROTO((CONST outer_char HUGE *p0)); outer_char HUGE *to_outer PROTO((ASCII HUGE *p0)); SRTN too_long PROTO((VOID)); SRTN undivert PROTO((VOID)); ASCII HUGE *uppercase PROTO((ASCII HUGE *p,int n)); SRTN usage PROTO((CONST char *msg, boolean is_fatal)); boolean verify PROTO((CONST outer_char fmt[] ELLIPSIS)); boolean was_opened PROTO((CONST outer_char HUGE *name, boolean global_scope, outer_char HUGE * HUGE *pname,FILE **pptr)); LEXI web_strcmp PROTO((CONST ASCII HUGE *j,CONST ASCII HUGE *j1, CONST ASCII HUGE *k,CONST ASCII HUGE *k1)); int wrap_up PROTO((VOID)); SRTN writing PROTO((boolean print_write,CONST outer_char *out_name)); SRTN x_keyword PROTO((eight_bits HUGE * HUGE *pmp, eight_bits HUGE *buf_end, eight_bits HUGE *p, eight_bits HUGE *p1, boolean in_quotes, boolean out_quotes, int input_level)); SRTN xpnd_file_name PROTO((outer_char HUGE *name)); FILE *xopen PROTO((outer_char *file_name,outer_char HUGE *path, SEQUENCES *extensions,CONST outer_char *iomode)); FILE *x0open PROTO((outer_char *file_name, SEQUENCES *extensions,CONST outer_char *iomode)); #endif @ Index: fweb-1.62/Web/d_type.web100644 10061 1115 1753 6602703135 14224 0ustar krommesusers@z --- d_type.web --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- \Title{D\_TYPE.WEB} % Prototypes for \.{reserved}. @c @* PROTOTYPES for {\tt RESERVED.WEB}. The function prototypes are macroed up so that if |PROTOTYPES==1| (see \.{proto.hweb}) one gets full function prototyping; otherwise just old-style declarations. @I formats.hweb @I os.hweb @ The make file produces \.{d\_type.h} from these prototypes. @a int cmpr_nd PROTO((NAME_INFO HUGE **p0,NAME_INFO HUGE **p1)); SRTN ini_tokens PROTO((LANGUAGE language0)); SRTN ini_RAT_tokens PROTO((LANGUAGE language0)); SRTN ini_reserved PROTO((LANGUAGE l)); SRTN save_id PROTO((WORD_TYPE word_type,LANGUAGE language0, CONST outer_char HUGE **words)); SRTN save_words PROTO((LANGUAGE language0,CONST RESERVED_WORD HUGE *words)); SRTN see_reserved PROTO((CONST RSRVD HUGE *prsrvd)); fweb-1.62/Web/e_type.web100644 10061 1115 4635 6602703135 14227 0ustar krommesusers@z --- e_type.web --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- \Title{E\_TYPE.WEB} % Prototypes for EVAL. @c @* PROTOTYPES for {\tt EVAL.WEB}. The function prototypes are macroed up so that if |PROTOTYPES==1| (see \.{proto.hweb}) one gets full function prototyping; otherwise just old-style declarations. @I formats.hweb @I os.hweb @ The make file produces \.{e\_type.h} from these prototypes. @a #include SFILE(c_type.h) /* Prototypes for \.{common.web}. */ SRTN i_eval_ PROTO((int n,PARGS pargs)); SRTN i_const_ PROTO((int n, PARGS pargs)); SRTN i_log_ PROTO((int n, PARGS pargs)); SRTN i_min_max_ PROTO((int n, PARGS pargs)); unsigned long btoi PROTO((CONST ASCII HUGE *b,CONST ASCII HUGE *b1)); SRTN chk_zero PROTO((outer_char c,CONST VAL HUGE *pv)); SRTN convert_to PROTO((TYPE type,VAL HUGE *v0,VAL HUGE *v1)); SRTN e_macros PROTO((VOID)); boolean eval PROTO((CONST eight_bits HUGE *p0,CONST eight_bits HUGE *p1)); CONST eight_bits HUGE *eval0 PROTO((VAL HUGE *val,CONST eight_bits HUGE *p0, CONST eight_bits HUGE *p1,eight_bits delim)); VAL HUGE *eval1 PROTO((CONST VAL HUGE *v0,CONST VAL HUGE *v1, PRECEDENCE prec0,int found_op[])); CONST eight_bits HUGE *evaluate PROTO((VAL HUGE *val,CONST eight_bits HUGE *p0, CONST eight_bits HUGE *p1)); SRTN fin_constant PROTO((TYPE type)); #ifndef C_TYPES name_pointer id_lookup PROTO((CONST ASCII HUGE *first, CONST ASCII HUGE *last,eight_bits t)); #endif /* |C_TYPES| */ void HUGE *mac_lookup PROTO((sixteen_bits cur_val)); SRTN mcheck0 PROTO((unsigned long n,CONST outer_char reason[])); SRTN misplaced_id PROTO((sixteen_bits a0,sixteen_bits a1)); int neval PROTO((CONST eight_bits HUGE *p0,CONST eight_bits HUGE *p1)); SRTN num_to_mbuf PROTO((int n,PARGS pargs, CONST char *built_in_name,int num_args, CONST char *num_descr,int num)); outer_char *op_name PROTO((eight_bits tokn)); unsigned long otoi PROTO((CONST ASCII HUGE *b,CONST ASCII HUGE *b1)); PRECEDENCE precedence PROTO((eight_bits tokn)); SRTN promote PROTO((VAL HUGE *v0,VAL HUGE *v1)); unsigned stnd_num PROTO((LANGUAGE Language)); outer_char *stype PROTO((TYPE type)); CONST eight_bits HUGE *vfill PROTO((VAL HUGE *v,CONST eight_bits HUGE *p0, CONST eight_bits HUGE *p1)); unsigned long xtoi PROTO((CONST ASCII HUGE *b,CONST ASCII HUGE *b1)); @ Index: fweb-1.62/Web/m_type.web100644 10061 1115 12742 6602703135 14255 0ustar krommesusers@z --- m_type.web --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- \Title{M\_TYPE.WEB} % Prototypes for MACS.WEB. @c @* PROTOTYPES for {\tt MACS.WEB}. The function prototypes are macroed up so that is |PROTOTYPES==1| (see \.{proto.hweb}) one gets full function prototyping; otherwise just old-style declarations. @I formats.hweb @I os.hweb @ The make file produces \.{m\_type.h} from these prototypes. @a SRTN i_ascii_ PROTO((int n,PARGS pargs)); SRTN i_assert_ PROTO((int n,PARGS pargs)); SRTN i_define_ PROTO((int n,PARGS pargs)); SRTN i_dumpdef_ PROTO((int n,PARGS pargs)); SRTN i_error_ PROTO((int n,PARGS pargs)); SRTN i_eval_ PROTO((int n,PARGS pargs)); SRTN i_getenv_ PROTO((int n,PARGS pargs)); SRTN i_if_ PROTO((int n,PARGS pargs)); SRTN i_ifcase_ PROTO((int n,PARGS pargs)); SRTN i_ifdef_ PROTO((int n,PARGS pargs)); SRTN i_ifndef_ PROTO((int n,PARGS pargs)); SRTN i_ifelse_ PROTO((int n,PARGS pargs)); SRTN i_inp_line_ PROTO((int n,PARGS pargs)); SRTN i_keyword_ PROTO((int n, PARGS pargs)); SRTN i_lang_ PROTO((int n,PARGS pargs)); SRTN i_len_ PROTO((int n,PARGS pargs)); SRTN i_lnum_ PROTO((int n,PARGS pargs)); SRTN i_lowercase_ PROTO((int n,PARGS pargs)); SRTN i_meta_ PROTO((int n,PARGS pargs)); SRTN i_mod_name_ PROTO((int n,PARGS pargs)); SRTN i_modules_ PROTO((int n,PARGS pargs)); SRTN i_nargs_ PROTO((int n,PARGS pargs)); SRTN i_outp_line_ PROTO((int n,PARGS pargs)); SRTN i_routine_ PROTO((int n,PARGS pargs)); SRTN i_sect_num_ PROTO((int n,PARGS pargs)); SRTN i_switch_ PROTO((int n,PARGS pargs)); SRTN i_tm_ PROTO((int n,PARGS pargs)); SRTN i_translit_ PROTO((int n,PARGS pargs)); SRTN i_undef_ PROTO((int n,PARGS pargs)); SRTN i_unstring_ PROTO((int n, PARGS pargs)); SRTN i_uppercase_ PROTO((int n,PARGS pargs)); SRTN i_verbatim_ PROTO((int n,PARGS pargs)); SRTN i_version_ PROTO((int n,PARGS pargs)); SRTN i_xflag_ PROTO((int n,PARGS pargs)); eight_bits HUGE *argize PROTO((eight_bits HUGE *start, eight_bits HUGE *end)); eight_bits HUGE *args_to_macrobuf PROTO((eight_bits HUGE *mp, eight_bits HUGE **pcur_byte, eight_bits HUGE **pthe_end, boolean multilevels, boolean var_args)); eight_bits HUGE *copy_and_paste PROTO((eight_bits HUGE *m_start, eight_bits HUGE *m_end)); SRTN copy_id PROTO((CONST ASCII HUGE *start,CONST ASCII HUGE *end, CONST char*descr)); SRTN copy_nth_arg PROTO((int n0,int n,PARGS pargs)); boolean cp_macro_arg PROTO((PARGS pargs,eight_bits k,eight_bits n, boolean HUGE *pxpn_argument, boolean last_was_paste, boolean next_is_paste)); SRTN cpy_op PROTO((CONST outer_char HUGE *s)); SRTN dbg_macs PROTO((sixteen_bits, eight_bits HUGE *, eight_bits *)); SRTN esc_certain_chars PROTO((sixteen_bits c,boolean esc_chars)); eight_bits HUGE *get_dargs PROTO((eight_bits HUGE *start, eight_bits HUGE *end, sixteen_bits HUGE *args,eight_bits *n, boolean *pvar_args)); eight_bits HUGE *get_margs0 PROTO((eight_bits HUGE *start, eight_bits HUGE *end, eight_bits HUGE **pcur_byte, eight_bits HUGE **pthe_end, boolean multilevels, boolean var_args, eight_bits HUGE *pargs[], eight_bits *n)); SRTN ini_internal_fcns PROTO((VOID)); boolean ins_arg PROTO((ASCII cleft,ASCII cright,PARGS pargs,text_pointer m, eight_bits n,eight_bits HUGE * HUGE *pp0, boolean *ppasting,boolean *pxpn_argument,boolean last_was_paste)); SRTN mac_args PROTO((sixteen_bits id_token)); void HUGE *mac_lookup PROTO((sixteen_bits cur_val)); SRTN mbuf_full PROTO((unsigned long n,CONST outer_char reason[])); SRTN must_quote PROTO((CONST outer_char *name, eight_bits HUGE *p,eight_bits HUGE *p1)); outer_char *type1 PROTO((eight_bits c)); SRTN new_mbuf PROTO((VOID)); SRTN num_to_mbuf PROTO((int n,PARGS pargs, CONST char *built_in_name,int num_args, CONST char *num_descr,int num)); eight_bits HUGE *paste1 PROTO((eight_bits HUGE *p0, eight_bits HUGE *begin_or_end)); CONST ASCII HUGE *proper_end PROTO((name_pointer np)); SRTN prn_mname PROTO((outer_char HUGE **pt,sixteen_bits tokn)); SRTN put_long PROTO((long l)); boolean recursive_name PROTO((sixteen_bits a,XIDS HUGE *xids,int last_level)); int rcvr_macro PROTO((ASCII HUGE *mtext,sixteen_bits HUGE *tokens, CONST eight_bits HUGE *p0,CONST eight_bits HUGE *p1)); SRTN see_macro PROTO((CONST eight_bits HUGE *p0,CONST eight_bits HUGE *p1)); SRTN see_xlevel PROTO((outer_char HUGE **pt, XIDS HUGE *p)); eight_bits HUGE *str_to_mb PROTO((CONST eight_bits HUGE *begin_arg, CONST eight_bits HUGE *end_arg,boolean escape_chars)); SRTN t_macros PROTO((VOID)); SRTN translit PROTO((CONST ASCII HUGE *s,CONST ASCII HUGE *from, CONST ASCII HUGE *to)); SRTN undef PROTO((sixteen_bits cur_val,boolean warning)); boolean x_int_fcn PROTO((sixteen_bits id,int n,PARGS pargs)); eight_bits HUGE *xmacro PROTO((text_pointer macro_text, eight_bits HUGE **pcur_byte, eight_bits HUGE **pthe_end, boolean multilevels, eight_bits HUGE *mp0)); eight_bits HUGE *xmac_buf PROTO((eight_bits HUGE *mp0, XIDS HUGE *old_xids, eight_bits HUGE **pcur_byte, eight_bits HUGE **pthe_end, boolean multilevels)); eight_bits HUGE *xmac_text PROTO((eight_bits HUGE *mp0, eight_bits HUGE *start, eight_bits HUGE *end)); boolean x0macro PROTO((eight_bits HUGE *p,eight_bits HUGE *end, XIDS HUGE *xids, eight_bits HUGE **pcur_byte, eight_bits HUGE **the_end, boolean multilevels)); SRTN xpn_before PROTO((eight_bits HUGE *mp0, XIDS HUGE *xids, eight_bits HUGE **pcur_byte, eight_bits HUGE **the_end, boolean multilevels)); @ Index: fweb-1.62/Web/p_type.web100644 10061 1115 11625 6602703136 14260 0ustar krommesusers@z --- p_type.web --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- \Title{P\_TYPE.WEB} % Prototypes for PROD.WEB. @c @* PROTOTYPES for {\tt PROD.WEB}. The function prototypes are macroed up so that if |PROTOTYPES==1| (see \.{proto.hweb}) one gets full function prototyping; otherwise just old-style declarations. @I formats.hweb @I os.hweb @ The make file produces \.{p\_type.h} from these prototypes. @A #include SFILE(c_type.h) /* Prototypes for \.{common}. */ SRTN app_loop_num PROTO((int n)); SRTN app_str PROTO((CONST outer_char HUGE *s)); SRTN app_ASCII_str PROTO((CONST ASCII HUGE *s)); SRTN b_app PROTO((Token a)); SRTN b_app1 PROTO((scrap_pointer a)); SRTN C_productions PROTO((VOID)); SRTN C_ignore_scrap PROTO((VOID)); SRTN C_expr PROTO((VOID)); SRTN C_UNOP PROTO((VOID)); SRTN C_BINOP PROTO((VOID)); SRTN C_COMMA PROTO((VOID)); SRTN C__E PROTO((VOID)); SRTN C__E_ PROTO((VOID)); SRTN C_E_ PROTO((VOID)); SRTN C_new_like PROTO((VOID)); SRTN C_lproc PROTO((VOID)); SRTN C_LPRC PROTO((VOID)); SRTN C_space PROTO((VOID)); SRTN C_question PROTO((VOID)); SRTN C_int_like PROTO((VOID)); SRTN C_ext_like PROTO((VOID)); SRTN C_modifier PROTO((VOID)); SRTN C_huge_like PROTO((VOID)); SRTN C_decl_hd PROTO((VOID)); SRTN C_decl PROTO((VOID)); SRTN C_fn_decl PROTO((VOID)); SRTN C_functn PROTO((VOID)); SRTN C_typedef_like PROTO((VOID)); SRTN C_imp_reserved PROTO((VOID)); SRTN C_op_like PROTO((VOID)); SRTN C_class_like PROTO((VOID)); SRTN C_struct_like PROTO((VOID)); SRTN C_str_hd PROTO((VOID)); SRTN C_lpar PROTO((VOID)); SRTN C_lbracket PROTO((VOID)); SRTN C_rbracket PROTO((VOID)); SRTN C_lbrace PROTO((VOID)); SRTN C__unop PROTO((VOID)); SRTN C_unorbinop PROTO((VOID)); SRTN C_cast PROTO((VOID)); SRTN C_sizeof_like PROTO((VOID)); SRTN C__binop PROTO((VOID)); SRTN C_do_like PROTO((VOID)); SRTN C_for_like PROTO((VOID)); SRTN C_forhd PROTO((VOID)); SRTN C_if_like PROTO((VOID)); SRTN C_IF PROTO((VOID)); SRTN C_if_hd PROTO((VOID)); SRTN C_els_hd PROTO((VOID)); SRTN C_else PROTO((VOID)); SRTN C_ELS PROTO((VOID)); SRTN C_IF_top PROTO((VOID)); SRTN C_stmt PROTO((VOID)); SRTN C_case_like PROTO((VOID)); SRTN C_langle PROTO((VOID)); SRTN C_namespace PROTO((VOID)); SRTN C_rangle PROTO((VOID)); SRTN C_reference PROTO((VOID)); SRTN C_semi PROTO((VOID)); SRTN C_tag PROTO((VOID)); SRTN C_template PROTO((VOID)); SRTN C_tlist PROTO((VOID)); SRTN C_tstart PROTO((VOID)); SRTN C_virtual PROTO((VOID)); SRTN C_wh_do PROTO((VOID)); boolean compare_text PROTO((text_pointer t0,text_pointer t1)); SRTN defined_at PROTO((name_pointer p)); sixteen_bits first_id PROTO((text_pointer t)); text_pointer indirect PROTO((text_pointer t)); SRTN V_productions PROTO((VOID)); SRTN make_reserved PROTO((scrap_pointer p)); name_pointer make_underlined PROTO((scrap_pointer p)); SRTN prn_cat PROTO((eight_bits c)); SRTN prn_math PROTO((scrap_pointer a)); SRTN prn_text PROTO((text_pointer p)); SRTN prn_trans PROTO((scrap_pointer p)); SRTN R_productions PROTO((void)); SRTN R_expr PROTO((VOID)); SRTN R_key_wd PROTO((VOID)); SRTN R_exp_op PROTO((VOID)); SRTN R_program_like PROTO((VOID)); SRTN R_fcn_hd PROTO((VOID)); SRTN R_proc_like PROTO((VOID)); SRTN R_private_like PROTO((VOID)); SRTN R_int_like PROTO((VOID)); SRTN R_struct_like PROTO((VOID)); SRTN R_str_hd PROTO((VOID)); SRTN R_op_like PROTO((VOID)); SRTN R_dcl_hd PROTO((VOID)); SRTN R_decl PROTO((VOID)); SRTN R_functn PROTO((VOID)); SRTN R_lpar PROTO((VOID)); SRTN R_colon PROTO((VOID)); SRTN R_lbrace PROTO((VOID)); SRTN R_unop PROTO((VOID)); SRTN R_unorbinop PROTO((VOID)); SRTN R_slash_like PROTO((VOID)); SRTN R_binop PROTO((VOID)); SRTN R_Rdo_like PROTO((VOID)); SRTN R_do_like PROTO((VOID)); SRTN R_until_like PROTO((VOID)); SRTN R_if_like PROTO((VOID)); SRTN R_go_like PROTO((VOID)); SRTN R_end_like PROTO((VOID)); SRTN R_END PROTO((VOID)); SRTN R_endif_like PROTO((VOID)); SRTN R_if_hd PROTO((VOID)); SRTN R_else_like PROTO((VOID)); SRTN R_stmt PROTO((VOID)); SRTN R_CASE PROTO((VOID)); SRTN R_case_like PROTO((VOID)); SRTN R_tag PROTO((VOID)); SRTN R_label PROTO((VOID)); SRTN R_semi PROTO((VOID)); SRTN R_common_like PROTO((VOID)); SRTN R_cmn_hd PROTO((VOID)); SRTN R_read_like PROTO((VOID)); SRTN R_rd_hd PROTO((VOID)); SRTN R_implicit_like PROTO((VOID)); SRTN R_imp_hd PROTO((VOID)); SRTN R_assign_like PROTO((VOID)); SRTN R_entry_like PROTO((VOID)); SRTN R_define_like PROTO((VOID)); SRTN R_no_order PROTO((VOID)); SRTN R_built_in PROTO((VOID)); SRTN R_newline PROTO((VOID)); int get_language PROTO((text_pointer xp)); SRTN reduce PROTO((scrap_pointer j,short k,eight_bits c,short d, unsigned long n)); SRTN squash PROTO((scrap_pointer j,short k,eight_bits c,short d, unsigned long n)); sixteen_bits tok_val PROTO((scrap_pointer p)); text_pointer translate PROTO((PARSING_MODE mode0)); name_pointer underline_xref PROTO((name_pointer p)); SRTN X_productions PROTO((VOID)); @ Index: fweb-1.62/Web/r_type.web100644 10061 1115 11302 6602703136 14252 0ustar krommesusers@z --- r_type.web --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- \Title{R\_TYPE.WEB} % Prototypes for RATFOR. @c @* PROTOTYPES for {\tt RATFOR.WEB}. The function prototypes are macroed up so that if |PROTOTYPES==1| (see \.{proto.hweb}) one gets full function prototyping; otherwise just old-style declarations. @I formats.hweb @I os.hweb @ The make file produces \.{r\_type.h} from these prototypes. @d OUT_MSG(msg,msg1) out_msg((CONST ASCII *)(msg),(CONST ASCII *)(msg1)) /* Helps avoid compiler warning messages for pc's. */ @a #include SFILE(c_type.h) /* Prototypes for \.{common.web}. */ #ifdef _ratfor_ boolean char_after PROTO((outer_char c)); outer_char HUGE *cmd_name PROTO((CMD cmd)); eight_bits copy_comment PROTO((boolean save_comments)); SRTN copyd PROTO((boolean to, boolean xpn_cases,ASCII l,ASCII r, boolean semi_allowed)); unsigned copy_2to PROTO((ASCII r_before,ASCII r_after)); SRTN expanding PROTO((CMD cmd)); eight_bits get_saved_output PROTO((stack_pointer stack_ptr0)); SRTN flush_comments PROTO((VOID)); SRTN id0 PROTO((sixteen_bits cur_val)); #ifndef C_TYPES name_pointer id_lookup PROTO((CONST ASCII HUGE *first, CONST ASCII HUGE *last, eight_bits t)); #endif /* |C_TYPES| */ SRTN ini_out_tokens PROTO((SPEC HUGE *tokens)); STMT_LBL label_case PROTO((CASE_TYPE cmin,CASE_TYPE m)); SRTN not_loop PROTO((CONST outer_char id[],CONST outer_char msg[])); SRTN not_switch PROTO((CONST outer_char s[])); SRTN output_ended PROTO((CONST outer_char msg[],int n ELLIPSIS)); SRTN out_cmd PROTO((boolean emit_continue, outer_char abbrev,CONST outer_char beginning[], CONST outer_char *fmt0,int n ELLIPSIS)); SRTN out_label PROTO((boolean suppress_0,STMT_LBL stmt_num)); outer_char *qdelim PROTO((ASCII delim)); SRTN resize PROTO((eight_bits HUGE **pp,int nmax, eight_bits HUGE **pq, eight_bits HUGE **pp_end)); int save_lbls PROTO((CMD cmd,STMT_LBL top0,STMT_LBL next0, STMT_LBL break0,int n_used)); SRTN show_cmd PROTO((CONST CASE HUGE *cur_case)); SRTN stmt PROTO((boolean to,boolean brace_only)); SRTN unexpected PROTO((CONST outer_char id[])); X_FCN x_block PROTO((VOID)); X_FCN x_blockdata PROTO((VOID)); X_FCN x_break PROTO((VOID)); X_FCN x_case PROTO((VOID)); X_FCN x_contains PROTO((VOID)); X_FCN x_default PROTO((VOID)); X_FCN x_do PROTO((VOID)); X_FCN x_else PROTO((VOID)); X_FCN x_els_if PROTO((VOID)); X_FCN x_end PROTO((VOID)); X_FCN x_en_if PROTO((VOID)); X_FCN x_en_interface PROTO((VOID)); X_FCN x_en_module PROTO((VOID)); X_FCN x_en_select PROTO((VOID)); X_FCN x_en_type PROTO((VOID)); X_FCN x_en_where PROTO((VOID)); X_FCN x_for PROTO((VOID)); X_FCN x_function PROTO((VOID)); X_FCN x_if PROTO((VOID)); X_FCN x_inter0face PROTO((VOID)); X_FCN x_interface PROTO((VOID)); X_FCN x_module PROTO((VOID)); X_FCN x_next PROTO((VOID)); X_FCN x_procedure PROTO((VOID)); X_FCN x_program PROTO((VOID)); X_FCN x_repeat PROTO((VOID)); X_FCN x_return PROTO((VOID)); SRTN x_stmt PROTO((VOID)); X_FCN x_subroutine PROTO((VOID)); X_FCN x_switch PROTO((VOID)); X_FCN x_then PROTO((VOID)); X_FCN x_type PROTO((VOID)); X_FCN x_until PROTO((VOID)); X_FCN x_where PROTO((VOID)); X_FCN x_while PROTO((VOID)); SRTN xpn_body PROTO((sixteen_bits token1,boolean scan_parens, sixteen_bits token2)); boolean xpn_else PROTO((sixteen_bits id_x,sixteen_bits id_else_x, sixteen_bits token1,boolean scan_parens, sixteen_bits token2)); #endif /* |_ratfor_| */ SRTN alloc_Rat PROTO((VOID)); int chk_lbl PROTO((VOID)); SRTN copy_out PROTO((CONST eight_bits HUGE *p0, CONST eight_bits HUGE *p1,boolean is_expr)); SRTN cp_fcn_body PROTO((VOID)); SRTN didnt_expand PROTO((eight_bits c0,eight_bits c,CONST char *op)); eight_bits get_output PROTO((VOID)); SRTN ini_Ratfor PROTO((VOID)); SRTN is_Rat_present PROTO((VOID)); void HUGE *mac_lookup PROTO((sixteen_bits cur_val)); outer_char HUGE *name_of PROTO((sixteen_bits id)); SRTN out_msg PROTO((CONST ASCII *msg,CONST ASCII *msg1)); SRTN out_ptrunc PROTO((sixteen_bits cur_val)); CONST ASCII HUGE *proper_end PROTO((name_pointer np)); SRTN RAT_error PROTO((ERR_TYPE err_type,CONST outer_char msg[], int n ELLIPSIS)); boolean Rat_OK PROTO((outer_char *msg)); SRTN rst_last PROTO((VOID)); SRTN skip_newlines PROTO((boolean save_comments)); eight_bits HUGE *str_to_mb PROTO((CONST eight_bits HUGE *begin_arg, CONST eight_bits HUGE *end_arg,boolean esc_chars)); SRTN x_mod_a PROTO((sixteen_bits a)); SRTN x_special PROTO((VOID)); eight_bits HUGE *xmacro PROTO((text_pointer macro_text, eight_bits HUGE **pcur_byte, eight_bits HUGE **pthe_end, boolean multilevels, eight_bits HUGE *mp0)); @ Index: fweb-1.62/Web/s_type.web100644 10061 1115 6031 6602703136 14236 0ustar krommesusers@z --- s_type.web --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- \Title{S\_TYPE.WEB} % Prototypes for STYLE.WEB. @c @* PROTOTYPES for {\tt STYLE.WEB}. The function prototypes are macroed up so that if |PROTOTYPES==1| (see \.{proto.hweb}) one gets full function prototyping; otherwise just old-style declarations. @I formats.hweb @I os.hweb @ The make file produces \.{s\_type.h} from these prototypes. @a #include SFILE(a_type.h) SRTN a_str PROTO((outer_char HUGE **pp,CONST outer_char HUGE *id)); SRTN add_str PROTO((S_MAP HUGE *ps)); int cc_cmp PROTO((CONST VOID *pk0, CONST VOID *pk1)); outer_char *ccode_name PROTO((eight_bits code)); SRTN clr_printf PROTO((COLOR clr,outer_char *fmt ELLIPSIS)); int ctoi PROTO((outer_char c)); int cmpr_s_map PROTO((S_MAP HUGE **s0,S_MAP HUGE **s1)); ASCII esc_achar PROTO((CONST ASCII HUGE * HUGE *ppc)); outer_char esc_char PROTO((CONST outer_char HUGE * HUGE *ppc)); SRTN ext_set PROTO((CONST outer_char HUGE **pid)); S_MAP HUGE *find_sty PROTO((S_MAP HUGE *m, CONST outer_char HUGE *keyword)); outer_char *get_option PROTO((outer_char *s)); outer_char *get_termcap PROTO((VOID)); SRTN ini_aclr PROTO((S_MAP HUGE *ps)); SRTN ini_bilevel PROTO((S_MAP HUGE *ps)); SRTN ini_ccode PROTO((CONST outer_char *keyword,CONST outer_char *defaults, eight_bits code)); SRTN ini_cchar PROTO((S_MAP HUGE *ps)); SRTN ini_cdir PROTO((CONST S_MAP HUGE *ps)); SRTN ini_change PROTO((CONST S_MAP HUGE *ps)); SRTN ini_clr PROTO((S_MAP HUGE *ps)); COLOR_MODE ini_colors PROTO((COLOR_MODE color_mode0)); SRTN ini_dot PROTO((S_MAP HUGE *ps)); SRTN ini_ext PROTO((S_MAP HUGE *ps)); SRTN ini_hchange PROTO((CONST S_MAP HUGE *ps)); SRTN ini_hweb PROTO((CONST S_MAP HUGE *ps)); SRTN ini_output_line_length PROTO((S_MAP HUGE *ps)); SRTN ini_style PROTO((VOID)); SRTN ini_web PROTO((CONST S_MAP HUGE *ps)); SRTN link0 PROTO((outer_char HUGE **pp,CONST outer_char HUGE *id, SRTN (HUGE_FCN_PTR *fcn)(CONST outer_char HUGE **))); STY_TYPE next_sty PROTO((VOID)); boolean out_map PROTO((outer_char *name)); SRTN prn0_code PROTO((ASCII a, CC_BUF HUGE *cc_buf, int *pk)); SRTN read_sty PROTO((CONST outer_char sty_file_name[],boolean warn_if_absent)); SRTN reassign PROTO((eight_bits old_code,eight_bits new_code)); SRTN see_map PROTO((S_MAP HUGE *s,CONST outer_char HUGE *pa, boolean see_all)); SRTN see_str PROTO((CONST outer_char HUGE *s, CONST outer_char *eos)); SRTN see_style PROTO((CONST outer_char HUGE *pa,boolean see_all)); SRTN set_color PROTO((COLOR clr)); SRTN set_char PROTO((S_MAP HUGE *ps)); SRTN set_int PROTO((S_MAP HUGE *ps)); SRTN set_long PROTO((S_MAP HUGE *ps)); SRTN set_str PROTO((S_MAP HUGE *ps)); outer_char *sset_color PROTO((COLOR clr)); boolean sty_line PROTO((VOID)); boolean sty0_line PROTO((outer_char HUGE *last_sprm)); outer_char *sput PROTO((SEQUENCES *ps)); SRTN tput PROTO((SEQUENCES *ps)); SRTN termset PROTO((CONST outer_char **pid)); SRTN zero_ccodes PROTO((VOID)); @ Index: fweb-1.62/Web/t_type.web100644 10061 1115 11655 6602703136 14267 0ustar krommesusers@z --- t_type.web --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- \Title{T\_TYPE.WEB} % Prototypes for FTANGLE. @c @* PROTOTYPES for {\tt FTANGLE.WEB}. The function prototypes are macroed up so that if |PROTOTYPES==1| (see \.{proto.hweb}) one gets full function prototyping; otherwise just old-style declarations. @I formats.hweb @I os.hweb @ The make file produces \.{t\_type.h} from these prototypes. @d OUT_CHAR(c) out_char((eight_bits)(c)) /* Cast avoids warning messages. */ @a #include SFILE(s_type.h) /* Prototypes for \.{style.web}. */ #include SFILE(r_type.h) /* Prototypes for \.{ratfor.web}. */ #include SFILE(e_type.h) /* Prototypes for \.{eval.web}. */ #include SFILE(m_type.h) /* Prototypes for \.{macs.web}. */ X_FCN x_unroll PROTO((VOID)); SRTN app_aconst PROTO((outer_char fmt_char,boolean leading_zero)); SRTN app_converted PROTO((unsigned long n)); SRTN app_dmacro PROTO((CONST eight_bits HUGE *p,CONST eight_bits HUGE *p1)); name_pointer app_macro PROTO((eight_bits last_control)); BP HUGE *b_link PROTO((TRUNC HUGE *s,LANGUAGE Language, CONST ASCII HUGE *p0,CONST ASCII HUGE *p1)); SRTN blank_out PROTO((int n)); SRTN buffer_out PROTO((outer_char c)); SRTN C_out PROTO((outer_char HUGE *buffer,outer_char HUGE *p, outer_char HUGE * HUGE *ppC_buffer, outer_char *end_str, CONST outer_char *begin_str, int indent)); SRTN C_putc PROTO((outer_char c)); SRTN C_sprintf PROTO((CONST outer_char s[],int n ELLIPSIS)); SRTN close0 PROTO((OPEN_FILE *f)); SRTN close_out PROTO((FILE *fp, outer_char *name)); SRTN cmp_outfiles PROTO((VOID)); int cmpr_bp PROTO((BP HUGE **bb0,BP HUGE **bb1)); int cmpr_trunc PROTO((TRUNC HUGE **t0,TRUNC HUGE **t1)); SRTN copy_string PROTO((eight_bits a0)); SRTN cp_ASCII PROTO((VOID)); eight_bits out_bracket PROTO((eight_bits cur_char,eight_bits new_char)); SRTN flush0 PROTO((VOID)); SRTN flush_out PROTO((boolean prn_new_line)); int get_constant PROTO((eight_bits HUGE *e)); GOTO_CODE get_control_code PROTO((VOID)); eight_bits get_next PROTO((VOID)); int id PROTO((int n)); name_pointer id0_lookup PROTO((CONST ASCII HUGE *start,CONST ASCII HUGE *end, LANGUAGE l)); SRTN ini_special_tokens PROTO((LANGUAGE language0,SPEC HUGE *tokens)); SRTN ini_univ_tokens PROTO((LANGUAGE language0)); SRTN ins_ln_no PROTO((int delta)); boolean is_deferred PROTO((sixteen_bits cur_val)); int main PROTO((int ac,outer_char **av)); SRTN mcheck0 PROTO((unsigned long n,CONST outer_char reason[])); SRTN mcopy PROTO((CONST outer_char *s)); SRTN new_out PROTO((boolean scope,sixteen_bits a)); eight_bits next_byte PROTO((VOID)); SRTN not_unique PROTO((VOID)); SRTN open_out PROTO((CONST outer_char *msg,boolean global_scope)); LANGUAGE opn_output_file PROTO((LANGUAGE language0)); eight_bits out_char PROTO((eight_bits cur_char)); eight_bits out_dflt PROTO((eight_bits c)); SRTN out_of_order PROTO((CONST outer_char cmd[])); SRTN out_op PROTO((CONST outer_char HUGE *s)); CONST outer_char HUGE *out_str PROTO((CONST outer_char HUGE *s0)); SRTN out_trunc PROTO((CONST name_pointer np)); SRTN out_version PROTO((CONST outer_char *msg)); SRTN phase1 PROTO((VOID)); SRTN phase2 PROTO((VOID)); boolean pop_level PROTO((VOID)); SRTN prn_mod_num PROTO((outer_char *fmt,long val)); GOTO_CODE prs_TeX_code PROTO((VOID)); GOTO_CODE prs_regular_code PROTO((GOTO_CODE iswitch)); SRTN push_level PROTO((name_pointer p, CONST eight_bits HUGE *b0,CONST eight_bits HUGE *b1)); SRTN RAT_out PROTO((outer_char c)); SRTN rdc_char_constant PROTO((VOID)); int rst_out PROTO((boolean continuation)); TRUNC HUGE *s_link PROTO((TRUNC HUGE *s,CONST ASCII HUGE *id, unsigned short len)); eight_bits HUGE *save_out PROTO((eight_bits HUGE **p, int nmax,eight_bits r_before,eight_bits r_after)); SRTN scan_module PROTO((VOID)); SRTN scan_repl PROTO((eight_bits t,boolean stop)); SRTN scan_text PROTO((int text_type,CONST name_pointer p,boolean expand)); int see PROTO((CONST ASCII HUGE *c0,CONST ASCII HUGE *c1)); SRTN see_dup PROTO((CONST TRUNC HUGE *s,LANGUAGE Language, BP HUGE *HUGE *bb0)); SRTN see_id PROTO((CONST ASCII HUGE *start,CONST ASCII HUGE *end)); SRTN send_single PROTO((sixteen_bits a)); LANGUAGE set_output_file PROTO((LANGUAGE language0)); eight_bits skip_ahead PROTO((eight_bits last_control,boolean skip_over_bars)); eight_bits skip_bars PROTO((VOID)); boolean skip_comment PROTO((VOID)); SRTN split_C PROTO((VOID)); SRTN split_X PROTO((CONST outer_char HUGE *prefx)); SRTN split0_C PROTO((outer_char HUGE *p)); #ifdef _FTANGLE_h SRTN store PROTO((TEXT_BUF HUGE *t, outer_char c)); #endif SRTN store_two_bytes PROTO((sixteen_bits x)); SRTN sv_macro PROTO((VOID)); SRTN to_else PROTO((VOID)); SRTN to_endif PROTO((int m_case)); int trap PROTO((VOID)); unsigned trunc_id PROTO((CONST name_pointer np0)); SRTN unwind PROTO((VOID)); boolean valid_char PROTO((ASCII c,int l)); eight_bits x_identifier PROTO((eight_bits cur_char)); @ Index: fweb-1.62/Web/w_type.web100644 10061 1115 10167 6602703136 14267 0ustar krommesusers@z --- w_type.web --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- \Title{W\_TYPE.WEB} % Prototypes for FWEAVE. @c @* PROTOTYPES for {\tt FWEAVE.WEB}. The function prototypes are macroed up so that if |PROTOTYPES==1| (see \.{proto.hweb}) one gets full function prototyping; otherwise just old-style declarations. @I formats.hweb @I os.hweb @ The make file produces \.{w\_type.h} from these prototypes. @a #include SFILE(s_type.h) // Prototypes for \.{style}. #include SFILE(c_type.h) // Prototypes for \.{common.web}. #include SFILE(p_type.h) // Prototypes for \.{prod.web}. #include SFILE(d_type.h) // Prototypes for \.{reserved.web}. SRTN app_hdr PROTO((CONST char *section_part)); SRTN app_overload PROTO((VOID)); SRTN app_lang PROTO((CONST outer_char *suffix)); SRTN app_misc PROTO((outer_char *s)); SRTN app_proc PROTO((eight_bits next_control)); SRTN app_temp PROTO((CONST outer_char letter[],CONST outer_char arg[])); SRTN break_out PROTO((VOID)); void cant_do PROTO((outer_char *the_part)); eight_bits copy_TeX PROTO((VOID)); SRTN C_parse PROTO((PARSING_MODE mode0)); text_pointer C_translate PROTO((VOID)); SRTN C_xref PROTO((PART part0,PARSING_MODE mode0)); int cmpr_rcs PROTO((RCS HUGE **pp0, RCS HUGE **pp1)); int copy_comment PROTO((int bal)); SRTN copy_limbo PROTO((VOID)); outer_char *dbl_bslash PROTO((outer_char *m_temp, outer_char *s)); outer_char *dbl_cslash PROTO((outer_char *m_temp, outer_char c)); ASCII HUGE *esc_buf PROTO((ASCII HUGE *temp,CONST ASCII HUGE *temp_end,CONST ASCII HUGE *buf,boolean all_cases)); SRTN fin_C PROTO((VOID)); SRTN fin_line PROTO((VOID)); SRTN flush_buffer PROTO((ASCII HUGE *b,boolean per_cent)); SRTN footnote PROTO((sixteen_bits flag)); GOTO_CODE get_control_code PROTO((VOID)); SRTN get_iformats PROTO((VOID)); eight_bits get_next PROTO((VOID)); eight_bits get_output PROTO((VOID)); eight_bits get_string PROTO((ASCII c,ASCII boz)); eight_bits get_TeX PROTO((VOID)); SRTN improper PROTO((outer_char *m_type, outer_char *msg)); SRTN init_op PROTO((eight_bits op_code,CONST outer_char op_name[], int lang,CONST outer_char op_macro[],boolean overload, eight_bits cat,CONST outer_char defn[])); int main PROTO((int ac,outer_char **av)); SRTN make_output PROTO((VOID)); outer_char *mktmp PROTO((outer_char *file_name, outer_char *ext)); int mod_check PROTO((name_pointer p)); SRTN mod_print PROTO((name_pointer p)); int mod_warn PROTO((name_pointer p, outer_char *msg)); SRTN mx_open PROTO((outer_char *ext)); outer_char *mx_quote PROTO((outer_char *m_out, outer_char *s)); SRTN new_mod_xref PROTO((name_pointer p)); SRTN new_xref PROTO((PART part0,name_pointer p)); SRTN out_atext PROTO((CONST ASCII HUGE *s)); SRTN out_fname PROTO((CONST outer_char HUGE *s)); SRTN out_md_name PROTO((VOID)); SRTN out_mod PROTO((sixteen_bits n,boolean encap)); SRTN out_name PROTO((outer_char *m_temp, boolean surround, boolean is_id, name_pointer p)); SRTN out_prm PROTO((CONST outer_char *fmt, int n, CONST outer_char *cmt ELLIPSIS)); SRTN out_skip PROTO((VOID)); SRTN out_str PROTO((CONST outer_char HUGE *s)); SRTN out_del_str PROTO((ASCII HUGE *s, ASCII HUGE *t)); SRTN out_del_tokens PROTO((token_pointer s, token_pointer t)); SRTN outr_parse PROTO((VOID)); SRTN outr_xref PROTO((PART part0)); SRTN output_C PROTO((VOID)); SRTN phase1 PROTO((VOID)); SRTN phase2 PROTO((VOID)); SRTN phase3 PROTO((VOID)); SRTN pop_level PROTO((VOID)); SRTN pr_format PROTO((boolean xref_lhs, boolean xref_rhs)); SRTN pre_scrap PROTO((eight_bits last_control)); GOTO_CODE prs_TeX_code PROTO((VOID)); GOTO_CODE prs_regular_code PROTO((GOTO_CODE iswitch)); SRTN push_level PROTO((text_pointer p)); SRTN room_for PROTO((int ntokens,int ntexts,int nscraps)); SRTN set_language PROTO((LANGUAGE language0)); eight_bits skip_TeX PROTO((VOID)); SRTN skip_file PROTO((VOID)); SRTN skip_limbo PROTO((VOID)); int TeX_char PROTO((VOID)); SRTN trns_code PROTO((VOID)); SRTN trns_defn PROTO((VOID)); SRTN trns_TeX PROTO((VOID)); SRTN unbucket PROTO((eight_bits d)); OPERATOR HUGE *valid_op PROTO((eight_bits op_code)); @ Index: fweb-1.62/Web/y_type.web100644 10061 1115 1543 6602703137 14250 0ustar krommesusers@z --- y_type.web --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- \Title{Y\_TYPE.WEB} % Prototypes for MEMORY ALLOCATION. @c @* PROTOTYPES for {\tt MEMORY ALLOCATION}. The function prototypes are macroed up so that if |PROTOTYPES==1| (see \.{proto.hweb}) one gets full function prototyping; otherwise just old-style declarations. @I formats.hweb @I os.hweb @ The make file produces \.{y\_type.h} from these prototypes. @a void HUGE *alloc PROTO((CONST outer_char abbrev[],BUF_SIZE HUGE *pnunits, size_t nsize,int dn)); SRTN free_mem0 PROTO((void HUGE *p,CONST outer_char why[],BUF_SIZE nunits, size_t nsize)); void HUGE *get_mem0 PROTO((CONST outer_char why[],BUF_SIZE nunits, size_t nsize)); fweb-1.62/Web/common.web100644 10061 1115 662555 6602703137 14307 0ustar krommesusers@z --- common.web --- FWEB version 1.62 (September 25, 1998) Based on version 0.5 of S. Levy's CWEB [copyright (C) 1987 Princeton University] @x----------------------------------------------------------------------------- \Title{COMMON} @c @* INTRODUCTION. This file contains code common to both \.{TANGLE} and \.{WEAVE}, that roughly concerns the following problems: character uniformity, input routines, error handling and parsing of command line. We have tried to concentrate in this file all the system dependencies, so as to maximize portability. \FWEB\ has been written to work with a variety of C~compilers, not necessarily ANSI. In particular, the special macro tokens~'\.\#' and~'\.{\#\#}' are not used in any \.{@@d} commands; when such constructions have been needed, the \WEB\ macro definition~\.{@@m} has been used. The |enum| feature has been assumed to exist. \CWEB\ did not use |enum|, so there's a fair amount of inherited \CWEB\ code that should eventually be changed to |enum|, which makes debugging much easier. This will be done in future versions. One should study the header files \.{os.hweb}, \.{proto.hweb}, \.{includes.hweb}, and \.{custom.web} for further information about machine dependencies. In the texts below we will sometimes use \.{WEB} to refer to either of the two component programs, if no confusion can arise. @m _COMMON_ @d _COMMON_h @d COMMON_FCNS_ @ Here is the overall appearance of this file: @d VERSION "1.61" // For development, use |$REVISION| here. @d RELEASE_DATE "September 23, 1998" @A @@; @@; @@; @@; @@; @@; /* For pc's, the file is split into two compilable parts using the compiler-line macro |part|, which must equal either~1 or~2. */ #if(part != 2) @@; #endif /* Part 1 */ #if(part != 1) @@; #endif /* Part 2 */ @I typedefs.hweb @I xrefs.hweb @I tokens.hweb @I scraps.hweb @I stacks.hweb @ @= #include "map.h" @ A dummy module for \.{scraps.hweb}. @= @ For personal computers, we sometimes need to initialize the stack size. @d STKLEN 20000U /* Borland needs this number; Microsoft requires it from the compiler line. */ @= #ifdef ibmpc /* \.{Machine-dependent}: For initializing the stack size. */ #ifdef borland extern unsigned _stklen = STKLEN; #endif #endif @* The CHARACTER SET. One of the main goals in the design of \.{WEB} has been to make it readily portable between a wide variety of computers. Yet \.{WEB} by its very nature must use a greater variety of characters than most computer programs deal with, and character encoding is one of the areas in which existing machines differ most widely from each other. To resolve this problem, all input to \.{WEAVE} and \.{TANGLE} is converted to an internal seven-bit code that is essentially standard ASCII, the ``American Standard Code for Information Interchange.'' The conversion is done immediately when each character is read in. Conversely, characters are converted from ASCII to the user's external representation just before they are output. Such an internal code can be accessed by users of \.{WEB} by means of constructions like \.{@@'A'}, which should be distinguished from \.{'A'}. The former is transformed by \.{TANGLE} into an integer that is the internal code of~\.A, but the latter, a |char| constant, is not touched by \.{WEB}, and will be interpreted by the compiler according to the machine's character set. @^ASCII code@> Here is a table of the standard visible ASCII codes (\.{\ } stands for a blank space): $$\def\:{\char\count255\global\advance\count255 by 1} \count255='40 \vbox{ \hbox{\hbox to 40pt{\it\hfill0\/\hfill}% \hbox to 40pt{\it\hfill1\/\hfill}% \hbox to 40pt{\it\hfill2\/\hfill}% \hbox to 40pt{\it\hfill3\/\hfill}% \hbox to 40pt{\it\hfill4\/\hfill}% \hbox to 40pt{\it\hfill5\/\hfill}% \hbox to 40pt{\it\hfill6\/\hfill}% \hbox to 40pt{\it\hfill7\/\hfill}} \vskip 4pt \hrule \def\^{\vrule height 10.5pt depth 4.5pt} \halign{\hbox to 0pt{\hskip -24pt\WO{\~#}\hfill}&\^ \hbox to 40pt{\tt\hfill#\hfill\^}& &\hbox to 40pt{\tt\hfill#\hfill\^}\cr 04&\:&\:&\:&\:&\:&\:&\:&\:\cr\noalign{\hrule} 05&\:&\:&\:&\:&\:&\:&\:&\:\cr\noalign{\hrule} 06&\:&\:&\:&\:&\:&\:&\:&\:\cr\noalign{\hrule} 07&\:&\:&\:&\:&\:&\:&\:&\:\cr\noalign{\hrule} 10&\:&\:&\:&\:&\:&\:&\:&\:\cr\noalign{\hrule} 11&\:&\:&\:&\:&\:&\:&\:&\:\cr\noalign{\hrule} 12&\:&\:&\:&\:&\:&\:&\:&\:\cr\noalign{\hrule} 13&\:&\:&\:&\:&\:&\:&\:&\:\cr\noalign{\hrule} 14&\:&\:&\:&\:&\:&\:&\:&\:\cr\noalign{\hrule} 15&\:&\:&\:&\:&\:&\:&\:&\:\cr\noalign{\hrule} 16&\:&\:&\:&\:&\:&\:&\:&\:\cr\noalign{\hrule} 17&\:&\:&\:&\:&\:&\:&\:\cr} \hrule width 280pt}$$ We introduce new types to distinguish between the transliterated characters and the characters in the outside world. Let all ``interesting'' values that a |char| variable may take lie between |first_text_char| and |last_text_char|; for the ASCII code we can take |first_text_char=0| and |last_text_char=0177|. We will tell \.{WEB} to convert all input characters in this range to its own code, and balk at characters outside the range. We make two assumptions: |first_text_char>=0| and |char| has room for at least eight bits. Following \CWEB, \FWEB\ deals with character constants by prefacing them with '\.{@@}' if they are to be interpreted as |ASCII|. In \CWEB, \TANGLE\ translated such constants into octal, which makes the output hard to read while debugging. While this mechanism is necessary for a non-ASCII machine, it is redundant for an ASCII machine. Thus, for the latter by default \FWEB\ does not translate |ASCII| character constants. To force it to do so, use the `\.{-a}' command-line option. For non-ASCII machines, the translation will always be done. {\bf WARNING:} \FWEB\ has been tested only on an ASCII machine. It is 100\% likely that some debugging will be necessary for any other kind of machine; the $|outer_char| \Leftrightarrow |ASCII|$ conversions are only about 75\% in place at this point. (Even this is a substantial improvement over \CWEB.) @^system dependencies@> @d first_text_char 0 // Lowest interesting value of an |outer_char|. @d last_text_char 0377 // Highest interesting value of an |outer_char|. @ The \.{WEAVE} and \.{TANGLE} processors convert between ASCII code and the user's external character set by means of arrays~|xord| and~|xchr| that are analogous to PASCAL's |ord| and |chr| functions. Thus, $\hbox{internal\_WEB\_chr} = |xord[@texternal\_chr@>]|$ and $\hbox{external\_chr} = |xchr[@tinternal\_WEB\_chr@>]|$. @= IN_COMMON ASCII xord[last_text_char+1]; // Converts input chars.\ to |ASCII|. #ifdef scramble_ASCII ASCII xxord[last_text_char+1]; // For scrambling. #endif IN_COMMON outer_char xchr[0200]; // Converts output chars.\ from |ASCII|. @ Every system supporting \cee\ must be able to read and write the 95~visible characters of standard ASCII above (although not necessarily using the ASCII codes to represent them). Conversely, these characters, plus the newline, are sufficient to write any \cee\ program. Other characters are desirable mainly in strings, and they can be referred to by means of escape sequences like~|'\t'|. The basic implementation of \.{WEB}, then, only has to assign an~|xord| to these 95 characters (newlines are swallowed by the reading routines). The easiest way to do this is to assign the characters to their positions in~|xchr| and then invert the correspondence: @=@[ SRTN common_init(VOID) { IN_RATFOR SRTN is_Rat_present PROTO((VOID)); struct tm *t = the_localtime(); // Initialize the time. #if(TRANSLATE_ASCII || DEBUG_XCHR) translate_ASCII = YES; // Force it for the cases that really need it. #endif is_Rat_present(); // Find out if the \Ratfor\ package was linked on. @@; @; @; predefine_macros(); /* Must be done before parsing the command line, so the user can undefine or override stuff if desired. */ @@; @; #if 0 banner(); // Start-up banner. #endif /* The next two have to be done after reading the command line. */ @@; @; @@; more_includes(&incl, wt_style.Idir); if(found_web) read_aux(); // Process the \.{.aux} file. } @ @= { STRNCPY(xchr," !\"#$%&'()*+,-./0123456789\ :;<=>?@@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ", sizeof(xchr)); /* Interesting ``invisible'' things to output. */ xchr[tab_mark] = '\t'; xchr[@'\n'] = '\n'; @; @; } @ The following system-independent code makes the |xord| array contain a suitable inverse to the information in |xchr|. @= @B int i; /* to invert the correspondence */ @b /* Initialize to |ASCII| blanks. */ for (i=first_text_char; i<=last_text_char; i++) { xord[i] = @' '; #ifdef scramble_ASCII xxord[i] = @' '; #endif } /* The |NUL| and |DEL| characters are left alone! */ for (i=1; i<0177; i++) { xord[(eight_bits)XCHR_[i]] = (ASCII)i; #ifdef scramble_ASCII xxord[(eight_bits)wt_style.xchr[i]] = i; #endif } #ifdef scramble_ASCII for(i=0177; i<=0377; i++) xxord[(eight_bits)wt_style.xchr[i]] = i; #endif #if(DEBUG_XCHR) for(i=0177; i<=0377; i++) xord[(eight_bits)XCHR_[i]] = (ASCII)i; #endif } @ Now follow routines that translate |outer_char| strings into |ASCII|. First, to avoid messing with possibly read-only memory, we have a routine that allocates new storage for the string. (Thanks to Thorsten Ohl for this one.) @=@[ ASCII HUGE * x__to_ASCII FCN((p0)) CONST outer_char HUGE *p0 C1("Character string to translate.")@; { if(translate_ASCII) { ASCII HUGE *buffer, HUGE *p; CONST outer_char HUGE *q; buffer = GET_MEM("x__to_ASCII arg",STRLEN(p0)+1,ASCII); for (p = buffer, q = p0; *q; p++, q++) *p = XORD(*q); *p = '\0'; return buffer; } else return (ASCII HUGE *)p0; } @ For dealing with arrays, we have to |realloc| the space. (Again, thanks to Thorsten Ohl.) @=@[ ASCII HUGE * x_to_ASCII FCN((p0)) CONST outer_char HUGE *p0 C1("Character string to translate.")@; { static size_t bufsiz = 0; static ASCII HUGE *buffer = NULL; if(translate_ASCII) { ASCII HUGE *p; CONST outer_char HUGE *q; while (bufsiz <= STRLEN (p0) + 1) { if(buffer == NULL) buffer = GET_MEM("x_to_ASCII_buf",bufsiz=32,ASCII); /* Some systems don't like a |NULL| argument to |realloc|. */ else { buffer = (ASCII HUGE *) REALLOC(buffer, bufsiz+32, bufsiz); bufsiz += 32; } if (buffer == NULL) FATAL(C, "!! No more memory (x_to_ASCII)", ""); } for (p = buffer, q = p0; *q; p++, q++) *p = XORD(*q); *p = '\0'; return buffer; } else return (ASCII HUGE *)p0; } @ Finally, this function converts in place. @=@[ ASCII HUGE * to_ASCII FCN((p0)) outer_char HUGE *p0 C1("Character string to translate.")@; { ASCII HUGE *p; if(translate_ASCII) for(p=(ASCII HUGE *)p0; *p; p++) *p = XORD(*p); return (ASCII HUGE *)p0; } @ Here is the inverse routine, converting in place |ASCII| to |outer_char|. @=@[ outer_char HUGE * to_outer FCN((p0)) ASCII HUGE *p0 C1("Internal string to translate to outer world.")@; { outer_char HUGE *p; if(translate_ASCII) for(p=(outer_char HUGE *)p0; *p; p++) *p = XCHR(*(ASCII HUGE *)p); return (outer_char HUGE *)p0; } @ Some \cee\ compilers accept an extended character set, so that one can type things like~\.{\^\^Z} instead of~\.{!=}. If that's the case in your system, you should change the relevant part of \.{typedefs.web}, assigning positions~|01| to~|037| in the most convenient way; for example, at MIT you can just say $$\hbox{|for (i=1; i<=037; i++) xchr[i]=i;|}$$ since \.{WEB}'s character set is essentially identical to MIT's, even with respect to characters less than |040| (see the definitions below). If, however, the changes do not conform with these definitions you should change the definitions as well. (See \.{typedefs.web} for definitions of |and_and|, etc.) @^system dependencies@> @^notes to myself@> @= /* nothing needs to be done */ @* IDENTIFIERS. At the point during phase one where we're recognizing identifiers, we sometimes have to determine whether the identifier is a special one. This is a simple byte-by-byte comparison. However, things are complicated because by that time the input has been converted to |ASCII|. Therefore, the comparison tables must also be converted to |ASCII|. @ Test whether an identifier is a |BUILT_IN|. @=@[ boolean is_include_like(VOID) { /* Check for \.{m4} built-in. */ if(m4 && is_in(incl_likes,id_first,id_loc)) return YES; /* The \.{WEB} functions behave as built-ins for \.{WEAVE}, but as macros for \.{TANGLE}. */ if(program==tangle) return NO; if(!(*id_first == @'$' || *id_first == @'_')) return NO; // Speed up |is_in|. return is_in(WEB_incl_likes,id_first,id_loc); } @ Convert lists to |ASCII|. @=@[ SRTN conv_bi FCN((b)) BUILT_IN HUGE *b C1("")@; { for( ; b->n != 0; b++) b->name = x__to_ASCII((outer_char *)b->name); } SRTN conv_dot FCN((d)) DOTS HUGE *d C1("")@; { for( ;d->code != 0; d++) d->symbol = x__to_ASCII((outer_char *)d->symbol); } @ Hunt through a |BUILT_IN| list. @=@[ boolean is_in FCN((b0,p0,p1)) CONST BUILT_IN b0[] C0("Array of built-ins.")@; CONST ASCII HUGE *p0 C0("Start of text.")@; CONST ASCII HUGE *p1 C1("End of text.")@; { CONST BUILT_IN HUGE *b; for(b=b0; b->n != 0; b++) if(web_strcmp(b->name,b->name+b->n,p0,p1) == EQUAL) return YES; return NO; } @ @= extern DOTS dots0[],mcmds[]; /* These are put into \.{typedefs.web} so we can make use of the various \.{@@d}s. */ @ Dot constants are allocated dynamically. Because of \Fortran-90's ability to define new constants, we have to allow for expanding the size of the table at run time. @= IN_COMMON BUF_SIZE delta_dots; // Expand the table in increments of this size. IN_COMMON BUF_SIZE ndots; // The current total size. IN_COMMON DOTS HUGE *dots,HUGE *dots_end,HUGE *next_dot; // The dynamic array. @ Here we do the initial allocation of the dynamic |dots| table. @= { DOTS HUGE *d; ALLOC(DOTS,dots,ABBREV(delta_dots),delta_dots,0); ndots = delta_dots; /* Initialize total size. */ dots_end = dots + ndots; next_dot = dots; /* Current pointer. */ /* Fill the table with the initial values. */ for(d=dots0; d->len != 0; d++) { if(dot_code(dots,d->symbol,d->symbol+d->len,d->code) != d->code) CONFUSION("dots allocation","Invalid dot code"); } } @ Either case is allowed for the dot constants. We will convert everything between the dots in place to upper case. @=@[ ASCII HUGE * uppercase FCN((p,n)) ASCII HUGE *p C0("Start of text.")@; int n C1("Number of bytes to convert in place.")@; { int k; for(k=0; k=@[ boolean is_dot(VOID) { ASCII HUGE *p; int n; ASCII temp[MAX_DOT_LENGTH]; /* For converting the putative constant to upper case. */ /* Scan to the end of the dot constant (all of which are alphabetic). */ for(p=loc,n=0; n=@[ eight_bits dot_code FCN((d0,p0,p1,new_code)) DOTS HUGE *d0 C0("|DOTS| array.")@; CONST ASCII HUGE *p0 C0("Start of text.")@; CONST ASCII HUGE *p1 C0("End of text.")@; eight_bits new_code C1("May we extend the table or not?")@; { DOTS HUGE *d; re_dot: for(d=d0; d < next_dot; d++) if(web_strcmp(d->symbol,d->symbol+d->len,p0,p1) == EQUAL) { /* Check for an overloaded operator. If so, remember the details. */ if(d->code == dot_const) { STRCPY(dot_op.name+1,d->symbol); dot_op.cat = d->cat; dot_op.num = (eight_bits)(d-dots); } return d->code; } /* Didn't find the dot constant or operator in the table. Enlarge the table if necessary. */ if(!new_code) return NO; /* One can add to |dots|, but not |mcmds|. */ if(next_dot == dots_end) { if( (dots=(DOTS HUGE *)REALLOC(dots, (ndots+delta_dots)*sizeof(DOTS), ndots*sizeof(DOTS)))==NULL ) OVERFLW("dot operators",ABBREV(delta_dots)); next_dot = dots + ndots; /* Next available position. */ ndots += delta_dots; /* New total length. */ dots_end = dots + ndots; /* Upper bound. */ } /* Add operator to table. */ next_dot->len = PTR_DIFF(short, p1, p0); next_dot->symbol = GET_MEM("next_dot->symbol",next_dot->len + 1,ASCII); STRNCPY(next_dot->symbol,p0,next_dot->len); next_dot->code = new_code; /* Mark as overloaded, or initialize. */ next_dot->cat = 1; /* ??? */ d0 = next_dot++; next_dot->len = 0; goto re_dot; } @ Is it a macro preprocessor command in a |DOTS| list? @=@[ eight_bits is_mcmd FCN((d0,p0,p1)) DOTS HUGE *d0 C0("|DOTS| array.")@; CONST ASCII HUGE *p0 C0("Start of text.")@; CONST ASCII HUGE *p1 C1("End of text.")@; { DOTS HUGE *d; for(d=d0; d->code; d++) if(web_strcmp(d->symbol,d->symbol+d->len,p0,p1) == EQUAL) return d->code; return 0; // Not a preprocessor command. } @* INPUT ROUTINES. The lowest level of input to the \.{WEB} programs is performed by |input_ln|, which must be told which file to read from. Unlike the original \WEB s, there is a separate input buffer for each possible open file, as well as associated parameters for each buffer. These parameters are collected in an array of structures of type \&{INPUT\_PRMS}, which contains symmetric entries for both input files and change files. The parameters for the current file are in |*cur0_prms| and are set upon entry to |input_ln|. This change was necessary in order to accomodate \Fortran, which, since it reads ahead, leaves stuff in the tail end of the buffer, to be read on the next call to |input_ln|. If one doesn't have separate buffers, the change file mechanism won't work properly, nor will the include facility. The return value of |input_ln| is |YES| if the read is successful and |NO| if not (generally this means the file has ended). The conventions of \TeX\ are followed; i.e., the characters of the next line of the file are translated to |ASCII| code and copied into the |cur_buffer| array, and the global variable |limit| is set to the first unoccupied position. Trailing blanks are ignored. The value of |limit| must be strictly less than |buf_size|, so that |cur_buffer[buf_size-1]| is never filled. We assume that none of the |ASCII| values of |*j| for |cur_buffer<=jFile /* The current file pointer. (It's~\.{@@m} instead of~\.{@@d} because of a header conflict on the C370 system.) */ @= IN_COMMON BUF_SIZE buf_size; // Holds input line. IN_COMMON ASCII HUGE *loc; // Points to the next character to be read from the buffer. typedef enum {START,END} DELIM_TYPE; typedef enum {NO_CMNT,SHORT_CMNT,LONG_CMNT} CMNT_TYPE; typedef struct { CMNT_TYPE type; DELIM_TYPE delim; eight_bits len; // Length of the delimiter; either~$0$, $1$, or~$2$. ASCII HUGE *pos; // Start of the delimiter. } CMNT_DATA; #define CMNT_MARKS 50 IN_COMMON CMNT_DATA posns[CMNT_MARKS], HUGE *pcmnt CSET(posns), HUGE *pcmnt_end CSET(posns+CMNT_MARKS); @*1 Reading an input line. In the unlikely event that your standard I/O library does not support |feof|, |getc| and |ungetc| you may have to change things here. @^system dependencies@> The |input_ln| function copies a line into |cur_buffer| or returns |NO| if it's gotten to the end-of-file. @=@[ boolean input_ln FCN((p0)) INPUT_PRMS0 HUGE *p0 C1("Which structure describes the current file?")@; { cur0_prms = p0; // Address of current parameters. limit = cur_buffer; /* Initialize the top to the bottom. |limit| points to first unfilled position. */ cur_line++; /* A separate line count is kept for each file (including the change file). */ /* |column_mode| and |parsing_mode| may be redundant. But don't mess with these. */ if(!nuweb_mode && FORTRAN_LIKE(language) && column_mode && parsing_mode==OUTER) switch(language) { case FORTRAN: case FORTRAN_90: if(!rd_Fortran()) return NO; break; case RATFOR: case RATFOR_90: if(!rd_Ratfor()) return NO; if(limit==cur_buffer) goto empty_line; break; default: CONFUSION("input_ln", "Invalid FORTRAN_LIKE language %i", language); } else if(!rd_free_form()) return NO; /* Take care of an empty line: kill the semicolon. (This is a bit shaky.) */ if(column_mode && FORTRAN_LIKE(language) && PTR_DIFF(size_t,limit,cur_buffer)==2 && ((!auto_semi && (cur_buffer[1]==@';' || cur_buffer[1]==@' ')) || (auto_semi && cur_buffer[1]==@';' && (cur_buffer[0]=='C' || cur_buffer[0]==@'c' || cur_buffer[0]==@'*')))) empty_line: limit = cur_buffer; @#if 0 fin_line: ; @#endif /* For future use. */ #if(DEBUG) @; #endif return YES; /* Successful read */ } @ For debugging purposes, echo the line which will be returned. For the benefit of the user, replace the |begin_comment0| by~'\.{!}' and |begin_comment1| by~'\.?'. Turn on this echo with the command-line option~'\.{-l}'. A positive numeric argument means only start debugging at that line number; a negative one means also print the address of the buffer. @= IN_COMMON long start_line CSET(1); // Must be |long|; a negative value is used as a flag. IN_COMMON long end_line CSET(LONG_MAX); @ @= { register ASCII HUGE *k; if(prn_input_lines && cur_line >= (LINE_NUMBER)start_line && cur_line < (LINE_NUMBER)end_line) { if(prn_input_addresses) printf("%lu->%lu (%u) ", (unsigned long)cur_buffer,(unsigned long)limit, PTR_DIFF(unsigned, limit, cur_buffer)); printf("%c[%d%s:%u]: \"", (language == global_language ? ' ' : *LANGUAGE_CODE(language)), incl_depth, (changing ? "*" :""), cur_line); for(k=cur_buffer; k"); break; case (ASCII)begin_comment1: printf(""); break; case interior_semi: printf("<;>"); break; default: putchar(XCHR(*k)); break; } puts("\""); } } @*1 Free-form input. The simplest, most straightforward thing to do is read completely free-form syntax. This is done for~C and for \RATFOR-77. Here is one of the clearest examples of when to prefix single-quoted characters with~'\.{@@}'. @=@[ boolean rd_free_form(VOID) { register int c='\0'; // The character read. register ASCII HUGE *k; // Where next character goes. @@; return YES; } @ @= { if(num_in_buffer != 0) @@; else { if (feof(fp)) return NO; // We have hit end-of-file. @; @#if(0) @; @#endif /* For speeding up input; not debugged. */ } } @ This is the original byte-oriented input routine. It is ANSI-compatible. However, on some systems such as VAX/VMS, it may be slow. @d TOO_LONG { FATAL(C, "Input line too long; ", "please use the `-ybs...' option to increase buffer size from \ its present value of %lu characters.", buf_size); } @= { k = cur_buffer; /* beginning of buffer */ @#if 0 if(column_mode && language==TEX) { // Make each line a short comment. *k++ = @'/'; @~ *k++ = @'/'; } @#endif while (k<=buffer_end && (c=getc(fp)) != EOF && c!='\n') if ((*(k++) = XORD(c)) != @' ') limit = k; /* Update first unfilled position; |k|~is now pointing to next position to fill, and the last one wasn't blank. */ if (k>buffer_end) if ((c=getc(fp))!=EOF && c!='\n') { ungetc(c,fp); loc=cur_buffer; TOO_LONG; @.Input line too long@> } if (c==EOF && limit==cur_buffer) return NO; // There was nothing after the last newline. } @ This is an experimental block to speed up the input. It is not complete. For VAX/VMS, it works only for files with variable length record formats, not with stream files. @= @B int n; @b for(k = cur_buffer; k < buffer_end && (n = fread(k,buffer_end-k,fp))!=0 && k[n-1]!='\n'; k += n); k += n; if(k==buffer_end && *(k-1) != '\n') { loc = cur_buffer; TOO_LONG; } #if(TRANSLATE_ASCII) TERMINATE(cur_buffer,n); to_ASCII(cur_buffer); #endif while(*(k-1)==@'\n' && k > cur_buffer) k--; while(*(k-1)==@' ' && k > cur_buffer) k--; limit = k; if(n==0 && limit==cur_buffer) return NO; } @*1 \Fortran\ input. It's probably hopeless to explain the present version of the \FORTRAN\ input driver. It should be abandoned and rewritten from scratch. The best that can be said about \FORTRAN\ with \FWEB\ is that one should use \RATFOR\ instead. The problem with \FORTRAN's fixed column format is that we must read ahead to get any continuation lines which may be waiting. By the time we've figured that out, we've read too far. We leave that stuff waiting, signified by |num_in_buffer != 0|. On the next time into |input_ln|, the waiting stuff will first be moved to the beginning of the buffer; then we go on and read ahead some more. In the following, |limit|~is the next available space in the buffer, |k|~is the present position; |k0|~marks the beginning of the last line read. Each line is actually 5~bytes longer than the actual number of characters read: 2~bytes for a possible |"*/"|, 3~for use by the scanning routines of \TANGLE, which may put things there during its scans. @d N_WORK 3 @d N_END (N_WORK+2) @=@[ boolean rd_Fortran(VOID) { register int c='\0'; // The character read. register ASCII HUGE *k; // Where next character goes. boolean first_line = YES; /* We're starting afresh; initialize flags. */ last_was_continued = NO; scanning_C_cmnt = NO; string_char = '\0'; in_char_string = NO; /* Keep reading lines until we sense a non-comment, non-continuation line. Leave the latter waiting in the buffer starting at~|k0|. */ for(k= limit; ; k=k0 = (limit+=N_END),first_line=NO,cur_line++) if(num_in_buffer == 0) @@; else @@; /* Except for new module, throw away all stuff after \.{@@}~command in column~1. */ if(*cur_buffer==@'@@' && !(limit==cur_buffer+1 || *(cur_buffer+1)==@'*' || *(cur_buffer+1)==@' ')) for(k=cur_buffer+2; k= { @; /* If what was waiting was a control line, we must shift out of column mode. */ if(found_at) { out_of_column_mode: found_at = column_mode = last_was_empty = NO; break; /* Break out of |for| loop which reads lines. The finish-read material is moot. */ } if(at_line) { last_was_empty = NO; break; } /* Finally, we give special treatment to empty lines. */ last_was_empty = BOOLEAN(limit==cur_buffer); scan_for_cmnts(); } /* Go back to the |for| loop which reads lines. */ @ Here we move stuff waiting in the buffer to the beginning of the buffer, and reset the end of the buffer. @= { STRNCPY(cur_buffer,k0,num_in_buffer); // Move line to beginning of buffer. k0 = cur_buffer; // For |scan_for_cmnts| limit = cur_buffer + num_in_buffer - N_END; // Reposition the end of buffer. num_in_buffer = 0; // We've now cleaned out the buffer. } @ We get to here when |num_in_buffer == 0|. @= @B int i; @b if (feof(fp)) { if(first_line) return NO; // We have hit end-of-file. else goto concatenate_cmnts; // Don't lose the last line. } k0 = limit; // Set the start of this line to the end of the old one. @; // |limit| is positioned after the last char.\ read. /* We will allow two extra characters at the end, in case we need to put end-of-comment markers there; we also need two bytes for Tangle's workspace. */ MEMSET(limit,@' ',N_END); num_in_buffer = 0; // There's nothing waiting. /* If we've read into a |new_module| command in column~1, prepare to switch out of column mode. */ at_line = BOOLEAN(*k0==@'@@' && *(k0+1) != @'/'); if(at_line && (*(k0+1)==@'*' || *(k0+1)==@' ')) found_at = YES; /* If we were appending, then we must delay shifting out of column mode until we process the first part of the buffer. However, if we're actually at the beginning of the buffer, then we must shift out of column mode immediately. */ if(found_at && k0==cur_buffer) goto out_of_column_mode; if(first_line && at_line) break; /* Now we look at the line we just put into the buffer. Usually, we should look at that to see whether it's a continuation or a comment line, because if so we keep on reading. However, if it's a command line, or if we're in the middle of handling a trailing C~comment which didn't end on the previous line, then this line should not be treated in column mode. */ if(scanning_C_cmnt) { scan_for_cmnts(); continue; } if(!(at_line || scanning_C_cmnt)) @@; /* If we get to here, it's neither a comment nor a continuation. If this line was the first in the buffer, we must continue to read more. (However, if this line is null, then we do not read any more, because we don't want to concatenate a null comment to the previous line.) Otherwise, we're done reading and we should leave this line waiting in the buffer. */ neither_cmnt_nor_continuation: if(first_line) if(limit==cur_buffer) /* Quit on null first line. */ { comment_in_buffer = NO; num_in_buffer = 0; break; } else { scan_for_cmnts(); continue; /* We must read some more to see if next is continuation. */ } @; } @ This is the end of this read. Replace the newline by a semicolon to delimit the statements. @= { last_of_read: if(!first_line) { num_in_buffer = PTR_DIFF(size_t,limit,k0) + N_END; limit = MAX(k0 - N_WORK,cur_buffer); } else limit += N_WORK; concatenate_cmnts: anlz_cmnts(); // Concatenate comments appropriately, and set |scanning_C_cmnt|. cur_line--; break; /* Break out of |for| loop. */ } @ Read characters for one line into buffer, translating them as we go. Trailing blanks will be ignored. Tabs will be translated into 6~spaces. @d IS_POINT(c) (c=='!' && (point_comments || (c1=getc(fp),ungetc(c1,fp),c1=='!' ))) @= { if(ignore_C) @@; while(k<=buffer_end && (c=getc(fp)) != EOF && c!='\n') if(c=='\t' && k<=buffer_end-6) for(i=0; i<6; ++i) *(k++) = @' '; // Translate tab character. (Don't update |limit|.) else { boolean escaped_char = NO; outer_char c1; // For looking ahead for \.{!!}. if(c==';') c = XCHR(interior_semi); else if(point_comments && (*k0 != @'@@') && (escaped_char = BOOLEAN(c == '\\'))) { c = getc(fp); // What's coming up next? /* If it's not an escaped point, just copy the escape sequence. */ if(c != '!') { ungetc(c,fp); c = '\\'; } } /* A point that's not escaped begins a short comment. */ if( (*(k++) = CHOICE(IS_POINT(c) && !escaped_char, (ASCII)begin_comment1, XORD(c))) != @' ') limit = k; // Ignore trailing blanks. } if (k>buffer_end) if ((c=getc(fp))!=EOF && c!='\n') { ungetc(c,fp); loc=cur_buffer; TOO_LONG; @.Input line too long@> } if (c==EOF && limit==cur_buffer) return NO; /* there was nothing after the last newline */ } @ Here we examine the line most recently read to see if it's a comment or continuation. If that's true, then we continue to the bottom of the enclosing |for| loop which reads lines. @= @B boolean is_cmnt = NO, Fortran_cmnt = NO, C_cmnt = NO; ASCII HUGE *p = k0; // Points to the comment character. @b /* Did we get a comment line? */ switch(*k0) { case @'C': case @'c': case @'*': case (ASCII)begin_comment0: case (ASCII)begin_comment1: is_cmnt = Fortran_cmnt = YES; break; default: /* Skip over white space at beginning of line. */ for(; p@; /* If we're this far, it's not a comment. Check for continuation line (neither blank nor |'0'| in column~6). If so, shift it over to abut it with previous stuff in buffer. */ if(limit-k0 >=5 && !(k0[5] == @' ' || k0[5]==@'0') ) @@; } @ If the |ignore_C| flag is on (\.{-nC} option), we simple skip a single-line \Fortran\ comment. @= { first_char: c = getc(fp); // First character in line. switch(c) { case '!': if(!point_comments) { ungetc(c, fp); break; } case 'C': case 'c': case '*': while((c=getc(fp)) != EOF && c != '\n') ; cur_line++; goto first_char; default: ungetc(c, fp); break; } } @ The line is a comment line. We give special treatment to an otherwise null comment line, treating it as a line with nothing in it at all. If the last line was a comment also, we concatenate this one with the previous one. @= { if(limit == k0+1) { /* Null comment line. */ limit = k0; if(!first_line) goto last_of_read; else goto concatenate_cmnts; } if(k0 > cur_buffer) MEMSET(k0-N_END,@' ',N_END); if(Fortran_cmnt) *p = begin_comment1; /* If the last line was empty, we don't want to read any further; leave this comment waiting in the buffer. */ if(last_was_empty) { num_in_buffer = PTR_DIFF(size_t,limit,k0) + N_END; comment_in_buffer = YES; limit = cur_buffer; break; // Break out of the |for| loop which reads lines. } scan_for_cmnts(); continue; // Go back and read more lines. } @ The line is a possible continuation line; namely, it has something in column~6. However, if we're in the midst of a trailing C~comment or if an alphanumeric label extends into column~6, then it's not a continuation. We check for these possibilities by seeing whether there's anything in columns 1--5. @= @B register ASCII HUGE *l; boolean stuff_in_1_5; @b if(first_line) {/* Error: Continuation line not expected. */ scan_for_cmnts(); continue; } /* We don't allow anything in columns 1--5 for a continuation line. That's a FORTRAN rule, and it helps us to catch a possible continuation of a C-style comment. */ stuff_in_1_5 = NO; for(l=k0;l=@[ SRTN mark_cmnt FCN((type0,delim0,length0,pos0)) CMNT_TYPE type0 C0("")@; DELIM_TYPE delim0 C0("")@; eight_bits length0 C0("")@; ASCII HUGE *pos0 C1("")@; { pcmnt->type = type0; pcmnt->delim = delim0; pcmnt->len = length0; pcmnt->pos = pos0; if(type0 == LONG_CMNT) scanning_C_cmnt = BOOLEAN(delim0 == START); pcmnt++; if(pcmnt == pcmnt_end) FATAL(C, "Cmnt-buffer overflow.", " Please simplify long Fortran comment."); pcmnt->type = NO_CMNT; pcmnt->delim = START; pcmnt->len = 0; pcmnt->pos = limit; } @ @= IN_COMMON ASCII string_char; IN_COMMON boolean in_char_string; @ @d MARK(type,delim,len) mark_cmnt(type,delim,len,p) @=@[ SRTN scan_for_cmnts(VOID) { register ASCII HUGE *p; for(p=k0; p@; break; case @'/': if(in_char_string || scanning_C_cmnt) break; if(*(p+1) == @'/' && Cpp_comments && !ignore_C) { MARK(SHORT_CMNT,START,2); p = limit; MARK(SHORT_CMNT,END,0); } else if(*(p+1) == @'*') { MARK(LONG_CMNT,START,2); p++; } break; case @'*': if(in_char_string) break; if(scanning_C_cmnt && *(p+1) == @'/') { MARK(LONG_CMNT,END,2); p++; } break; } } @ @= { if(!in_char_string) { in_char_string = YES; string_char = *p; break; } if(string_char == *p && p[1] == string_char) { p++; break; } in_char_string = NO; } @ @d BLANK_OUT(d) MEMSET((d)->pos,@' ',(d)->len) @=@[ SRTN anlz_cmnts(VOID) { CMNT_DATA *d; boolean found_text = NO; ASCII HUGE *l; pcmnt->pos = limit; for(d=posns + 1; dpos+d->len; l<(d+1)->pos; l++) if(*l != @' ') { found_text = YES; break; } if(found_text) { if(d->type == SHORT_CMNT) { BLANK_OUT(d-1); *((d-1)->pos) = begin_comment0; *(d->pos) = @'*'; *(d->pos + 1) = @'/'; } } else if(d->type == (d+1)->type) { BLANK_OUT(d); BLANK_OUT(d+1); d->type = (d+1)->type = NO_CMNT; } } @@; pcmnt = posns; // Reset. } @ @= for(pk = k0-1; ;) if(!bscn_white() || !bscn_cmnt()) break; @ @= IN_COMMON ASCII HUGE *pk; @ @= boolean bscn_white(VOID) { for( ; pk>=cur_buffer; --pk) if(*pk != @' ') return YES; return NO; } boolean bscn_cmnt(VOID) { /* Are we at end of comment? */ if( !(*pk==@'/' && *(pk-1) == @'*') ) { ++pk; /* Copy the continuation line to here. */ return NO; /* Not on white space and not on end of comment; we're done. */ } /* Scan backwards to beginning of comment. Must allow for both kinds of comment styles. */ for(pk -=N_END; pk >= cur_buffer; --pk) if(*pk==(ASCII)begin_comment0 || *pk==(ASCII)begin_comment1 || (*pk==@'/' && (*(pk+1) == @'*' || *(pk+1)==@'/'))) /* Found start of comment. */ { --pk; return YES; } return NO; } @ In Fortran mode, the last thing we do before returning the line is to parse looking for comments. We want to propagate the final semicolon to just before the last comment. With this scheme, the innards of \WEAVE\ and \TANGLE\ are presented with a uniform syntax. @= IN_COMMON ASCII HUGE *lp, HUGE *semi_pos; IN_COMMON boolean found_text,text,C_style_cmnt,short_cmnt,R_style_cmnt; @ @= { boolean text_after = NO; if(pcmnt > posns) { // There's at least one comment. if(!scanning_C_cmnt) for(l=limit-1; l>(pcmnt-1)->pos + (pcmnt-1)->len; l--) if(*l != @' ') { // There's text after the comment. text_after = YES; *(l+1) = @';'; break; } if(!text_after) { pcmnt -= 2; if(pcmnt < posns) { ERR_PRINT(C, "Fortran comment didn't end; missing */?"); pcmnt = posns; } while(pcmnt->type == NO_CMNT) { pcmnt--; if(pcmnt < posns) CONFUSION("Insert an automatic semicolon", "Invalid comment structure"); } while(pcmnt >= posns) { ASCII HUGE *lmin; if(pcmnt == posns) lmin = cur_buffer; else lmin = (pcmnt-1)->pos + (pcmnt-1)->len; for(l=pcmnt->pos - 1; l>=lmin; l--) { if(*l != @' ') { // There's text before the comment. semi_pos = pcmnt->pos; @@; goto done_auto_insert; } } pcmnt -= 2; } } } else { // No comments at all. for(l=limit-1; l>=cur_buffer; l--) if(*l != @' ') { *(l+1) = @';'; break; } } done_auto_insert: ; } @ Here we put in the semicolon. We have to watch out for a preceding `\.{@@}' sign, which signifies a verbatim comment. @= { *(semi_pos+1) = (ASCII)(((pcmnt+1)->type==LONG_CMNT ? begin_comment0 : begin_comment1)); /* If the comment was started by |begin_comment0| or |begin_comment1|, this overwrites the character after that. (We have to make room for the semicolon.) If we want to cure this, we must do more copying. */ if(semi_pos > cur_buffer && *(semi_pos-1) == @'@@') /* A verbatim comment. */ { *(semi_pos--) = @'@@'; } *semi_pos = @';'; /* This overwrites the beginning of the comment marker, or the previous~\.{@@} if there was one. */ @; } @ As a kludge, if the Fortran line ends with an \.{@@/}, we interchange it with the semicolon. @= for(lp=semi_pos-1; lp>cur_buffer; lp--) { if(*lp == @' ') continue; if(*lp == @'/' && *(--lp) == @'@@') { *semi_pos = @' '; *lp = @';'; @~ *(lp+1) = @'@@'; @~ *(lp+2) = @'/'; } break; } @*1 \Ratfor\ input. @=@[ boolean rd_Ratfor(VOID) { register int c='\0'; // The character read. register ASCII HUGE *k; // Where next character goes. boolean found_semi; string_char = '\0'; in_char_string = NO; @@; /* If we've read into a |new_module| command in column~1, switch out of column mode. */ if(*cur_buffer == @'@@' && (limit==cur_buffer+1 || *(cur_buffer+1)==@'*' || *(cur_buffer+1)==@' ')) column_mode = NO; else @; return YES; } @ @= IN_COMMON ASCII HUGE *last_pos; IN_COMMON ASCII cmnt_char; @ This section has to handle the completely free-form syntax as well as the ``obviously continued'' syntax. The latter is more trouble than it's worth, and isn't recommended. @= { last_was_continued = continuing_line; continuing_line = NO; if(limit==cur_buffer) return YES; limit[0] = limit[1] = limit[2] = limit[3] = @' '; cmnt_char = @'#'; found_semi = found_text = text = NO; /* Start off assuming we're in comment mode. */ semi_pos = NULL; /* |semi_pos| will record the position of a prospective comment, to be begun by a semicolon. */ /* Scan the line. */ if(!free_form_input && !(*cur_buffer==@'@@' && *(cur_buffer+1)==@'#')) { for(lp=cur_buffer; ;) if(!skip_Rtext() || !skp_cmnt()) break; switch(*last_pos) { case @'+': case @'-': case @'*': case @'=':case @'{':case @'}': case @'^': case @'&': case @'|': case @'(': case @':': case @'>': case @'<': case @'[': case @',': case @'\\': continuing_line = YES; break; /* Line is continued. */ /* Ratfor's continuation character. */ case @'_': if(last_pos > cur_buffer) { ASCII c; c = *(last_pos-1); if(isAlpha(c) || isDigit(c) || c==@'_' || c==@'$') goto not_continuation; } *last_pos = @' '; continuing_line = YES; break; default: not_continuation: if(!auto_semi) break; /* If the last construction is a comment (|!text|) and there was actually some text (|semi_pos!=NULL|), replace ``\.{\slashstar}'' by |';'| and |begin_comment0| or |begin_comment1|. */ if(!text && semi_pos!=NULL) @@; else if(found_text && limit > cur_buffer) *limit++ = @';'; /* Line ended. */ break; } } } @ This nucleus skips over text in a line, stopping if it finds a comment. @d is_C_style_cmnt (C_style_cmnt = ((short_cmnt = Cpp_comments && *lp == @'/' && *(lp+1) == @'/')) || (*lp == @'/' && *(lp+1) == @'*') ) @d start_comment (is_C_style_cmnt || (*lp == (char)begin_comment0) || (*lp == (char)begin_comment1) ) @= boolean skip_Ftext(VOID) { @; /* If we haven't found a comment, set mode to text. */ if(!start_comment) { found_text = text = YES; ++lp; } /* Scan to a comment. */ for(; lp=@[ boolean skip_Rtext(VOID) { static ASCII blank = @' '; @; last_pos = ␣ /* If we haven't found a comment, set mode to text. */ if(!start_Rcomment) { found_text = text = YES; } /* Scan to a comment. */ for(; lp= if(scanning_C_cmnt) return YES; /* Make sure |skp_cmnt| is the first to be executed. */ /* Start scanning at the current position. Skip over white space. */ for(; lp= limit) return NO; /* The line was all white space. */ @ This nucleus skips over comments. */ @=@[ boolean skp_cmnt(VOID) { /* If the last mode was text, remember the position for a possible semi. */ if(text) semi_pos = lp - 1; text = NO; /* We're in comment mode. */ scanning_C_cmnt = NO; /* Flag used to handle the next line properly if the comment runs over. */ /* Scan to end of comment. */ if(C_style_cmnt) { if(short_cmnt) { lp = limit; return YES; } for(++lp; lpK0 @d found_at cur0_prms->Found_at @d at_line cur0_prms->At_line @ When |changing=NO|, the next line of |change_file| is kept in |change_buffer|, for purposes of comparison with the next line of |cur_file|. After the change file has been completely input, we set |change_limit=change_buffer|, so that no further matches will be made. Here's a shorthand expression for inequality between the two lines: @d LINES_DONT_MATCH (change_limit-change_buffer != limit-cur_buffer || STRNCMP(cur_buffer, change_buffer, PTR_DIFF(size_t,limit,cur_buffer))) @d change_params prms[incl_depth].input_params @ Procedure |prime_the_change_buffer| sets |change_buffer| in preparation for the next matching operation. Since blank lines in the change file are not used for matching, we have |(change_limit==NULL && !changing)| if and only if the change file is exhausted. This procedure is called only when |changing| is |YES|; hence error messages will be reported correctly. @=@[ SRTN prime_the_change_buffer(VOID) { INPUT_PARAMS input_params; // Saves incoming state. input_params.Language = language; input_params.Parsing_mode = parsing_mode; input_params.Column_mode = column_mode; language = change_params.Language; parsing_mode = change_params.Parsing_mode; column_mode = change_params.Column_mode; change_limit = NULL; // This value will be used if the change file ends. @; @; done_priming: language = input_params.Language; parsing_mode = input_params.Parsing_mode; column_mode = input_params.Column_mode; /* After we're done priming the change buffer, we will next read from the input file. */ changing = NO; cur0_prms = cur_prms.web; } @ While looking for a line that begins with~\.{@@x} in the change file, we allow lines that begin with~\.{@@}, as long as they don't begin with~\.{@@y} or~\.{@@z} (which would probably indicate that the change file is fouled up). @= WHILE() { ASCII c; if (!input_ln(CHANGE_FILE)) { change_limit = NULL; goto done_priming; } if (limit < cur_buffer+2) continue; // There can't be an \.{@@}~command. if (cur_buffer[0] != @'@@') continue; // Skip lines that don't start with~\.{@@}. @; @; if ((c=cur_buffer[1])==@'x') break; // Found beginning of a change. if (c==@'y' || c==@'z') { loc = cur_buffer+2; // Skip erroneous change. ERR_PRINT(C,"Where is the matching @@x?"); @.Where is the match...@> } else @@; } @ @= { if(c==@'l') if(limit == cur_buffer+2) ERR_PRINT(C,"Missing language character after @@L"); else c = cur_buffer[2]; switch(c) { @<|ASCII| cases for |C|@>: language = change_params.Language = (cur_buffer[2] == @'+') ? C_PLUS_PLUS : C; column_mode = change_params.Column_mode = NO; continue; @<|ASCII| cases for |RATFOR|@>: if(!RAT_OK("Language change ignored")) continue; language = change_params.Language = (cur_buffer[2] == @'9') ? RATFOR_90 : RATFOR; continue; @<|ASCII| cases for |FORTRAN|@>: language = change_params.Language = (cur_buffer[2] == @'9') ? FORTRAN_90 : FORTRAN; continue; @<|ASCII| cases for |LITERAL|@>: language = change_params.Language = LITERAL; continue; @<|ASCII| cases for |TEX|@>: language = change_params.Language = TEX; continue; case @'[': column_mode = change_params.Column_mode = YES;continue; case @']': column_mode = change_params.Column_mode = NO;continue; default: loc = cur_buffer + 2; ERR_PRINT(C,"Invalid @@ command in change file"); continue; } } @ This line of code makes~|"@@X"| equivalent to~|"@@x"| and so on. @= if ((cur_buffer[1]>=@'X' && cur_buffer[1]<=@'Z') || cur_buffer[1]==@'I') cur_buffer[1]+=@'z'-@'Z'; @ We do not allow includes in a change file, so as to avoid confusion. @= if (cur_buffer[1]==@'i') { loc = cur_buffer + 2; ERR_PRINT(C,"Sorry, no includes allowed in change file"); @.No includes allowed...@> } @ Here we are looking at lines following the~\.{@@x}. @= do { if (!input_ln(CHANGE_FILE)) { ERR_PRINT(C,"Change file ended after @@x"); @.Change file ended...@> change_limit = NULL; goto done_priming; } } while (limit==cur_buffer); @ The following procedure is used to see if the next change entry should go into effect; it is called only when |changing| is~|NO|. The idea is to test whether or not the current contents of |cur_buffer| matches the current contents of |change_buffer|. If not, there's nothing more to do; but if so, a change is called for: All of the text down to the~\.{@@y} is supposed to match. An error message is issued if any discrepancy is found. Then the procedure prepares to read the next line from |change_file|. @=@[ SRTN chk_change(VOID) // Switches to |change_file| if the buffers match. { int n = 0; // The number of discrepancies found. if(LINES_DONT_MATCH) return; // Didn't match a change. WHILE() { changing = YES; prn_where = YES; if (!input_ln(CHANGE_FILE)) { ERR_PRINT(C,"Change file ended before @@y"); @.Change file ended...@> change_limit = NULL; changing = NO; prn_where = YES; return; } @;@/ changing = NO; prn_where = YES; while(!input_ln(INPUT_FILE)) { /* Pop the stack or quit. */ if (incl_depth==WEB_FILE) { ERR_PRINT(C,"WEB file ended during a change"); @.WEB file ended...@> input_has_ended = YES; return; } incl_depth--; prn_where = YES; } if(LINES_DONT_MATCH) n++; } } @ @= if (limit>cur_buffer+1 && cur_buffer[0]==@'@@') { @; @; if (cur_buffer[1]==@'x' || cur_buffer[1]==@'z') { loc=cur_buffer+2; ERR_PRINT(C,"Where is the matching @@y?"); @.Where is the match...@> } else if (cur_buffer[1]==@'y') { if (n>0) { loc = cur_buffer + 2; ERR_PRINT(C,"Hmm... some of the preceding lines failed to match"); @.Hmm... some of the preceding...@> } return; } } @ The |rst_input| procedure, which gets \.{WEAVE} ready to read the user's \.{WEB} input, is used at the beginning of both phases one and two. @d ABORT_ON_ERROR YES @d DONT_ABORT_ON_ERROR NO @d FCLOSE(file_ptr) if(file_ptr != stdin) fclose(file_ptr); file_ptr = NULL@; @=@[ SRTN rst_input(VOID) { FCLOSE(prms[WEB_FILE].web.File); FCLOSE(prms[WEB_FILE].change.File); ini_input_prms(WEB_FILE,(outer_char HUGE *)"",ABORT_ON_ERROR); @; @@; incl_depth = WEB_FILE; input_has_ended = NO; } @ Prepare to read from an input buffer. It positions the~|loc| after~|limit| so that a new line will be sure to be read next. @= limit=cur_buffer; loc=cur_buffer+1; cur_buffer[0]=@' '@; @ @= IN_COMMON INPUT_PARAMS change_params0 #if(part == 0 || part == 1) = {FORTRAN,OUTER,NO} #endif ; @ @= { cur0_prms = cur_prms.change; changing = YES; change_params = change_params0; // Reset to default values. prime_the_change_buffer(); @; } @*1 Initializing input files. Whenever a new input file is opened, we must allocate a buffer, and initialize parameters. This routine initializes both the \WEB\ file and the change file for a particular include level. @^system dependencies@> @ @= { ALLOC(INPUT_PRMS, prms, ABBREV(max_include_depth), max_include_depth, 1); } @ Although the |prms| array had to be allocated before scanning the command line (with the default |DFLT_MAX_INCLUDE_DEPTH|), the \.{-y}~option might have requested a change in size. If so, we reallocate the array. @= { BUF_SIZE cur_prms_units; alloc(OC("id"), &cur_prms_units, 0, -1); // What is current allocation? if(cur_prms_units != DFLT_MAX_INCLUDE_DEPTH) prms = (INPUT_PRMS *)REALLOC(prms, (cur_prms_units + 1)*sizeof(INPUT_PRMS), (DFLT_MAX_INCLUDE_DEPTH+1)*sizeof(INPUT_PRMS)); } @ @=@[ boolean ini_input_prms FCN((ilevel,path,quit_on_error)) int ilevel C0("Present level of input files.")@; outer_char HUGE *path C0("Colon-delimited path list")@; boolean quit_on_error C1("Abort flag.")@; { INPUT_PRMS HUGE *p = &prms[ilevel]; CUR_PRMS old_prms; boolean web_level = BOOLEAN(ilevel==WEB_FILE); old_prms = cur_prms; // Save state in case of error. /* Initialize this here in case of error messages. */ cur_prms.web = &p->web; cur_prms.change = &p->change; /* Initialize both input and change files; abort if error. */ if(!(ini0_input_prms(cur_prms.web,path,OC("input"),quit_on_error, (SEQUENCES *)(web_level ? wt_style.input_ext.web : wt_style.input_ext.hweb)) && ini0_input_prms(cur_prms.change,path,OC("change"),quit_on_error, (SEQUENCES *)(web_level ? wt_style.input_ext.change : wt_style.input_ext.hchange)))) { cur_prms = old_prms; // Restore old state if error. return NO; } /* For definiteness we set |cur0_prms| to the web input file. */ cur0_prms = cur_prms.web; loc = cur_buffer; /* Remember the name of the include file, for use by \WEAVE. */ STRCPY(this_include_file,web_level ? (CONST outer_char *)"" : p->web.File_name); return YES; } @ This function initializes either a web file or a change file. @=@[ boolean ini0_input_prms FCN((p0,path,file_type,quit_on_error,extensions)) INPUT_PRMS0 HUGE *p0 C0("")@; outer_char HUGE *path C0("")@; outer_char file_type[] C0("")@; boolean quit_on_error C0("")@; SEQUENCES *extensions C1("")@; { cur0_prms = p0; /* In case of error messages. */ /* If we've never opened this level before, allocate appropriate space. */ if(p0->Buffer == NULL) { ALLOC(ASCII,p0->Buffer,ABBREV(buf_size),buf_size,0); p0->Buffer_end = p0->Buffer + buf_size - 2; } /* Initialize location pointers and flags. */ loc = p0->Limit = p0->Buffer; p0->Line = 0; p0->Num_in_buffer = 0; p0->Scanning_C_cmnt = p0->Last_was_empty = p0->Continuing_line = p0->Last_was_continued = NO; /* --- Open file (but not if it's already open) --- */ if(!p0->File && (p0->File=xopen(p0->File_name,path,extensions,OC("r"))) == NULL) { if(quit_on_error) { FATAL(C, "", "Can't open %s%s file %s.", *p0->File_name ? "" : "(null) ", (char *)file_type, *p0->File_name ? p0->File_name : wt_style.null_file_name); @.Can't open input file@> @.Can't open change file@> } else { err_print(C,"Can't open include %s file \"%s\"", file_type,p0->File_name); @.Can't open include file@> } return NO; // Couldn't open file. } return YES; // Opened file successfully. } @ This general routine attempts to open a file by searching through a path. @=@[ FILE * xopen FCN((file_name,path,extensions,iomode)) outer_char *file_name C0("")@; outer_char HUGE *path C0("")@; SEQUENCES *extensions C0("")@; CONST outer_char *iomode C1("")@; { outer_char HUGE *p1; FILE *file_ptr; outer_char total_name[2*MAX_FILE_NAME_LENGTH]; outer_char prefix_end_str[2]; if(!*file_name) return FOPEN(wt_style.null_file_name,iomode); if(*iomode=='r' && STRCMP(file_name,"stdin")==0) return stdin; else if(*iomode=='w' && STRCMP(file_name,"stdout")==0) return stdout; /* If at this point there's still a path attached to |file_name| (probably occurs only with the \.{-H} option), we just try to open the file. If there's no path, we just try to look in the present directory. */ if(file_name[0] == prefix_end_char || !(path && *path)) return x0open(file_name,extensions,iomode); prefix_end_str[0] = prefix_end_char; prefix_end_str[1] = '\0'; /* Hunt through the path. */ while((p1=(outer_char HUGE *)STRCHR(path,':')) != NULL) { *p1 = '\0'; STRCPY(total_name,path); *p1 = ':'; if(*(p1-1) != prefix_end_char) STRCAT(total_name,prefix_end_str); STRCAT(total_name,file_name); if((file_ptr=x0open(total_name,extensions,iomode)) != NULL) return file_ptr; path = p1 + 1; } return NULL; // Couldn't open any file. } @ Here we attempt to open a file with a specific file name. When the \.{-e}~option is in effect, we must scan through the list of possible extensions in order to ascertain whether one of the possible files can be opened. @=@[ FILE * x0open FCN((file_name,extensions,iomode)) outer_char *file_name C0("")@; SEQUENCES *extensions C0("")@; CONST outer_char *iomode C1("")@; { int k; /* If it has a dot in it, it's always interpreted literally. If it didn't have a dot, then if the `\.{-e}'~option isn't in effect it will already have had the `\.{.web}' extension added to it, so it will now have a dot. (So presumably the last option of the \&{if} is redundant?) */ if(STRCHR(file_name,wt_style.ext_delimiter)!=NULL || !try_extensions) return FOPEN(file_name,iomode); /* At this point, the file name didn't have a dot and the `\.{-e}'~option is in effect. Make trial file names from the list of extensions and try to open them one at a time until one matches. */ for(k=0; kn; k++) { outer_char full_name[MAX_FILE_NAME_LENGTH]; FILE *file_ptr; if(NSPRINTF(full_name,"%s%c%s", file_name,wt_style.ext_delimiter,extensions->string[k]) >= MAX_FILE_NAME_LENGTH) OVERFLW("Extended file name",""); file_ptr = FOPEN(full_name,iomode); if(file_ptr) { STRCPY(file_name,full_name); /* If we don't do this, the information messages aren't as informative as they could be. */ return file_ptr; // Opened a file successfully. } } return NULL; // Failed to open the file. } @ The |get_line| procedure is called when |loc>limit|; it puts the next line of merged input into the buffer and updates the other variables appropriately. A space is placed at the right end of the line. This procedure returns |!input_has_ended| because we often want to check the value of that variable after calling the procedure. If we've just changed from the |cur_file| to the |change_file|, or if the |cur_file| has changed, we tell \.{TANGLE} to print this information in the output file by means of the |prn_where| flag. @= IN_COMMON sixteen_bits module_count; // The current module number. IN_COMMON BUF_SIZE max_modules; // Greater than the total number of modules. IN_COMMON boolean HUGE *chngd_module; // Dynamic array: Is the module changed? IN_COMMON boolean prn_where CSET(NO); // Tells \.{TANGLE} to print line and file info IN_COMMON boolean return_toggle CSET(NO); /* Switch used for sending back an `\.{@@i}' when |toggle_includes| is on. */ IN_COMMON boolean toggling CSET(NO); // In the middle of a toggle include? IN_COMMON boolean popped CSET(NO); // After popping the stack? IN_COMMON boolean no_more_input CSET(NO); // Temporary replacement for |input_has_ended|. @ @= ALLOC(boolean,chngd_module,ABBREV(max_modules),max_modules,0); @*1 Getting the next line. Input the next line. @=@[ boolean get_line(VOID) { if(return_toggle) @@; restart: if (changing) chngd_module[module_count] = YES; else @; if (changing) { @; if (!changing) { chngd_module[module_count]=YES; goto restart; } } process_line: loc = cur_buffer; *limit = @' '; if(return_toggle) @@; if (*cur_buffer==@'@@') switch(*(cur_buffer+1)) { case @'i': case @'I': @@; break; } return (boolean)(!input_has_ended); } @ @= if( *(cur_buffer+1)==@'I' && (skip_includes || (program==weave && toggle_includes && CUR_FILE==WEB_FILE)) ) { if(skip_includes) { /* Include commands are being skipped altogether. */ loc = limit + 1; // Turn whole line into null. goto restart; } else if(toggle_includes && CUR_FILE==WEB_FILE) { /* Include files are read, but not printed. */ toggling = YES; @@; } } else @@; @ Process an \.{\AT!o} command. @= { outer_char new_file_name[MAX_FILE_NAME_LENGTH]; if(program==weave || phase==1) goto restart; loc = cur_buffer + 2; // Position after \.{@@o}. /* Look for the name of the new output file. */ if(!get_fname(new_file_name)) ERR_PRINT(C,"Output file name not given"); @.Output file name not given@> else { fclose(out_file); strcpy(output_file_name,new_file_name); open_out(); } goto restart; } @ An~`\.{@@i}'---|toggle_output|--- is returned before and after an include line that is to be processed but not output (when |toggle_includes == YES|). Before we send it back, we must save the line in the buffer, because we must process it the next time we come back in for a line. @= { return_toggle = YES; stored_line_length = PTR_DIFF(size_t, limit, cur_buffer); stored_line = GET_MEM("stored_line", stored_line_length+1, ASCII); /* We allocate one extra so we don't have to handle the special case of a zero-length line, for which |FREE_MEM| would complain. */ STRNCPY(stored_line, cur_buffer, stored_line_length); loc = cur_buffer + 2; get_fname(prms[1].web.File_name); // For \.{@@I} bug. loc = limit = cur_buffer; *limit++ = @'@@'; @~ *limit++ = '\001'; @~ *limit = @' '; // |toggle_output| is \.{@@\\001}. return YES; } @ We need a place to hold that line. @= IN_COMMON int stored_line_length; IN_COMMON ASCII HUGE *stored_line; // Allocated dynamically. @ When we come back after sending a |toggle_include| command, we must get back the previous line that was in the buffer. @= { return_toggle = NO; if(popped && no_more_input) { input_has_ended = YES; return NO; } STRNCPY(cur_buffer, stored_line, stored_line_length); FREE_MEM(stored_line, "stored_line", stored_line_length, ASCII); limit = cur_buffer + stored_line_length; *limit = @' '; if(popped) { popped = NO; goto popped_stack; } else if(toggling) goto push_stack; else goto process_line; } @ When an \.{@@i}~line is found in the |cur_file|, we must temporarily stop reading it and start reading from the named include file. The \.{@@i}~line should give a complete file name with or without~\.{"..."}; \.{WEB} will not look for include files in standard directories as the \cee\ preprocessor does when a \.{\#include } line is found. Also, the file name should only contain visible ASCII characters, since the characters are translated into ASCII and back again. Optionally, one may also name a new change file. As for the command line, the format is \.{@@i include\_file [change\_file]}. The next arrays hold the last and current names of the include file, for use by \WEAVE\ in printing out what file goes with what section. @= IN_COMMON outer_char last_include_file[MAX_FILE_NAME_LENGTH] CSET(""), this_include_file[MAX_FILE_NAME_LENGTH] CSET(""); @ @= @B boolean found_include; @b push_stack: loc = cur_buffer + 2; // Position after \.{@@i}. if(++incl_depth >= (int)max_include_depth) { incl_depth--; err_print(C, "Too many nested includes; %d allowed. \ Increase with `-yid'.", max_include_depth); @.Too many nested includes@> goto restart; } /* Look for the name of a \WEB\ file to include. */ if(!(found_include=get_fname(cur_file_name))) ERR_PRINT(C,"Include file name not given"); @.Include file name not given@> else { // Found a \WEB\ file name; now look for change file name. if(skip_ifiles) @@; if(!get_fname(change_file_name)) { /* No change file name specified; obtain it from the last level. */ INPUT_PRMS *p_lower = &prms[incl_depth-1]; INPUT_PRMS0 *p0_lower = &p_lower->change; STRCPY(change_file_name,p0_lower->File_name); change_file = p0_lower->File; change_params = p_lower->input_params; } } if(found_include) { if(ini_input_prms(CUR_FILE,incl.list,DONT_ABORT_ON_ERROR)) { if(cur_prms.change->File != prms[incl_depth-1].change.File) @@; // New change file. else *cur_prms.change = prms[incl_depth-1].change; // Still using the old change file. cur_line = 0; prn_where = YES; CLR_PRINTF(SHORT_INFO, include_file, (" (%s", (char *)cur_file_name)); /* Tell the terminal where we're reading from. */ } else { /* Failed to open include file. */ incl_depth--; } } goto restart; } @ When option \.{-j} is used, include files that have already been included are not included again. @= IN_COMMON BUF_SIZE max_ifiles; IN_COMMON outer_char **ifiles; // Dynamic array of unique include file names. IN_COMMON int num_ifiles; // Current number of include file names. @ @= { ALLOC(outer_char *, ifiles, ABBREV(max_ifiles), max_ifiles, 0); } @ @= { int j; for(j=0; j=@[ boolean get_fname FCN((file_name)) outer_char HUGE *file_name C1("")@; { ASCII HUGE *j; outer_char HUGE *k; skip_white: /* Skip over leading white space and optional quotes. */ while (loc<=limit && (*loc==@' '||*loc==@'\t'||*loc==@'"')) loc++; /* If we've hit the end of the buffer, we're done, and we didn't find anything. */ if(loc >= limit) return NO; @@; k = file_name; j=loc; /* Terminate scan by white space or quotes. */ while (*loc!=@' '&&*loc!=@'\t'&&*loc!=@'"') *k++ = XCHR(*loc++); TERMINATE(k,0); /* On certain systems, underscores aren't allowed in file names. */ @#ifdef MVS for (k = file_name; *k; k++) if (*k == '_') *k = '@@'; @#endif // |MVS| add_prefix(file_name); // Attach a directory prefix. return YES; } @ @= { if(*loc==@'/') { if(*(loc+1) == @'/') { /* Short comment */ loc = limit+1; return NO; } if(*(loc+1) == @'*') { /* Long comment */ for(loc += 2; loc <= limit; loc++) if(*loc==@'*' && *(loc+1)==@'/') { loc += 2; goto skip_white; } ERR_PRINT(C,"Can't continue comments on @@i lines"); } } } @ If the include file name has no directory prefix and there was a web file prefix, then attach the latter to the former. @=@[ SRTN add_prefix FCN((file_name)) outer_char HUGE *file_name C1("")@; { outer_char temp[MAX_FILE_NAME_LENGTH]; xpnd_file_name(file_name); // Expand possible environmental prefix. if(*wbprefix && STRRCHR(file_name,prefix_end_char)==NULL) { if(NSPRINTF(temp,"%s%s",wbprefix,file_name) >= MAX_FILE_NAME_LENGTH) OVERFLW("Path/file_name",""); STRCPY(file_name,temp); } } @ The following function emulates VMS' expansions of logical names. It's assumed that the file names in an \.{@@i} command look like \.{ENV:name}, where \.{ENV}~is an environmental variable defined with \.{setenv}. \.{ENV}~should expand to a subdirectory, without a trailing slash. @=@[ SRTN xpnd_file_name FCN((name)) outer_char HUGE *name C1("")@; { outer_char temp[MAX_FILE_NAME_LENGTH],env_prefix[MAX_FILE_NAME_LENGTH]; outer_char *pc,*px,*qx; CONST char *separator; int n; boolean expanded; #ifdef vms return; // VAX/VMS does its own expansions of logical names. #else #if !HAVE_GETENV err_print(C,"Sorry, this machine doesn't support environment variables"); return; #else /* Is there a logical name prefix? */ if((pc=OC(STRCHR(name,':'))) == NULL) return; /* Isolate the prefix. */ STRNCPY(env_prefix,name,n=PTR_DIFF(int, pc, name)); TERMINATE(env_prefix,n); /* Recursively expand the prefix. |px|~will have the last non-null name. */ expanded = NO; for(px=env_prefix; px; px=qx) { if((qx=GETENV(px)) == NULL) break; if(STRCMP(qx,env_prefix) == 0) { err_print(C,"Infinite recursion in definition of \ environmental variable \"%s\"",px=env_prefix); expanded = NO; break; } expanded = YES; /* At least one expansion of the logical name was made. */ } /* If the prefix wasn't expandable, or if it turned into an infinite recursion, do nothing. */ if(!expanded) return; /* Otherwise, |px|~has the last expansion of the name. */ separator = #ifdef ibmpc "\\" #else "/" #endif /* |ibmpc| */ ; if(NSPRINTF(temp,"%s%s%s",px,separator,pc+1) >= MAX_FILE_NAME_LENGTH) OVERFLW("Expandable file name",""); STRCPY(name,temp); #endif // |HAVE_GETENV| #endif // |vms| } @ @= { popped = NO; if(cur_prms.web->Line == 0) { if(ignored_cmnts()) goto fin_read; else goto pop_or_quit; } while (!input_ln(INPUT_FILE)) { /* Pop the stack or quit. */ pop_or_quit: prn_where=YES; if(incl_depth==WEB_FILE) {input_has_ended = YES; break;} else { /* Tidy up the include level we're about to leave. */ if(cur_prms.web->File != prms[incl_depth-1].web.File) {FCLOSE(cur_prms.web->File);} if(cur_prms.change->File != prms[incl_depth-1].change.File) {FCLOSE(cur_prms.change->File);} else prms[incl_depth-1].change = *cur_prms.change; cur0_prms->File = NULL; CLR_PRINTF(SHORT_INFO, include_file, (")")); /* Tell the terminal we're finished with this web input file. */ /* Pop the stack here. */ incl_depth--; cur_prms.web = &prms[incl_depth].web; cur_prms.change = &prms[incl_depth].change; if(incl_depth == WEB_FILE && toggle_includes && toggling) { toggling = NO; return_toggle = YES; } STRCPY(this_include_file,(incl_depth==WEB_FILE) ? (CONST outer_char *)"" : cur_file_name); } } fin_read: if(return_toggle) { no_more_input = input_has_ended; input_has_ended = NO; popped = YES; @@; } popped_stack: if (!input_has_ended) if (limit==change_limit-change_buffer+cur_buffer) if (cur_buffer[0]==change_buffer[0]) if (change_limit>change_buffer) chk_change(); } @ Here we look at the beginning material in the include file. If the file begins with~`\.{@@z}', then everything up to and including a line beginning with~`\.{@@x}' is skipped. @=@[ boolean ignored_cmnts(VOID) { boolean limbo_material; /* Read the first line of file. */ if(!input_ln(INPUT_FILE)) return NO; /* Check for possible limbo material. If so, skip all lines up to an~`\.{@@x}'. */ limbo_material = BOOLEAN(cur_buffer[0] == @'@@' && cur_buffer[1] == @'z'); if(limbo_material) do { if(!input_ln(INPUT_FILE)) { CLR_PRINTF(WARNINGS, warning, ("\n! File ended while \ skiping ignorable commentary. Limbo material that begins with @@z must be \ terminated by @@x.")); return NO; } if(phase == 1) find_keywords(cur_buffer, limit); /* The |WEB_FILE| constraint is a kludge. Eventually, one should integrate this into the stacking mechanism for include files. */ } while(!(cur_buffer[0] == @'@@' && cur_buffer[1] == @'x')); /* If there was limbo material, at this point the line beginning with~`\.{@@x}' is in the buffer. The next operation is to read another line, which starts the proper part of the include file. If there was no limbo material, the first line of the file is already in the buffer. Thus, after the following operation we'll always have the first proper line of the file in the buffer. */ if(limbo_material && !input_ln(INPUT_FILE)) return NO; return YES; // Successfully skipped comments. } @ Here we search the line from~|p| to~|p_end| for the pattern `\.{\$keyword:\ text\ \$}'. If so, the text is associated with the built-in function \.{\$KEYWORD(keyword)}. @=@[ SRTN find_keywords FCN((p, p_end)) ASCII HUGE *p C0("Start of line to search")@; ASCII HUGE *p_end C1("End of line")@; { ASCII HUGE *pk, HUGE *pk_end, HUGE *ptext, HUGE *ptext_end; *p_end = '\0'; pk = (ASCII HUGE *)STRCHR(p, @'$'); if(!pk) return; // No starting \.{'\$'}. pk_end = (ASCII HUGE *)STRCHR(pk, @':'); if(!pk_end) return; // No intermediate \.{':'}. if(pk_end[1] != @' ') return; // There must be at least one blank after the \.{':'}. ptext_end = (ASCII HUGE *)STRCHR(pk_end+1, @'$'); if(!ptext_end) return; // No ending \.{'\$'}. if(ptext_end[-1] != @' ') return; // There must be at least one blank before the \.{'\$'}. /* Strip blanks from start of text. */ for(ptext = pk_end+2; *ptext == @' '; ptext++) ; /* Strip blanks from end of text. */ for(ptext_end--; *ptext_end == @' '; ptext_end--) ; add_keyword(pk+1, pk_end, ptext, ptext_end+1); } @ @= IN_COMMON BUF_SIZE max_keywords; IN_COMMON RCS HUGE *rcs; // Dynamic array of RCS-like keywords. IN_COMMON unsigned num_keywords; // Current number of RCS-like keywords. @ @= { ALLOC(RCS, rcs, ABBREV(max_keywords), max_keywords, 0); } @ @=@[ SRTN add_keyword FCN((pk, pk_end, pt, pt_end)) ASCII HUGE *pk C0("Start of keyword")@; ASCII HUGE *pk_end C0("End of keyword")@; ASCII HUGE *pt C0("Start of text")@; ASCII HUGE *pt_end C1("End of text")@; { RCS_LIST HUGE *plist = &prms[CUR_FILE].rcs_list; RCS HUGE *prcs; unsigned k; *pk_end = *pt_end = '\0'; for(prcs=plist->start; prcs && prcs->keyword; prcs=prcs->next) if(STRCMP(pk, prcs->keyword) == 0) { outer_char temp[256]; STRCPY(temp, pk); to_outer(temp); printf("\n! Duplicate RCS-like keyword `%s' ignored (l. %u).", temp, cur_line); mark_harmless; return; } if(!plist->start) plist->end = plist->start = GET_MEM("RCS", 1, RCS); else plist->end = plist->end->next = GET_MEM("RCS", 1, RCS); prcs = plist->end; prcs->keyword = GET_MEM("keyword", STRLEN(pk) + 1, ASCII); STRCPY(prcs->keyword, pk); prcs->txt = GET_MEM("RCS text", STRLEN(pt) + 1, ASCII); STRCPY(prcs->txt, pt); prcs->next = NULL; } @ @= { if (!input_ln(CHANGE_FILE)) { ERR_PRINT(C,"Change file ended without @@z"); @.Change file ended...@> cur_buffer[0]=@'@@'; cur_buffer[1]=@'z'; limit=cur_buffer+2; } if (limit>cur_buffer+1) /* check if the change has ended */ if (cur_buffer[0]==@'@@') { @; @; if (cur_buffer[1]==@'x' || cur_buffer[1]==@'y') { loc=cur_buffer+2; ERR_PRINT(C,"Where is the matching @@z?"); @.Where is the match...@> } else if (cur_buffer[1]==@'z') { prime_the_change_buffer(); prn_where=YES; } } } @ At the end of the program, we will tell the user if the change file had a line that didn't match any relevant line in |web_file|. @=@[ SRTN chk_complete(VOID) { if (change_limit != NULL) { /* |changing| is |NO| */ STRNCPY(cur_buffer,change_buffer, PTR_DIFF(size_t,change_limit,change_buffer)+1); loc = limit = PTR_DIFF(size_t,change_limit,change_buffer) + cur_buffer; changing=YES; ERR_PRINT(C,"Change file entry did not match"); @.Change file entry did not match@> } } @* MEMORY ALLOCATION. Almost all memory is allocated dynamically. This allows one to customize the tables if necessary; default sizes can be overridden by the command-line option~``\.{-y}'', which can also be used in the ini file. Dynamic allocation also ensures that the pointer to the array is |HUGE|, and that sometimes matters for personal computers. @i mem.hweb @ The memory allocation routine quits if it can't find anything. @d MAX_SIZE_T ((BUF_SIZE)(size_t)(~(0L))) // Maximum argument to |calloc|. @= IN_COMMON BUF_SIZE total_mem CSET(0); // Current total dynamically allocated memory. IN_COMMON BUF_SIZE max_mem CSET(0); // The maximum bytes that were allocated. @ @=@[ void HUGE * get_mem0 FCN((why,nunits,nsize)) CONST outer_char why[] C0("Reason for request")@; BUF_SIZE nunits C0("Number of units to allocate.")@; size_t nsize C1("Size of each unit.")@; { void HUGE *p; /* With certain compilers such as the |SGI|, |void| is translated into |char|; see \.{proto.hweb}. */ BUF_SIZE nbytes; if(nunits==0) return NULL; /* Should this ever happen? */ if(nsize==0) CONFUSION("get_mem0","Nsize = 0 requested"); #if !NON_ANSI_CALLOC /* For ANSI, the prototype for |calloc| is |void *calloc(size_t,size_t)|. */ if(nunits > MAX_SIZE_T) { err_print(C,"get_mem0: Can't request %lu units; used max of %lu", nunits,MAX_SIZE_T); nunits = MAX_SIZE_T; } #endif /* |ANSI_CALLOC| */ if( (p=(void HUGE *)CALLOC(nunits,nsize)) == NULL) { FREE(byte_mem); // Kludge to try to make it go out gracefully. FATAL(C, "\n!!! NO MORE MEMORY", " (\"%s\")!!! \ [Requesting %lu unit(s) of size %lu byte(s); \ allocated %lu bytes so far.] \ Try using the -y option to reduce the sizes of internal tables.", (char *)why, nunits, (BUF_SIZE)nsize, total_mem); } /* Keep track of total allocation. */ nbytes = nunits*nsize; total_mem += nbytes; max_mem = MAX(max_mem,total_mem); #ifdef mac lmemset(p,0,nbytes); /* For |lmalloc|, must zero explicitly. */ #endif if(show_mem && nbytes >= show_size) show_alloc('+',why,nunits,(BUF_SIZE)nsize,nbytes,p,total_mem); return p; /* The allocated memory area. */ } @ Here we display the details of the memory allocation. @=@[ SRTN show_alloc FCN((c,why,nunits,nsize,nbytes,p,total_mem)) outer_char c C0("Either plus or minus")@; CONST outer_char why[] C0("Reason for request")@; BUF_SIZE nunits C0("Number of units")@; BUF_SIZE nsize C0("Size of each unit.")@; BUF_SIZE nbytes C0("Bytes allocated")@; void HUGE *p C0("Start of allocated area")@; BUF_SIZE total_mem C1("Total bytes currently allocated")@; { printf("\"%s\": %c(%s x %s) = %c%s ", (char *)why, c, commas(nunits), commas(nsize), c, commas(nbytes)); ptr_range(p,nbytes); printf("(%s total)\n", commas(total_mem)); free_buf(&c_buf); } @ Because not all compilers understand the \.{\%p}~format command, and since different users may wish to customize the form of the pointer range for an allocation, we provide this function. If one wanted, for the Sun etc.\ he could use |$TRANSLIT| to turn~\.p into~\.d, for example. @d PTR_BASE "[%p,%p) " /* To style file? */ @=@[ SRTN ptr_range FCN((p,nbytes)) void HUGE *p C0("Start of the allocated space.")@; BUF_SIZE nbytes C1("Length of the allocation")@; { static char ptr_string[] = #ifdef ibmpc PTR_BASE #else "" #endif ; printf(ptr_string,p,(char HUGE *)p + nbytes); } @ We free memory through an intermediate routine so we can keep track of the total memory allocations. @=@[ SRTN free_mem0 FCN((p,why,nunits,nsize)) void HUGE *p C0("Pointer to deallocate")@; CONST outer_char why[] C0("Reason for request")@; BUF_SIZE nunits C0("Number of units to deallocate.")@; size_t nsize C1("Size of each unit.")@; { BUF_SIZE nbytes; /* If things are working correctly, |p|~should have been previously allocated. */ if(p == NULL) CONFUSION("free_mem0", "Attempting to deallocate NULL pointer"); /* Keep track of total allocation. */ nbytes = nunits*nsize; total_mem -= nbytes; if(show_mem && nbytes >= show_size) show_alloc('-',why,nunits,(BUF_SIZE)nsize,nbytes,p,total_mem); FREE(p); } @ For debugging, we have some variables that say whether to display the dynamic memory allocations as they occur. To turn on the display, use the command-line option~\.{-sm}. A numeric argument changes |show_size|---e.g., \.{-sm100} shows all memory allocations whose size is $\ge 100$ bytes. @d SHOW_MEM 0 /* Don't display by default. */ @= IN_COMMON boolean show_mem CSET(SHOW_MEM); IN_COMMON BUF_SIZE show_size CSET(10000); // Display for |nbytes >= show_size|. @ Here we set up for dynamic memory allocation. The information about the minimum allowed, maximum allowed, and default value for the length or value of a variable is held in a |MEM| structure. The default value can be overridden with the command-line option~\.{-y}. @m ID_FLAG 10240 /* \bf DO NOT MESS WITH THIS NUMBER!. */ @m ID_FLAG1 $EVAL(ID_FLAG-1) @= /* Ideally, the following numbers should be large enough to handle both \FTANGLE\ and \FWEAVE. In the comments, we show some characteristic statistics. */ /* \.{Machine-dependent:} Machines with limited memory. */ #if SMALL_MEMORY #define DFLT_BYTES 10000 /* \.{fweave fweave} $\approx$ 23,300. */ #define DFLT_BUF_SIZE 1500 #define DFLT_C_BUF_SIZE 200 #define DFLT_FMT_SIZE 200 #define DFLT_MSG_SIZE 1000 #define DFLT_DELTA_DOTS 20 #define DFLT_MAX_LBLS 20 #define DFLT_LINE_LENGTH 80 #define DFLT_LONGEST_NAME 1000 #define DFLT_MAX_EXPR_CHARS 500 #define DFLT_MAX_IFILES 10 #define DFLT_MAX_INCLUDE_DEPTH 10 #define DFLT_MAX_KEYWORDS 15 #define DFLT_MAX_MARGS 20 #define DFLT_MAX_MODULES 400 #define DFLT_MBUF_SIZE 32767 #define DFLT_MAX_NAMES 1000 /* \.{fweave fweave} $\approx$ 3,300. */ #define DFLT_MAX_REFS 2500 /* \.{fweave ftangle} $\approx$ 5,850. */ #define DFLT_SBUF_LEN 300 #define DFLT_STACK_SIZE_T 50 #define DFLT_STACK_SIZE_W 210 /* \.{fweave fweave} $\approx$ 200. */ #define DFLT_MAX_SCRAPS 1000 /* \.{fweave fweave} $\approx$ 900. */ #define DFLT_MAX_TOKS_T 50000L // \.{ftangle fweave} $\approx$ 92,000. #define DFLT_MAX_TOKS_W 6000 /* \.{fweave fweave} $\approx$ 6,700. */ #define DFLT_MAX_DTOKS 2500 #define DFLT_MAX_TEXTS 2500 /* \.{fweave fweave} $\approx$ 4,500. */ #define DFLT_MAX_DTEXTS 100 #define DFLT_NUM_FILES 15 #define DFLT_OP_ENTRIES $EVAL(128+PREDEFINED_DOTS+5) #define DFLT_X_BUF_SIZE 80 #else /* Large limits. */ #define DFLT_BYTES 90000L #define DFLT_BUF_SIZE 1500 #define DFLT_C_BUF_SIZE 255 #define DFLT_FMT_SIZE 500 #define DFLT_MSG_SIZE 2000 #define DFLT_DELTA_DOTS 20 #define DFLT_MAX_LBLS 20 #define DFLT_LINE_LENGTH 80 #define DFLT_LONGEST_NAME 10000 #define DFLT_MAX_EXPR_CHARS 500 #define DFLT_MAX_IFILES 100 #define DFLT_MAX_INCLUDE_DEPTH 10 #define DFLT_MAX_KEYWORDS 20 #define DFLT_MAX_MARGS 20 #define DFLT_MAX_MODULES 2000 #define DFLT_MBUF_SIZE 50000L #define DFLT_MAX_NAMES 4000 #define DFLT_MAX_REFS 20000 #define DFLT_SBUF_LEN 300 #define DFLT_STACK_SIZE_T 50 #define DFLT_STACK_SIZE_W 400 #define DFLT_MAX_SCRAPS 10000 #define DFLT_MAX_TOKS_T 150000L #define DFLT_MAX_TOKS_W 25000 #define DFLT_MAX_DTOKS 25000 #define DFLT_MAX_TEXTS ID_FLAG1 #define DFLT_MAX_DTEXTS 500 #define DFLT_NUM_FILES 15 #define DFLT_OP_ENTRIES $EVAL(128+PREDEFINED_DOTS+15) #define DFLT_X_BUF_SIZE 80 #endif /* Limited memory. */ @ The following list must be kept sorted by abbreviation! @= IN_COMMON MEM mem[] #if(part == 0 || part == 1) = { {ABBREV(max_bytes),1, 1000,DFLT_BYTES,ULONG_MAX}, /* |"b"|. |max_bytes|: the number of bytes in identifiers, index entries, and module names. */ {ABBREV(buf_size),1, 500,DFLT_BUF_SIZE,20000}, // |"bs"|. |change_buffer| etc. {ABBREV(C_buf_size),1, 10,DFLT_C_BUF_SIZE,1000},// |"cb"|. |C_buf_size|: see |C_putc|. {ABBREV(cmd_fsize),1, 100,DFLT_FMT_SIZE,UL(65536L)}, // |"cf"|.|cmd_fsize|: see |out_cmd|. {ABBREV(cmd_size),1, 100,DFLT_MSG_SIZE,UL(65536L)}, // |"cg"|. |cmd_size|: see |out_cmd| {ABBREV(delta_dots),sizeof(DOTS), 20,DFLT_DELTA_DOTS,255}, /* |"d"|. |delta_dots|: Number of additional entries to reallocate for |dots| if necessary. */ {ABBREV(max_dtoks),sizeof(eight_bits), 1000,DFLT_MAX_DTOKS,ULONG_MAX}, // |"dt"|. |max_dtoks|. {ABBREV(dtexts_max),sizeof(text), 100,DFLT_MAX_DTEXTS,ID_FLAG1}, // |"dx"|. |dtexts_max|. {ABBREV(max_include_depth), sizeof(INPUT_PRMS), 1, DFLT_MAX_INCLUDE_DEPTH, 100}, // |"id"|. |prms| (open files). {ABBREV(max_ifiles), sizeof(outer_char *), 1, DFLT_MAX_IFILES, 10000}, // |"if"|. |max_ifiles|. {ABBREV(stck_size_t),sizeof(output_state), 10,DFLT_STACK_SIZE_T,100}, // |"kt"|. Tangle's |stck_size|. {ABBREV(stck_size_w),sizeof(output_state), 50,DFLT_STACK_SIZE_W,1000}, // |"kw"|. Weave's |stck_size|. {ABBREV(max_lbls),sizeof(BEGUN), 5,DFLT_MAX_LBLS,255}, // |"lb"|. |max_lbls|. {ABBREV(line_length),1, 60,DFLT_LINE_LENGTH,255}, /* |"ll"|. |line_length| for \FWEAVE's output. */ {ABBREV(longest_name),1, 3*MAX_FILE_NAME_LENGTH, DFLT_LONGEST_NAME, UL(50000L)}, /* |"ln"|. |longest_name|: module names and strings shouldn't be longer than this. */ {ABBREV(max_expr_chars),1, 25,DFLT_MAX_EXPR_CHARS,UL(65536L)}, // |"lx"|. |max_expr_chars|. {ABBREV(max_modules),sizeof(boolean), 100,DFLT_MAX_MODULES,ID_FLAG1}, /* |"m"|. |max_modules|: larger than the max number of modules. */ {ABBREV(max_margs), sizeof(sixteen_bits), 1, DFLT_MAX_MARGS, 255}, // |"ma"|. |max_margs|. {ABBREV(mbuf_size),1, 5000,DFLT_MBUF_SIZE,ULONG_MAX}, // |"mb"|. |mbuf_size|. {ABBREV(max_names),sizeof(NAME_INFO)+sizeof(name_pointer), 500,DFLT_MAX_NAMES,ID_FLAG1}, /* |"n"|. |max_names|: number of identifiers, strings, module names; must be less than 10240. */ {ABBREV(num_files),sizeof(OPEN_FILE), 1,DFLT_NUM_FILES,256}, // |"nf"|. |num_files|. {ABBREV(op_entries),sizeof(OPERATOR), $EVAL(128+PREDEFINED_DOTS),DFLT_OP_ENTRIES,256}, /* |"op"|. |op_entries| */ {ABBREV(max_refs),sizeof(xref_info), 500,DFLT_MAX_REFS,UL(65536L)}, /* |"r"|. |max_refs|: number of cross-references; must be less than 65536. */ {ABBREV(max_keywords), sizeof(RCS), 11, DFLT_MAX_KEYWORDS, UL(65536L)}, // |"rk"|. |max_keywords|. {ABBREV(max_scraps),sizeof(scrap), 1000,DFLT_MAX_SCRAPS,ULONG_MAX}, // |"s"|. |max_scraps|. {ABBREV(sbuf_len),sizeof(outer_char), 100,DFLT_SBUF_LEN,ULONG_MAX}, // |"sb"|. |sbuf_len|. {ABBREV(max_toks_t),sizeof(eight_bits), 10000,DFLT_MAX_TOKS_T,ULONG_MAX}, /* |"tt"|. Tangle's |max_toks|: Total for the entire code; can be big. */ {ABBREV(max_toks_w),sizeof(sixteen_bits),1000, DFLT_MAX_TOKS_W,UL(65536L)}, /* |"tw"|. Weave's |max_toks|: number of symbols in code texts being parsed; must be less than 65536. */ {ABBREV(max_texts),sizeof(text), 500,DFLT_MAX_TEXTS,ID_FLAG1}, // |"x"|. |max_texts|. {ABBREV(X_buf_size),1, 10,DFLT_X_BUF_SIZE,1000},// |"xb"|. |X_buf_size|: see |C_putc|. {"",0,0,0} } #endif // |part == 1| ; IN_COMMON size_t sizeof_mem CSET(sizeof(mem)); @ This is the search routine used by the `\.{-y}'~option that matches an abbreviation with the right element of the |MEM| structure and overrides the default value. @=@[ MEM HUGE * msearch FCN((abbrev,nunits)) CONST outer_char abbrev[] C0("Abbreviation for desired object.")@; BUF_SIZE nunits C1("Value.")@; { MEM HUGE *m; for(m=mem; *m->abbrev; m++) if(STRCMP(m->abbrev,abbrev)==0) { if(nunits == 0L) return m; // Special case: just find it. if(nunits < m->min) { CLR_PRINTF(WARNINGS, warning, ("! Warning (msearch:%s): nunits (%lu) < min (%lu); min used.\n", (char *)abbrev,nunits,m->min)); mark_harmless; nunits = m->min; } else if(nunits > m->max) { CLR_PRINTF(WARNINGS, warning, ("! Warning (dynamic buffer %s): nunits (%lu) > max (%lu); max used.\n", (char *)abbrev,nunits,m->max)); mark_harmless; nunits = m->max; } m->nunits = nunits; /* Override the default value. */ return m; } CLR_PRINTF(WARNINGS, warning, ("! Invalid alloc abbreviation \"%s[%lu]\"\n", (char *)abbrev,nunits)); mark_harmless; return m; } @ Here is the allocation routine that works with the |ALLOC| macro. It returns a pointer to allocated memory, and also sets an|unsigned long| variable with the number of units (not bytes) allocated. @=@[ void HUGE * alloc FCN((abbrev,pnunits,nsize,dn)) CONST outer_char abbrev[] C0("Abbreviation for desired object.")@; BUF_SIZE HUGE *pnunits C0("Pointer to returned \# of units.")@; size_t nsize C0("Size of object.")@; int dn C1("Incremental number of units to allocate.")@; { MEM HUGE *m = find_abbrev(abbrev); *pnunits = m->nunits; /* |dn| is used as a flag; if it's negative, we just obtain the number of units. */ if(dn < 0) return NULL; else return get_mem0(abbrev, (*pnunits)+dn, nsize); } @ Search through the abbreviations list to get the element. @=@[ MEM HUGE * find_abbrev FCN((abbrev)) CONST outer_char abbrev[] C1("")@; { MEM HUGE *m; for(m=mem; *m->abbrev; m++) if(STRCMP(m->abbrev,abbrev)==0) return m; CONFUSION("find_abbrev", "Bad alloc abbreviation \"%s\"", abbrev); return NULL; } @ Annoyingly, Microsoft doesn't supply a reallocation routine that works with |halloc|, presumably because it doesn't do heap management with |huge| stuff. So, we write our own. We simply allocate new space, copy the old to the new, then free the old. @=@[ #ifdef mcc void HUGE * hrealloc FCN((old_ptr, new_size, old_size)) void HUGE *old_ptr C0("Old buf previously allocated with |halloc|.")@; BUF_SIZE new_size C0("New size in bytes.")@; BUF_SIZE old_size C1("Old size in bytes.")@; { void HUGE *new_ptr; BUF_SIZE num_to_copy; size_t ncopied; new_ptr = GET_MEM("hrealloc", new_size, char); if(new_ptr == NULL) return NULL; num_to_copy = MIN(old_size, new_size); ncopied = (size_t)num_to_copy; if((BUF_SIZE)ncopied != num_to_copy) CONFUSION("hrealloc", "trying to copy %lu bytes; more than size_t", num_to_copy); memcpy(new_ptr, old_ptr, ncopied); FREE_MEM(old_ptr, "old_ptr", old_size, char); return new_ptr; } #endif /* |mcc| */ @* STORAGE of IDENTIFIERS and MODULE NAMES. Both \.{WEAVE} and \.{TANGLE} store identifiers, module names and other strings in a large array of |ASCII|s, called |byte_mem|. Information about the names is kept in the array |name_dir|, whose elements are structures of type \&{NAME\_INFO}, containing a pointer into the |byte_mem| array (the address where the name begins) and other data. A \&{name\_pointer} variable is a pointer into |name_dir|. @= ALLOC(ASCII,byte_mem,ABBREV(max_bytes),max_bytes,0); // Characters of names. byte_end = byte_mem + max_bytes - 1; // End of |byte_mem|. ALLOC(NAME_INFO,name_dir,ABBREV(max_names),max_names,0); // Information about names. name_end = name_dir + max_names - 1; // End of |name_dir|. ALLOC(ASCII,mod_text,ABBREV(longest_name),longest_name,1); mod_end = mod_text+longest_name; // End of |mod_text|. @I trunc.hweb @ The actual sequence of characters in the name pointed to by a |name_pointer p| appears in positions |p->byte_start| to |(p+1)->byte_start|, inclusive. The |prn_id| macro prints this text on the user's terminal. @=@[ unsigned prn_id FCN((np)) name_pointer np C1("")@; { ASCII_write(*np->byte_start == BP_MARKER ? ((BP *)np->byte_start)->Root->id : np->byte_start,Length(np)); return PTR_DIFF(unsigned, np, name_dir); } int Length FCN((np)) name_pointer np C1("")@; { int n; BP HUGE *bp; TRUNC HUGE *s; CONST ASCII HUGE *p0; CONST ASCII HUGE *p1; p0 = np->byte_start; bp = (BP *)p0; if(*(char *)bp == BP_MARKER) { s = bp->Root; n = PTR_DIFF(int, s->id_end, s->id); } else { p1 = (np+1)->byte_start; PROPER_END(p1); n = PTR_DIFF(int, p1, p0); } return n; } @ The first unused position in |byte_mem| and |name_dir| is kept in |byte_ptr| and |name_ptr|, respectively. Thus we usually have |name_ptr->byte_start=byte_ptr|, and certainly we want to keep |name_ptr<=name_end| and |byte_ptr<=byte_end|. @= IN_COMMON name_pointer name_ptr; // First unused position in |byte_start|. IN_COMMON ASCII HUGE *byte_ptr; // First unused position in |byte_mem|. @ @= CAST(name_pointer,name_dir)->byte_start=byte_ptr=byte_mem; /* position zero in both arrays */ name_ptr=name_dir+1; /* |name_dir[0]| will not be used */ CAST(name_pointer,name_ptr)->byte_start=byte_mem; /* this makes name 0 of length zero */ @ The names of identifiers are found by computing a hash address |h| and then looking at strings of bytes signified by the |name_pointer|s |hash[h]|, |hash[h]->link|, |hash[h]->link->link|, \dots, until either finding the desired name or encountering the null pointer. The hash table itself consists of |hash_size| entries of type |name_pointer|, and is updated by the |id_lookup| procedure, which finds a given identifier and returns the appropriate |name_pointer|. The matching is done by the function |names_match|, which is slightly different in \.{WEAVE} and \.{TANGLE}. If there is no match for the identifier, it is inserted into the table. @d hash_size 353 /* should be prime */ @ Initially all the hash lists are empty. @= hash = GET_MEM("hash",hash_size,name_pointer); hash_end = hash + hash_size - 1; for (h=hash; h<=hash_end; *h++=NULL) ; @ Here is the main procedure for finding identifiers. The type of identifier being considered is held in the global variable |word_type| (set in \.{reserved.web}, function |save_id|; this comes into play when |last == NULL|. @=@[ name_pointer id_lookup FCN((first,last,t)) CONST ASCII HUGE *first C0("First character of string.")@; CONST ASCII HUGE *last C0("last character of string plus one.")@; eight_bits t C1("The |ilk|; used by \.{WEAVE} only.")@; { CONST ASCII HUGE *i=first; /* position in |cur_buffer| */ int h; /* hash code */ int l; /* length of the given identifier */ name_pointer p; /* where the identifier is being sought */ WORD_TYPE word_type0 = ORDINARY_ID; if(last == NULL) { word_type0 = word_type; for (last=first; *last!='\0'; last++) ; // Find end of identifier. } l = PTR_DIFF(int,last,first); /* compute the length */ @; @; if (p==name_ptr) @; if(!(p->Language & (boolean)language)) p->ilk = t; p->Language |= (boolean)language; /* Record language usage. This line is dangerous if one is using |id_lookup| for a query from a routine for a language other than the current one; see |ini_special_tokens|. */ switch(word_type0) { case RESERVED_WD: p->reserved_word |= (boolean)language; break; case INTRINSIC_FCN: p->intrinsic_word |= (boolean)language; break; case KEYWD: p->keyword |= (boolean)language; break; default: ; /* Avoids warning about unused |enum|. */ } return p; } @ The following two routines |find_n| and |find_s| are for rapid debugging of the |name_dir|. They are to be called from the debugger. |find_n| prints information about the $n$th~identifier; |find_s| prints information about the identifier named~|s|. @=@[ sixteen_bits find_n FCN((n)) sixteen_bits n C1("")@; { name_pointer np; CONST ASCII HUGE *end; outer_char HUGE *s; size_t len; np = name_dir + n; if(np >= name_ptr) { printf("!! n = %u exceeds nmax = %u.\n", n, PTR_DIFF(unsigned, name_ptr, name_dir) - 1); return 0; } PROPER_END(end); len = PTR_DIFF(size_t, end, np->byte_start); // Length of the $n$th identifier. s = GET_MEM("find_n",len+1,outer_char); // Allocate temporary area. STRNCPY(s,np->byte_start,len); TERMINATE(s,len); /* Convert from |ASCII| to the outer world; print info about id. */ to_outer((ASCII HUGE *)s); id_info(np,(long)n,(CONST outer_char *)s, NULL); FREE_MEM(s,"find_n",len+1,outer_char); return n; } sixteen_bits find_s FCN((s)) CONST outer_char *s C1("")@; { int h,l; name_pointer p; ASCII HUGE *a; CONST ASCII HUGE *first, HUGE *last; CONST ASCII HUGE *i; sixteen_bits n = 0; l = STRLEN(s); a = GET_MEM("find_s",l+1,ASCII); STRCPY(a,s); i = first = to_ASCII((outer_char *)a); last = first + l; @@; p=hash[h]; while (p && !(STRNCMP(first,p->byte_start,l) == 0)) p = p->link; if(p == NULL) {CLR_PRINTF(WARNINGS, warning, ("%cId \"%s\" is not in name_dir!\n", beep(1), (char *)s));} else id_info(p,(long)(n=(sixteen_bits)(p-name_dir)),s, NULL); FREE_MEM(a,"find_s",l+1,ASCII); return n; } @I t_codes.hweb @ @=@[ sixteen_bits find_id FCN((a0,a1)) eight_bits a0 C0("")@; eight_bits a1 C1("")@; { return find_n(IDENTIFIER(a0,a1)); } @ The information utility used in |find_n| and |find_s|; also in |see_reserved|. @=@[ SRTN id_info FCN((np,n,s,prsrvd)) name_pointer np C0("")@; long n C0("")@; CONST outer_char *s C0("")@; CONST RSRVD HUGE *prsrvd C1("")@; { if(n >= 0) printf(_Xx("Id %ld (0x%lx):"),n,n); if(!prsrvd || (prsrvd->reserveds && np->reserved_word) || (prsrvd->intrinsics && np->intrinsic_word) || (prsrvd->keywords && np->keyword)) printf(" \"%s\"\n", (char *)s); if(!prsrvd) pr_lan("Language ", np->Language); if(!prsrvd || prsrvd->reserveds) pr_lan("reserved ", np->reserved_word); if(!prsrvd || prsrvd->intrinsics) pr_lan("intrinsic", np->intrinsic_word); if(!prsrvd || prsrvd->keywords) pr_lan("keyword ", np->keyword); } @ @= IN_COMMON boolean info_option CSET(NO); IN_COMMON boolean see_rsrvd CSET(NO); IN_COMMON RSRVD rsrvd #if(part == 0 || part == 1) = {NULL, NO, NO, NO} #endif // |part == 1| ; IN_COMMON outer_char HUGE *style_args CSET(NULL); IN_STYLE ASCII HUGE *at_codes; @ Some info options can be executed only after dynamic memory is allocated. After that, if no web file was specified on the command line we just terminate gracefully. @= { if(rsrvd.args) see_reserved(&rsrvd); if(style_args) see_style(style_args, NO); if(!found_web && info_option && !at_codes) wrap_up(); } @ Format the language dependence of a boolean variable~|b|, for debugging and the \.{-D}~option. @=@[ SRTN pr_lan FCN((name,b)) CONST char *name C0("")@; boolean b C1("")@; { unsigned k; // For scanning over the 8 possibilities. boolean first = YES; if(b==0) return; // Not turned on at all. printf(" %s = { ",name); for(k=1; k<=$EVAL(2^^8); k<<=1) if(k & b) { printf("%s%s", first ? "" : ", ", languages[lan_num((LANGUAGE)k)]); first = NO; } if(first) printf("(none)"); printf(" }"); @% printf(_Xx(" (0x%x)"), b); puts(""); } @ More debugging: Print out the entire |name_dir|. @=@[ BUF_SIZE prn_nd(VOID) { BUF_SIZE k, n = name_ptr - name_dir; for(k=0; k= h=*i; while (++i= p=hash[h]; while (p && !names_match(p,first,l,t)) p=p->link; if (p==NULL) { p=name_ptr; /* the current identifier is new */ p->link=hash[h]; hash[h]=p; /* insert |p| at beginning of hash list */ } @ The information associated with a new identifier must be initialized in a slightly different way in \.{WEAVE} than in \.{TANGLE}; hence the |ini_p| procedure. @= @B if (byte_ptr+l>byte_end) OVERFLW("bytes",ABBREV(max_bytes)); if (name_ptr>=name_end) OVERFLW("names",ABBREV(max_names)); STRNCPY(byte_ptr,first,l); (++name_ptr)->byte_start = byte_ptr += l; if (program==weave) ini_p(p,t); } @ The names of modules are stored in |byte_mem| together with the identifier names, but a hash table is not used for them because \.{TANGLE} needs to be able to recognize a module name when given a prefix of that name. A conventional binary seach tree is used to retrieve module names, with fields called |llink| and |rlink| (where |llink| takes the place of |link|). The root of this tree is stored in |name_dir->rlink|; this will be the only information in |name_dir[0]|. Since the space used by |rlink| has a different function for identifiers than for module names, we declare it as a |union|. @ The binary search tree starts out with nothing in it. @= root = NULL; @ The |mod_lookup| procedure finds a module name in the search tree, after inserting it if necessary, and returns a pointer to where it was found. According to the rules of \.{WEB}, no module name should be a proper prefix of another, so a ``clean'' comparison should occur between any two names. The result of |mod_lookup| is |NULL| if this prefix condition is violated. An error message is printed when such violations are detected. (Note that the |LESS|, |EQUAL|, and |GREATER| conventions here are different than those for |strcmp|; they are defined in \.{typedefs.hweb}.) @=@[ name_pointer mod_lookup FCN((k,l)) CONST ASCII HUGE *k C0("First character of name.")@; CONST ASCII HUGE *l C1("Last character of name.")@; { LEXI c = GREATER; /* comparison between two names */ name_pointer p = root; /* current node of the search tree */ name_pointer q = name_dir; /* father of node |p| */ while (p) { c = web_strcmp(k,l+1,p->byte_start,(p+1)->byte_start); q=p; switch(c) { case LESS: p=p->llink; continue; case GREATER: p=p->rlink; continue; case EQUAL: return p; default: ERR_PRINT(C,"Incompatible section names"); return NULL; @.Incompatible section names@> } } return install_node(q,c,k,PTR_DIFF(int,l,k)+1); } @ This function is like |strcmp|, but it does not assume the strings are null-terminated. @=@[ LEXI web_strcmp FCN((j,j1,k,k1)) /* fuller comparison than |strcmp| */ CONST ASCII HUGE *j C0("Beginning of first string.")@; CONST ASCII HUGE *j1 C0("End of first string plus one.")@; CONST ASCII HUGE *k C0("Beginning of second string.")@; CONST ASCII HUGE *k1 C1("End of second string plus one.")@; { while (krlink| point to the root of the tree when |q=name_dir|, that is, the first time it is called. The information associated with a new node must be initialized in a slightly different way in \.{WEAVE} than in \.{TANGLE}; hence the |ini_node| procedure. @=@[ name_pointer install_node FCN((parent,c,j,name_len)) /* install a new node in the tree */ name_pointer parent C0("Parent of new node.")@; int c C0("Right or left?")@; CONST ASCII HUGE *j C0("Where replacement text starts.")@; int name_len C1("length of replacement text.")@; { name_pointer node=name_ptr; /* new node */ if (byte_ptr+name_len>byte_end) OVERFLW("bytes",ABBREV(max_bytes)); if (name_ptr==name_end) OVERFLW("names",ABBREV(max_names)); if (c==LESS) parent->llink=node; else parent->rlink=node; node->llink=node->rlink=NULL; ini_node(node); STRNCPY(byte_ptr,j,name_len); (++name_ptr)->byte_start=byte_ptr+=name_len; return node; } @ The |prefix_lookup| procedure is supposed to find exactly one module name that has |k..l| as a prefix. Actually the algorithm silently accepts also the situation that some module name is a prefix of |k..l|, because the user who painstakingly typed in more than necessary probably doesn't want to be told about the wasted effort. @=@[ name_pointer prefix_lookup FCN((k,l)) /* finds module name given a prefix */ CONST ASCII HUGE *k C0("First char of prefix.")@; CONST ASCII HUGE *l C1("Last char of prefix.")@; { LEXI c = GREATER; /* comparison between two names */ short count = 0; /* the number of hits */ name_pointer p = root; /* current node of the search tree */ name_pointer q = NULL; /* another place to resume the search after one is done */ name_pointer r = NULL; /* extension found */ while (p) { c=web_strcmp(k,l+1,p->byte_start,(p+1)->byte_start); switch(c) { case LESS: p=p->llink; break; case GREATER: p=p->rlink; break; default: r=p; count++; q=p->rlink; p=p->llink; } if (p==NULL) { p=q; q=NULL; } } if (count==0) ERR_PRINT(C,"Name does not match"); @.Name does not match@> else if (count>1) ERR_PRINT(C,"Ambiguous prefix"); @.Ambiguous prefix@> return r; /* the result will be |NULL| if there was no match */ } @ Here's a routine to be called from the debugger; it returns the directory number and the full name of a prefix. @=@[ unsigned find_prefix FCN((s)) outer_char s[] C1("")@; { name_pointer r; to_ASCII(s); r = prefix_lookup((ASCII HUGE *)s,(ASCII HUGE *)(s+STRLEN(s))); return r ? prn_id(r) : 0; } @ The last component of |name_info| is different for \.{TANGLE} and \.{WEAVE}. In \.{TANGLE}, if |p| is a pointer to a module name, |p->equiv| is a pointer to its replacement text, an element of the array |text_info|. In \.{WEAVE}, on the other hand, if |p| points to an identifier, |p->xref| is a pointer to its list of cross-references, an element of the array |xmem|. The make-up of |text_info| and |xmem| is discussed in the \.{TANGLE} and \.{WEAVE} source files, respectively; here we just declare a common field |equiv_or_xref| as a pointer to an |ASCII|. @* REPORTING ERRORS to the USER. The command `|ERR_PRINT(origin,"Error message")|' will report a syntax error to the user, by printing the error message at the beginning of a new line and then giving an indication of where the error was spotted in the source file. Note that no period follows the error message, since the error routine will automatically supply a period. The |origin| argument is one of~|C|, |T|, |W|, |R|, or~|M|; these are translated by the macro into things like |ERR_C|, an enumerated type that says where the error came from. More generally, one can say |err_print(origin,msg,args)|, where |msg| can be formatted as for |printf| and |n|~specifies how many arguments follow. Thus, |ERR_PRINT| is a special case of |err_print| with $n = 0$. The actual error indications are provided by a procedure called |error|. However, error messages are not actually reported during phase one, since errors detected on the first pass will be detected again during the second. @= IN_COMMON CONST char *origin_name[] #if(part == 0 || part == 1) = {"","COMMON","FTANGLE","FWEAVE","RATFOR","MACROS","STYLE",".fweb"} #endif // |part == 1| ; @ @=@[ SRTN err0_print FCN(VA_ALIST((err_origin,fmt,n VA_ARGS))) VA_DCL( ERR_ORIGIN err_origin C0("Where the error came from")@; CONST outer_char *fmt C0("Format of error message.")@; int n C2("Number of arguments to the string.")@;)@; { VA_LIST(arg_ptr)@; ASCII HUGE *k, HUGE *l; /* pointers into |cur_buffer| */ char temp[500]; boolean prn_input_buffer; boolean newline_first; #if(NUM_VA_ARGS == 1) ERR_ORIGIN err_origin; CONST outer_char *fmt; int n; #endif VA_START(arg_ptr, n); #if(NUM_VA_ARGS == 1) err_origin = va_arg(arg_ptr,ERR_ORIGIN); fmt = va_arg(arg_ptr,outer_char *); va_arg(arg_ptr,int); #endif prn_input_buffer = BOOLEAN(err_origin!=ERR_NULL); if(n < 0) { n = -(n+1); newline_first = NO; } else newline_first = YES; if(prn_input_buffer && err_origin != ERR_S && newline_first) putchar('\n'); SET_COLOR(error); if(prn_input_buffer) { printf("! "); CLR_PRINTF(ALWAYS, md_name, ("(%s)", origin_name[err_origin])); sprintf(temp,": %s", (char *)fmt); vprintf(temp, arg_ptr); } else vprintf((char *)fmt, arg_ptr); va_end(arg_ptr); if(prn_input_buffer) { outer_char last_char = fmt[STRLEN(fmt)-1]; if(*fmt && last_char != '?' && last_char != '!') printf("."); /* Sometimes the third argument to |fatal| is empty, so the period isn't necessary; or the phrase ends with a question mark or exclamation point. */ if(err_origin == ERR_S) @@; else @@; } fflush(stdout); mark_error; if(prn_input_buffer && err_origin != ERR_S && !newline_first) putchar('\n'); mfree(); // Free up any |mod_trans| allocations. free_buf(&sput_buf); set_color(NORMAL); } @ The error locations can be indicated by using the global variables |loc|, |cur_line|, |cur_file_name| and |changing|, which tell respectively the first unlooked-at position in |cur_buffer|, the current line number, the current file, and whether the current line is from |change_file| or |cur_file|. This routine should be modified on systems whose standard text editor has special line-numbering conventions. @^system dependencies@> @d MAX_ERR_BUF 160 @= { if(cur0_prms) { if (changing) { CLR_PRINTF(ALWAYS, line_num, (" (l. %u of %s file ", change_line, "change")); CLR_PRINTF(ALWAYS, in_file, ("%s)\n", (char *)change_file_name)); } else if (incl_depth==WEB_FILE) { CLR_PRINTF(ALWAYS, line_num, (" (l. %u)\n", cur_line)); } else { CLR_PRINTF(ALWAYS, line_num, (" (l. %u of %s file ",cur_line,"include")); CLR_PRINTF(ALWAYS, in_file,("%s)\n", (char *)cur_file_name)); } l = MIN(loc,limit); SET_COLOR(ordinary); if (l>cur_buffer && cur_buffer!=NULL) { if((BUF_SIZE)(l-cur_buffer) > buf_size) { CLR_PRINTF(ALWAYS, error, ("! TROUBLE IN ERROR ROUTINE. PLEASE REPORT THIS!\n")); mark_error; l = cur_buffer + MAX_ERR_BUF; } for (k=cur_buffer; k 127 ? ' ' : XCHR(*k)); /* print the characters already read */ putchar('\n'); // Separate already read from not yet read. multi_chars(' ', l - cur_buffer); // Space out the next line. } if(l != NULL) { if((BUF_SIZE)(limit-l) > buf_size) { puts("! TROUBLE IN ERROR ROUTINE. PLEASE REPORT THIS!"); l = limit - MAX_ERR_BUF; } for (k=l; k 127 ? ' ' : XCHR(*k)); /* print the part not yet read */ } if(limit != NULL) if (*limit==@'|') putchar('|'); // End of code text in module names. putchar(' '); // To separate the message from future asterisks. err_happened = YES; } } @ Print a character multiple times. @a SRTN multi_chars FCN((c, n)) outer_char c C0("Character to print")@; int n C1("Number of times to print")@; { while(--n >= 0) putchar(c); } @ @= { CONST outer_char HUGE *k, HUGE *l; IN_STYLE boolean from_sprm; printf(" (l. %u of %s file ", s_line, "style"); CLR_PRINTF(ALWAYS, in_file, ("%s)\n", from_sprm ? "parameter buffer" : (char *)style_file_name)); l = MIN(sloc,slimit); for (k=sbuf; k 127 ? ' ' : (*k == '\t' ? ' ' : *k)); // Print the characters already read. putchar('\n'); // Separate already read from not yet read. multi_chars(' ', l - sbuf); // Space out the next line. for (k=l; k 127 ? ' ' : *k); // Print the part not yet read. putchar('\n'); } @ When no recovery from some error has been provided, we have to wrap up and quit as graciously as possible. This is done by calling the function |wrap_up| at the end of the code. @=@[ int fatal FCN(VA_ALIST((err_origin, s1, fmt VA_ARGS))) VA_DCL( ERR_ORIGIN err_origin C0("Where the error came from")@; CONST outer_char s1[] C0("Basic message.")@; CONST outer_char fmt[] C2("Elaboration.")@;)@; { VA_LIST(arg_ptr)@; #if(NUM_VA_ARGS == 1) ERR_ORIGIN err_origin; CONST outer_char s1[]; CONST outer_char fmt[]; #endif outer_char temp[500]; VA_START(arg_ptr, fmt); #if(NUM_VA_ARGS == 1) err_origin = va_arg(arg_ptr, ERR_ORIGIN); s1 = va_arg(arg_ptr, outer_char *); fmt = va_arg(arg_ptr, outer_char *); #endif printf("\n"); if(err_origin != ERR_NULL) { CLR_PRINTF(ALWAYS, fatal, ("! ")); CLR_PRINTF(ALWAYS, md_name, ("(%s)", origin_name[err_origin])); CLR_PRINTF(ALWAYS, fatal, (": ")); } CLR_PRINTF(ALWAYS, fatal,((char *)s1)); vsprintf((char *)temp, (CONST char *)fmt, arg_ptr); err0_print(ERR_NULL, temp, 0); history = FATAL_MESSAGE; va_end(arg_ptr); return wrap_up(); /* It never really returns, but the compiler doesn't know that. */ } @ Sometimes the program's behavior is far different from what it should be, and \.{WEB} prints an error message that is really for the \.{WEB} maintainance person, not the user. In such cases the program says |confusion("indication of where we are","what went wrong")|. The second argument is actually a format in the style of |printf|, and there may optionally be additional arguments that are printed into the format. Note that this function doesn't really return. It's coded this way so compilers don't give spurious warnings. @=@[ int confusion FCN(VA_ALIST((where, fmt0 VA_ARGS))) VA_DCL( CONST outer_char where[] C0("")@; CONST outer_char fmt0[] C2("")@;)@; { outer_char fmt[200], temp[200]; VA_LIST(arg_ptr)@; #if(NUM_VA_ARGS == 1) CONST outer_char where[]; CONST outer_char fmt0[]; #endif VA_START(arg_ptr, fmt0); #if(NUM_VA_ARGS == 1) where = va_arg(arg_ptr, outer_char *); fmt0 = va_arg(arg_ptr, outer_char *); #endif SPRINTF(200, fmt, `"\n At %s: %s.", where, fmt0`); vsprintf((char *)temp, (CONST char *)fmt, arg_ptr); beep(3); return FATAL(NULL, "\n!!! \ I'M CONFUSED; this shouldn't happen. PLEASE REPORT THIS!!! ", temp); } @.This shouldn't happen@> @ An overflow stop occurs if \.{WEB}'s tables aren't large enough. @=@[ SRTN overflow FCN((s,abbrev)) CONST outer_char s[] C0("Condition that caused overflow.")@; CONST outer_char abbrev[] C1("Abbreviation for buffer.")@; { if(*abbrev == '\0') { FATAL(NULL, "!!! Sorry, CAPACITY EXCEEDED: ", "%s contents too long.", (char *)s); } else { MEM HUGE *m = msearch(abbrev,0L); FATAL(NULL, "!!! Sorry, CAPACITY EXCEEDED: ", "Too many %s. Current number is %lu, absolute max is \ %lu. Use command-line option \"-y%s...\" to override default.", (char *)s, m->nunits, m->max, (char *)abbrev); } } @.Sorry, capacity exceeded@> @ A special case of |overflow| is useful for style-file parameters. @=@[ SRTN new_sprm FCN((name, value)) CONST outer_char name[] C0("Name of parameter.")@; int value C1("Integer value of parameters.")@; { char temp[100]; sprintf(temp, "Please increase style-file parameter `%s' from current value \ of %i;", name, value); OVERFLW(temp, ""); } @ Some implementations may wish to pass the |history| value to the operating system so that it can be used to govern whether or not other programs are started. Here, for instance, we pass the Unix operating system a status of~ 0 if and only if only harmless messages were printed. @^system dependencies@> @=@[ #if(VMS) #include stsdef // Return codes. #endif /* |VMS| */ int wrap_up(VOID) { /* --- Finish up --- */ if(statistics) see_statistics(); /* Invoked by command-line option~\.{-s}. (\FTANGLE\ and \FWEAVE\ each has its own version of |see_statistics|.) */ #if TIMING prn_time(); #endif // |TIMING| @@; @@; SET_COLOR(ordinary); #if(VMS) switch(history) { case SPOTLESS: exit(STS$K_SUCCESS | STS$M_INHIB_MSG); case HARMLESS_MESSAGE: exit(STS$K_INFO | STS$M_INHIB_MSG); case ERROR_MESSAGE: exit(STS$K_ERROR | STS$M_INHIB_MSG); case FATAL_MESSAGE: exit(STS$K_SEVERE | STS$M_INHIB_MSG); } #else switch(history) { case SPOTLESS: case HARMLESS_MESSAGE: exit(0); default: exit(1); // Some reasonably serious error occurred. } #endif // |VMS| return -1; // Never really does this. } @ With some systems, it seems to be helpful to close the open files explicitly, rather than letting |exit| do it. I don't know why. @= { if(cur_prms.web && cur_prms.web->File) fclose(cur_prms.web->File); if(cur_prms.change && cur_prms.change->File) fclose(cur_prms.change->File); cls_files(); // Do stuff specific to \FTANGLE\ or \FWEAVE. } @ @= { if(msg_level >= SHORT_INFO || (msg_level >= WARNINGS && history >= HARMLESS_MESSAGE) || (history >= ERROR_MESSAGE)) { putchar('\n'); CLR_PRINTF(ALWAYS, program_name, ("[%s:",program==tangle ? TANGLE : WEAVE)); printf(" "); } switch(history) { case SPOTLESS: CLR_PRINTF(SHORT_INFO, info, ("No errors were found.")); break; case HARMLESS_MESSAGE: CLR_PRINTF(WARNINGS, warning, ("%cDid you see the warning message(s) above?", beep(1))); break; case ERROR_MESSAGE: CLR_PRINTF(ALWAYS, error, ("%cPardon me, but I think I spotted something wrong.", beep(1))); break; case FATAL_MESSAGE: CLR_PRINTF(ALWAYS, fatal, ("%cThat was a fatal error, my friend.", beep(2))); break; } // There are no other cases. if(msg_level >= SHORT_INFO || (msg_level >= WARNINGS && history >= HARMLESS_MESSAGE) || (history >= ERROR_MESSAGE)) CLR_PRINTF(ALWAYS, program_name, ("]\n")); set_color(NORMAL); } @ Certain errors beep the terminal. The beeps can be turned off (and replaced by an exclamation point) with the \.{-B} option. @=@[ char beep FCN((n)) int n C1("")@; { if(beeps) { for(--n; n>0; n--) printf("\007"); fflush(stdout); return '\007'; // (Some compilers didn't understand \.{'\\a'}.) } else return '!'; } @ The following error routine is called if there's problem with writing. Usually, this means that you've run out of disk space. @=@[ SRTN out_error FCN((fcn)) CONST outer_char fcn[] C1("")@; { FATAL(C, "Output error", "from %s (quota exceeded?).", fcn); } @ Here is a function that accepts either \.{yes} or \.{no} from the keyboard, then returns~1 or~0. @=@[ boolean verify FCN(VA_ALIST((fmt VA_ARGS))) VA_DCL( CONST outer_char fmt[] C2("")@;)@; { VA_LIST(arg_ptr)@; outer_char buf[80]; VA_START(arg_ptr, fmt); vprintf_((CONST char *)fmt, arg_ptr)@; va_end(arg_ptr); printf(" ["); CLR_PRINTF(ALWAYS, info, ("yes")); printf("/"); CLR_PRINTF(ALWAYS, error, ("no")); printf("]? "), fflush(stdout); WHILE() { SET_COLOR(ordinary); gets((char *)buf); if(STRCMP(buf, "yes") == 0 || STRCMP(buf, "no") == 0) break; SET_COLOR(error); printf(">>> Please answer ``yes'' or ``no'': "); fflush(stdout); } return (STRCMP(buf, "yes") == 0); } @* INITIALIZING FLAGS. @= { int k; for(k=0; k<128; k++) TeX[k] = TeX_other; for(k=@'A'; k<=@'Z'; k++) TeX[k] = TeX_letter; for(k=@'a'; k<=@'z'; k++) TeX[k] = TeX_letter; TeX[@'\\'] = TeX_escape; TeX[@'{'] = TeX_bgroup; TeX[@'}'] = TeX_egroup; TeX[@'$'] = TeX_math_shift; TeX[@'&'] = TeX_alignment_tab; TeX[@'\n'] = TeX_eol; TeX[@'#'] = TeX_parameter; TeX[@'^'] = TeX_superscript; TeX[@'_'] = TeX_subscript; TeX[0] = TeX_ignored; TeX[@' '] = TeX[tab_mark] = TeX_space; TeX[@'~'] = TeX_active; TeX[@'%'] = TeX_comment; TeX[0177] = TeX_invalid; } @ We don't initialize the flags statically because it's too tedious to get the initialization list right if one adds a flag randomly. @= { params.uses = 0; // For safety. #define FSET(flag) = flag active_brackets FSET(ACTIVE_BRACKETS); // Special array handling? all_cmnts_verbatim FSET(ALL_CMNTS_VERBATIM); /* Should \.{TANGLE} copy all comments? */ all_includes FSET(ALL_INCLUDES); // Cross-reference all include files? auto_app_semi FSET(AUTO_APP_SEMI); /* For \.{WEAVE}, automatically append a pseudo-semi to the end of \.{WEB} macro definitions? */ auto_line FSET(AUTO_LINE); // Auto-insert line nums after \.{@@\%}? /* Append automatic semicolon or pseudo-semicolon? */ params.Auto_semi[LN(FORTRAN)] = params.Auto_semi[LN(FORTRAN_90)] = YES; params.Auto_semi[LN(RATFOR)] = params.Auto_semi[LN(RATFOR_90)] = params.Auto_semi[LN(C)] = params.Auto_semi[LN(C_PLUS_PLUS)] = params.Auto_semi[LN(LITERAL)] = params.Auto_semi[LN(TEX)] = NO; /* Which do we append: pseudo or actual? */ params.Auto_pseudo_semis[LN(FORTRAN)] = params.Auto_pseudo_semis[LN(RATFOR)] = params.Auto_pseudo_semis[LN(RATFOR_90)] = params.Auto_pseudo_semis[LN(C)] = params.Auto_pseudo_semis[LN(C_PLUS_PLUS)] = params.Auto_pseudo_semis[LN(LITERAL)] = params.Auto_pseudo_semis[LN(TEX)] = NO; params.Auto_pseudo_semis[LN(FORTRAN_90)] FSET(AUTO_PSEUDO_SEMIS); // F90 code: append pseudo-semis, not semis. params.Beeps FSET(BEEPS); /* Do we label |do|s and |if|s with the block number? */ params.Block_nums[LN(C)] = params.Block_nums[LN(C_PLUS_PLUS)] = params.Block_nums[LN(LITERAL)] = params.Block_nums[LN(TEX)] = NO; params.Block_nums[LN(FORTRAN)] = params.Block_nums[LN(FORTRAN_90)] = params.Block_nums[LN(RATFOR)] = params.Block_nums[LN(RATFOR_90)] = BLOCK_NUMS; bslash_continued_strings FSET(BSLASH_CONTINUED_STRINGS); /* Do the continuations of strings require a starting backslash? */ chk_ifelse FSET(CHK_IFELSE); // Protect parenthesized strings? chk_stmts FSET(CHK_STMTS); // Check statement syntax in \Ratfor? compare_outfiles FSET(COMPARE_OUTFILES);// Compare new vs.\ old output. compound_assignments FSET(COMPOUND_ASSIGNMENTS); /* Do we allow things like \.{+=}? */ Cpp FSET(NO); /* Do we recognize \.{C++}? */ dbg_output FSET(DBG_OUTPUT); // Print output characters? deferred_macros FSET(DEFERRED_MACROS); // Allow deferred macros? defn_mask.outer_macros FSET(PRN_OUTER_MACROS); defn_mask.formats FSET(PRN_fORMATS); defn_mask.Formats FSET(PRN_FORMATS); defn_mask.limbo FSET(PRN_LIMBO); defn_mask.macros FSET(PRN_MACROS); defn_mask.v FSET(PRN_V); defn_mask.w FSET(PRN_W); dot_constants FSET(DOT_CONSTANTS); // Recognize dot constants? params.CPP_comments[LN(C)] = params.CPP_comments[LN(C_PLUS_PLUS)] = params.CPP_comments[LN(LITERAL)] = params.CPP_comments[LN(TEX)] = CPP_COMMENTS; /* For \Fortran\ and \Ratfor, the \.{//}~is preempted for concatenation. Therefore, its use for short comments must be turned on explicitly. */ params.CPP_comments[LN(FORTRAN)] = params.CPP_comments[LN(FORTRAN_90)] = params.CPP_comments[LN(RATFOR)] = params.CPP_comments[LN(RATFOR_90)] = NO; Fortran88 FSET(FORTRAN88); // Turn on stuff for Fortran-88? Fortran_label FSET(FORTRAN_LABEL); // Label on same line? params.Free_form_input[LN(FORTRAN)] = params.Free_form_input[LN(LITERAL)] = params.Free_form_input[LN(TEX)] = NO; params.Free_form_input[LN(RATFOR)] = params.Free_form_input[LN(RATFOR_90)] = params.Free_form_input[LN(C)] = params.Free_form_input[LN(C_PLUS_PLUS)] = params.Free_form_input[LN(FORTRAN_90)] = YES; keep_trailing_comments FSET(KEEP_TRAILING_COMMENTS); // For \TeX. ignore_C FSET(IGNORE_C); // Throw away single \Fortran\ comment lines. params.In_escape[LN(FORTRAN)] = params.In_escape[LN(FORTRAN_90)] = '&'; params.In_escape[LN(RATFOR)] = params.In_escape[LN(RATFOR_90)] = params.In_escape[LN(C)] = params.In_escape[LN(C_PLUS_PLUS)] = params.In_escape[LN(LITERAL)] = params.In_escape[LN(TEX)] = '\\'; in_escape FSET(IN_ESCAPE); // Default continuation character. index_hidden FSET(INDEX_HIDDEN); // Index skipped includes files. index_one FSET(INDEX_ONE); // Index single-character identifiers? input_macros FSET(INPUT_MACROS); /* Generate the default ``\.{\\input fwebmac.tx}'' line? */ lc_keywords FSET(LC_KEYWORDS); // Lower-case \Fortran\ keywords? line_info FSET(LINE_INFO); // Should \FTANGLE\ print out line info? lowercase_tokens FSET(LOWERCASE_TOKENS); // Output lower-case tokens? m4 FSET(M4_); makeindex FSET(MAKEINDEX); // Output a \.{makeindex} file? no_xref FSET(NO_XREF); // Should \.{WEAVE} print an index? number_dos FSET(NUMBER_DOS); nuweb_mode FSET(NUWEB_MODE); // Emulate \.{nuweb}? overload_ops FSET(OVERLOAD_OPS); // Is operator overloading allowed? params.Point_comments[LN(C)] = params.Point_comments[LN(C_PLUS_PLUS)] = params.Point_comments[LN(TEX)] = params.Point_comments[LN(LITERAL)] = NO; params.Point_comments[LN(FORTRAN)] = params.Point_comments[LN(FORTRAN_90)] = params.Point_comments[LN(RATFOR)] = params.Point_comments[LN(RATFOR_90)] = POINT_COMMENTS; /* Does \.! signify a Fortran comment? */ prn_contents FSET(PRN_CONTENTS); // Print the table of contents? prn_index FSET(PRN_INDEX); // Print the index? prn_input_lines FSET(NO); /* Used in |input_ln| to print out the lines sent back. */ prn_input_addresses FSET(NO); /* Print out the buffer addresses. */ prn_modules FSET(PRN_MODULES); // Print the module list? prn_semis FSET(PRN_SEMIS); // Print semicolons in \Fortran\ output? quoted_includes FSET(QUOTED_INCLUDES); // Cross-reference quoted include files? Ratfor77 FSET(RATFOR77); /* Expand \Ratfor\ code directly to \Fortran-77? */ read_iformats FSET(READ_IFORMATS); // Read include files for formats. params.Reverse_indices[LN(C)] = params.Reverse_indices[LN(C_PLUS_PLUS)] = params.Reverse_indices[LN(TEX)] = params.Reverse_indices[LN(LITERAL)] = NO; params.Reverse_indices[LN(FORTRAN)] = params.Reverse_indices[LN(FORTRAN_90)] = params.Reverse_indices[LN(RATFOR)] = params.Reverse_indices[LN(RATFOR_90)] = REVERSE_INDICES; // C-style indexing in \Fortran? rmv_files FSET(RMV_FILES); // Remove temporary files related to \.{-H}? skip_ifiles FSET(SKIP_IFILES); // \.{-j} --- skip files already included. skip_includes FSET(SKIP_INCLUDES); /* For \.{WEAVE}, don't read in \.{@@I} commands. (Uppercase '\.{I}' only.) */ statistics FSET(STATISTICS); /* Print statistics about memory usage? */ stop_the_scan FSET(YES); /* */ subscript_fcns FSET(YES); // Module references on functions? suppress_cmds FSET(YES); /* ??? */ toggle_includes FSET(TOGGLE_INCLUDES); /* For \.{WEAVE}, read in \.{@@I} commands, but don't print them out. */ top_version FSET(TOP_VERSION); /* Header info at top of output? */ translate_ASCII FSET(TRANSLATE_ASCII0); /* Do we bother with the |xchr|--|xord| conversions? */ translate_brackets FSET(TRANSLATE_BRACKETS); /* Do we translate brackets to parentheses in \Fortran? */ truncate_ids FSET(NO); /* Shorten identifiers? */ try_extensions FSET(TRY_EXTENSIONS); // Try various file names. TeX_processor FSET(TEX_PROCESSOR); // Default \TeX\ processor. xref_unnamed FSET(XREF_UNNAMED); // Xref unnamed stuff. #undef FSET #if(TRANSLATE_ASCII || DEBUG_XCHR) translate_ASCII = YES; // Force it for the cases that really need it. #endif /* The following ensures that |ini_language| will work right. (It references |global_params|.) */ global_params = params; } @ When we're scanning for identifiers, we have sometimes to do a byte-by-byte comparison looking for special strings. These have to be |ASCII|, not ordinary compiler strings. Thus, we initialize them here. @= IN_COMMON ASCII HUGE *pformat,HUGE *pdefault, HUGE *pdata, HUGE *pbp, HUGE *pinclude, HUGE *ppragma, HUGE *pcontains; @ We must translate the |outer_char| strings into |ASCII|. @= { pformat = x__to_ASCII(OC("format")); pdata = x__to_ASCII(OC("data")); pdefault = x__to_ASCII(OC("default")); pbp = x__to_ASCII(OC("_BP")); pinclude = x__to_ASCII(OC("include")); ppragma = x__to_ASCII(OC("pragma")); conv_bi(incl_likes); conv_bi(WEB_incl_likes); conv_bi(non_labels); conv_dot(dots0); conv_dot(mcmds); } @* COMMAND-LINE ARGUMENTS. The user calls \.{WEAVE} and \.{TANGLE} with arguments on the command line. These are either file names or flags (beginning with |'-'|). The following globals are for communicating the user's desires to the rest of the program. The various file name variables contain strings with the names of those files. See the user manual for a detailed description of the various flags. @= IN_COMMON outer_char outp_buf[MAX_OUTPUT_LINE_LENGTH]; // FORTRAN's output buffer. IN_COMMON int nbuf_length CSET(72); IN_COMMON outer_char wbprefix[MAX_FILE_NAME_LENGTH]; // Possible directory prefix for the web file name. /* Signifies the end of a directory prefix. */ IN_COMMON outer_char prefix_end_char CSET(PREFIX_END_CHAR); IN_COMMON boolean all_std CSET(NO); // Do we route all output to |stdout|? @ We now must look at the command line arguments and set the file names accordingly. At least one file name must be present: the \.{WEB} file. It may have an extension, or it may omit it to get |'.web'| added. The \TeX\ output file name is formed by replacing the \.{WEB} file name extension by |'.tex'|, and the code output file name by replacing the extension by~|'.c'|, |'.rat'|, or~|'.for'|. If there is another file name present among the arguments, it is the change file, again either with an extension or without one to get~|'.ch'| An omitted change file argument means that \.{/dev/null} (for Unix), \.{nl:} (for VMS), or \.{NUL} (for DOS) should be used, when no changes are desired. (These default extensions are in the style file, and can be overridden.) @^system dependencies@> The following function should be superceded by ANSI's |strchr|. @= char HUGE *index FCN((s,c)) /* this is standard, but the name is not */ char HUGE *s C0("String to be searched.")@; char c C1("Search for this character.")@; { while (*s!=c && *s!='\0') s++; if (*s=='\0') return NULL; return s; } @*1 Scanning command-line arguments. |scan_args| is the major routine that handles the command-line arguments. If a command-line option doesn't begin with a hyphen, it's a file name. If it just a hyphen, it means ``\.{stdin}''. Otherwise, it's an option. @= IN_COMMON boolean found_web,found_change; // Have these names been seen? IN_COMMON outer_char wbflnm0[MAX_FILE_NAME_LENGTH]; // The root name of the web file. @ @=@[ SRTN scan_args(VOID) { outer_char wbflnm[MAX_FILE_NAME_LENGTH]; /* Build the command line in a buffer. */ cmd_ln_buf = cmd_line(argc, argv); /* Add the arguments from the ini file \.{.fweb}. This resets |argc| and |argv|, and also ignores |argv[0]| from the command line. */ set_args(&argc, &argv); /* Process all the arguments in order from left to right. */ do_args(YES, argc, argv, &found_web, wbflnm, &found_change); banner(); // Start-up banner. if(statistics) mem_avail(0); /* How much memory is available at start? */ @@; @@; @; if (!(found_web || info_option)) usage("!! Missing webfile name.\n", YES); if (!found_change) *change_file_name = '\0'; // This means null file. } @ Here we allocate a buffer and build the command line into it. @d WEAVE_LINE0 OC("{\"") @d TANGLE_LINE0 OC(" COMMAND LINE: \"") @d WEAVE_LINE1 OC("\"} ") @d TANGLE_LINE1 OC("\"") @d ESCAPE_LENGTH 256 @=@[ outer_char HUGE * cmd_line FCN((num_args,args)) int num_args C0("Number of arguments on command line.")@; outer_char *args[] C1("Array of pointers to arguments.")@; { int k,len,l0,l1; outer_char HUGE *buf,HUGE *b, HUGE *line0, HUGE *line1; outer_char p[ESCAPE_LENGTH]; /* The escaped argument. */ if(program==tangle) { line0 = TANGLE_LINE0; line1 = TANGLE_LINE1; } else { line0 = WEAVE_LINE0; line1 = WEAVE_LINE1; } /* Determine required buffer length. */ for(k=0,len=0; k 0) { int n = esc_file_name(p, ESCAPE_LENGTH, *(args++)); STRNCPY(b, p, n); b += n; *b++ = ' '; } STRCPY(--b, line1); /* Kill off final blank. */ return buf; } @*1 Processing {\tt .fweb}. Here we handle the initialization file \.{.fweb}. If it exists, it is opened. Arguments beginning with a '\.-' are placed before the command-line arguments (\.+ also works for backward compatibility); those beginning with a '\.\&' are placed after the command-line arguments. @= IN_COMMON outer_char HUGE * HUGE *ini_args, // Arguments read from the ini file; allocated dynamically. HUGE * HUGE *new_args, /* The new list of all arguments; allocated dynamically. */ HUGE * HUGE *pn; // Pointer to the current new argument being processed. IN_COMMON outer_char HUGE * HUGE *pn0; // Marks end of ini args. IN_COMMON outer_char HUGE * HUGE *pn1; // Marks end of cmd-line args. IN_COMMON FILE *ini_file CSET(NULL); // The ini file \.{.fweb}. @ @d MAX_INI_ARGS 100 // Max \# of arguments in the ini file. @d T_SIZE 200 // Buffer length for |fgets|. @d INI_CMNT_CHAR '%' @d BEFORE_CHAR '-' @d MIDDLE_CHAR '0' @d AFTER_CHAR '&' @=@[ SRTN set_args FCN((pargc,pargv)) int HUGE *pargc C0("Pointer to the arg count; new value returned.")@; outer_char HUGE * HUGE * *pargv C1("Ptr to the array of ptrs; returned.")@; { int k,n; outer_char HUGE *buffer, // Put one line from ini file into here. HUGE *temp, HUGE *t, // Extract the argument into here. HUGE * HUGE *a, // The current ini arg. HUGE *pc; // Pointer to possible comment character in ini line. boolean blank; outer_char ini_file_name[MAX_FILE_NAME_LENGTH]; /* Allocate temporary buffers. */ buffer = GET_MEM("buffer",T_SIZE,outer_char); temp = GET_MEM("temp",T_SIZE,outer_char); /* We start by assuming there is no ini file, hence no argument. */ k = 0; // Argument count. ini_args = GET_MEM("ini_args", MAX_INI_ARGS, outer_char HUGE *); @@; /* If there is an ini file, then put the arguments into an array. */ if(ini_file) @@; /* Allocate space for all the arguments, both ini and command-line. (We don't count |argv[0]| from command line.) */ pn = new_args = GET_MEM("new_args", n=*pargc-1+k, outer_char HUGE *); acopy(BEFORE_CHAR, ini_args, k); // Put those starting with '\.+' or '\.-' first. pn0 = pn; // Mark end of the ini stuff. acopy(MIDDLE_CHAR, (outer_char HUGE **)(*pargv), *pargc); // Then the command-line arguments. pn1 = pn; // Mark end of command-line arguments. acopy(AFTER_CHAR, ini_args, k); // Then the rest. /* Return the new number and array of arguments. */ *pargc = n; *pargv = new_args; FREE_MEM(ini_args, "ini_args", MAX_INI_ARGS, outer_char HUGE *); FREE_MEM(buffer, "buffer", T_SIZE, char); FREE_MEM(temp, "temp", T_SIZE, char); } @ We will look for the ini file in the user's root directory, if possible. We determine this by querying the environment with |getenv|. @d HOME OC("HOME") // The Unix-standard name for the top-level directory. @d ENV_INI OC("FWEB_INI") // Default root name to use. @d ENV_INCLUDES OC("FWEB_INCLUDES") // The include path for \FWEB\ files. @d ENV_HDR_INCLUDES OC("FWEB_HDR_INCLUDES") // \.{gcc -I} options. @= @B outer_char *p_root, ini_root[MAX_FILE_NAME_LENGTH]; #if HAVE_GETENV /* \.{Machine-dependent}: Understands |getenv|. */ p_root = GETENV(ENV_INI); if(p_root) STRCPY(ini_root, p_root); else STRCPY(ini_root, OC(FWEB_INI)); more_includes(&incl, GETENV(ENV_INCLUDES)); // Included \FWEB\ files. more_includes(&hdr_incl, GETENV(ENV_HDR_INCLUDES)); // Included C files to be scanned by preprocessor. #else STRCPY(ini_root, OC(FWEB_INI)); #endif // |HAVE_GETENV| ini_file = FOPEN(mk_fname(ini_file_name, MAX_FILE_NAME_LENGTH, HOME, YES, ini_root), "r"); } @ Here we read the initialization file, if we could open it. @= { outer_char CONST HUGE *b, HUGE *blimit; #if 0 reading(ini_file_name, NO); // Can't print this here; msg level isn't set. #endif for(a=ini_args; k@; goto done; // Should check for trailing spurious text. case ' ': *t = '\0'; for(b++; b= SHORT_INFO) putchar('\n'); // End of reading message. #endif } @ @= { outer_char delim = *b; // Opening and closing character of string. *t++ = *b++; // Store opening delimiter. while(*b != delim) { if(b == blimit) { err_print_(F, ".fweb: Missing quote inserted at end of string. \ Did you mean to continue the line with '\\'? \ (No white space is allowed after the '\\'.)"); *t++ = delim; goto done; } if(*b == '\\') { if(++b == blimit) { /* Line is continued. */ FGETS(buffer, T_SIZE, ini_file); blimit = buffer + STRLEN(buffer); b = buffer; continue; } else *t++ = '\\'; } *t++ = *b++; // Ordinary character within string. } *t++ = *b++; // Store terminating quote. } @ The list of include paths is allocated only as necessary. @= IN_COMMON INCL_PATHS incl; IN_COMMON INCL_PATHS hdr_incl; @ This function adds more entries to the include list. The list is constructed in the format \.{$\alpha$:$\beta$:$\gamma$:}; in other words, entries are terminated by a colon. @=@[ SRTN more_includes FCN((pincl, incl_list0)) INCL_PATHS *pincl C0("Structure to fill")@; outer_char *incl_list0 C1("")@; { unsigned n; BUF_SIZE old_size; if(!incl_list0) return; /* Strip off useless opening colon. */ while(*incl_list0 == ':') incl_list0++; if((n = STRLEN(incl_list0)) == 0) return; old_size = incl.size; pincl->size += n + 2; // Allow for trailing colon and null byte. if(!pincl->list) { /* List hasn't been allocated yet. */ pincl->list = GET_MEM("incl_list", pincl->size, outer_char); STRCPY(pincl->list, incl_list0); pincl->num = chr_cnt(pincl->list, ':'); // Count number of entries. } else { /* Add more to the list. */ pincl->list = (outer_char HUGE *)REALLOC(pincl->list, pincl->size, old_size); if(pincl->list == NULL) FATAL(NULL, "!! NO MORE MEMORY", " (more_includes)"); STRCAT(pincl->list, incl_list0); pincl->num += chr_cnt(incl_list0, ':'); } /* Ensure list ends in a colon. */ if(pincl->list[n-1] != ':') { pincl->list[n] = ':'; pincl->num++; } } @ @=@[ int chr_cnt FCN((s, c)) outer_char *s C0("String to be searched for occurrences of |c|")@; outer_char c C1("Search character")@; { int n; for(n=0; *s; s++) if(*s == c) n++; return n; } @ @=@[ char * mk_fname FCN((buffer,buf_len,env_var,print_msg,file_name)) outer_char *buffer C0("Put result here.")@; unsigned buf_len C0("Length of |buffer|.")@; CONST outer_char *env_var C0("Variable that holds directory name.")@; boolean print_msg C0("Flag for not recognizing |env_var|.")@; CONST outer_char *file_name C1("The raw file name.")@; { outer_char *directory; // Will hold result of |getenv|. #if HAVE_GETENV /* \.{Machine-dependent}: Understands |getenv|. */ if( (directory=GETENV(env_var)) == NULL) { if(print_msg) printf("! I can't find environment \ variable \"%s\", so I'll look for file \"%s\" \ in directory \"%s\".\n", (char *)env_var, (char *)file_name, *wbprefix ? (char *)wbprefix : "."); if(buf_chk(file_name,buf_len, STRLEN(file_name)+STRLEN(wbprefix))) return (char *)wt_style.null_file_name; STRCPY(buffer,wbprefix); STRCAT(buffer,file_name); } else { /* Got a directory from the environment variable. */ if(buf_chk(file_name,buf_len, STRLEN(directory)+1+STRLEN(file_name))) return (char *)wt_style.null_file_name; /* For Unix, home is of the form \.{/u/krommes}; for VMS, it's like \.{ux3:[krommes]}. */ #if !UNIX_PATH SPRINTF(buf_len,buffer,`"%s%s",directory,file_name`); #else SPRINTF(buf_len,buffer,`"%s%c%s",directory,prefix_end_char,file_name`); #endif // |!UNIX_PATH| } #else /* Doesn't understand |getenv|. */ if(buf_chk(file_name,buf_len,STRLEN(file_name))) return (char *)wt_style.null_file_name; STRCPY(buffer,file_name); #endif // |CAN_GETENV| return (char *)buffer; } @ Make sure we don't overrun a file buffer. @=@[ boolean buf_chk FCN((file_name,buf_len,needed)) CONST outer_char *file_name C0("Raw file name")@; unsigned buf_len C0("Max space available")@; unsigned needed C1("Requested")@; { if(needed >= buf_len) { printf("\n! Buffer too small to make complete file name from \ \"%s\"; opened \"%s\"\n", (char *)file_name, (char *)wt_style.null_file_name); return YES; } return NO; } @ Here we copy from an old argument array to the new one. If the argument begins with a~'\.+', that is changed to a~'\.-'. @=@[ SRTN acopy FCN((c,a,n)) outer_char c C0("Starting symbol.")@; outer_char HUGE **a C0("Old array.")@; int n C1("Number of arguments to be looked at.")@; { boolean is_before = BOOLEAN(c==BEFORE_CHAR || c=='+'); boolean is_middle = BOOLEAN(c==MIDDLE_CHAR); boolean is_after = BOOLEAN(c==AFTER_CHAR); int k; /* Disgard the zeroth argument from the command line. */ if(is_middle) { k = 1; a++; } else k = 0; /* Look at all the arguments; copy them if appropriate. */ for(; k}', we do nothing, except if it contains a~`\.\#' we expand that into the |wbflnm0|. If it was not set, we add the extension determined from the style file. @m SET_NAME(l,labbrev) set_name(l,wt_style.output_ext.labbrev##_) @= { int k; /* \WEAVE's output file. */ xpn_name(&tex_fname, MAX_FILE_NAME_LENGTH, tex_fname, wbflnm0); if(*tex_fname == '\0') new_fname(&tex_fname, wbflnm0, OC("tex")); /* \TANGLE's output files. */ for(k=0; k= { outer_char HUGE *dot_pos; outer_char HUGE *p = NULL; if (STRLEN(wbflnm) > MAX_FILE_NAME_LENGTH-5) too_long(); if(STRCMP(wbflnm,"stdin") == 0) STRCPY(web_file_name,wbflnm); else { p = OC(STRRCHR(wbflnm,prefix_end_char)); // Is there a path? if((dot_pos=OC(STRCHR(p ? p+1 : wbflnm,wt_style.ext_delimiter)))==NULL && !try_extensions) { /* Attach ``\.{.web}'' as a default. */ SPRINTF(MAX_FILE_NAME_LENGTH,web_file_name,`"%s%cweb", wbflnm,wt_style.ext_delimiter`); } else { /* There's a dot, or we're trying extensions; treat the name as is. */ SPRINTF(MAX_FILE_NAME_LENGTH,web_file_name,`"%s",wbflnm`); if(!try_extensions) TERMINATE(dot_pos,0); /* string now ends where the dot was */ } } @@; } @ @=@[ SRTN set_name FCN((l,output_ext)) LANGUAGE l C0("")@; outer_char *output_ext C1("")@; { int k; if(*params.outp_nm[k=lan_num(l)] == '\0') new_fname(params.outp_nm+k,wbflnm0,output_ext); } @ We will always write into the current directory. Thus, we strip off all leading subdirectory information. @= { if(p) { /* Path was specified. */ STRNCPY(wbprefix,wbflnm, PTR_DIFF(size_t,p,(outer_char HUGE *)wbflnm)+1); // Path. STRCPY(wbflnm0,p+1); // Root name. } else { /* No path specification. */ TERMINATE(wbprefix,0); // No path. STRCPY(wbflnm0,wbflnm); // Root name. } } @ Here we search for an embedded~`\.\#' and expand that into the web file name. The construction `\.{\#\#}' is replaced by a single~`\.\#'. @=@[ outer_char HUGE * xpn_name FCN((pout_name, buf_len, in_name, wbflnm0)) outer_char HUGE * HUGE *pout_name C0("The expanded result")@; int buf_len C0("Length of above buffer")@; CONST outer_char *in_name C0("File name possibly having a \.\#.")@; CONST outer_char wbflnm0[] C1("Basic name of the web file.")@; { size_t n; /* Length of the root name. */ outer_char HUGE *t,HUGE *t0=NULL; boolean buffered = BOOLEAN(*pout_name == in_name); if(buffered) t = t0 = GET_MEM("xpn buffer",buf_len,outer_char); else t = *pout_name; for(; *in_name; in_name++) if(*in_name == '#') { if(in_name[1] == '#') *t++ = *in_name++; else { n = STRLEN(wbflnm0); STRNCPY(t,wbflnm0,n); t += n; } } else *t++ = *in_name; TERMINATE(t,0); if(buffered) { new_fname(pout_name, t0, NULL); FREE_MEM(t0, "xpn buffer", buf_len,outer_char); } return *pout_name; } @*1 Processing the {\tt .aux} file. When |TeX_processor == LaTeX_p|, the \.{.aux} file is read if it is present. Information from the \.{\\Newlabel} commands is accumulated and used to translate module numbers in error messages. @d AUX_LEN 200 @d MAX_MOD_NAMES 3 // No more than this many names in one error message. @= typedef struct { outer_char *secno; // The \LaTeX\ section number. sixteen_bits pageno, modno0; boolean subpage_flag; // |YES| if more than one section per page. } SECT_INFO; IN_COMMON SECT_INFO HUGE *sect_info; IN_COMMON outer_char HUGE * HUGE *mod_names; IN_COMMON outer_char HUGE * HUGE *next_mod_name, HUGE * HUGE *last_mod_name; @ @= ALLOC(SECT_INFO, sect_info, ABBREV(max_modules), max_modules, 0); @ Open the \.{.aux} file, read and process each line of the file. If the line begins with ``\.{\\Newlabel}'', then the line is parsed. The same logic as in \.{fwebmac.web} is used to set the |subpage_flag| to |NO| if there is only one section per page, or to |YES| if there are more than one. @=@[ SRTN read_aux(VOID) { outer_char aux_file_name[MAX_FILE_NAME_LENGTH]; FILE *fa; outer_char buffer[AUX_LEN]; int aline = 0; // Counts line in the \.{.aux} file. sixteen_bits modno, modno0; outer_char smodno[100], smodno0[100], spageno[10], ssecno[100]; int n; SECT_INFO *ps; // Points to current info structure. int pmcount = 1; // Number of sections per page. long modno_ref = -1; /* Last reference module number. It's |long| to deal with the possibility of 16-bit integers, where |-1| would be the maximum module number. */ next_mod_name = mod_names = GET_MEM("mod_names", MAX_MOD_NAMES, outer_char HUGE *@e); last_mod_name = mod_names + MAX_MOD_NAMES; if(TeX_processor != LaTeX_p) return; @@; modno = 0; // In case there's nothing in the \.{.aux} file. while(FGETS(buffer,AUX_LEN,fa)) { aline++; if(STRNCMP(buffer,"\\Newlabel",9) != 0) continue; @@; } sect_info[modno].subpage_flag = BOOLEAN(pmcount != 1); fclose(fa); } @ @= { outer_char *dot_pos; // For finding extension in file name. dot_pos = OC(STRCHR(tex_fname, wt_style.ext_delimiter)); if(dot_pos == NULL) n = STRLEN(tex_fname); else n = PTR_DIFF(int, dot_pos, tex_fname); STRNCPY(aux_file_name, tex_fname, n); SPRINTF(MAX_FILE_NAME_LENGTH, aux_file_name+n,`"%caux", wt_style.ext_delimiter`); fa = FOPEN(aux_file_name, "r"); if(!fa) { SET_COLOR(info); printf("(No "); CLR_PRINTF(ALWAYS, in_file, ("%s", (char *)aux_file_name)); printf(" file.)\n"); return; } else reading(aux_file_name, YES); } @ @a void seea(int n, char *s) { printf("Arg %i = \"%s\"\n", n, s); } @ The format of the \.{\\Newlabel} line is ``\.{\\Newlabel\{12\}\{\{1.11\}\{5\}\}\{10\}}''. In the original scheme, we used the ANSI |sscanf| \.{\%[\dots]} format command to read the contents of the braces as strings. However, that didn't work for complicated arguments that included nested braces. So now we do it right, taking account of brace levels. @= { #if(!ANSI_SSCANF) { ERR_PRINT(C,"Sorry, non-ANSI sscanf; can't read .aux file"); return; } #endif #if 0 n = sscanf((char *)(buffer+9),"%*c%[^}]%*3c%[^}]%*2c%[^}]%*3c%[^}]", (char *)smodno, (char *)ssecno, (char *)spageno, (char *)smodno0); if(n != 4) { err_print(C,"Invalid \\Newlabel format in %s file, line %d", aux_file_name, aline); return; } #endif if(setjmp(top_of_get_arg) == 0) { outer_char *p, *q; outer_char arg2[100]; p = (outer_char *)STRCHR(buffer, '{'); p = get_arg(smodno, p, '{', '}'); #if 0 seea(1, smodno); #endif p = get_arg(arg2, p, '{', '}'); q = get_arg(ssecno, arg2, '{', '}'); #if 0 seea(2, ssecno); #endif q = get_arg(spageno, q, '{', '}'); #if 0 seea(3, spageno); #endif p = get_arg(smodno0, p, '{', '}'); #if 0 seea(4, smodno0); #endif } else { err_print(C, "Invalid \\Newlabel format in %s file, line %d", aux_file_name, aline); return; } modno = (sixteen_bits)ATOI(smodno); if(modno >= max_modules) OVERFLW("sections", ABBREV(max_modules)); ps = sect_info + modno; ps->secno = GET_MEM("ps->secno",STRLEN(ssecno)+1,outer_char); STRCPY(ps->secno, ssecno); ps->pageno = (sixteen_bits)ATOI(spageno); ps->modno0 = modno0 = (sixteen_bits)ATOI(smodno0); /* Check to see whether there was more than one section on a page. */ sect_info[modno-1].subpage_flag = YES; if((long)modno0 == modno_ref) pmcount++; // More than one section on page. else { /* Start of new page. */ if(pmcount == 1) sect_info[modno-1].subpage_flag = NO; modno_ref = (long)modno0; pmcount = 1; } } @ The core routine for obtaining a delimited argument is |get_arg|. That can fail because of a variety of error conditions. If one is recognized, we bail out immediately with a |longjmp|. @= jmp_buf top_of_get_arg; // For premature bailout from get_arg. @ |get_arg| takes a string |s| and returns in |result| an argument delimited by |ldelim| and |rdelim|. The argument can itself contain matched delimiters. @a outer_char * get_arg FCN((result, s, ldelim, rdelim)) outer_char *result C0("Resulting argument string")@; outer_char *s C0("Input argument")@; outer_char ldelim C0("Left argument delimiter")@; outer_char rdelim C1("Right argument delimiter")@; { outer_char *s0; int blevel; // Brace level. if(!s) { err_print(C, "get_arg: Null arg pointer"); longjmp(top_of_get_arg, 1); } /* Skip white space at beginning of argument. */ while(*s == ' ' || *s == '\t') s++; if(*s++ != ldelim) { err_print(C, "get_arg: Expected '%c' while processing \"%s\".\n", ldelim, s-1); longjmp(top_of_get_arg, 2); } s0 = s; // Remember beginning of argument. blevel = 1; // We've already found the left-hand delimiter. while(*s) { if(*s == ldelim) blevel++; else if(*s == rdelim) { blevel--; if(blevel < 0) { err_print(C, "Too many '%c' while processing \"%s\"\n", rdelim, s0-1); longjmp(top_of_get_arg, 3); } if(blevel == 0) { /* We've found the matching right-hand delimiter. */ int n; STRNCPY(result, s0, n = s-s0); result[n] = '\0'; return s + 1; } } s++; } if(!(*s)) { err_print(C, "get_arg: Field \"%s\" ended while scanning for '%c'\n", s0-1, rdelim); longjmp(top_of_get_arg, 4); } } @ Format a module number including section and page information. (The value returned from this function should be |FREE|d after use by calling |mfree|.) @d NMOD_TEMP 200 @=@[ outer_char HUGE * mod_trans FCN((prefix,modno)) outer_char *prefix C0("")@; sixteen_bits modno C1("")@; { outer_char HUGE *mod_temp = GET_MEM("mod_temp", NMOD_TEMP, outer_char); SECT_INFO *ps = sect_info + modno; if(ps->secno) { outer_char c, letter[2]; letter[1] = '\0'; c = (ps->subpage_flag ? XCHR(modno - ps->modno0 + @'a' - 1) : '\0'); if(c) { if(XORD(c) > @'z') c = '?'; else if(c == @'`') c = '\0'; } letter[0] = c; SPRINTF(NMOD_TEMP, mod_temp, `"%s %d (sect. %s, p. %d%s)", prefix, modno, ps->secno, ps->pageno, letter`); } else { SPRINTF(NMOD_TEMP, mod_temp, `"%s %d", prefix, modno`); } if(next_mod_name == last_mod_name) CONFUSION("mod_trans", "too many unfreed mod names"); return *(next_mod_name++) = mod_temp; } @ Undo storage areas allocated for |mod_trans|. @=@[ SRTN mfree(VOID) { if(!mod_names) return; // For errors happening during the command line. /* Don't mess with this next construction; tricky on some systems. The form |for(--next_mod_name; next_mod_name >= mod_names; next_mod_name--)| doesn't always work. */ while(next_mod_name > mod_names) { next_mod_name--; FREE(*next_mod_name); } } @*1 Indexing languages. Languages have both a number, name, and symbol; be careful to keep these all in the same order. We provide two functions: |lan_num| takes a language and returns an index number; |lan_enum| takes an index number and returns a language. @=@[ int lan_num FCN((Language)) LANGUAGE Language C1("")@; { proper_language: switch(Language) { case C: return 0; case RATFOR: return 1; case FORTRAN: return 2; case TEX: return 3; case LITERAL: return 4; case C_PLUS_PLUS: return 5; case RATFOR_90: return 6; case FORTRAN_90: return 7; case NO_LANGUAGE: Language = GLOBAL_LANGUAGE; goto proper_language; default: Language = global_language; goto proper_language; } } LANGUAGE lan_enum FCN((num)) int num C1("Integer index of the language.")@; { switch(num) { case 0: return C; case 1: return RATFOR; case 2: return FORTRAN; case 3: return TEX; case 4: return LITERAL; case 5: return C_PLUS_PLUS; case 6: return RATFOR_90; case 7: return FORTRAN_90; default: return NO_LANGUAGE; } } @ The function |lan_index| is like |lan_num|, but it compresses |RATFOR| and |FORTRAN| onto the same index. @=@[ int lan_index FCN((Language)) LANGUAGE Language C1("")@; { proper_language: switch(Language) { case C: return 0; case RATFOR: case FORTRAN: return 1; case TEX: return 2; case LITERAL: return 3; case C_PLUS_PLUS: return 4; case RATFOR_90: case FORTRAN_90: return 5; case NO_LANGUAGE: Language = GLOBAL_LANGUAGE; goto proper_language; default: Language = global_language; goto proper_language; } } @*1 Processing {\tt fweb.sty}. Here we construct the name of the style file, and read that file. @= IN_COMMON outer_char style_file_name[MAX_FILE_NAME_LENGTH] CSET(STYLE_FILE_NAME); IN_COMMON boolean renamed_style CSET(NO); @ @= { read_sty(style_file_name,renamed_style); // See \.{style.web}. @@; } @ The style file is read as |outer_char|. Some fields are best left that way, while others need to be converted to |ASCII|. @= { DOT_DELIMITER HUGE *d = &wt_style.dot_delimiter; d->begin = XORD(d->begin); d->end = XORD(d->end); if(program==tangle) { t_style.ASCII_fcn = x__to_ASCII((outer_char *)t_style.ASCII_fcn); } } @*1 Processing command-line arguments. Processing arguments is done in a separate function because it's called several times: once for the command line, and (possibly) each time there's a language change. @d THE_FILE_NAME (a_file_name ? pa : (outer_char HUGE *)"stdin") @= IN_COMMON boolean doing_cmd_line; // Command line or optional arguments? IN_COMMON boolean cmd_prms; // Stuff from ini file or from command line? @ @=@[ SRTN do_args FCN((doing_cmd_line0,argc,argv,pfound_web,wbflnm,pfound_change)) boolean doing_cmd_line0 C0("")@; int argc C0("")@; outer_char HUGE *argv[] C0("")@; boolean HUGE *pfound_web C0("")@; outer_char wbflnm[] C0("")@; boolean HUGE *pfound_change C1("")@; { boolean a_file_name; // Is an actual file name supplied from the command line? outer_char HUGE *dot_pos; /* Position of |'.'| (or more generally, |wt_style.ext_delimiter|) in the argument */ IN_STYLE outer_char HUGE *sprm_ptr0, HUGE *sprm_ptr; doing_cmd_line = doing_cmd_line0; cmd_prms = NO; *pfound_web = *pfound_change = NO; while (argc-- > 0) { if(!cmd_prms && argv == pn0) { /* Note beginning of command-line parameters. */ cmd_prms = YES; sprm_ptr0 = sprm_ptr; } if(cmd_prms && argv == pn1) { /* Note beginning of more \.{.fweb} arguments. */ cmd_prms = YES; } pa = pa_begin = *(argv++); // Beginning of current argument string. /* Arguments that don't begin with a hyphen, or that are just a single hyphen with no trailing stuff, mean file names. */ if ( (a_file_name= BOOLEAN(*pa != '-')) || *(pa+1)=='\0') @@; else @; } } @ @= { if(doing_cmd_line) { if (!*pfound_web) { STRCPY(wbflnm,THE_FILE_NAME); *pfound_web = YES; } else if (!*pfound_change) @@; else @; } else { printf("\n! File name \"%s\" is not allowed as optional argument; \ ignored.\n", pa); mark_harmless; } } @ @= { if (a_file_name && STRLEN(pa) > MAX_FILE_NAME_LENGTH-5) too_long(); /* For VMS, should skip over brackets here. */ if (a_file_name && (dot_pos=OC(STRCHR(pa,wt_style.ext_delimiter)))==NULL && !try_extensions) { SPRINTF(MAX_FILE_NAME_LENGTH,change_file_name,`"%s%cch", pa,wt_style.ext_delimiter`); } else { SPRINTF(MAX_FILE_NAME_LENGTH,change_file_name,`"%s",THE_FILE_NAME`); } *pfound_change=YES; } @ After a language command, there may be optional arguments that must also be parsed. @d ARG_BUFFER_SIZE 500 @d COPY_TO_ARG_BUFFER(c) if(pa < arg_buffer_end) *pa++ = c; else OVERFLW("arg buffer bytes","")@; @d MAX_ARGS 100 @=@[ SRTN opt_args FCN((l)) ASCII l C1("")@; { ASCII arg_buffer[ARG_BUFFER_SIZE],*pa = arg_buffer, *arg_buffer_end = arg_buffer + ARG_BUFFER_SIZE; int argc; outer_char HUGE *args[MAX_ARGS]; ini_language(l); /* Set language and initialize flags. */ if(!IS_WHITE(*loc)) { if(*loc != @'[') { /* Unbracketed command, as in \.{@@c++}. */ *pa++ = @'-'; // Make it an honest command. *pa++ = l; // Don't forget the language. WHILE() { if(IS_WHITE(*loc) || *loc==@'[') break; if(*loc==@'|' && parsing_mode==INNER) { ERR_PRINT(C,"WARNING: Code mode ended during \ unbracketed optional argument. Should there be white space after \ language command?"); break; } COPY_TO_ARG_BUFFER(*loc++); } } /* We allow bracketed commands to follow unbracketed ones. */ if(*loc == @'[') { COPY_TO_ARG_BUFFER(@' '); for(loc++; ; ) { // Skip the opening bracket; copy contents. if(*loc == @']') { loc++; /* Skip the ending bracket. */ break; } COPY_TO_ARG_BUFFER(*loc++); } } TERMINATE(pa,0); /* Terminate |arg_buffer|. */ argc = to_args(to_outer(arg_buffer),args,MAX_ARGS); do_args(NO,argc,args,&found_web,(outer_char *)NULL,&found_change); } fin_language(); /* Do any further flag setup. */ } @ Set the language, and also set up flags for particular language. The input parameter is the letter corresponding to the basic language. Subsidiary dialect flags such as~|Cpp| or~|Fortran88| are used to determine the full language. @=@[ SRTN ini_language FCN((l)) ASCII l C1("Basic language code")@; { /* First we set the language. */ l = A_TO_LOWER(l); // We now enforce that language commands are lower case. switch(l) { @<|ASCII| cases for |C|@>: language = (Cpp ? C_PLUS_PLUS : C); break; @<|ASCII| cases for |RATFOR|@>: if(!RAT_OK("Invalid @@r command; language set to C")) language = C; else language = (Fortran88 ? RATFOR_90 : RATFOR); break; @<|ASCII| cases for |FORTRAN|@>: language = (Fortran88 ? FORTRAN_90 : FORTRAN); break; @<|ASCII| cases for |LITERAL|@>: language = LITERAL; break; @<|ASCII| cases for |TEX|@>: language = TEX; break; } /* The following is for checking an override of the command-line language in the limbo section. */ if(doing_cmd_line) cmd_language = language; ini0_language(); } @ Set parameters for each language. Note that certain flags, such as |free_form_input|, are really arrays that can have a different value depending on the language. @=@[ SRTN ini0_language(VOID) { /* Set the output language. */ out_language = OUT_LANGUAGE(language); /* Storing these numbers cuts down on the overhead of function calls. It also enables us to use the macros in the following |switch| properly. */ language_index = (short)lan_index(language); // Maybe no longer used. language_num = (short)lan_num(language); index_flag = YES; // Most languages will cross-reference. switch(language) { case C: Cpp = NO; break; case C_PLUS_PLUS: Cpp = YES; // Just a shorthand for |language==CPP|. break; case FORTRAN: case FORTRAN_90: free_form_input = global_params.Free_form_input[language_num]; /* This can be turned on by the \.{-n\\} or \.{-n\&} options. */ auto_semi = global_params.Auto_semi[language_num]; break; case RATFOR: case RATFOR_90: if(nuweb_mode) err_print(C, "SORRY, but Ratfor doesn't work yet with the N \ mode!") ; auto_semi = global_params.Auto_semi[language_num]; if(auto_semi) free_form_input = NO; break; case LITERAL: nuweb_mode = YES; line_info = NO; index_flag = NO; break; case TEX: break; default: break; } } @ Now handle any parameter modifications after optional arguments have been read. @=@[ SRTN fin_language(VOID) { ini_reserved(language); switch(language) { case C: break; case RATFOR: break; case FORTRAN: break; case LITERAL: break; case TEX: break; default: break; } frz_params(); // Make any local parameters. /* Output file name. For |program == weave|, |out_file == tex_file| by a macro definition in \.{typedefs.hweb}. */ if(program == tangle) out_file = params.outp_file[lan_num(out_language)]; } @ Call this routine whenever |params| is reset. @=@[ SRTN frz_params(VOID) { @#if 0 if(auto_semi && !Fortran88) free_form_input = NO; @#endif cont_char = XORD(in_escape); // Current continuation character (in |ASCII|). free_90 = BOOLEAN(Fortran88 && free_form_input); free_Fortran = BOOLEAN((language==FORTRAN_90) && free_90); if(!prn_semis && free_Fortran && auto_pseudo_semis) prn_semis = YES; @#if 0 /* Semicolons must be inserted explicitly for \Fortran-90! */ if(is_FORTRAN_(language)) auto_semi = BOOLEAN(!free_Fortran); @#endif if(program==tangle && free_90) switch(language) { case FORTRAN_90: case RATFOR_90: begin_comment_char[lan_num(FORTRAN_90)] = (outer_char)CHOICE(free_90, '!', 'C'); break; default: ; } } @ At this point the effective command line is in |outer_char| form in |arg_buffer|. @=@[ int to_args FCN((p,args,max_args)) outer_char HUGE *p C0("")@; outer_char HUGE *args[] C0("")@; int max_args C1("")@; { int n; for(n=0; *p; p++) { if(n >= max_args) { err_print(C,"Too many command-line or optional \ arguments; must be < %d",max_args); break; } while(isspace(*p)) p++; // Skip leading white space. args[n++] = p; // Record start and count. for(p++; *p; p++) if(isspace(*p) || !*p) break; // Find end of argument. if(!*p) break; // Get out at end of line. TERMINATE(p,0); // Mark end of argument. } return n; // Number of arguments found. } @ @= SET_VAL(mbuf_size,ABBREV(mbuf_size)); @ These are for automatic statement numbering. @d STARTING_DO_NUM UL(90000L) @= IN_COMMON STMT_LBL max_stmt CSET(STARTING_DO_NUM); IN_COMMON int not; // For the negations of options. @ For many of the flags, a minus option, as \.{-flag}, means to do the opposite of the default. Furthermore, if the format is \.{--flag}, this is the opposite of \.{-flag}. Negating the usual flag value can be accomplished by exclusive-oring it with |not|, where |not == YES| when we have the extra hyphen, or |NO|~otherwise. @d NOT(flag) BOOLEAN((!flag) ^ not) @= @B outer_char mc; outer_char cmd_symbol; // The character after the hyphen. @b pa++; // |pa| now points to the character after the hyphen. if(*pa == '-') { // Second hyphen means negate. not = YES; pa++; // Skip second hyphen. } else not = NO; reswitch: switch(cmd_symbol= *pa++) { /* |pa| now positioned after command symbol---e.g., to optional argument. */ case '1': tracing = BRIEF; break; case '2': tracing = VERBOSE; break; case '@@': @