From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23053 invoked from network); 23 Feb 2005 05:39:20 -0000 Received: from unknown (HELO lists.gnu.org) (199.232.76.165) by sourceware.org with SMTP; 23 Feb 2005 05:39:20 -0000 Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1D3pSh-0005fC-6h for listarch-gnats-devel@sources.redhat.com; Wed, 23 Feb 2005 00:53:27 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1D3pRw-0005TU-7F for help-gnats@gnu.org; Wed, 23 Feb 2005 00:52:43 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1D3pRq-0005PV-87 for help-gnats@gnu.org; Wed, 23 Feb 2005 00:52:34 -0500 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1D3pRp-0005PS-UD for help-gnats@gnu.org; Wed, 23 Feb 2005 00:52:34 -0500 Received: from [199.199.210.160] (helo=chef.nerp.net) by monty-python.gnu.org with esmtp (Exim 4.34) id 1D3ot3-0005IC-1y for help-gnats@gnu.org; Wed, 23 Feb 2005 00:16:49 -0500 Received: from skuld.wookimus.net (c-66-41-156-164.mn.client2.attbi.com [66.41.156.164]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by chef.nerp.net (Postfix) with ESMTP id 9F71957E73 for ; Tue, 22 Feb 2005 23:16:13 -0600 (CST) Received: from wookimus.net (skuld.wk [192.168.5.100]) by skuld.wookimus.net (Postfix) with ESMTP id D78843E00 for ; Tue, 22 Feb 2005 23:16:10 -0600 (CST) Received: by wookimus.net (Postfix, from userid 1000) id 4A4A9141F; Tue, 22 Feb 2005 23:15:19 -0600 (CST) Date: Wed, 23 Feb 2005 05:39:00 -0000 From: Chad Walstrom To: help-gnats@gnu.org Message-ID: <20050223051519.GA4061@wookimus.net> Mail-Followup-To: help-gnats@gnu.org Mime-Version: 1.0 X-Operating-System: Linux skuld 2.6.8-1-k7 X-GnuPG-Fingerprint: B4AB D627 9CBD 687E 7A31 1950 0CC7 0B18 206C 5AFD User-Agent: Mutt/1.5.6+20040907i Subject: [PATCH] Removing gnats/man and config/* X-BeenThere: help-gnats@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: General discussion about GNU GNATS List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: multipart/mixed; boundary="===============1096106095==" Sender: help-gnats-bounces+listarch-gnats-devel=sources.redhat.com@gnu.org Errors-To: help-gnats-bounces+listarch-gnats-devel=sources.redhat.com@gnu.org X-SW-Source: 2005-q1/txt/msg00035.txt.bz2 --===============1096106095== Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="qtZFehHsKgwS5rPz" Content-Disposition: inline --qtZFehHsKgwS5rPz Content-Type: multipart/mixed; boundary="St7VIuEGZ6dlpu13" Content-Disposition: inline --St7VIuEGZ6dlpu13 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Content-length: 527 OK. Because I did say I wouldn't be the benevolent dictator and play by the same rules as everyone else... ;-) This patch will remove gnats/man directory and contents, config/ contents, renames configure.in to configure.ac, moves missing and install-sh to config/, and updates texinfo.tex. ;-) Next, time to test Mike's patch. If I hear no objections, I'll commit the patch later tomorrow. --=20 Chad Walstrom http://www.wookimus.net/ assert(expired(knowledge)); /* core dump */ --St7VIuEGZ6dlpu13 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: attachment; filename="config-man-cleanup.diff" Content-Transfer-Encoding: quoted-printable Content-length: 557907 diff -x CVS -uNr gnats/ChangeLog gnats.new/ChangeLog --- gnats/ChangeLog 2004-11-17 22:22:49.000000000 -0600 +++ gnats.new/ChangeLog 2005-02-22 22:02:10.000000000 -0600 @@ -1,3 +1,12 @@ +2005-02-22 Chad Walstrom + + * config/*: Makefile fragments removed, unnecessary with autoconf. + + * configure.in -> configure.ac, configure: Moved. Regenerated + configure. + + * texinfo/texinfo.tex: Updated + 2004-11-17 Chad Walstrom =20 * libiberty/*, include/*: Updated from GCC 3.4.2 release. diff -x CVS -uNr gnats/config/ChangeLog gnats.new/config/ChangeLog --- gnats/config/ChangeLog 1999-10-26 02:10:16.000000000 -0500 +++ gnats.new/config/ChangeLog 1969-12-31 18:00:00.000000000 -0600 @@ -1,382 +0,0 @@ -Sun Oct 24 23:54:10 PDT 1999 Jeff Law (law@cygnus.com) - - * gcc-2.95.2 Released. - -Mon Aug 16 01:29:24 PDT 1999 Jeff Law (law@cygnus.com) - - * gcc-2.95.1 Released. - -Wed Jul 28 21:39:31 PDT 1999 Jeff Law (law@cygnus.com) - - * gcc-2.95 Released. - -Sun Jul 25 23:40:51 PDT 1999 Jeff Law (law@cygnus.com) - - * gcc-2.95 Released. - -Tue Feb 2 22:51:21 1999 Philip Blundell - - * mh-armpic: New file. Patch from Jim Pick . - * mt-armpic: Likewise. - -Mon Jan 18 19:41:08 1999 Christopher Faylor - - * cygwin.mh: Activate commented out dependencies for - gdb: libtermcap. - -Wed Nov 18 20:29:46 1998 Christopher Faylor - - * cygwin.mh: Add extra libtermcap target information. - Add commented out dependency for gdb to libtermcap for - future readline requirement. - -Mon Nov 2 15:15:33 1998 Geoffrey Noer - - * mh-cygwin32: delete - * mh-cygwin: was mh-cygwin32 - -Mon Aug 31 17:50:53 1998 David Edelsohn - - * mh-aix43 (NM_FOR_TARGET): Add -X32_64 as well. - -Sat Aug 29 14:32:55 1998 David Edelsohn - - * mh-aix43: New file. - -Mon Aug 10 00:15:47 1998 HJ Lu (hjl@gnu.org) - - * mt-linux (CXXFLAGS_FOR_TARGET): Add -D_GNU_SOURCE. - -Wed Apr 22 12:24:28 1998 Michael Meissner - - * mt-ospace: New file, support using -Os instead of -O2 to compile - the libraries. - -Wed Apr 22 10:53:14 1998 Andreas Schwab - - * mt-linux (CXXFLAGS_FOR_TARGET): Set this instead of CXXFLAGS. - -Sat Apr 11 22:43:17 1998 J. Kean Johnston - - * mh-svsv5: New file - support for SCO UnixWare 7 / SVR5. - -Thu Mar 26 01:54:25 1998 Geoffrey Noer - - * mh-cygwin32: stop configuring and building dosrel. - -Thu Sep 11 16:43:27 1997 Jim Wilson - - * mh-elfalphapic, mt-elfalphapic: New files. - -Wed Jul 23 12:32:18 1997 Robert Hoehne - - * mh-go32 (CFLAGS): Don't set -fno-omit-frame-pointer. - -Mon Jun 16 19:06:41 1997 Geoff Keating - - * mh-ppcpic: New file. - * mt-ppcpic: New file. - -Thu Mar 27 15:52:40 1997 Geoffrey Noer - - * mh-cygwin32: override CXXFLAGS, setting to -O2 only - (no debug) - -Tue Mar 25 18:16:43 1997 Geoffrey Noer - - * mh-cygwin32: override LIBGCC2_DEBUG_CFLAGS so debug info - isn't included in cygwin32-hosted libgcc2.a by default - -Wed Jan 8 19:56:43 1997 Geoffrey Noer - - * mh-cygwin32: override CFLAGS so debug info isn't included - in cygwin32-hosted tools by default - -Tue Dec 31 16:04:26 1996 Ian Lance Taylor - - * mh-linux: Remove. - -Mon Nov 11 10:29:51 1996 Michael Meissner - - * mt-ppc: Delete file, options moved to newlib configure. - -Fri Oct 4 12:21:03 1996 Angela Marie Thomas (angela@cygnus.com) - - * mh-dgux386: New file. x86 dgux specific flags - -Mon Sep 30 15:10:07 1996 Stan Shebs - - * mpw-mh-mpw (EXTRALIBS_PPC_XCOFF): New, was EXTRALIBS_PPC. - (EXTRALIBS_PPC): Use shared libraries instead of xcoff. - -Sat Aug 17 04:56:25 1996 Geoffrey Noer - - * mh-cygwin32: don't -D_WIN32 here anymore - -Thu Aug 15 19:46:44 1996 Stan Shebs - - * mpw-mh-mpw (SEGFLAG_68K, SEGFLAG_PPC): Remove. - (EXTRALIBS_PPC): Add libgcc.xcoff. - -Thu Aug 8 14:51:47 1996 Michael Meissner - - * mt-ppc: New file, add -mrelocatable-lib and -mno-eabi to all - target builds for PowerPC eabi targets. - -Fri Jul 12 12:06:01 1996 Stan Shebs - - * mpw: New subdir, Mac MPW configuration support bits. - -Mon Jul 8 17:30:52 1996 Jim Wilson - - * mh-irix6: New file. - -Mon Jul 8 15:15:37 1996 Jason Merrill - - * mt-sparcpic (PICFLAG_FOR_TARGET): Use -fPIC. - -Fri Jul 5 11:49:02 1996 Ian Lance Taylor - - * mh-irix4 (RANLIB): Don't define; Irix 4 does have ranlib. - -Sun Jun 23 22:59:25 1996 Geoffrey Noer - - * mh-cygwin32: new file. Like mh-go32 without the CFLAGS entry. - -Tue Mar 26 14:10:41 1996 Ian Lance Taylor - - * mh-go32 (CFLAGS): Define. - -Thu Mar 14 19:20:54 1996 Ian Lance Taylor - - * mh-necv4: New file. - -Thu Feb 15 13:07:43 1996 Ian Lance Taylor - - * mh-cxux (CC): New variable. - (CFLAGS, LDFLAGS): Remove. - * mh-ncrsvr43 (CC): New variable. - (CFLAGS): Remove. - * mh-solaris (CFLAGS): Remove. - - * mh-go32: Remove most variable settings, since they presumed a - Canadian Cross, which is now handled correctly by the configure - script. - - * mh-sparcpic (PICFLAG): Set to -fPIC, not -fpic. - -Mon Feb 12 14:53:39 1996 Andreas Schwab - - * mh-m68kpic, mt-m68kpic: New files. - -Thu Feb 1 14:15:42 1996 Stan Shebs - - * mpw-mh-mpw (CC_MWC68K): Add options similar to those used - in CC_MWCPPC, and -mc68020 -model far. - (AR_MWLINK68K): Add -xm library. - (AR_AR): Define. - (CC_LD_MWLINK68K): Remove -d. - (EXTRALIBS_MWC68K): Define. - -Thu Jan 25 16:05:33 1996 Ian Lance Taylor - - * mh-ncrsvr43 (CFLAGS): Remove -Hnocopyr. - -Tue Nov 7 15:41:30 1995 Stan Shebs - - * mpw-mh-mpw (CC_MWC68K, CC_MWCPPC): Remove unused include path. - (CC_MWCPPC): Add -mpw_chars, disable warnings, add comments - explaining reasons for various flags. - (EXTRALIBS_PPC, EXTRALIBS_MWCPPC ): Put runtime library first. -=09 -Fri Oct 13 14:44:25 1995 Jason Molenda (crash@phydeaux.cygnus.com) - - * mh-aix, mh-sun: Removed. - - * mh-decstation (X11_EXTRA_CFLAGS): Define. - - * mh-sco, mh-solaris, mh-sysv4 (X11_EXTRA_LIBS): Define. - - * mh-hp300, mh-hpux, mh-hpux8, mh-solaris, mh-sun3, mh-sysv4: Don'= t=20 - hardcode location of X stuff here. - -Thu Sep 28 13:14:56 1995 Stan Shebs - - * mpw-mh-mpw: Add definitions for various 68K and PowerMac - compilers, add definitions for library and link steps for - PowerMacs. - -Thu Sep 14 08:20:04 1995 Fred Fish - - * mh-hp300 (CC): Add "CC =3D cc -Wp,-H256000" to avoid - "too much defining" errors from the HPUX compiler. - -Thu Aug 17 17:28:56 1995 Ken Raeburn - - * mh-hp300 (RANLIB): Use "ar ts", in case GNU ar was used and - didn't build a symbol table. - -Thu Jun 22 17:47:24 1995 Stan Shebs - - * mpw-mh-mpw (CC): Define ANSI_PROTOTYPES. - -Mon Apr 10 12:29:48 1995 Stan Shebs - - * mpw-mh-mpw (EXTRALIBS): Always link in Math.o, CSANELIB.o, - and ToolLibs.o. - - * mpw-mh-mpw (CC): Define ALMOST_STDC. - (CFLAGS): Remove ALMOST_STDC, -mc68881. - (LDFLAGS): add -w. - - * mpw-mh-mpw (CFLAGS): Add -b option to put strings at the ends of - functions. - - * mpw-mh-mpw: New file, host makefile definitions for MPW. - -Fri Mar 31 11:35:17 1995 Jason Molenda (crash@phydeaux.cygnus.com) - - * mt-netware: New file. - -Mon Mar 13 12:31:29 1995 Ian Lance Taylor - - * mh-hpux8: New file. - * mh-hpux: Use X11R5 rather than X11R4. - -Thu Feb 9 11:04:13 1995 Ian Lance Taylor - - * mh-linux (SYSV): Don't define. - (RANLIB): Don't define. - -Wed Jan 11 16:29:34 1995 Jason Merrill - - * m?-*pic (LIBCXXFLAGS): Add -fno-implicit-templates. - -Thu Nov 3 17:27:19 1994 Ken Raeburn - - * mh-irix4 (CC): Increase maximum string length. - - * mh-sco (CC): Define away const, it doesn't work right; elements - of arrays of ptr-to-const are considered const themselves. - -Sat Jul 16 12:17:49 1994 Stan Shebs (shebs@andros.cygnus.com) - - * mh-cxux: New file, from Bob Rusk (rrusk@mail.csd.harris.com). - -Sat Jun 4 17:22:12 1994 Per Bothner (bothner@kalessin.cygnus.com) - - * mh-ncrsvr43: New file from Tom McConnell - . - -Thu May 19 00:32:11 1994 Jeff Law (law@snake.cs.utah.edu) - - * mh-hpux (CC): Add -Wp,-H256000 to avoid "too much defining" - errors from the HPUX 8 compilers. - -Wed May 4 20:14:47 1994 D. V. Henkel-Wallace (gumby@cygnus.com) - - * mh-lynxrs6k: set SHELL to /bin/bash - -Tue Apr 12 12:38:17 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mh-irix4 (CC): Change -XNh1500 to -XNh2000. - -Sat Dec 25 20:03:45 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * mt-hppa: Delete. - -Tue Nov 16 22:54:39 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * mh-a68bsd: Define CC to gcc. - -Mon Nov 15 16:56:51 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * mh-linux: Don't put -static in LDFLAGS. Add comments. - -Mon Nov 15 13:37:58 1993 david d `zoo' zuhn (zoo@cirdan.cygnus.com) - - * mh-sysv4 (AR_FLAGS): change from cq to cr - -Fri Nov 5 08:12:32 1993 D. V. Henkel-Wallace (gumby@blues.cygnus.com) - - * mh-unixware: remove. It's the same as sysv4, and config.guess - can't tell the difference. So don't allow skew. - -Wed Oct 20 20:35:14 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * mh-hp300: Revert yesterday's change, but add comment explaining. - -Tue Oct 19 18:58:21 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * mh-hp300: Don't define CFLAGS to empty. Why should hp300 be - different from anything else? ("gdb doesn't understand the native - debug format" isn't a good enough answer because we might be using - gcc). - -Tue Oct 5 12:17:40 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen= .de) - - * mh-alphaosf: Remove, no longer necessary now that gdb knows - how to handle OSF/1 shared libraries. - -Tue Jul 6 11:27:33 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) - - * mh-alphaosf: New file. - -Thu Jul 1 15:49:33 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * mh-riscos: New file. - -Mon Jun 14 12:03:18 1993 david d `zoo' zuhn (zoo at rtl.cygnus.com) - - * mh-aix, mh-aix386, mh-decstation, mh-delta88, mh-hpux, mh-irix4, - mh-ncr3000, mh-solaris, mh-sysv, mh-sysv4: remove INSTALL=3Dcp line, - now that we're using install.sh globally - -Fri Jun 4 16:09:34 1993 Ian Lance Taylor (ian@cygnus.com) - - * mh-sysv4 (INSTALL): Use cp, not /usr/ucb/install. - -Thu Apr 8 11:21:52 1993 Ian Lance Taylor (ian@cygnus.com) - - * mt-a29k, mt-ebmon29k, mt-os68k, mt-ose68000, mt-ose68k, - mt-vxworks68, mt-vxworks960: Removed obsolete, unused target - Makefile fragment files. - -Mon Mar 8 15:05:25 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * mh-aix386: New file; old mh-aix, plus no-op RANLIB. - -Thu Oct 1 13:50:48 1992 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * mh-solaris: INSTALL is NOT /usr/ucb/install - -Mon Aug 24 14:25:35 1992 Ian Lance Taylor (ian@cygnus.com) - - * mt-ose68000, mt-ose68k: renamed from mt-OSE*. - -Tue Jul 21 02:11:01 1992 D. V. Henkel-Wallace (gumby@cygnus.com) - - * mt-OSE68k, mt-680000: new configs. - -Thu Jul 16 17:12:09 1992 K. Richard Pixley (rich@rtl.cygnus.com) - - * mh-irix4: merged changes from progressive. - -Tue Jun 9 23:29:38 1992 Per Bothner (bothner@rtl.cygnus.com) - - * Everywhere: Change RANLIB=3Decho>/dev/null (which confuses - some shells - and I don't blame them) to RANLIB=3Dtrue. - * mh-solaris: Use /usr/ucb/install for INSTALL. - -Sun May 31 14:45:23 1992 Mark Eichin (eichin at cygnus.com) - - * mh-solaris2: Add new configuration for Solaris 2 (sysv, no ranlib) - -Fri Apr 10 23:10:08 1992 Fred Fish (fnf@cygnus.com) - - * mh-ncr3000: Add new configuration for NCR 3000. - -Tue Dec 10 00:10:55 1991 K. Richard Pixley (rich at rtl.cygnus.com) - - * ChangeLog: fresh changelog. - diff -x CVS -uNr gnats/config/install-sh gnats.new/config/install-sh --- gnats/config/install-sh 1969-12-31 18:00:00.000000000 -0600 +++ gnats.new/config/install-sh 2005-02-22 22:06:27.000000000 -0600 @@ -0,0 +1,325 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=3D2004-04-01.17 + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a = copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation t= he +# rights to use, copy, modify, merge, publish, distribute, sublicense, and= /or +# sell copies of the Software, and to permit persons to whom the Software = is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included = in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS = OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL= THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHE= R IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON= NEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall n= ot +# be used in advertising or otherwise to promote the sale, use or other de= al- +# ings in this Software without prior written authorization from the X Con= sor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# 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. It can only install one file at a time, a restriction +# shared with many OS's install programs. + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit=3D"${DOITPROG-}" + +# put in absolute paths if you don't have them in your path; or use env. v= ars. + +mvprog=3D"${MVPROG-mv}" +cpprog=3D"${CPPROG-cp}" +chmodprog=3D"${CHMODPROG-chmod}" +chownprog=3D"${CHOWNPROG-chown}" +chgrpprog=3D"${CHGRPPROG-chgrp}" +stripprog=3D"${STRIPPROG-strip}" +rmprog=3D"${RMPROG-rm}" +mkdirprog=3D"${MKDIRPROG-mkdir}" + +transformbasename=3D +transform_arg=3D +instcmd=3D"$mvprog" +chmodcmd=3D"$chmodprog 0755" +chowncmd=3D +chgrpcmd=3D +stripcmd=3D +rmcmd=3D"$rmprog -f" +mvcmd=3D"$mvprog" +src=3D +dst=3D +dir_arg=3D + +usage=3D"Usage: $0 [OPTION]... SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 -d DIRECTORIES... + +In the first form, install SRCFILE to DSTFILE, removing SRCFILE by default. +In the second, create the directory path DIR. + +Options: +-b=3DTRANSFORMBASENAME +-c copy source (using $cpprog) instead of moving (using $mvprog). +-d create directories instead of installing files. +-g GROUP $chgrp installed files to GROUP. +-m MODE $chmod installed files to MODE. +-o USER $chown installed files to USER. +-s strip installed files (using $stripprog). +-t=3DTRANSFORM +--help display this help and exit. +--version display version info and exit. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG +" + +while test -n "$1"; do + case $1 in + -b=3D*) transformbasename=3D`echo $1 | sed 's/-b=3D//'` + shift + continue;; + + -c) instcmd=3D$cpprog + shift + continue;; + + -d) dir_arg=3Dtrue + shift + continue;; + + -g) chgrpcmd=3D"$chgrpprog $2" + shift + shift + continue;; + + --help) echo "$usage"; exit 0;; + + -m) chmodcmd=3D"$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd=3D"$chownprog $2" + shift + shift + continue;; + + -s) stripcmd=3D$stripprog + shift + continue;; + + -t=3D*) transformarg=3D`echo $1 | sed 's/-t=3D//'` + shift + continue;; + + --version) echo "$0 $scriptversion"; exit 0;; + + *) # When -d is used, all remaining arguments are directories to crea= te. + test -n "$dir_arg" && break + # Otherwise, the last argument is the destination. Remove it from= $@. + for arg + do + if test -n "$dstarg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dstarg" + shift # fnord + fi + shift # arg + dstarg=3D$arg + done + break;; + esac +done + +if test -z "$1"; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +for src +do + # Protect names starting with `-'. + case $src in + -*) src=3D./$src ;; + esac + + if test -n "$dir_arg"; then + dst=3D$src + src=3D + + if test -d "$dst"; then + instcmd=3D: + chmodcmd=3D + else + instcmd=3D$mkdirprog + fi + else + # Waiting for this to be detected by the "$instcmd $src $dsttmp" comma= nd + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dstarg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + + dst=3D$dstarg + # Protect names starting with `-'. + case $dst in + -*) dst=3D./$dst ;; + esac + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + dst=3D$dst/`basename "$src"` + fi + fi + + # This sed command emulates the dirname command. + dstdir=3D`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + + # Make sure that the destination directory exists. + + # Skip lots of stat calls in the usual case. + if test ! -d "$dstdir"; then + defaultIFS=3D' + ' + IFS=3D"${IFS-$defaultIFS}" + + oIFS=3D$IFS + # Some sh's can't handle IFS=3D/ for some reason. + IFS=3D'%' + set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` + IFS=3D$oIFS + + pathcomp=3D + + while test $# -ne 0 ; do + pathcomp=3D$pathcomp$1 + shift + if test ! -d "$pathcomp"; then + $mkdirprog "$pathcomp" || lasterr=3D$? + # mkdir can fail with a `File exist' error in case several + # install-sh are creating the directory concurrently. This + # is OK. + test ! -d "$pathcomp" && { (exit ${lasterr-1}); exit; } + fi + pathcomp=3D$pathcomp/ + done + fi + + if test -n "$dir_arg"; then + $doit $instcmd "$dst" \ + && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ + && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ + && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ + && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } + + else + # If we're going to rename the final executable, determine the name no= w. + if test -z "$transformarg"; then + dstfile=3D`basename "$dst"` + else + dstfile=3D`basename "$dst" $transformbasename \ + | sed $transformarg`$transformbasename + fi + + # don't allow the sed command to completely eliminate the filename. + test -z "$dstfile" && dstfile=3D`basename "$dst"` + + # Make a couple of temp file names in the proper directory. + dsttmp=3D$dstdir/_inst.$$_ + rmtmp=3D$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'status=3D$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0 + trap '(exit $?); exit' 1 2 13 15 + + # Move or copy the file name to the temp name + $doit $instcmd "$src" "$dsttmp" && + + # 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. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ + && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ + && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ + && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && + + # Now rename the file to the real destination. + { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ + || { + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + if test -f "$dstdir/$dstfile"; then + $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ + || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ + || { + echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 + (exit 1); exit + } + else + : + fi + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" + } + } + fi || { (exit 1); exit; } +done + +# The final little trick to "correctly" pass the exit status to the exit t= rap. +{ + (exit 0); exit +} + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=3D" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff -x CVS -uNr gnats/config/mh-a68bsd gnats.new/config/mh-a68bsd --- gnats/config/mh-a68bsd 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-a68bsd 1969-12-31 18:00:00.000000000 -0600 @@ -1,12 +0,0 @@ -RANLIB=3Dtrue - -#None of the Apollo compilers can compile gas or binutils. The preprocess= or -# chokes on bfd, the compiler won't let you assign integers to enums, and -# other problems. Defining CC to gcc is a questionable way to say "don't = use -# the apollo compiler" (the preferred version of GCC could be called cc, -# or whatever), but I'm not sure leaving CC as cc is any better... - -#CC=3Dcc -A ansi -A runtype,any -A systype,any -U__STDC__ -DNO_STDARG -CC=3Dgcc - -BISON=3Dyacc diff -x CVS -uNr gnats/config/mh-aix386 gnats.new/config/mh-aix386 --- gnats/config/mh-aix386 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-aix386 1969-12-31 18:00:00.000000000 -0600 @@ -1 +0,0 @@ -RANLIB =3D @: diff -x CVS -uNr gnats/config/mh-aix43 gnats.new/config/mh-aix43 --- gnats/config/mh-aix43 1999-10-26 02:10:16.000000000 -0500 +++ gnats.new/config/mh-aix43 1969-12-31 18:00:00.000000000 -0600 @@ -1,4 +0,0 @@ -# AIX 4.3 and above requires -X32_64 flag to all ar and nm commands -# to handle both 32-bit and 64-bit objects. -AR_FOR_TARGET=3Dar -X32_64 -NM_FOR_TARGET=3Dnm -X32_64 diff -x CVS -uNr gnats/config/mh-apollo68 gnats.new/config/mh-apollo68 --- gnats/config/mh-apollo68 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-apollo68 1969-12-31 18:00:00.000000000 -0600 @@ -1,3 +0,0 @@ -HDEFINES =3D -DUSG -RANLIB=3Dtrue -CC=3D cc -A ansi -A runtype,any -A systype,any -U__STDC__ -DUSG diff -x CVS -uNr gnats/config/mh-armpic gnats.new/config/mh-armpic --- gnats/config/mh-armpic 1999-10-26 02:10:16.000000000 -0500 +++ gnats.new/config/mh-armpic 1969-12-31 18:00:00.000000000 -0600 @@ -1 +0,0 @@ -PICFLAG=3D-fPIC diff -x CVS -uNr gnats/config/mh-cxux gnats.new/config/mh-cxux --- gnats/config/mh-cxux 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-cxux 1969-12-31 18:00:00.000000000 -0600 @@ -1,14 +0,0 @@ -# Configuration for Harris CX/UX 7 (and maybe 6), based on sysv4 configura= tion. - -# Define SYSV as -DSYSV if you are using a System V operating system. -SYSV =3D -DSYSV -DSVR4 -RANLIB =3D true - -# C++ debugging is not yet supported under SVR4 (DWARF) -CXXFLAGS=3D-O - -# The l flag generates a warning from the SVR4 archiver, remove it. -AR_FLAGS =3D cq - -# Under CX/UX, we want to tell the compiler to use ANSI mode. -CC=3Dcc -Xa diff -x CVS -uNr gnats/config/mh-cygwin gnats.new/config/mh-cygwin --- gnats/config/mh-cygwin 1999-10-26 02:10:16.000000000 -0500 +++ gnats.new/config/mh-cygwin 1969-12-31 18:00:00.000000000 -0600 @@ -1,6 +0,0 @@ -EXTRA_TARGET_HOST_ALL_MODULES=3Dall-libtermcap -EXTRA_TARGET_HOST_INSTALL_MODULES=3Dinstall-libtermcap - -all-gdb: all-libtermcap - -install-gdb: all-libtermcap diff -x CVS -uNr gnats/config/mh-cygwin32 gnats.new/config/mh-cygwin32 --- gnats/config/mh-cygwin32 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-cygwin32 1969-12-31 18:00:00.000000000 -0600 @@ -1,16 +0,0 @@ -# We don't want debugging info in Win32-hosted toolchains. -# Accomplish this by overriding CFLAGS. -CFLAGS=3D-O2 -CXXFLAGS=3D-O2 - -# We also need to override LIBGCC2_DEBUG_CFLAGS so libgcc2 will be -# build without debugging information - -LIBGCC2_DEBUG_CFLAGS=3D - -# We set MAKEINFOFLAGS to not split .info files, because the resulting -# file names don't work on DOS. -MAKEINFOFLAGS=3D--no-split - -# custom installation rules for cygwin32 (append .exe to binaries, etc.) -INSTALL_DOSREL=3Dinstall-dosrel diff -x CVS -uNr gnats/config/mh-decstation gnats.new/config/mh-decstation --- gnats/config/mh-decstation 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-decstation 1969-12-31 18:00:00.000000000 -0600 @@ -1,5 +0,0 @@ -CC =3D cc -Wf,-XNg1000 - -# for X11, since the native DECwindows include files are really broken when -# it comes to function prototypes.=20=20 -X11_EXTRA_CFLAGS =3D "-DNeedFunctionPrototypes=3D0" diff -x CVS -uNr gnats/config/mh-delta88 gnats.new/config/mh-delta88 --- gnats/config/mh-delta88 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-delta88 1969-12-31 18:00:00.000000000 -0600 @@ -1,4 +0,0 @@ -RANLIB =3D true - - - diff -x CVS -uNr gnats/config/mh-dgux gnats.new/config/mh-dgux --- gnats/config/mh-dgux 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-dgux 1969-12-31 18:00:00.000000000 -0600 @@ -1,4 +0,0 @@ -HDEFINES=3D-DHOST_SYS=3DDGUX_SYS -CC=3Dgcc -Wall -ansi -D__using_DGUX -RANLIB=3Dtrue - diff -x CVS -uNr gnats/config/mh-dgux386 gnats.new/config/mh-dgux386 --- gnats/config/mh-dgux386 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-dgux386 1969-12-31 18:00:00.000000000 -0600 @@ -1,22 +0,0 @@ -# from mh-dgux -HDEFINES=3D-DHOST_SYS=3DDGUX_SYS -CC=3Dgcc -Wall -ansi -D__using_DGUX -RANLIB =3D true - -# from mh-sysv4 -# Define SYSV as -DSYSV if you are using a System V operating system. -SYSV =3D -DSYSV -DSVR4 -RANLIB =3D true - -# C++ debugging is not yet supported under SVR4 (DWARF) -CXXFLAGS=3D-O - -# The l flag generates a warning from the SVR4 archiver, remove it. -AR_FLAGS =3D cr - -X11_EXTRA_LIBS =3D -lnsl - -# from angela -# no debugging due to broken compiler, use BSD style timeofday -CFLAGS=3D-O -D_BSD_TIMEOFDAY_FLAVOR - diff -x CVS -uNr gnats/config/mh-djgpp gnats.new/config/mh-djgpp --- gnats/config/mh-djgpp 1999-10-26 02:10:16.000000000 -0500 +++ gnats.new/config/mh-djgpp 1969-12-31 18:00:00.000000000 -0600 @@ -1,4 +0,0 @@ -# We don't want to use debugging information on DOS. Unfortunately, -# this requires that we set CFLAGS. -# This used to set -fno-omit-frame-pointer. -CFLAGS=3D-O2 diff -x CVS -uNr gnats/config/mh-elfalphapic gnats.new/config/mh-elfalphapic --- gnats/config/mh-elfalphapic 1999-10-26 02:10:16.000000000 -0500 +++ gnats.new/config/mh-elfalphapic 1969-12-31 18:00:00.000000000 -0600 @@ -1 +0,0 @@ -PICFLAG=3D-fPIC diff -x CVS -uNr gnats/config/mh-go32 gnats.new/config/mh-go32 --- gnats/config/mh-go32 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-go32 1969-12-31 18:00:00.000000000 -0600 @@ -1,4 +0,0 @@ -# We don't want to use debugging information on DOS. Unfortunately, -# this requires that we set CFLAGS. -# This used to set -fno-omit-frame-pointer. -CFLAGS=3D-O2 diff -x CVS -uNr gnats/config/mh-hp300 gnats.new/config/mh-hp300 --- gnats/config/mh-hp300 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-hp300 1969-12-31 18:00:00.000000000 -0600 @@ -1,13 +0,0 @@ -# Define SYSV as -DSYSV if you are using a System V operating system. -SYSV =3D -DSYSV -# Avoid "too much defining" errors from HPUX compiler. -CC =3D cc -Wp,-H256000 -# If "ar" in $PATH is GNU ar, the symbol table may need rebuilding. -# If it's HP/UX ar, this should be harmless. -RANLIB =3D ar ts - -# Native cc can't bootstrap gcc with -g. Defining CFLAGS here loses (a) -# for non-gcc directories, (b) if we are compiling with gcc, not -# native cc. Neither (a) nor (b) has a trivial fix though. - -CFLAGS =3D diff -x CVS -uNr gnats/config/mh-hpux gnats.new/config/mh-hpux --- gnats/config/mh-hpux 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-hpux 1969-12-31 18:00:00.000000000 -0600 @@ -1,4 +0,0 @@ -# Define SYSV as -DSYSV if you are using a System V operating system. -CC =3D cc -Wp,-H256000 -SYSV =3D -DSYSV -RANLIB =3D true diff -x CVS -uNr gnats/config/mh-hpux8 gnats.new/config/mh-hpux8 --- gnats/config/mh-hpux8 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-hpux8 1969-12-31 18:00:00.000000000 -0600 @@ -1,4 +0,0 @@ -# Define SYSV as -DSYSV if you are using a System V operating system. -CC =3D cc -Wp,-H256000 -SYSV =3D -DSYSV -RANLIB =3D true diff -x CVS -uNr gnats/config/mh-interix gnats.new/config/mh-interix --- gnats/config/mh-interix 1999-10-26 02:10:16.000000000 -0500 +++ gnats.new/config/mh-interix 1969-12-31 18:00:00.000000000 -0600 @@ -1,14 +0,0 @@ -# The shell may not be in /bin.=20 -SHELL =3D sh -RANLIB =3D true - -# We don't want debugging info in Interix-hosted toolchains. -# Accomplish this by overriding CFLAGS. This is also a workaround -# for LD crash when building shared libstdc++. -CFLAGS=3D-O2 -CXXFLAGS=3D-O2 - -# We also need to override LIBGCC2_DEBUG_CFLAGS so libgcc2 will be -# built without debugging information - -LIBGCC2_DEBUG_CFLAGS=3D diff -x CVS -uNr gnats/config/mh-irix4 gnats.new/config/mh-irix4 --- gnats/config/mh-irix4 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-irix4 1969-12-31 18:00:00.000000000 -0600 @@ -1,7 +0,0 @@ -# Makefile changes for SGI's running IRIX-4.x. -# Tell compiler to use K&R C. We can't compile under the SGI Ansi -# environment. Also bump switch table size so that cp-parse will -# compile. Bump string length limit so linker builds. - -CC =3D cc -cckr -Wf,-XNg1500 -Wf,-XNk1000 -Wf,-XNh2000 -Wf,-XNl8192 -SYSV =3D -DSYSV diff -x CVS -uNr gnats/config/mh-irix5 gnats.new/config/mh-irix5 --- gnats/config/mh-irix5 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-irix5 1969-12-31 18:00:00.000000000 -0600 @@ -1,3 +0,0 @@ -# Makefile changes for SGI's running IRIX-5.x. -SYSV =3D -DSYSV -RANLIB =3D true diff -x CVS -uNr gnats/config/mh-irix6 gnats.new/config/mh-irix6 --- gnats/config/mh-irix6 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-irix6 1969-12-31 18:00:00.000000000 -0600 @@ -1,7 +0,0 @@ -# Makefile changes for SGI's running IRIX-6.x. -SYSV =3D -DSYSV -RANLIB =3D true -# Specify the ABI, to ensure that all Irix 6 systems will behave the same. -# Also, using -32 avoids bugs that exist in the n32/n64 support in some -# versions of the SGI compiler. -CC =3D cc -32 diff -x CVS -uNr gnats/config/mh-lynxos gnats.new/config/mh-lynxos --- gnats/config/mh-lynxos 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-lynxos 1969-12-31 18:00:00.000000000 -0600 @@ -1,2 +0,0 @@ -# /bin/cc is less than useful for our purposes. Always use GCC -CC =3D /bin/gcc diff -x CVS -uNr gnats/config/mh-lynxrs6k gnats.new/config/mh-lynxrs6k --- gnats/config/mh-lynxrs6k 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-lynxrs6k 1969-12-31 18:00:00.000000000 -0600 @@ -1,8 +0,0 @@ -# LynxOS running on the rs6000 doesn't have ranlib -RANLIB =3D true - -# /bin/cc is less than useful for our purposes. Always use GCC -CC =3D /usr/cygnus/progressive/bin/gcc - -# /bin/sh is too buggy, so use /bin/bash instead. -SHELL =3D /bin/bash diff -x CVS -uNr gnats/config/mh-m68kpic gnats.new/config/mh-m68kpic --- gnats/config/mh-m68kpic 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-m68kpic 1969-12-31 18:00:00.000000000 -0600 @@ -1 +0,0 @@ -PICFLAG=3D-fpic diff -x CVS -uNr gnats/config/mh-mingw32 gnats.new/config/mh-mingw32 --- gnats/config/mh-mingw32 1999-10-26 02:10:16.000000000 -0500 +++ gnats.new/config/mh-mingw32 1969-12-31 18:00:00.000000000 -0600 @@ -1,12 +0,0 @@ -# We don't want debugging info in Win32-hosted toolchains. -# Accomplish this by overriding CFLAGS. -CFLAGS=3D-O2 -CXXFLAGS=3D-O2 - -# We also need to override LIBGCC2_DEBUG_CFLAGS so libgcc2 will be -# built without debugging information - -LIBGCC2_DEBUG_CFLAGS=3D - -# custom installation rules for mingw32 (append .exe to binaries, etc.) -# INSTALL_DOSREL=3Dinstall-dosrel diff -x CVS -uNr gnats/config/mh-ncr3000 gnats.new/config/mh-ncr3000 --- gnats/config/mh-ncr3000 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-ncr3000 1969-12-31 18:00:00.000000000 -0600 @@ -1,17 +0,0 @@ -# Host configuration file for an NCR 3000 (i486/SVR4) system. - -# The NCR 3000 ships with a MetaWare compiler installed as /bin/cc. -# This compiler not only emits obnoxious copyright messages every time -# you run it, but it chokes and dies on a whole bunch of GNU source -# files. Default to using the AT&T compiler installed in /usr/ccs/ATT/cc. -# Unfortunately though, the AT&T compiler sometimes generates code that -# the assembler barfs on if -g is used, so disable it by default as well. -CC =3D /usr/ccs/ATT/cc -CFLAGS =3D - -# Define SYSV as -DSYSV if you are using a System V operating system. -SYSV =3D -DSYSV -DSVR4 -RANLIB =3D true - -# The l flag generates a warning from the SVR4 archiver, remove it. -AR_FLAGS =3D cq diff -x CVS -uNr gnats/config/mh-ncrsvr43 gnats.new/config/mh-ncrsvr43 --- gnats/config/mh-ncrsvr43 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-ncrsvr43 1969-12-31 18:00:00.000000000 -0600 @@ -1,9 +0,0 @@ -# Host configuration file for an NCR 3000 (i486/SVR43) system. - -# The MetaWare compiler will generate a copyright message unless you -# turn it off by adding the -Hnocopyr flag. -CC =3D cc -Hnocopyr - -# Define SYSV as -DSYSV if you are using a System V operating system. -SYSV =3D -DSYSV -DSVR4 -RANLIB =3D true diff -x CVS -uNr gnats/config/mh-necv4 gnats.new/config/mh-necv4 --- gnats/config/mh-necv4 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-necv4 1969-12-31 18:00:00.000000000 -0600 @@ -1,11 +0,0 @@ -# Host Makefile fragment for NEC MIPS SVR4. - -# The C compiler on NEC MIPS SVR4 needs bigger tables. -CC =3D cc -ZXNd=3D5000 -ZXNg=3D1000 - -# Define SYSV as -DSYSV if you are using a System V operating system. -SYSV =3D -DSYSV -DSVR4 -RANLIB =3D true - -# NEC -lX11 needs some other libraries. -X11_EXTRA_LIBS =3D -lsocket -lnsl diff -x CVS -uNr gnats/config/mh-papic gnats.new/config/mh-papic --- gnats/config/mh-papic 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-papic 1969-12-31 18:00:00.000000000 -0600 @@ -1 +0,0 @@ -PICFLAG=3D-fPIC diff -x CVS -uNr gnats/config/mh-ppcpic gnats.new/config/mh-ppcpic --- gnats/config/mh-ppcpic 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-ppcpic 1969-12-31 18:00:00.000000000 -0600 @@ -1 +0,0 @@ -PICFLAG=3D-fPIC diff -x CVS -uNr gnats/config/mh-riscos gnats.new/config/mh-riscos --- gnats/config/mh-riscos 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-riscos 1969-12-31 18:00:00.000000000 -0600 @@ -1,15 +0,0 @@ -# This is for a MIPS running RISC/os 4.52C. - -# This is needed for GDB, but needs to be in the top-level make because -# if a library is compiled with the bsd headers and gets linked with the -# sysv system libraries all hell can break loose (e.g. a jmp_buf might be -# a different size). -# ptrace(2) apparently has problems in the BSD environment. No workaround= is -# known except to select the sysv environment. Could we use /proc instead? -# These "sysv environments" and "bsd environments" often end up being a pa= in. -# -# This is not part of CFLAGS because perhaps not all C compilers have this -# option. -CC=3D cc -systype sysv - -RANLIB =3D true diff -x CVS -uNr gnats/config/mh-sco gnats.new/config/mh-sco --- gnats/config/mh-sco 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-sco 1969-12-31 18:00:00.000000000 -0600 @@ -1,10 +0,0 @@ -# Define SYSV as -DSYSV if you are using a System V operating system. -SYSV =3D -DSYSV -RANLIB =3D true -# You may need this if you don't have bison. -# BISON =3D yacc -Sm10400 -# The native C compiler botches some simple uses of const. Unfortunately, -# it doesn't defined anything like "__sco__" for us to test for in ansidec= l.h. -CC =3D cc -Dconst=3D - -X11_EXTRA_LIBS =3D -lsocket -lm -lintl -lmalloc diff -x CVS -uNr gnats/config/mh-solaris gnats.new/config/mh-solaris --- gnats/config/mh-solaris 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-solaris 1969-12-31 18:00:00.000000000 -0600 @@ -1,6 +0,0 @@ -# Makefile changes for Suns running Solaris 2 - -SYSV =3D -DSYSV -RANLIB =3D true - -X11_EXTRA_LIBS =3D -lnsl -lsocket diff -x CVS -uNr gnats/config/mh-sparcpic gnats.new/config/mh-sparcpic --- gnats/config/mh-sparcpic 1999-10-26 02:10:16.000000000 -0500 +++ gnats.new/config/mh-sparcpic 1969-12-31 18:00:00.000000000 -0600 @@ -1 +0,0 @@ -PICFLAG=3D`case "${LIBCFLAGS} ${LIBCXXFLAGS}" in *-fpic* ) echo -fpic ;; *= ) echo -fPIC ;; esac` diff -x CVS -uNr gnats/config/mh-sun3 gnats.new/config/mh-sun3 --- gnats/config/mh-sun3 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-sun3 1969-12-31 18:00:00.000000000 -0600 @@ -1,3 +0,0 @@ -# Sun's C compiler needs the -J flag to be able to compile cp-parse.c -# without overflowing the jump tables (-J says to use a 32 bit table) -CC =3D cc -J diff -x CVS -uNr gnats/config/mh-sysv gnats.new/config/mh-sysv --- gnats/config/mh-sysv 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-sysv 1969-12-31 18:00:00.000000000 -0600 @@ -1,3 +0,0 @@ -# Define SYSV as -DSYSV if you are using a System V operating system. -SYSV =3D -DSYSV -RANLIB =3D true diff -x CVS -uNr gnats/config/mh-sysv4 gnats.new/config/mh-sysv4 --- gnats/config/mh-sysv4 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-sysv4 1969-12-31 18:00:00.000000000 -0600 @@ -1,11 +0,0 @@ -# Define SYSV as -DSYSV if you are using a System V operating system. -SYSV =3D -DSYSV -DSVR4 -RANLIB =3D true - -# C++ debugging is not yet supported under SVR4 (DWARF) -CXXFLAGS=3D-O - -# The l flag generates a warning from the SVR4 archiver, remove it. -AR_FLAGS =3D cr - -X11_EXTRA_LIBS =3D -lnsl diff -x CVS -uNr gnats/config/mh-sysv5 gnats.new/config/mh-sysv5 --- gnats/config/mh-sysv5 1999-10-26 02:10:16.000000000 -0500 +++ gnats.new/config/mh-sysv5 1969-12-31 18:00:00.000000000 -0600 @@ -1,8 +0,0 @@ -# Define SYSV as -DSYSV if you are using a System V operating system. -SYSV =3D -DSYSV -DSVR4 -DSVR5 -RANLIB =3D true - -# The l flag generates a warning from the SVR4 archiver, remove it. -AR_FLAGS =3D cr - -X11_EXTRA_LIBS =3D -lnsl diff -x CVS -uNr gnats/config/mh-vaxult2 gnats.new/config/mh-vaxult2 --- gnats/config/mh-vaxult2 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-vaxult2 1969-12-31 18:00:00.000000000 -0600 @@ -1,2 +0,0 @@ -# The old BSD pcc isn't up to compiling parts of gdb so use gcc -CC =3D gcc diff -x CVS -uNr gnats/config/mh-windows gnats.new/config/mh-windows --- gnats/config/mh-windows 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-windows 1969-12-31 18:00:00.000000000 -0600 @@ -1,16 +0,0 @@ -CC=3Dcc -CFLAGS=3D -RANLIB=3Dtrue -AR_FLAGS=3D - -.PHONY: windows -windows: nmake.mak - @echo "Don't forget to setup setvars.mak!" - -nmake.mak: to-be-built - @echo Building nmake files - @$(srcdir)/gdb/mswin/genmakes - -to-be-built: - @echo Recording commands - @$(srcdir)/gdb/mswin/recordit diff -x CVS -uNr gnats/config/mh-x86pic gnats.new/config/mh-x86pic --- gnats/config/mh-x86pic 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mh-x86pic 1969-12-31 18:00:00.000000000 -0600 @@ -1 +0,0 @@ -PICFLAG=3D-fpic diff -x CVS -uNr gnats/config/missing gnats.new/config/missing --- gnats/config/missing 1969-12-31 18:00:00.000000000 -0600 +++ gnats.new/config/missing 2005-02-22 22:06:36.000000000 -0600 @@ -0,0 +1,360 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=3D2003-09-02.23 + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003=20 +# Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# This program 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 program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=3D: + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=3Dconfigure.ac +else + configure_ac=3Dconfigure.in +fi + +msg=3D"missing on your system" + +case "$1" in +--run) + # Try to run requested program, and just exit if it succeeds. + run=3D + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? =3D 63; then + run=3D: + msg=3D"probably too old" + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case "$1" in + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Send bug reports to ." + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + + aclocal*) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might wa= nt + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=3D`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${confi= gure_ac}` + test -z "$files" && files=3D"config.h" + touch_files=3D + for f in $files; do + case "$f" in + *:*) touch_files=3D"$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files=3D"$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}= '. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=3D`echo "$*" | sed -n 's/.*--output[ =3D]*\([^ ]*\).*/\1/p'` + test -z "$file" && file=3D`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\= 1/p'` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if [ $# -ne 1 ]; then + eval LASTARG=3D"\${$#}" + case "$LASTARG" in + *.y) + SRCFILE=3D`echo "$LASTARG" | sed 's/y$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=3D`echo "$LASTARG" | sed 's/y$/h/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if [ ! -f y.tab.h ]; then + echo >y.tab.h + fi + if [ ! -f y.tab.c ]; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex|flex) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if [ $# -ne 1 ]; then + eval LASTARG=3D"\${$#}" + case "$LASTARG" in + *.l) + SRCFILE=3D`echo "$LASTARG" | sed 's/l$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if [ ! -f lex.yy.c ]; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=3D`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=3D`echo "$*" | sed -n 's/.*--output=3D\([^ ]*\).*/\1/p'` + fi + if [ -f "$file" ]; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit 1 + fi + ;; + + makeinfo) + if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then + # We have makeinfo, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + file=3D`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=3D`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=3D`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $f= ile` + fi + touch $file + ;; + + tar) + shift + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + fi + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar "$@" && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar "$@" && exit 0 + fi + firstarg=3D"$1" + if shift; then + case "$firstarg" in + *o*) + firstarg=3D`echo "$firstarg" | sed s/o//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + case "$firstarg" in + *h*) + firstarg=3D`echo "$firstarg" | sed s/h//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=3D" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff -x CVS -uNr gnats/config/mpw/ChangeLog gnats.new/config/mpw/ChangeLog --- gnats/config/mpw/ChangeLog 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mpw/ChangeLog 1969-12-31 18:00:00.000000000 -0600 @@ -1,53 +0,0 @@ -Tue Nov 26 12:34:12 1996 Stan Shebs - - * g-mpw-make.sed: Fix some comments. - -Mon Sep 16 14:42:52 1996 Stan Shebs - - * g-mpw-make.sed (HLDENV): Edit out all references. - -Thu Aug 15 19:49:23 1996 Stan Shebs - - * true: New script, identical to mpw-true. - * g-mpw-make.sed: Add @DASH_C_FLAG@ and @SEGMENT_FLAG()@ - to the editors for compile commands. - -Thu Aug 1 15:01:42 1996 Stan Shebs - - * mpw-true, mpw-touch, null-command: New scripts. - * README: Describe usage in more detail. - -Tue Dec 12 14:51:51 1995 Stan Shebs - - * g-mpw-make.sed: Don't edit out "version=3D" occurrences. - -Fri Dec 1 11:46:18 1995 Stan Shebs - - * g-mpw-make.sed (bindir, libdir): Edit the positions of - pathname separators to work with other pathnames better. - -Tue Nov 7 15:08:07 1995 Stan Shebs - - * g-mpw-make.sed: Add comment about Duplicate vs Catenate, - add additional pattern for editing link-compile commands. - -Tue Oct 24 14:28:51 1995 Stan Shebs - - * g-mpw-make.sed: Add handling for *.tab.[hc] files. - (CHILL_FOR_TARGET, CHILL_LIB): Edit out tricky definitions - of these. - -Thu Sep 28 21:05:10 1995 Stan Shebs - - * g-mpw-make.sed: New file, generic sed commands to translate - Unix makefiles into MPW makefile syntax. - -Fri Mar 17 11:51:20 1995 Stan Shebs - - * README: Clarify instructions. - * fi: Remove. - -Wed Dec 21 15:45:53 1994 Stan Shebs - - * MoveIfChange, README, fi, forward-include, open-brace, - tr-7to8-src: New files. diff -x CVS -uNr gnats/config/mpw/MoveIfChange gnats.new/config/mpw/MoveIfC= hange --- gnats/config/mpw/MoveIfChange 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mpw/MoveIfChange 1969-12-31 18:00:00.000000000 -0600 @@ -1,19 +0,0 @@ -# Rename a file only if it is different from a previously existing -# file of the same name. This is useful for keeping make from doing -# too much work if the contents of a file haven't changed. - -# This is an MPW translation of the standard GNU sh script move-if-change. - -Set exit 0 - -If "`exists -f "{2}"`" - Compare "{1}" "{2}" >dev:null - If {status} !=3D 0 - Rename -y "{1}" "{2}" - Else - Echo "{2}" is unchanged - Delete -i -y "{1}" - End -Else - Rename -y "{1}" "{2}" -End diff -x CVS -uNr gnats/config/mpw/README gnats.new/config/mpw/README --- gnats/config/mpw/README 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mpw/README 1969-12-31 18:00:00.000000000 -0600 @@ -1,23 +0,0 @@ -This directory contains MPW scripts and related files that are needed to -build Cygnus GNU tools for MPW. The scripts should be somewhere on the -command path; our usual practice has been to have a separate directory -for the scripts, and put the tools (byacc, flex, and sed at least) there -also; then it's easier to drag the support bits around as a group, or to -upgrade MPW versions. The complete package of scripts and tool binaries -is usually available as pub/mac/buildtools.cpt.hqx on ftp.cygnus.com. - -"tr-7to8-src" is actually the source to an MPW script that transforms -sequences like "\Option-d" into the actual 8-bit chars that MPW needs. -It's only the source because it can't itself include any 8-bit chars. -It *can* be processed into a genuine "tr-7to8" by using itself: - - tr-7to8 tr-7to8-src | sed -e 's/Src//' >new-tr-7to8 - -Use this to verify: - - compare tr-7to8 new-tr-7to8 - -If you don't have a working tr-7to8, then you will have to manually -replace all occurrences of "\Option-d" with real Option-d (which looks -like a delta), then do similarly with all the other "\Option-..." -strings, and then change "\SrcOption-d" into the string "\Option-d". diff -x CVS -uNr gnats/config/mpw/forward-include gnats.new/config/mpw/forw= ard-include --- gnats/config/mpw/forward-include 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mpw/forward-include 1969-12-31 18:00:00.000000000 -0600 @@ -1,3 +0,0 @@ -Echo '#include' =B6""{1}"=B6" >"{2}".tem -MoveIfChange "{2}".tem "{2}" - diff -x CVS -uNr gnats/config/mpw/g-mpw-make.sed gnats.new/config/mpw/g-mpw= -make.sed --- gnats/config/mpw/g-mpw-make.sed 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mpw/g-mpw-make.sed 1969-12-31 18:00:00.000000000 -0600 @@ -1,293 +0,0 @@ -# Sed commands to translate Unix makefiles into MPW makefiles. -# These are nominally generic, but work best on the makefiles used -# for GNU programs. - -# Whack out any commented-out lines that are probably commands; -# they can only cause trouble later on. -/^# /d - -# Change dependency char. -/:$/s/:/ \\Option-f/g -/^[^ :#][^:]*:/s/\([ ]*\):\([ ]*\)/ \\Option-f /g - -# Change syntax of Makefile vars. -/\$/s/\${\([a-zA-Z0-9_-]*\)}/{\1}/g -/\$/s/\$(\([a-zA-Z0-9_-]*\))/{\1}/g -/ $@/s/ $@/ {Targ}/ - -# Double-$ are literals to Unix but not to MPW make. -/\$\$/s/\$\$/$/g - -# Change pathname syntax. -/\//s,\.\./\/\.\./,:::,g -/\//s,\.\./,::,g -/\.\//s,\./,:,g -/\//s,/,:,g -# Undo excess changes. -/and/s,and:or$,and/or, -/and/s,and:or ,and/or , -/want/s,want:need,want/need, -# Fixing up sed commands. -/-e/s_":\([^:]*\):d"_"/\1/d"_g -/-e/s_":\([^:]*\):,:\([^:]*\):d"_"/\1/,/\2/d"_g - -/=3D/s/ =3D \.$/ =3D :/ - -# Make these go away so that later edits not confused. -/HLDENV/s/{HLDENV}// - -# Comment out any explicit srcdir setting. -/srcdir/s/^srcdir/# srcdir/ - -/BASEDIR/s/^BASEDIR =3D.*$/BASEDIR =3D "{srcroot}"/ -/{BASEDIR}:/s/{BASEDIR}:/{BASEDIR}/g -/{srcdir}:/s/{srcdir}:/"{srcdir}"/g -/"{srcdir}":/s/"{srcdir}":/"{srcdir}"/g - -# Tweak some conventions that are backwards for the Mac. -/bindir/s/{exec_prefix}:bin/{exec_prefix}bin:/ -/libdir/s/{exec_prefix}:lib/{exec_prefix}lib:/ - -# Comment out settings of anything set by mpw host config. -/CC/s/^CC *=3D/#CC =3D/ -/CFLAGS/s/^CFLAGS *=3D/#CFLAGS =3D/ -/AR/s/^AR *=3D/#AR =3D/ -/AR_FLAGS/s/^AR_FLAGS *=3D/#AR_FLAGS =3D/ -/RANLIB/s/^RANLIB *=3D/#RANLIB =3D/ -/CC_LD/s/^CC_LD *=3D/#CC_LD =3D/ -/LDFLAGS/s/^LDFLAGS *=3D/#LDFLAGS =3D/ - -# Change -I usages. -/-I/s/-I\./-i :/g -/-I/s/-I::bfd/-i ::bfd:/g -/-I/s/-I::include/-i ::include:/g -/-I/s/-I/-i /g - -# Change -D usage. -/-D/s/\([ =3D]\)-D\([^ ]*\)/\1-d \2/g - -# Change continuation char. -/\\$/s/\\$/\\Option-d/ - -# Change wildcard char. -/\*/s/\*/\\Option-x/g - -# Change path of various types of source files. This rule does not allow -# for file names with multiple dots in the name. -/\.[chly]/s/\([ ><=3D]\)\([-a-zA-Z0-9_${}:"]*\)\.\([chly]\)/\1"{s}"\2.\3/g -/\.[chly]/s/^\([-a-zA-Z0-9_${}:"]*\)\.\([chly]\)/"{s}"\1.\2/ -# Allow files named *.tab.[ch] as a special case. -/\.tab\.[ch]/s/\([ ><=3D]\)\([-a-zA-Z0-9_${}:"]*\.tab\)\.\([ch]\)/\1"{s}"= \2.\3/g -/\.tab\.[ch]/s/^\([-a-zA-Z0-9_${}:"]*\.tab\)\.\([ch]\)/"{s}"\1.\2/ -# Fix some overenthusiasms. -/{s}/s/"{s}""{srcdir}"/"{srcdir}"/g -/{s}/s/"{s}"{\([a-zA-Z0-9_]*\)dir}/"{\1dir}"/g -/{s}/s/"{s}"{\([a-zA-Z0-9_]*\)DIR}/"{\1DIR}"/g -/{s}/s/"{s}""{\([a-zA-Z0-9_]*\)dir}"/"{\1dir}"/g -/{s}/s/"{s}""{\([a-zA-Z0-9_]*\)DIR}"/"{\1DIR}"/g -/{s}/s/"{s}":/:/g -/{s}/s/^"{s}"//g -/{s}/s/"{s}""{s}"/"{s}"/g -/{s}/s/"{s}""{srcdir}"/"{s}"/g -/{s}/s/"{srcdir}""{s}"/"{s}"/g - -# The .def files are also typically source files. -/\.def/s/\([ ><]\)\([-a-zA-Z0-9_${}:"]*\)\.def/\1"{s}"\2.def/g -/\.def/s/^\([-a-zA-Z0-9_${}:"]*\)\.def/"{s}"\1.def/g - -# Change extension and path of objects. -/\.o/s/\([ =3D]\)\([-a-zA-Z0-9_${}:"]*\)\.o/\1"{o}"\2.c.o/g -/\.o/s/^\([-a-zA-Z0-9_${}:"]*\)\.o/"{o}"\1.c.o/ -# Allow *.tab.o files as a special case of a 2-dot-name file. -/\.o/s/\([ =3D]\)\([-a-zA-Z0-9_${}:"]*\)\.tab\.o/\1"{o}"\2.tab.c.o/g -/\.o/s/^\([-a-zA-Z0-9_${}:"]*\)\.tab\.o/"{o}"\1.tab.c.o/ -# Clean up. -/"{o}"/s/"{o}""{o}"/"{o}"/g -/"{o}"/s/^"{o}"\([a-zA-Z0-9_]*\)=3D/\1=3D/ - -# Change extension of libs. -/\.a/s/lib\([a-z]*\)\.a/lib\1.o/g - -# Remove non-fail option. -/-/s/^\([ ]*\)-/\1/ -# Fix overeagernesses - assumes no one-letter commands. -/^[ ]*[a-z] /s/^\([ ]*\)\([a-z]\) /\1-\2 / - -# Remove non-echo option. (watch out for autoconf things) -/@/s/^\([ ]*\)@/\1/ - -# Change cp to Duplicate. -# Catenate is perhaps more accurate, but the pattern would have to -# identify the output file and add a '>' redirection into it. -/cp/s/^\([ ]*\)cp /\1Duplicate -d -y / -# Change mv to Rename. -/mv/s/^\([ ]*\)mv /\1Rename -y / -/Rename/s/^\([ ]*\)Rename -y -f/\1Rename -y/ -# Change rm to Delete. -/rm -rf/s/^\([ ]*\)rm -rf /\1Delete -i -y / -/rm -f/s/^\([ ]*\)rm -f /\1Delete -i -y / -/rm/s/^\([ ]*\)rm /\1Delete -i -y / -# Note that we don't mess with ln - directory-specific scripts -# must decide what to do with symlinks. -# Change cat to Catenate. -/cat/s/^\([ ]*\)cat /\1Catenate / -# Change touch to mpw-touch. -/touch/s/^\([ ]*\)touch /\1mpw-touch / -# Change mkdir to NewFolder. -/mkdir/s/^\([ ]*\)mkdir /\1NewFolder / -# Change var setting to Set. -/=3D/s/^\([ ]*\)\([-a-zA-Z0-9_]*\)=3D\([^;]*\); \\Option-d/\1Set \2 \3/ - -# Change tests. -/if /s/if \[ *-f \([^ ]*\) ] *; *\\Option-d/If "`Exists "\1"`" !=3D ""/ -/if /s/if \[ *-f \([^ ]*\) ] *; *then *\\Option-d/If "`Exists "\1"`" !=3D = ""/ -/if /s/if \[ ! *-f \([^ ]*\) ] *; *\\Option-d/If "`Exists "\1"`" =3D=3D ""/ -/if /s/if \[ ! *-f \([^ ]*\) ] *; *then \\Option-d/If "`Exists "\1"`" =3D= =3D ""/ - -/if /s/if \[ *-d \([^ ]*\) ] *; *\\Option-d/If "`Exists "\1"`" !=3D ""/ -/if /s/if \[ *-d \([^ ]*\) ] *; *then *\\Option-d/If "`Exists "\1"`" !=3D = ""/ -/if /s/if \[ ! *-d \([^ ]*\) ] *; *\\Option-d/If "`Exists "\1"`" =3D=3D ""/ -/if /s/if \[ ! *-d \([^ ]*\) ] *; *then *\\Option-d/If "`Exists "\1"`" =3D= =3D ""/ - -/if /s/if \[ -d \([^ ]*\) ] *; then true *; else mkdir \([^ ;]*\) *; fi/If= "`Exists "\1"`" !=3D "" NewFolder \2 End If/ - -/if /s/if \[ \([^ ]*\) =3D \([^ ]*\) ] *; *\\Option-d/If "\1" =3D=3D "\2"/ -/if /s/if \[ \([^ ]*\) =3D \([^ ]*\) ] *; *then *\\Option-d/If "\1" =3D=3D= "\2"/ - -/if /s/if \[ \([^ ]*\) !=3D \([^ ]*\) ] *; *\\Option-d/If "\1" !=3D "\2"/ -/if /s/if \[ \([^ ]*\) !=3D \([^ ]*\) ] *; *then *\\Option-d/If "\1" !=3D = "\2"/ - -/if /s/if \[ \([^ ]*\) -eq \([^ ]*\) ] *; *\\Option-d/If "\1" !=3D "\2"/ -/if /s/if \[ \([^ ]*\) -eq \([^ ]*\) ] *; *then *\\Option-d/If "\1" !=3D "= \2"/ - -/^[ ]*else true$/c\ - Else\ - mpw-true\ - - -/else/s/^\([ ]*\)else[ ]*$/\1Else/ -/else/s/^\([ ]*\)else[; ]*\\Option-d$/\1Else/ - -/^[ ]*else[ ]*true[ ]*$/c\ - Else\ - mpw-true - -/^[ ]*else[ ]*true[; ]*fi$/c\ - Else\ - mpw-true\ - End If - -/fi/s/^\([ ]*\)fi *$/\1End/ -/fi/s/^\([ ]*\)fi *; *\\Option-d/\1End/ - -# Change looping. -/for/s/^\([ ]*\)for \([-a-zA-Z0-9_]*\) in \([^;]*\); *do *\\Option-d/\1Fo= r \2 In \3/ -/^\([ ]*\)do *\\Option-d/d -/done/s/^\([ ]*\)done *; *\\Option-d/\1End/ -/done/s/^\([ ]*\)done$/\1End/ - -# Trailing semicolons and continued lines are unneeded sh syntax. -/; \\Option-d/s/; \\Option-d// - -# Change move-if-change to MoveIfChange. -/move-if-change/s/\([^ ]*\)move-if-change/MoveIfChange/g - -# Change $(SHELL) to the script name by itself. -/SHELL/s/^\([ ]*\){SHELL} /\1/ - -# Change syntax of default rule dependency. -/^\.c\.o/s/^\.c\.o \\Option-f$/.c.o \\Option-f .c/ - -# Change default rule's action. -/{CC} -c/s/{CC} -c \(.*\) \$<$/{CC} @DASH_C_FLAG@ {DepDir}{Default}.c \1 @= SEGMENT_FLAG({Default})@ -o {TargDir}{Default}.c.o/ - -# This is pretty disgusting, but I can't seem to detect empty rules. -/Option-f$/s/Option-f$/Option-f _oldest/g - -# Remove -c from explicit compiler calls. (but should not if GCC) -# Handle the case of a source file that is "{xxx}"file.c. -/ -c /s/{\([A-Z_]*\)CC}\(.*\) -c \(.*\)"\([^"]*\)"\([-a-z_]*\)\.c/{\1CC}\2= @DASH_C_FLAG@ \3"\4"\5.c -o "{o}"\5.c.o/ -# Handle the case of a source file that is "{xxx}"dir:file.c. -/ -c /s/{\([A-Z_]*\)CC}\(.*\) -c \(.*\)"\([^"]*\)"\([-a-z_]*\):\([-a-z_]*\= )\.c/{\1CC}\2 @DASH_C_FLAG@ \3"\4"\5:\6.c -o "{o}"\6.c.o/ - -# Change linking cc to linking sequence. -/-o/s/^\([ ]*\){CC} \(.*\){\([A-Z_]*\)CFLAGS} \(.*\){LDFLAGS} \(.*\)-o \(= [^ ]*\) \(.*\)$/\1{CC_LD} \2 {\3CFLAGS} \4 {LDFLAGS} \5 -o \6{PROG_EXT} \7\ -\1{MAKEPEF} \6{PROG_EXT} -o \6 {MAKEPEF_TOOL_FLAGS} {MAKEPEF_FLAGS}\ -\1{REZ} "{s}"\6.r -o \6 -append -d PROG_NAME=3D'"'\6'"' -d VERSION_STRING= =3D'"'{version}'"'/ -/-o/s/^\([ ]*\){CC} \(.*\){\([A-Z_]*\)CFLAGS} \(.*\)-o \([^ ]*\) \(.*\){L= DFLAGS} \(.*\)$/\1{CC_LD} \2 {\3CFLAGS} \4 {LDFLAGS} \6 -o \5{PROG_EXT} \7\ -\1{MAKEPEF} \5{PROG_EXT} -o \5 {MAKEPEF_TOOL_FLAGS} {MAKEPEF_FLAGS}\ -\1{REZ} "{s}"\5.r -o \5 -append -d PROG_NAME=3D'"'\5'"' -d VERSION_STRING= =3D'"'{version}'"'/ -/-o/s/^\([ ]*\){HOST_CC} \(.*\)-o \([^ ]*\) \(.*\)$/\1{HOST_CC_LD} \2 -o = \3{PROG_EXT} \4\ -\1{MAKEPEF} \3{PROG_EXT} -o \3 {MAKEPEF_TOOL_FLAGS} {MAKEPEF_FLAGS}\ -\1{REZ} "{s}"\3.r -o \3 -append -d PROG_NAME=3D'"'\3'"' -d VERSION_STRING= =3D'"'{version}'"'/ - -# Comment out .NOEXPORT rules. -/\.NOEXPORT/s/^\.NOEXPORT/#\.NOEXPORT/ -# Comment out .PHONY rules. -/\.PHONY/s/^\.PHONY/#\.PHONY/ -# Comment out .PRECIOUS rules. -/\.PRECIOUS/s/^\.PRECIOUS/#\.PRECIOUS/ -# Comment out .SUFFIXES rules. -/\.SUFFIXES/s/^\.SUFFIXES/#\.SUFFIXES/ - -# Set the install program appropriately. -/INSTALL/s/^INSTALL *=3D *`.*`:install.sh -c/INSTALL =3D Duplicate -y/ - -# Don't try to decide whether to use the tree's own tools. -/bison/s/`.*bison:bison.*`/bison -y/ -/byacc/s/`.*byacc:byacc.*`/byacc/ -/flex/s/`.*flex:flex.*`/flex/ - -# Turn transformed C comments in echo commands back into comments. -/echo/s,echo '\(.*\):\\Option-x\(.*\)\\Option-x:\(.*\)',echo '\1/*\2*/\3', - -# Whack out various clever expressions that search for tools, since -# the clever code is too /bin/sh specific. - -/^AR_FOR_TARGET =3D `/,/`$/c\ -AR_FOR_TARGET =3D ::binutils:ar\ - - -/^RANLIB_FOR_TARGET =3D `/,/`$/c\ -RANLIB_FOR_TARGET =3D ::binutils:ranlib\ - - -/^RANLIB_TEST_FOR_TARGET =3D /,/ranlib ] )$/c\ -RANLIB_TEST_FOR_TARGET =3D \ - - -/^EXPECT =3D `/,/`$/c\ -EXPECT =3D \ - - -/^RUNTEST =3D `/,/`$/c\ -RUNTEST =3D \ - - -/^CC_FOR_TARGET =3D `/,/`$/c\ -CC_FOR_TARGET =3D \ - - -/^CXX_FOR_TARGET =3D `/,/`$/c\ -CXX_FOR_TARGET =3D \ - - -/^CHILL_FOR_TARGET =3D `/,/`$/c\ -CHILL_FOR_TARGET =3D \ - - -/^CHILL_LIB =3D `/,/`$/c\ -CHILL_LIB =3D \ - -/sanit/s/{start-sanit...-[a-z0-9]*}// -/sanit/s/{end-sanit...-[a-z0-9]*}// - -# Add standard defines and default rules. -/^# srcdir/a\ -\ -s =3D "{srcdir}"\ -\ -o =3D :\ -\ -"{o}" \\Option-f : "{s}" - diff -x CVS -uNr gnats/config/mpw/mpw-mh-mpw gnats.new/config/mpw/mpw-mh-mpw --- gnats/config/mpw/mpw-mh-mpw 1999-10-26 02:10:16.000000000 -0500 +++ gnats.new/config/mpw/mpw-mh-mpw 1969-12-31 18:00:00.000000000 -0600 @@ -1,157 +0,0 @@ -# This is an MPW makefile fragment. - -# Since there are a multiplicity of Mac compilers and two different -# processors, this file is primarily a library of options for each -# compiler. Somebody else (such as a configure or build script) will -# make the actual choice. - -# Compiler to use for compiling. - -CC_MPW_C =3D C -d MPW_C -d ALMOST_STDC -d ANSI_PROTOTYPES -d MPW -mc68020 = -model far -b -w - -CC_SC =3D SC -d ALMOST_STDC -d ANSI_PROTOTYPES -d MPW -mc68020 -model far = -b -i '' -i : - -CC_MWC68K =3D MWC68K -d MPW -enum int -mpw_chars -sym on -w off -mc68020 -= model far - -CC_PPCC =3D PPCC -d powerc=3D1 -d pascal=3D -d ALMOST_STDC -d ANSI_PROTOTY= PES -d MPW -w - -CC_MRC =3D MrC -d powerc=3D1 -d pascal=3D -d ALMOST_STDC -d ANSI_PROTOTYPE= S -d MPW -i '' -i : -jm - -CC_SMrC =3D SMrC -d MPW - -# "-mpw_chars" is necessary because GNU sources often mix signed and -# unsigned casually. -# "-w off" is not a great idea, but CW7 is complaining about enum -# assignments. -# "-opt global,peep,l4,speed" is sometimes good, and sometimes bad. -# We must use {CIncludes} so that MPW tools will work; {MWCIncludes} -# defines stdout, islower, etc, in ways that are incompatible with MPW's -# runtime. However, this cannot be done via -i "{CIncludes}", since -# that does not affect how <>-type includes happen; instead, the variable -# MWCIncludes must be set to point at {CIncludes}. - -CC_MWCPPC =3D MWCPPC -d MPW -enum int -mpw_chars -sym on -w off - -# Note that GCC does *not* wire in a definition of "pascal", so that -# it can be handled in another way if desired. - -CC_68K_GCC =3D gC -Dpascal=3D -DANSI_PROTOTYPES -DMPW - -CC_PPC_GCC =3D gC -Dpowerc=3D1 -Dpascal=3D -DANSI_PROTOTYPES -DMPW - -# Nothing for the default CFLAGS. - -CFLAGS =3D=20 - -# Tool to use for making libraries/archives. - -AR_LIB =3D Lib - -AR_MWLINK68K =3D MWLink68K -xm library - -AR_PPCLINK =3D PPCLink -xm library - -AR_MWLINKPPC =3D MWLinkPPC -xm library - -AR_AR =3D ar - -AR_FLAGS =3D -o - -RANLIB_NULL =3D null-command - -RANLIB_RANLIB =3D ranlib - -# Compiler and/or linker to use for linking. - -CC_LD_LINK =3D Link -w -d -model far {CC_LD_TOOL_FLAGS} - -CC_LD_MWLINK68K =3D MWLink68K -w {CC_LD_TOOL_FLAGS} -sym on -model far - -CC_LD_PPCLINK =3D PPCLink -main __start -outputformat xcoff - -CC_LD_MWLINKPPC =3D MWLinkPPC -w {CC_LD_TOOL_FLAGS} -sym on - -CC_LD_GLD =3D gC - -# Extension for linker output. - -PROG_EXT_68K =3D - -PROG_EXT_XCOFF =3D .xcoff - -# Nothing for the default LDFLAGS. - -LDFLAGS =3D -w - -CC_LD_TOOL_FLAGS =3D -c 'MPS ' -t MPST - -# Libraries to link against. - -# It would appear that the math libraries are not -# needed except to provide a definition for scalb, -# which is called from ldexp, which is referenced -# in the m68k opcodes library. - -EXTRALIBS_C =3D \Option-d - "{CLibraries}"StdClib.o \Option-d - "{CLibraries}"Math.o \Option-d - "{CLibraries}"CSANELib.o \Option-d - "{Libraries}"Stubs.o \Option-d - "{Libraries}"Runtime.o \Option-d - "{Libraries}"Interface.o \Option-d - "{Libraries}"ToolLibs.o - -EXTRALIBS_MWC68K =3D \Option-d - "{CLibraries}"StdClib.o \Option-d - "{CLibraries}"Math.o \Option-d - "{CLibraries}"CSANELib.o \Option-d - "{Libraries}"Stubs.o \Option-d - "{Libraries}"Runtime.o \Option-d - "{Libraries}"Interface.o \Option-d - "{Libraries}"ToolLibs.o \Option-d - "{MW68KLibraries}MPW ANSI (4i) C.68K.Lib" - -EXTRALIBS_PPC_XCOFF =3D \Option-d - "{PPCLibraries}"StdCRuntime.o \Option-d - "{PPCLibraries}"InterfaceLib.xcoff \Option-d - "{PPCLibraries}"MathLib.xcoff \Option-d - "{PPCLibraries}"StdCLib.xcoff \Option-d - "{PPCLibraries}"PPCToolLibs.o \Option-d - "{PPCLibraries}"PPCCRuntime.o \Option-d - "{GCCPPCLibraries}"libgcc.xcoff - -EXTRALIBS_PPC =3D \Option-d - "{PPCLibraries}"StdCRuntime.o \Option-d - "{SharedLibraries}"InterfaceLib \Option-d - "{SharedLibraries}"MathLib \Option-d - "{SharedLibraries}"StdCLib \Option-d - "{PPCLibraries}"PPCToolLibs.o \Option-d - "{PPCLibraries}"PPCCRuntime.o \Option-d - "{GCCPPCLibraries}"libgcc.xcoff - -EXTRALIBS_MWCPPC =3D \Option-d - "{MWPPCLibraries}"MWStdCRuntime.Lib \Option-d - "{MWPPCLibraries}"InterfaceLib \Option-d - "{MWPPCLibraries}"StdCLib \Option-d - "{MWPPCLibraries}"MathLib \Option-d - "{MWPPCLibraries}"PPCToolLibs.o - -# Tool to make PEF with, if needed. - -MAKEPEF_NULL =3D null-command - -MAKEPEF_PPC =3D MakePEF - -MAKEPEF_FLAGS =3D \Option-d - -l InterfaceLib.xcoff=3DInterfaceLib \Option-d - -l MathLib.xcoff=3DMathLib \Option-d - -l StdCLib.xcoff=3DStdCLib - -MAKEPEF_TOOL_FLAGS =3D -ft MPST -fc 'MPS ' - -# Resource compiler to use. - -REZ_68K =3D Rez - -REZ_PPC =3D Rez -d WANT_CFRG - diff -x CVS -uNr gnats/config/mpw/mpw-touch gnats.new/config/mpw/mpw-touch --- gnats/config/mpw/mpw-touch 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mpw/mpw-touch 1969-12-31 18:00:00.000000000 -0600 @@ -1,7 +0,0 @@ -# "Touch" command. - -If "`Exists "{1}"`" !=3D "" - SetFile -m . "{1}" -Else - Echo ' ' > "{1}" -End If diff -x CVS -uNr gnats/config/mpw/mpw-true gnats.new/config/mpw/mpw-true --- gnats/config/mpw/mpw-true 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mpw/mpw-true 1969-12-31 18:00:00.000000000 -0600 @@ -1 +0,0 @@ -Exit 0 diff -x CVS -uNr gnats/config/mpw/null-command gnats.new/config/mpw/null-co= mmand --- gnats/config/mpw/null-command 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mpw/null-command 1969-12-31 18:00:00.000000000 -0600 @@ -1 +0,0 @@ -# This command does nothing. diff -x CVS -uNr gnats/config/mpw/open-brace gnats.new/config/mpw/open-brace --- gnats/config/mpw/open-brace 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mpw/open-brace 1969-12-31 18:00:00.000000000 -0600 @@ -1,4 +0,0 @@ -# MPW makefiles seem not to have any way to get a literal open -# brace into a rule anywhere, so this does the job. - -Echo '{' diff -x CVS -uNr gnats/config/mpw/tr-7to8-src gnats.new/config/mpw/tr-7to8-= src --- gnats/config/mpw/tr-7to8-src 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mpw/tr-7to8-src 1969-12-31 18:00:00.000000000 -0600 @@ -1,9 +0,0 @@ -StreamEdit -e \Option-d - '/\Option-x/ \Option-d - Replace /\Option-d\SrcOption-d/ "\Option-d\Option-d" -c \Option-5 ; \O= ption-d - Replace /\Option-d\SrcOption-f/ "\Option-d\Option-f" -c \Option-5 ; \O= ption-d - Replace /\Option-d\SrcOption-8/ "\Option-d\Option-8" -c \Option-5 ; \Opti= on-d - Replace /\Option-d\SrcOption-5/ "\Option-d\Option-5" -c \Option-5 ; \Opti= on-d - Replace /\Option-d\SrcOption-x/ "\Option-d\Option-x" -c \Option-5 ; \Opti= on-d - Replace /\Option-d\SrcOption-r/ "\Option-d\Option-r" -c \Option-5' \Opti= on-d - "{1}" diff -x CVS -uNr gnats/config/mpw/true gnats.new/config/mpw/true --- gnats/config/mpw/true 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mpw/true 1969-12-31 18:00:00.000000000 -0600 @@ -1 +0,0 @@ -Exit 0 diff -x CVS -uNr gnats/config/mpw-mh-mpw gnats.new/config/mpw-mh-mpw --- gnats/config/mpw-mh-mpw 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mpw-mh-mpw 1969-12-31 18:00:00.000000000 -0600 @@ -1,157 +0,0 @@ -# This is an MPW makefile fragment. - -# Since there are a multiplicity of Mac compilers and two different -# processors, this file is primarily a library of options for each -# compiler. Somebody else (such as a configure or build script) will -# make the actual choice. - -# Compiler to use for compiling. - -CC_MPW_C =3D C -d MPW_C -d ALMOST_STDC -d ANSI_PROTOTYPES -d MPW -mc68020 = -model far -b -w - -CC_SC =3D SC -d ALMOST_STDC -d ANSI_PROTOTYPES -d MPW -mc68020 -model far = -b -i '' -i : - -CC_MWC68K =3D MWC68K -d MPW -enum int -mpw_chars -sym on -w off -mc68020 -= model far - -CC_PPCC =3D PPCC -d powerc=3D1 -d pascal=3D -d ALMOST_STDC -d ANSI_PROTOTY= PES -d MPW -w - -CC_MRC =3D MrC -d powerc=3D1 -d pascal=3D -d ALMOST_STDC -d ANSI_PROTOTYPE= S -d MPW -i '' -i : -jm - -CC_SMrC =3D SMrC -d MPW - -# "-mpw_chars" is necessary because GNU sources often mix signed and -# unsigned casually. -# "-w off" is not a great idea, but CW7 is complaining about enum -# assignments. -# "-opt global,peep,l4,speed" is sometimes good, and sometimes bad. -# We must use {CIncludes} so that MPW tools will work; {MWCIncludes} -# defines stdout, islower, etc, in ways that are incompatible with MPW's -# runtime. However, this cannot be done via -i "{CIncludes}", since -# that does not affect how <>-type includes happen; instead, the variable -# MWCIncludes must be set to point at {CIncludes}. - -CC_MWCPPC =3D MWCPPC -d MPW -enum int -mpw_chars -sym on -w off - -# Note that GCC does *not* wire in a definition of "pascal", so that -# it can be handled in another way if desired. - -CC_68K_GCC =3D gC -Dpascal=3D -DANSI_PROTOTYPES -DMPW - -CC_PPC_GCC =3D gC -Dpowerc=3D1 -Dpascal=3D -DANSI_PROTOTYPES -DMPW - -# Nothing for the default CFLAGS. - -CFLAGS =3D=20 - -# Tool to use for making libraries/archives. - -AR_LIB =3D Lib - -AR_MWLINK68K =3D MWLink68K -xm library - -AR_PPCLINK =3D PPCLink -xm library - -AR_MWLINKPPC =3D MWLinkPPC -xm library - -AR_AR =3D ar - -AR_FLAGS =3D -o - -RANLIB_NULL =3D null-command - -RANLIB_RANLIB =3D ranlib - -# Compiler and/or linker to use for linking. - -CC_LD_LINK =3D Link -w -d -model far {CC_LD_TOOL_FLAGS} - -CC_LD_MWLINK68K =3D MWLink68K -w {CC_LD_TOOL_FLAGS} -sym on -model far - -CC_LD_PPCLINK =3D PPCLink -main __start -outputformat xcoff - -CC_LD_MWLINKPPC =3D MWLinkPPC -w {CC_LD_TOOL_FLAGS} -sym on - -CC_LD_GLD =3D gC - -# Extension for linker output. - -PROG_EXT_68K =3D - -PROG_EXT_XCOFF =3D .xcoff - -# Nothing for the default LDFLAGS. - -LDFLAGS =3D -w - -CC_LD_TOOL_FLAGS =3D -c 'MPS ' -t MPST - -# Libraries to link against. - -# It would appear that the math libraries are not -# needed except to provide a definition for scalb, -# which is called from ldexp, which is referenced -# in the m68k opcodes library. - -EXTRALIBS_C =3D \Option-d - "{CLibraries}"StdClib.o \Option-d - "{CLibraries}"Math.o \Option-d - "{CLibraries}"CSANELib.o \Option-d - "{Libraries}"Stubs.o \Option-d - "{Libraries}"Runtime.o \Option-d - "{Libraries}"Interface.o \Option-d - "{Libraries}"ToolLibs.o - -EXTRALIBS_MWC68K =3D \Option-d - "{CLibraries}"StdClib.o \Option-d - "{CLibraries}"Math.o \Option-d - "{CLibraries}"CSANELib.o \Option-d - "{Libraries}"Stubs.o \Option-d - "{Libraries}"Runtime.o \Option-d - "{Libraries}"Interface.o \Option-d - "{Libraries}"ToolLibs.o \Option-d - "{MW68KLibraries}MPW ANSI (4i) C.68K.Lib" - -EXTRALIBS_PPC_XCOFF =3D \Option-d - "{PPCLibraries}"StdCRuntime.o \Option-d - "{PPCLibraries}"InterfaceLib.xcoff \Option-d - "{PPCLibraries}"MathLib.xcoff \Option-d - "{PPCLibraries}"StdCLib.xcoff \Option-d - "{PPCLibraries}"PPCToolLibs.o \Option-d - "{PPCLibraries}"PPCCRuntime.o \Option-d - "{GCCPPCLibraries}"libgcc.xcoff - -EXTRALIBS_PPC =3D \Option-d - "{PPCLibraries}"StdCRuntime.o \Option-d - "{SharedLibraries}"InterfaceLib \Option-d - "{SharedLibraries}"MathLib \Option-d - "{SharedLibraries}"StdCLib \Option-d - "{PPCLibraries}"PPCToolLibs.o \Option-d - "{PPCLibraries}"PPCCRuntime.o \Option-d - "{GCCPPCLibraries}"libgcc.xcoff - -EXTRALIBS_MWCPPC =3D \Option-d - "{MWPPCLibraries}"MWStdCRuntime.Lib \Option-d - "{MWPPCLibraries}"InterfaceLib \Option-d - "{MWPPCLibraries}"StdCLib \Option-d - "{MWPPCLibraries}"MathLib \Option-d - "{MWPPCLibraries}"PPCToolLibs.o - -# Tool to make PEF with, if needed. - -MAKEPEF_NULL =3D null-command - -MAKEPEF_PPC =3D MakePEF - -MAKEPEF_FLAGS =3D \Option-d - -l InterfaceLib.xcoff=3DInterfaceLib \Option-d - -l MathLib.xcoff=3DMathLib \Option-d - -l StdCLib.xcoff=3DStdCLib - -MAKEPEF_TOOL_FLAGS =3D -ft MPST -fc 'MPS ' - -# Resource compiler to use. - -REZ_68K =3D Rez - -REZ_PPC =3D Rez -d WANT_CFRG - diff -x CVS -uNr gnats/config/mt-armpic gnats.new/config/mt-armpic --- gnats/config/mt-armpic 1999-10-26 02:10:16.000000000 -0500 +++ gnats.new/config/mt-armpic 1969-12-31 18:00:00.000000000 -0600 @@ -1 +0,0 @@ -PICFLAG_FOR_TARGET=3D-fPIC diff -x CVS -uNr gnats/config/mt-elfalphapic gnats.new/config/mt-elfalphapic --- gnats/config/mt-elfalphapic 1999-10-26 02:10:16.000000000 -0500 +++ gnats.new/config/mt-elfalphapic 1969-12-31 18:00:00.000000000 -0600 @@ -1 +0,0 @@ -PICFLAG_FOR_TARGET=3D-fPIC diff -x CVS -uNr gnats/config/mt-linux gnats.new/config/mt-linux --- gnats/config/mt-linux 1999-10-26 02:10:16.000000000 -0500 +++ gnats.new/config/mt-linux 1969-12-31 18:00:00.000000000 -0600 @@ -1,2 +0,0 @@ -# When using glibc 2 on Linux we must always use vtable thunks. -CXXFLAGS_FOR_TARGET =3D $(CXXFLAGS) -fvtable-thunks -D_GNU_SOURCE diff -x CVS -uNr gnats/config/mt-m68kpic gnats.new/config/mt-m68kpic --- gnats/config/mt-m68kpic 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mt-m68kpic 1969-12-31 18:00:00.000000000 -0600 @@ -1 +0,0 @@ -PICFLAG_FOR_TARGET=3D-fpic diff -x CVS -uNr gnats/config/mt-netware gnats.new/config/mt-netware --- gnats/config/mt-netware 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mt-netware 1969-12-31 18:00:00.000000000 -0600 @@ -1 +0,0 @@ -GDB_NLM_DEPS =3D all-gcc all-ld diff -x CVS -uNr gnats/config/mt-ospace gnats.new/config/mt-ospace --- gnats/config/mt-ospace 1999-10-26 02:10:16.000000000 -0500 +++ gnats.new/config/mt-ospace 1969-12-31 18:00:00.000000000 -0600 @@ -1,3 +0,0 @@ -# Build libraries optimizing for space, not speed. - CFLAGS_FOR_TARGET =3D -g -Os - CXXFLAGS_FOR_TARGET =3D -g -Os diff -x CVS -uNr gnats/config/mt-papic gnats.new/config/mt-papic --- gnats/config/mt-papic 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mt-papic 1969-12-31 18:00:00.000000000 -0600 @@ -1 +0,0 @@ -PICFLAG_FOR_TARGET=3D-fPIC diff -x CVS -uNr gnats/config/mt-ppcpic gnats.new/config/mt-ppcpic --- gnats/config/mt-ppcpic 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mt-ppcpic 1969-12-31 18:00:00.000000000 -0600 @@ -1 +0,0 @@ -PICFLAG_FOR_TARGET=3D-fPIC diff -x CVS -uNr gnats/config/mt-sparcpic gnats.new/config/mt-sparcpic --- gnats/config/mt-sparcpic 1999-10-26 02:10:16.000000000 -0500 +++ gnats.new/config/mt-sparcpic 1969-12-31 18:00:00.000000000 -0600 @@ -1 +0,0 @@ -PICFLAG_FOR_TARGET=3D`case "${LIBCFLAGS} ${LIBCXXFLAGS}" in *-fpic* ) echo= -fpic ;; * ) echo -fPIC ;; esac` diff -x CVS -uNr gnats/config/mt-v810 gnats.new/config/mt-v810 --- gnats/config/mt-v810 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mt-v810 1969-12-31 18:00:00.000000000 -0600 @@ -1,4 +0,0 @@ -CC_FOR_TARGET =3D ca732 -ansi -AS_FOR_TARGET =3D as732 -AR_FOR_TARGET =3D ar732 -RANLIB_FOR_TARGET =3D true diff -x CVS -uNr gnats/config/mt-x86pic gnats.new/config/mt-x86pic --- gnats/config/mt-x86pic 1998-11-05 13:54:08.000000000 -0600 +++ gnats.new/config/mt-x86pic 1969-12-31 18:00:00.000000000 -0600 @@ -1 +0,0 @@ -PICFLAG_FOR_TARGET=3D-fpic diff -x CVS -uNr gnats/configure gnats.new/configure --- gnats/configure 2004-11-17 22:22:49.000000000 -0600 +++ gnats.new/configure 2005-02-22 22:20:07.000000000 -0600 @@ -1258,7 +1258,7 @@ =20 =20 ac_aux_dir=3D -for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do +for ac_dir in config $srcdir/config; do if test -f $ac_dir/install-sh; then ac_aux_dir=3D$ac_dir ac_install_sh=3D"$ac_aux_dir/install-sh -c" @@ -1274,8 +1274,8 @@ fi done if test -z "$ac_aux_dir"; then - { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in= $srcdir $srcdir/.. $srcdir/../.." >&5 -echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcd= ir/.. $srcdir/../.." >&2;} + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in= config $srcdir/config" >&5 +echo "$as_me: error: cannot find install-sh or install.sh in config $srcdi= r/config" >&2;} { (exit 1); exit 1; }; } fi ac_config_guess=3D"$SHELL $ac_aux_dir/config.guess" @@ -2524,6 +2524,7 @@ done test -n "$YACC" || YACC=3D"yacc" =20 +AC_PROG_LIBTOOL =20 ac_config_files=3D"$ac_config_files Makefile" =20 diff -x CVS -uNr gnats/configure.ac gnats.new/configure.ac --- gnats/configure.ac 1969-12-31 18:00:00.000000000 -0600 +++ gnats.new/configure.ac 2005-02-22 22:20:31.000000000 -0600 @@ -0,0 +1,31 @@ +dnl Process this file with autoconf to produce a configure script. +dnl +dnl Copyright (C) 2001 Milan Zamazal +dnl +dnl This file is part of GNU GNATS. +dnl=20 +dnl GNU GNATS is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 2, or (at your option) +dnl any later version. +dnl=20 +dnl GNU GNATS is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +dnl GNU General Public License for more details. +dnl=20 +dnl You should have received a copy of the GNU General Public License +dnl along with GNU GNATS; see the file COPYING. If not, write to the Free +dnl Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, US= A. +dnl +AC_PREREQ(2.5) +AC_INIT(gnats,4.1.0,bug-gnats@gnu.org) +AC_CONFIG_AUX_DIR(config) +AC_CONFIG_SUBDIRS(libiberty gnats send-pr doc) + +AC_PROG_CC +AC_PROG_LEX +AC_PROG_YACC + +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT diff -x CVS -uNr gnats/configure.in gnats.new/configure.in --- gnats/configure.in 2004-11-17 22:22:49.000000000 -0600 +++ gnats.new/configure.in 1969-12-31 18:00:00.000000000 -0600 @@ -1,30 +0,0 @@ -dnl Process this file with autoconf to produce a configure script. -dnl -dnl Copyright (C) 2001 Milan Zamazal -dnl -dnl This file is part of GNU GNATS. -dnl=20 -dnl GNU GNATS is free software; you can redistribute it and/or modify -dnl it under the terms of the GNU General Public License as published by -dnl the Free Software Foundation; either version 2, or (at your option) -dnl any later version. -dnl=20 -dnl GNU GNATS is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -dnl GNU General Public License for more details. -dnl=20 -dnl You should have received a copy of the GNU General Public License -dnl along with GNU GNATS; see the file COPYING. If not, write to the Free -dnl Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, US= A. -dnl -AC_PREREQ(2.5) -AC_INIT(gnats,4.1.0,bug-gnats@gnu.org) -AC_CONFIG_SUBDIRS(libiberty gnats send-pr doc) - -AC_PROG_CC -AC_PROG_LEX -AC_PROG_YACC - -AC_CONFIG_FILES([Makefile]) -AC_OUTPUT diff -x CVS -uNr gnats/gnats/ChangeLog gnats.new/gnats/ChangeLog --- gnats/gnats/ChangeLog 2004-11-30 09:44:37.000000000 -0600 +++ gnats.new/gnats/ChangeLog 2005-02-22 21:28:42.000000000 -0600 @@ -1,3 +1,8 @@ +2005-02-22 Chad Walstrom + + * gnats/man: Removed historical directory. Current manpages found in + doc/man. + 2004-11-30 Chad Walstrom =20 * gnatsd.c, gnats-pwconv.c (HAVE_CRYPT_H): Changed HAVE_CRYPT to diff -x CVS -uNr gnats/gnats/gnats-pwconv.c.orig gnats.new/gnats/gnats-pwco= nv.c.orig --- gnats/gnats/gnats-pwconv.c.orig 1969-12-31 18:00:00.000000000 -0600 +++ gnats.new/gnats/gnats-pwconv.c.orig 2004-11-29 17:58:57.000000000 -0600 @@ -0,0 +1,321 @@ +/* GNATS password conversion tool. + Copyright (C) 2001, 2002 Free Software Foundation, Inc. + +This file is part of GNU GNATS. + +GNU GNATS 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. + +GNU GNATS 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 GNU GNATS; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. = */ + +#include "gnats.h" +#ifdef HAVE_LIBCRYPT +#ifdef HAVE_CRYPT /* some systems declare `crypt' in unistd.h */ +#include +#endif +#endif +#include +#include +#include +#include + + +enum _Crypt_Type { NONE, PLAIN, CRYPT, MD5 }; +typedef enum _Crypt_Type Crypt_Type; + + +#define PROGRAM_NAME "gnats-pwconv" +const char *program_name =3D PROGRAM_NAME; + +/* static const int MAXLINE =3D 1024; */ +static const char* const VERSION =3D "1.0"; + +static const char* USAGE[] =3D + { + "Usage: " PROGRAM_NAME, +#ifdef HAVE_LIBCRYPT + " {-c | -m | -p} INFILE [OUTFILE]\n", +#else + " -p INFILE [OUTFILE]\n", +#endif + "Convert GNATS v3 gnatsd*.access passwords to version 4 format.\n", +#ifdef HAVE_LIBCRYPT + "Supports plaintext, DES crypt and MD5 output.\n", +#else + "Supports only unencrypted plaintext (compiled without `libcrypt').\n", +#endif + "\n", +#ifdef HAVE_LIBCRYPT=20=20=20=20 +" -c --crypt Use crypt() encryption of passwords.\n\ + -m --md5 Use MD5 encryption.\n", +#endif +" -p --plaintext Do not encrypt the passwords (plaintext).\n\ + -h --help\n\ + -V --version\n", + NULL + }; + + +/* Print perror MESSAGE, processed through printf with a single argument A= RG. + */ +static void +perrorf (const char *message, char *arg) +{ + char *formatted; + if (asprintf (&formatted, message, arg) < 0) + { + perror ("System error"); + exit (1); + } + perror (formatted); + free (formatted); +} + + +/* Split LINE into its fields. + Return true iff the operation was successful. + Note: LINE is modified during the operation. +*/ +static bool +parse_entry (char *line, + char **username, char **password, char **level, char **dbs) +{ + int i; + int length =3D strlen (line); + char *separator; + char **fields[4]; + fields[0] =3D username; fields[1] =3D password; + fields[2] =3D level; fields[3] =3D dbs; + + if (length && line[length-1] =3D=3D '\n') + { + line[length-1] =3D '\0'; + } +=20=20=20=20 + *dbs =3D (char *)""; + for (i =3D 0; + (i < 4) && (separator =3D (char *)strchr (line, ':')) !=3D NULL; + i++) + { + *(fields[i]) =3D line; + *separator =3D '\0'; + line =3D separator + 1; + } + + return i >=3D 3; +} + + +/* Encrypt CLEARPWSTRING by the encryption type CRYPTTYPE and store the re= sult + into NEWPWENTRY. Return 0 on success, 1 if MD5 encryption is requested= and + it is not supported by the system. */ +static int +encrypt_ (char *clearpwstring, Crypt_Type crypttype, char **newpwentry) +{ + int result; +#ifdef HAVE_LIBCRYPT + unsigned long seed =3D random(); + char salt[12]; + char rawsalt[9]; + const char *SEEDCHARS =3D + "./0123456789ABCDEFGHIJKLMNOPQRST" + "UVWXYZabcdefghijklmnopqrstuvwxyz"; + const int SEEDCHARS_LEN =3D strlen (SEEDCHARS); + int i; +=20=20 + for (i =3D 0; i < 8; i++) + { + rawsalt[i] =3D SEEDCHARS[(seed/(i+1)) % SEEDCHARS_LEN]; + } + rawsalt[i] =3D '\0'; +#endif +=20=20 + switch (crypttype) + { + case PLAIN: + result =3D asprintf (newpwentry, "$0$%s", clearpwstring); + break; +=20=20=20=20=20=20 +#ifdef HAVE_LIBCRYPT=20=20=20=20=20=20 + case CRYPT:=20=20=20=20=20=20 + strncpy (salt, rawsalt, 2); + salt[2] =3D '\0'; + result =3D asprintf (newpwentry, "%s", crypt (clearpwstring, salt)); + break; +=20=20=20=20=20=20 + case MD5: + sprintf (salt, "$1$%s", rawsalt); + result =3D asprintf (newpwentry, "%s", crypt (clearpwstring, salt)); + break; +#endif +=20=20=20=20=20=20 + default: + fprintf (stderr, "Program error\n"); + exit (1); + } + + if (result < 0) + { + fprintf (stderr, "Memory allocation error\n"); + exit (1); + } +=20=20 + /* Are we on a system that supports MD5? */ + return (crypttype =3D=3D MD5 && strncmp ("$1$", *newpwentry, 3)) ? 1 : 0; +} + + +/* Convert password data in the file INFILE to the file OUTFILE. + OUTFILE can be NULL, in which case the data is output to stdout. + CRYPTTYPE is passed through to `encrypt_'. + Return 0 on success, anything else otherwise. */ +static int +process_file (char *infile, char *outfile, int crypttype) +{ + FILE *input; + FILE *output; + char *line; + int i; +=20=20 + if ((input =3D fopen (infile, "r")) =3D=3D NULL) + { + perrorf ("Can't open the file `%s' for input", infile); + return 1; + } + if (outfile =3D=3D NULL) + { + output =3D stdout; + } + else if ((output =3D fopen (outfile, "w")) =3D=3D NULL) + { + perrorf ("Can't open the file `%s' for output", outfile); + return 1; + } +=20=20 + for (i =3D 1; (line =3D read_line (input, NULL)) !=3D NULL; i++) + { + if (strncmp (line, "#", 1) =3D=3D 0 + || (strspn (line, " \t\r\n") =3D=3D strlen (line))) + { + fprintf (output, "%s", line); + } + else + { + char *username, *password, *level, *dbs; + char *newpwentry; + if (parse_entry (line, &username, &password, &level, &dbs)) + { + if (encrypt_ (password, crypttype, &newpwentry) =3D=3D 1) + { + fprintf (stderr, "Error: " + "MD5 encryption not supported on this system.\n"); + free (line); + free (newpwentry); + return 1; + } + fprintf (output, "%s:%s:%s:%s\n", + username, newpwentry, level, dbs); + free (newpwentry); + } + else + { + fprintf (stderr, + "Error: Unable to decode line %d of the file `%s'.\n", + i, infile); + free (line); + return 1; + } + free (line); + } + } +=20=20 + fclose(input); + fclose(output); +=20=20 + return 0; +} + + +int +main (int argc, char **argv) +{ +#ifdef HAVE_LIBCRYPT + static const char* const OPTSTRING =3D "pcmVh"; +#else + static const char* const OPTSTRING =3D "pVh"; +#endif + int optc =3D 0; + int opt_index =3D 0; + Crypt_Type crypttype =3D NONE; + char *infile =3D NULL; + char *outfile =3D NULL; + struct option LONG_OPTIONS[] =3D + { + {"plaintext", no_argument, NULL, 'p'}, +#ifdef HAVE_LIBCRYPT + {"crypt", no_argument, NULL, 'c'}, + {"md5", no_argument, NULL, 'm'}, +#endif + {"version", no_argument, NULL, 'V'}, + {"help", no_argument, NULL, 'h'},=20 + {0, 0, 0, 0} + }; +=20=20 + while ((optc =3D getopt_long (argc, argv, OPTSTRING, LONG_OPTIONS, &opt_= index)) + !=3D -1) + { + switch (optc) + { + case 'p': + if (crypttype !=3D NONE) + usage (USAGE, 1); + crypttype =3D PLAIN; + break; + + case 'c': + if (crypttype !=3D NONE) + usage (USAGE, 1); + crypttype =3D CRYPT; + break; + + case 'm': + if (crypttype !=3D NONE) + usage (USAGE, 1); + crypttype =3D MD5; + break; + + case 'V': + printf ("%s %s\n", PROGRAM_NAME, VERSION); + exit (0); + break; + + case 'h': + usage (USAGE, 0); + break; +=20=20=20=20=20=20 + default: + usage (USAGE, 1); + } + } + + if ((crypttype =3D=3D NONE) || (optind >=3D argc)) + usage (USAGE, 1); +=20=20 + infile =3D argv[optind++]; + if (optind < argc) + { + outfile =3D argv[optind]; + } +=20=20 + srandom (time (NULL)); + return process_file (infile, outfile, crypttype); +} diff -x CVS -uNr gnats/gnats/man/Makefile.in gnats.new/gnats/man/Makefile.in --- gnats/gnats/man/Makefile.in 2004-06-09 15:36:34.000000000 -0500 +++ gnats.new/gnats/man/Makefile.in 1969-12-31 18:00:00.000000000 -0600 @@ -1,158 +0,0 @@ -# Makefile for GNU GNATS manual pages. -# Copyright (C) 1993 Free Software Foundation, Inc. -# -# This file is part of GNU GNATS. -# -# GNU GNATS 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. -#=20 -# GNU GNATS 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. -#=20 -# You should have received a copy of the GNU General Public License -# along with GNU GNATS; see the file COPYING. If not, write to -# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - -srcdir =3D @srcdir@ -VPATH =3D @srcdir@ - -GNATS_ROOT =3D @GNATS_ROOT@ -GNATS_SITE =3D @GNATS_SITE@ - -prefix =3D @prefix@ - -exec_prefix =3D @exec_prefix@ -bindir =3D @bindir@ -datadir =3D @datadir@ - -datadir =3D @datadir@ - -mandir =3D @mandir@ -man1dir =3D $(mandir)/man1 -man2dir =3D $(mandir)/man2 -man3dir =3D $(mandir)/man3 -man4dir =3D $(mandir)/man4 -man5dir =3D $(mandir)/man5 -man6dir =3D $(mandir)/man6 -man7dir =3D $(mandir)/man7 -man8dir =3D $(mandir)/man8 -man9dir =3D $(mandir)/man9 -man1ext =3D .1 -man5ext =3D .5 -man7ext =3D .7 -man8ext =3D .8 -infodir =3D @infodir@ -includedir =3D @includedir@ - -SHELL =3D /bin/sh - -INSTALL =3D @INSTALL@ -INSTALL_PROGRAM =3D @INSTALL_PROGRAM@ -INSTALL_DATA =3D @INSTALL_DATA@ - -#### host, target, and site dependent makefile fragments come in here. -### - -SRCS1=3D edit-pr$(man1ext) query-pr$(man1ext) -MAN1=3D edit-pr.man query-pr.man -SRCS5=3D dbconfig$(man5ext) databases$(man5ext) -MAN5=3D dbconfig.man databases.man -SRCS7=3D gnats$(man7ext) -MAN7=3D gnats.man -SRCS8=3D mkcat$(man8ext) queue-pr$(man8ext) file-pr$(man8ext) rmcat$(man8= ext) gen-index$(man8ext) gnatsd$(man8ext) mkdb$(man8ext) delete-pr$(man8ext= ) pr-edit$(man8ext) -MAN8 =3D mkcat.man queue-pr.man file-pr.man rmcat.man gen-index.man gnatsd= .man mkdb.man delete-pr.man pr-edit.man - -DISTFILES =3D Makefile.in $(MAN1) $(MAN7) $(MAN8) - -all: @GNATS_ALL@ - -all-gnats gnats-man-pages: $(SRCS1) $(SRCS5) $(SRCS7) $(SRCS8) -all-tools tools-man-pages: $(SRCS1) - -.PHONY: check -check: - -$(SRCS1): ../Makefile $(MAN1) - @echo Creating $@... - @file=3D`echo $@ | sed -e 's,\$(man1ext),,'` ; \ - sed -e 's,xGNATS_ROOTx,$(GNATS_ROOT),g' \ - -e 's,xGNATS_SITEx,$(GNATS_SITE),g' \ - -e 's,@BINDIR@,$(bindir),g' \ - -e 's,@PREFIX@,$(prefix),g' \ - -e 's,@VERSION@,$(VERSION),g' $(srcdir)/$$file.man > tmp-$@ - @mv tmp-$@ $@ - -$(SRCS5): ../Makefile $(MAN5) - @echo Creating $@... - @file=3D`echo $@ | sed -e 's,\$(man5ext),,'` ; \ - sed -e 's,xGNATS_ROOTx,$(GNATS_ROOT),g' \ - -e 's,xGNATS_SITEx,$(GNATS_SITE),g' \ - -e 's,@BINDIR@,$(bindir),g' \ - -e 's,@PREFIX@,$(prefix),g' \ - -e 's,@VERSION@,$(VERSION),g' $(srcdir)/$$file.man > tmp-$@ - @mv tmp-$@ $@ - -$(SRCS7): ../Makefile $(MAN7) - @echo Creating $@... - @file=3D`echo $@ | sed -e 's,\$(man7ext),,'` ; \ - sed -e 's,xGNATS_ROOTx,$(GNATS_ROOT),g' \ - -e 's,xGNATS_SITEx,$(GNATS_SITE),g' \ - -e 's,@DATADIR@,$(datadir),g' \ - -e 's,@VERSION@,$(VERSION),g' $(srcdir)/$$file.man > tmp-$@ - @mv tmp-$@ $@ - -$(SRCS8): ../Makefile $(MAN8) - @echo Creating $@... - @file=3D`echo $@ | sed -e 's,\$(man8ext),,'` ; \ - sed -e 's,xGNATS_ROOTx,$(GNATS_ROOT),g' \ - -e 's,xGNATS_SITEx,$(GNATS_SITE),g' \ - -e 's,@DATADIR@,$(datadir),g' \ - -e 's,@VERSION@,$(VERSION),g' $(srcdir)/$$file.man > tmp-$@ - @mv tmp-$@ $@ - -info install-info clean-info: -dvi: -TAGS: - -mostlyclean: force - rm -f $(SRCS1) $(SRCS5) $(SRCS7) $(SRCS8) -clean: mostlyclean -distclean: clean - rm -f Makefile -realclean: distclean - -install: @GNATS_INSTALL@ - -install-gnats install-gnats-man: all-gnats install-tools - for i in $(SRCS5); do \ - $(INSTALL_DATA) $$i $(DESTDIR)$(man5dir)/$$i; \ - done - for i in $(SRCS7); do \ - $(INSTALL_DATA) $$i $(DESTDIR)$(man7dir)/$$i; \ - done - for i in $(SRCS8); do \ - $(INSTALL_DATA) $$i $(DESTDIR)$(man8dir)/$$i; \ - done - -install-tools install-tools-man: all-tools - for i in $(SRCS1); do \ - $(INSTALL_DATA) $$i $(DESTDIR)$(man1dir)/$$i; \ - done - -uninstall: - -for i in $(SRCS1); do rm -f $(DESTDIR)$(man1dir)/$$i; done - -for i in $(SRCS5); do rm -f $(DESTDIR)$(man5dir)/$$i; done - -for i in $(SRCS7); do rm -f $(DESTDIR)$(man7dir)/$$i; done - -for i in $(SRCS8); do rm -f $(DESTDIR)$(man8dir)/$$i; done - -force: -dist: - -# Prevent GNU make v3 from overflowing arg limit on SysV. -.NOEXPORT: -Makefile: $(srcdir)/Makefile.in - cd .. && $(SHELL) config.status diff -x CVS -uNr gnats/gnats/man/databases.man gnats.new/gnats/man/database= s.man --- gnats/gnats/man/databases.man 2000-02-23 00:10:40.000000000 -0600 +++ gnats.new/gnats/man/databases.man 1969-12-31 18:00:00.000000000 -0600 @@ -1,85 +0,0 @@ -.\" Copyright (c) 1993, 2000 Free Software Foundation, Inc. -.\" See section COPYING for conditions for redistribution -.TH databases 5 "January 2000" "GNATS @VERSION@" "GNATS configuration file= s" -.de BP -.sp -.ti -.2i -\(** -.. -.SH NAME -databases \- the known set of GNATS databases -.SH DESCRIPTION -\fBdatabases\fR contains a list of database names and their associated -parameters. It it used by the GNATS clients to determine the location -of a database referred to by name. It is located by default in -@PREFIX@/share/gnats/databases. -.P -\fBdatabases\fR consists of one or more lines containing at least -three colon-separated fields: -.P -.RS -default\:The default database\:/the/directory -.RE -.P -Lines beginning with a # are ignored. -.P -The first field is the database name, which is the string passed to -the --database option or specified via the GNATSDB environment -variable. The second field is a short human-readable description of -the database contents. The final field is the directory where the -database contents are kept. -.P -It may also contain one or two additional fields describing the -network location of the database: -.P -.RS -network\:Network db\:\:gnats.foo.com\:1234 -.RE -.P -The last two options describe the hostname and port of the server where -\fBgnatsd\fR is running. -.P -Both a directory and a server/port may be present. In this case -\fBgnatsd\fR uses the directory field to determine where the database -contents are located, while the clients use the server/port -information to connect to \fBgnatsd\fR. -.P -The database name \fBdefault\fR is special; this is the entry used if -no database name is specified via a --database option or the -\fBGNATSDB\fR environment variable. -.SH "SEE ALSO" -.I Keeping Track: Managing Messages With GNATS -(also installed as the GNU Info file -.BR gnats.info ) -and -.I Reporting Problems Using send-pr -(also installed as the GNU Info file -.BR send-pr.info ). -.LP -.BR gnats (7), -.BR send-pr (1), -.BR edit-pr (1), -.BR delete-pr (8), -.BR query-pr (1), -.BR file-pr (8), -.BR queue-pr (8), -.BR gen-index (8), -.BR mkcat (8), -.BR mkdb (8). -.SH COPYING -Copyright (c) 1993, 2000 Free Software Foundation, Inc. -.PP -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. -.PP -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. -.PP -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 included in -translations approved by the Free Software Foundation instead of in -the original English. diff -x CVS -uNr gnats/gnats/man/dbconfig.man gnats.new/gnats/man/dbconfig.= man --- gnats/gnats/man/dbconfig.man 2000-03-09 22:49:29.000000000 -0600 +++ gnats.new/gnats/man/dbconfig.man 1969-12-31 18:00:00.000000000 -0600 @@ -1,556 +0,0 @@ -'\" t -.\" Copyright (c) 2000 Free Software Foundation, Inc. -.\" See section COPYING for conditions for redistribution -.TH dbconfig 5 "January 2000" "GNATS @VERSION@" "GNATS Admininstration Fil= es" -.SH NAME -dbconfig \- GNATS database configuration file -.SH DESCRIPTION -The dbconfig configuration file is, oddly enough, used to control -the configuration of a GNATS database. Each database has its own -individual copy of the file, which is located in the \fBgnats-adm\fR -administrative subdirectory of the database. -.P -The file contains 6 major sections, which must appear in this order: -.P -.RS 0.5i -.br -Overall database configuration -.br -Individual field configuration -.br -Named query definitions -.br -Audit-trail and outgoing email formats -.br -Index file description -.br -Initial \fIPR\fR input fields -.RE -.P -Individual descriptions of each section will appear below. (It is -helpful to refer to the supplied default configuration, which contains -examples of most of the available configuration options.) -.P -It is very helpful if the administrator has a reasonably good -understanding of the overall GNATS \fIPR\fR process before trying to -create or edit a database configuration. -.SH "FILE FORMAT" -The file is a free-form ASCII file. Whitespace is completely -optional, and is ignored. Braces ({}) are used to delimit sections -within the file. Non-keyword values must generally be surrounded with -double quotes. Newline characters within double quotes must be -proceeded with a backslash (`\\') character, and are not included in -the final resulting string; to include a newline character in a value, -use the \fB\\n\fR combination instead. -.SH "Overall Database Configuration" -The overall database options are controlled with the \fBdatabase-info\fR -section: -.P -.RS 0.5i -\fBdatabase-info\fR { -.RS 0.25i -[\fIoptions\fR] -.RE -} -.RE -The following options may be present: -.TP -\fBdebug-mode\fR \fItrue\fR|\fIfalse\fR -If set to true, the database is placed into \fIdebug mode\fR. This -causes all outgoing email to be sent to the \fIgnats-admin\fR user -listed in the \fBresponsible\fR adm file. -.RS 0.5i -.P -The default value is \fIfalse\fR. -.RE -.TP -\fBkeep-all-received-headers\fR \fItrue\fR|\fIfalse\fR -If set to true, all of the Received: headers for \fIPR\fRs submitted via -email are kept in the PR; otherwise, only the first one is kept. -.RS 0.5i -.P -The default value is \fIfalse\fR. -.RE -.TP -\fBnotify-about-expired-prs\fR \fItrue\fR|\fIfalse\fR -If set to true, notification email about expired \fIPR\fRs is sent via -the at-pr command. Otherwise, required times for \fIPR\fR fixes -are not used. -.RS 0.5i -.P -The default value is \fIfalse\fR. -.RE -.TP -\fBsend-submitter-ack\fR \fItrue\fR|\fIfalse\fR -When new \fIPRs\fR are submitted to the database, an acknowledgement -email will be sent to the submitter if \fBsend-submitter-ack\fR is set -to true. This is in addition to the normal notification mail to the -person(s) responsible for the new \fIPR\fR. -.RS 0.5i -.P -The default value is \fIfalse\fR. -.RE -.TP -\fBlibexecdir\fR "\fIpath\fR" -Used to specify the directory where the GNATS adminstrative -executables can be found; in particular, \fBat\-pr\fR and -\fBmail\-pr\fR are invoked from this directory. -.RS 0.5i -.P -The default value is the empty string, which is unlikely to be useful. -.RE -.TP -\fBbusiness-day-hours\fR \fIday-start\fR \- \fIday-end\fR -Used to specify the hours that define a business day in 24-hour -format; the times are inclusive. A single dash separates the two -values. The values are used to determine if a \fIPR\fR required -completion time has expired. -.RS 0.5i -.P -The default values are 8 for \fIday-start\fR, and 17 for \fIday-end\fR. -.RE -.TP -\fBbusiness-week-days\fR \fIweek-start\fR \- \fIweek-end\fR=20 - -Used to specify the start and ending days of the business week, where -0 is Sunday, 1 is Monday, etc; the days are inclusive. These values -are used to determine if a \fIPR\fR required completion time has -expired. -.RS 0.5i -.P -The default values are 1 for \fIweek-start\fR, and 5 for \fIweek-end\fR. -.RE -.TP -\fBcreate-category-dirs\fR \fItrue\fR|\fIfalse\fR - -If set to true, database directories for categories are automatically -created as needed; otherwise, they must be created manually (usually -with the \fBmkcat\fR script). It is suggested that the value be left -to \fItrue\fR. -.RS 0.5i -.P -The default value is \fItrue\fR. -.RE - -.SH "Individual field configuration" -Each field in a PR is described with a field entry. It has the general=20 -structure -.RS -\fBfield\fR "\fIfieldname\fR" { -.RS 0.25i -\fBdescription\fR "\fIstring\fR" -.br -[ \fIfield-options\fR ... ] -.br -\fIdatatype\fR [ \fIdatatype-options\fR ... ] -.br -[ \fBon-change\fR { \fIedit-options\fR ... } ] -.RE -} -.RE -.P -\fIfieldname\fR is used as the field header in the \fIPR\fR. The -\fB>\fR and \fB:\fR field markers should not be present in the name. -.P -The order in which the field configurations appear in the -configuration file determines the order that they appear in the PR -text. There is no required order, unlike previous versions of GNATS; -multitext and the Unformatted fields can appear anywhere in the PR. -.P -The following options may be present within the \fBfield\fR section: -.TP -\fBbuiltin-name\fR "\fRname\fR" -Indicates that this field corresponds to one of the GNATS builtin -fields. -.RS -.P -GNATS has several fields which are required to be present in a -\fIPR\fR, and this option is used to map their external descriptions -to their internal usage. The internal fieldnames are: -.P -.TS -l l -l l. -\fBName Meaning\fR -number The PR's unique numeric identifier -category The category that the PR falls into -synopsis The one-line description of the PR -confidential If "yes", the PR is confidential -severity How severe is the PR? -priority What's the PR's priority? -responsible Who's responsible for the PR? -state What's the frequency, Kenneth? -submitter The user that submitted the PR -arrival-date When did the PR arrive? -last-modified The date of the last PR modification -audit-trail The audit-trail of various changes to the PR -.TE -.P -For these builtin fields, a matching field description must appear in -the database configuration. Otherwise, the configuration will be -considered invalid, and errors will be generated from the GNATS -clients and \fBgnatsd\fR. -.RE -.TP -\fBdescription\fR "\fIdescription text\fR" -A one-line human-readable description of the field. Clients -can use this string to describe the field in a help dialog; the -string is returned from the \fBFDSC\fR command in \fBgnatsd\fR, -and is also available via the \fB\-\-field-description\fR option -in \fBquery\-pr\fR. -.RS 0.5i -.P -This entry must be present in the field description; there is no default -value. -.RE -.TP -\fBquery-default\fR \fIexact-regexp\fR|\fIinexact-regexp\fR -Used to specify the default type of searches performed on this field. -This is used when the \fB^\fR search operator appears in a query, and -is also used for queries in \fBquery\-pr\fR that use the old \fI\-\-field\= fR -query options. -.RS 0.5i -.P -If the option is not given, the default search is \fIexact\-regexp\fR). -.RE -.TP -\fBtextsearch\fR -If this option is present, the field will be searched when the user -performs a --text search from \fBquery-pr\fR. The field is also -flagged as a \fItextsearch\fR field in the set of field flags returned -by the \fBFIELDFLAGS\fR command in \fBgnatsd\fR. -.P -.RS 0.5i -By default, fields are not marked as \fItextsearch\fR fields. -.RE -.TP -\fBread-only\fR -The field contents may not be edited; they must be set when the PR -is initially created. In general, this should only be used for fields that -are given internal values rather than fields supplied by the user. -.P -.RS 0.5i -By default, fields are editable by the user. -.RE -.SH Field datatypes -.TP -\fIdatatype\fR [ \fIoptions\fR ... ] -Describes the type of data to be stored in the field, and must be present -in each field description. -.P -.RS -The available datatypes are: -.RE -.TP -\fBtext\fR [ \fBmatching\fR { "\fIregexp\fR" [ "\fIregexp\fR" ... ] } ] -The text datatype is the most commonly used type; it is a one-line -text string. -.P -.RS -If the \fBmatching\fR qualfifier is present, the data in the field -must match at least one of the specified regexps. Otherwise, no -restriction is placed on what values may appear in the field. -.P -.RE -.TP -\fBmultitext\fR [ { \fBdefault\fR "\fIstring\fR" } ] -The field can contain multiple lines of text. -.P -.RS -If the \fBdefault\fR option is present, the field will default to the -specified \fIstring\fR if the field is not given a value when the -\fIPR\fR is initially created. Otherwise, the field will be left -empty. -.RE -.ne 8 -.TP -\fBenum\fR { -.RS 0.25i -\fBvalues\fR { -.RS 0.25i -"\fIstring\fR" [ "\fIstring\fR" ... ] -.RE -} -.br -[ \fBdefault\fR "\fIstring\fR" ]=20 -.RE -} -.P -.RS -Defines an enumerated field, where the value in the PR field must -match an entry from a list of specified values.=20=20 -.P -The list of allowed values is given with the \fBvalues\fR option, -which must be present. -.P -If a \fBdefault\fR option is present, it is used to determine the -initial value of the field if no entry for the field appears in an -initial PR (or if the value in the initial PR is not one of the -acceptable values). However, the value in the \fBdefault\fR -statement is not required to be one of the accepted values; this can -be used to allow the field to be initially empty, for example. -.P -If no \fBdefault\fR option is specified, the default value for the -field is the first value in the \fBvalues\fR section. -.RE -.TP -\fBmultienum\fR { -.RS 0.25i -\fBvalues\fR { -.RS 0.25i -"\fIstring\fR" [ "\fIstring\fR" ... ] -.RE -} -.br -[ \fBseparators\fR "\fIstring\fR" ] -.br -[ \fBdefault\fR "\fIstring\fR" ]=20 -.RE -} -.P -.RS -The \fBmultienum\fR datatype is similar to the \fBenum\fR datatype, -except that the field can contain multiple values, separated by one or -more characters from the \fIseparators\fR list. -.P -If no \fBseparators\fR option is present, the default separators are -space (` ') and colon (':'). -.RE -.ne 8 -.TP -\fBenumerated-in-file\fR { -.RS 0.25i -\fBpath\fR "\fIfilename\fR" -.br -\fBfields\fR { -.RS 0.25i -"\fIname\fR" [ "\fIname\fR" ... ] -.RE -} \fBkey\fR "\fIname\fR" -.br -[ \fBallow-any-value\fR ] -.RE -} -.RS -The \fBenumerated-in-file\fR type is used to describe an enumerated -field with an associated \fIadministrative file\fR, which lists the -legal values for the field, and may optionally contain additional -fields that can be examined by query clients or used for other -internal purposes. It is similar to the \fBenum\fR datatype, except -that the list of legal values is stored in a separate file. -.P -\fIfilename\fR is the name of a file in the \fBgnats-adm\fR administrative -directory for the database. -.P -The format of the administrative file is a simple ASCII text file. -Fields within the file are separated with colons (`:'). Lines -beginning with an octothorpe ('#') are ignored as comments. Records -within the file are separated with newlines. -.P -The \fBfield\fR option is used to name the fields in the -administrative file. There must be at least one field, which is used -to list the legal values for the field. If the administrative file is -empty (or does not contain any non-empty non-comment lines) then the -PR field must be empty. -.P -The \fBkey\fR option is used to designate which field in the -administrative file should be used to list the legal values for the PR -field. The value must match one of the field names in the \fBfield\fR -option. -.P -If the \fBallow-any-value\fR option is present, then the value of the -PR field is not required to appear in the administrative file; any -value will be accepted. -.RE -.TP -\fBdate\fR -The date datatype is used to hold dates. Date fields may be empty, or -must contain a correctly-formatted date. -.P -.RS -No defaults or other options are available. The field is left empty if -no value for the field is given in the initial PR. -.RE -.TP -\fBinteger\fR [ { \fBdefault\fR "\fIinteger\fR" } ] -Integer fields are used to hold numbers. They may be empty, or must -contain a value composed entirely of digits, with an optional leading -sign. -.P -.RS -If the \fBdefault\fR option is present, the field will have the -value of \fIinteger\fR if the field is not given a value when the -\fIPR\fR is initially created. Otherwise, the field will be left -empty. -.RE -.SH "Edit controls" -The \fBon-change\fR section is used to specify one or more actions -to be performed when the field value is edited by the user. It -has the general form -.RS -\fBon-change\fR [ "\fIquery-expression\fR" ] { -.P -.RS 0.25i -[ \fBadd-audit-trail\fR ] -.P -[ \fBaudit-trail-format { -.RS 0.25i -\fBformat\fR "\fIformatstring\fR" -.br -[ fields { "\fIfieldname\fR" ... } ] -.RE -} ] -.P -[ \fBrequire-change-reason\fR ] -.P -[ \fBset-field\fR|\fBappend-to-field\fR "\fIfieldname\fR" { -.RS 0.25i -"\fIformat-string\fR" [ \fIfieldlist\fR ] -.RE -} ] -.RE -} -.RE -.P -The optional \fIquery-expression\fR controls whether or not the -actions in the \fBon-change\fR section are taken. If the expression -fails to match, the actions are skipped. -.P -The \fBadd-audit-trail\fR option indicates that an entry should be -appended to the builtin audit-trail field when this field is changed. -The format of the entry is controlled by the optional -\fBaudit-trail-format\fR section within the field, or by the global -\fBaudit-trail-format\fR section. (See the \fBAudit-trail and -outgoing email formats\fR section for more information.) -.P -The \fBrequire-change-reason\fR option specifies that a change reason -must be present in the PR when this field is edited. This option only -makes sense if an audit-trail entry is required, as the change reason -is otherwise unused. -.P -The \fBset-field\fR and \fBappend-to-field\fR options are used to -change the value of the field \fIfieldname\fR in the PR. The supplied -\fBformat\fR is used to format the value that will be placed in the -field (for more information, see the \fBAudit-trail and outgoing email -formats\fR section of this manual). \fBappend-to-field\fR appends the -resulting formatted string to the existing field contents, while -\fBset-field\fR completely replaces the contents. -.P -Any field may be edited by the \fBset-field\fR or -\fBappend-to-field\fR option (the \fBread-only\fR option on a field is -ignored). However, the changes are subject to the usual field content -checks. -.P -There is a global \fBon-change\fR section that is executed once for -each \fIPR\fR edit. -.SH "Named query definitions" -When queries are performed via \fBquery\-pr\fR, they can refer to -a query format described via the \fBquery\fR section: -.RS -\fBquery\fR "\fIqueryname\fR" { -.RS 0.25i -\fBformat\fR "\fIformatstring\fR" -.br -[ \fBfields\fR { "\fIfieldname\fR" [ "\fIfieldname\fR" ... ] } ] -.RE -} -.RE -\fIformatstring\fR is as described in the \fBquery-pr\fR(1) manpage; -it contains a string with \fBprintf\fR(3)-like % escapes. The output -of the query is then formatted as specified by the format string. -.P -The \fBfields\fR option lists the fields to be used with the -\fBformat\fR string. If the \fBfields\fR option is present without a -\fBformat\fR option is, then the listed fields are printed out as just -their contents separated by newlines. -.P -The named query formats \fIfull\fR, \fIstandard\fR and \fIsummary\fR -must be present in the database configuration. \fBfull\fR and -\fBsummary\fR correspond to the \fBquery\-pr\fR options \fB--full\fR -and \fB--summary\fR, while \fIstandard\fR is used when no format -option is given to \fBquery\-pr\fR. -.SH "Audit-trail and outgoing email formats" -These formats are smilar to the named query formats, but they include -more options. They are used for formatting audit-trail entries and -for outgoing email messages. -.P -There is currently only one audit-trail format, defined by the -\fBaudit-trail-format\fR option: -.RS -\fBaudit-trail-format\fR { -.RS 0.25i -\fBformat\fR "\fIformatstring\fR" -.br -[\fBfields\fR { "\fIfieldname\fR" [ "\fIfieldname\fR" ... ] } ] -.RE -} -.RE -For those fields that require an audit-trail entry, the audit-trail -text to be appended is formatted as described by this format. The -per-field \fBaudit-trail-format\fR is used in preference to this one, -if it exists. -.P -\fIformatstring\fR and \fIfieldname\fR are similar to those used by -the named query format. \fIfieldname\fR may also be a \fIformat -parameter\fR, which is a context-specific value. [Format parameters -are distinguished from fieldnames by a leading dollarsign (`$').] -.P -The following format parameters are defined for -\fBaudit-trail-format\fR entries: -.TP -\fB$FieldName\fR -The name of the field for which an audit-trail entry is being created. -.TP -\fB$OldValue\fR -The old value of the field. -.TP -\fB$NewValue\fR -The new field value. -.TP -\fB$EditUserEmailAddr\fR -The email address of the user editing the field. -.TP -\fB$CurrentDate\fR -The current date. -.TP -\fB$ChangeReason\fR -The reason for the change; may be blank if no reason was supplied. -.P -These parameters may be used anywhere a \fIfieldname\fR can appear. - - -.SH "SEE ALSO" -.I Keeping Track: Managing Messages With GNATS -(also installed as the GNU Info file -.BR gnats.info ) -and -.I Reporting Problems Using send-pr -(also installed as the GNU Info file -.BR send-pr.info ). -.LP -.BR gnats (7), -.BR send-pr (1), -.BR edit-pr (1), -.BR query-pr (1), -.BR file-pr (8), -.BR queue-pr (8), -.BR rmcat (8), -.BR gen-index (8), -.BR mkcat (8). -.SH COPYING -Copyright (c) 2000 Free Software Foundation, Inc. -.PP -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. -.PP -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. -.PP -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 included in -translations approved by the Free Software Foundation instead of in -the original English. diff -x CVS -uNr gnats/gnats/man/delete-pr.man gnats.new/gnats/man/delete-p= r.man --- gnats/gnats/man/delete-pr.man 1999-12-30 22:19:21.000000000 -0600 +++ gnats.new/gnats/man/delete-pr.man 1969-12-31 18:00:00.000000000 -0600 @@ -1,116 +0,0 @@ -.\" Copyright (c) 1999 Free Software Foundation, Inc. -.\" See section COPYING for conditions for redistribution -.TH delete-pr 8 "December 1999" "GNATS @VERSION@" "GNATS Admininstration U= tilities" -.de BP -.sp -.ti -.2i -\(** -.. -.SH NAME -delete\-pr \- deletes closed PRs -.SH SYNOPSIS -.hy 0 -.na -.TP -.B delete\-pr -[ -.B \-V=20 -| -.B \-\-version -] -| -[ -.B \-h -| -.B \-\-help -] -| -.br -[ -.BI -d \ name -| -.BI --database=3D name -] -.BR \-c\ | \ \-\-closed\ | \ PR -.ad b -.hy 1 -.SH DESCRIPTION -Deletes the specified -.BR PR , -or if the \fB\-\-closed\fR option is given, all of the closed \fIPR\fRs in= the -database are deleted. -.P -\fBdelete\-pr\fR must be run as @GNATS_USER@. -.P -Deleting PRs on a regular basis is generally a bad idea, because they -contain useful historical state that would be lost. -.SH OPTIONS -.TP -.B \-V\fR,\fB \-\-version -Prints the program version to stdout and exits. -.TP -.B \-h\fR,\fB \-\-help -Prints a short help text to stdout and exits. -.TP -.B \-d\fR,\fB \-\-database -Specifies the database from which the PR(s) are to be deleted. If no -database is specified, the database named \fIdefault\fR is assumed. -This option overrides the database specified in the \fBGNATSDB\fR -environment variable. -.TP -.B \-\-closed -Requests that all closed PRs in the database be deleted. -.TP -.B PR -Requests that the specified \fBPR\fR be deleted. The \fBPR\fR must be -in a closed state. -.SH ENVIRONMENT VARIABLES -The \fBGNATSDB\fR environment variable is used to determine which database= to -use. For a local database, it contains the name of the database to access. -.P -For network access via \fIgnatsd\fR, it contains a colon-separated list -of strings that describe the remote database, in the form -.TP -\fIserver\fR:\fIport\fR:\fIdatabasename\fR:\fIusername\fR:\fIpassword\fR -.P -Any of the fields may be omitted, but at least one colon must appear; -otherwise, the value is assumed to be the name of a local database. -.P -If \fBGNATSDB\fR is not set and the --database option is not supplied, -it is assumed that the database is local and that its name is -\fIdefault\fR. -.SH "SEE ALSO" -.I Keeping Track: Managing Messages With GNATS -(also installed as the GNU Info file -.BR gnats.info ) -and -.I Reporting Problems Using send-pr -(also installed as the GNU Info file -.BR send-pr.info ). -.LP -.BR gnats (7), -.BR send-pr (1), -.BR edit-pr (1), -.BR query-pr (1), -.BR file-pr (8), -.BR queue-pr (8), -.BR rmcat (8), -.BR gen-index (8), -.BR mkcat (8). -.SH COPYING -Copyright (c) 1999 Free Software Foundation, Inc. -.PP -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. -.PP -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. -.PP -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 included in -translations approved by the Free Software Foundation instead of in -the original English. diff -x CVS -uNr gnats/gnats/man/edit-pr.man gnats.new/gnats/man/edit-pr.man --- gnats/gnats/man/edit-pr.man 2000-01-22 23:35:38.000000000 -0600 +++ gnats.new/gnats/man/edit-pr.man 1969-12-31 18:00:00.000000000 -0600 @@ -1,154 +0,0 @@ -.\" Copyright (c) 1993, 1999 Free Software Foundation, Inc. -.\" See section COPYING for conditions for redistribution -.\" edit-pr, editing function for GNATS - Jeffrey Osier -.TH edit-pr 1 "December 1999" "GNATS @VERSION@" "GNATS User Utilities" -.de BP -.sp -.ti -.2i -\(** -.. -.SH NAME -edit-pr \- edit a problem report in the GNATS database -.SH SYNOPSIS -.hy 0 -.na -.B edit-pr=20 -[ -.B -h=20 -|=20 -.B --help -] -[ -.B -V=20 -|=20 -.B --version -] -[ -.BI -H \ host -| -.BI --host=3D host -] -[ -.BI -P \ port -| -.BI --port=3D port -] -[ -.BI -v \ user -| -.BI --user=3D user -] -[ -.BI -w \ password -| -.BI --passwd=3D password -] -[ -.BI -d \ databasename -| -.BI --database=3D databasename -] -.I gnats-id -.ad b -.hy 1 -.SH DESCRIPTION -Calls=20 -.B $EDITOR -on=20 -.IR gnats-id ;=20 -when finished editing, refiles=20 -.I gnats-id -in the=20 -.B GNATS -database, updating the index and sending mail to relevant parties. -.SH OPTIONS -.TP 1i -.B -h\fR,\fB --help -Prints a brief usage message for -.BR edit-pr . -.TP -.B -V\fR,\fB --version -Prints the version number for -.BR edit-pr . -.TP -.B -d\fR,\fB --database -Specifies the database containing the PR to be edited; if no database is -specified, the database named \fIdefault\fR is assumed. This option -overrides the database specified in the \fBGNATSDB\fR environment variable. -.SS -GNATS network options: -.TP -.B -H\fR,\fB --host -Hostname of the GNATS server. -.TP -.B -P\fR,\fB --port -The port that the GNATS server runs on. -.TP -.B -v\fR,\fB --username -Username used to log into the GNATS server. -.TP -.B -w\fR,\fB --passwd -Password used to log into the GNATS server. -.B -.SH ENVIRONMENT VARIABLES -The \fBGNATSDB\fR environment variable is used to determine which database= to -use. For a local database, it contains the name of the database to access. -.P -For network access via \fIgnatsd\fR, it contains a colon-separated list -of strings that describe the remote database, in the form -.TP -\fIserver\fR:\fIport\fR:\fIdatabasename\fR:\fIusername\fR:\fIpassword\fR -.P -Any of the fields may be omitted, but at least one colon must appear; -otherwise, the value is assumed to be the name of a local database. -.P -If \fBGNATSDB\fR is not set, it is assumed that the database is local -and that its name is \fIdefault\fR. -.SH FILES -.TP 1i -.B /tmp/ep$$ -Temporary file for PR being edited. -.TP -.B /tmp/ed_pr_ch$$ -Holds=20 -.B >Audit-Trail: -change message, if needed. -.TP -.B /tmp/u$$ -Holds output of lock function. -.SH "SEE ALSO" -.I Keeping Track: Managing Messages With GNATS -(also installed as the GNU Info file -.BR gnats.info ) -and -.I Reporting Problems Using send-pr -(also installed as the GNU Info file -.BR send-pr.info ). -.LP -.BR gnats (7), -.BR send-pr (1), -.BR query-pr (1), -.BR delete-pr (8), -.BR file-pr (8), -.BR queue-pr (8), -.BR mkcat (8), -.BR rmcat (8), -.BR gen-index (8), -.BR mkdb (8). -.SH COPYING -Copyright (c) 1993 Free Software Foundation, Inc. -.PP -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. -.PP -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. -.PP -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 included in -translations approved by the Free Software Foundation instead of in -the original English. diff -x CVS -uNr gnats/gnats/man/file-pr.man gnats.new/gnats/man/file-pr.man --- gnats/gnats/man/file-pr.man 1999-12-30 22:19:21.000000000 -0600 +++ gnats.new/gnats/man/file-pr.man 1969-12-31 18:00:00.000000000 -0600 @@ -1,149 +0,0 @@ -.\" Copyright (c) 1993, 1999 Free Software Foundation, Inc. -.\" See section COPYING for conditions for redistribution -.TH file-pr 8 "December 1999" "GNATS @VERSION@" "GNATS Internal Utilities" -.de BP -.sp -.ti -.2i -\(** -.. -.SH NAME -file-pr \- files incoming problem reports in GNATS database -.SH SYNOPSIS -.hy 0 -.na -.B file\-pr -[ -.B \-f \fIfile\fB=20 -|=20 -.B \-\-file=3D\fIfile\fB -] -[ -.B \-h=20 -|=20 -.B \-\-help -] -.br -[ -.B \-V=20 -|=20 -.B \-\-version -] -[ -.BI -H \ host -| -.BI --host=3D host -] -.br -[ -.BI -P \ port -| -.BI --port=3D port -] -[ -.BI -v \ user -| -.BI --user=3D user -] -.br -[ -.BI -w \ password -| -.BI --passwd=3D password -] -.br -[ -.BI -d \ databasename -| -.BI --database=3D databasename -] - -.ad b -.hy 1 -.SH DESCRIPTION -Files incoming bug reports in the=20 -.B GNATS -database. Sends mail to appropriate people. Logs database activity. -.SH OPTIONS -.TP -.B \-f \fIfile\fB, \-\-filename=3D\fIfile\fB -Accept -.I file -as input; if this option is not present, standard input is used. -.TP -.B \-h, \-\-help -Display usage summary for -.BR file\-pr . -.TP -.B \-V, \-\-version -Display version number for -.BR file\-pr . -.TP -.B -d\fR,\fB --database -Specifies the database to which the PR is to be submitted. If no -database is specified, the database named \fIdefault\fR is assumed. -This option overrides the database specified in the \fBGNATSDB\fR -environment variable. -.SS -GNATS network options: -.TP -.B -H\fR,\fB --host -Hostname of the GNATS server. -.TP -.B -P\fR,\fB --port -The port that the GNATS server runs on. -.TP -.B -v\fR,\fB --username -Username used to log into the GNATS server. -.TP -.B -w\fR,\fB --passwd -Password used to log into the GNATS server. -.SH ENVIRONMENT VARIABLES -The \fBGNATSDB\fR environment variable is used to determine which database= to -use. For a local database, it contains the name of the database to access. -.P -For network access via \fIgnatsd\fR, it contains a colon-separated list -of strings that describe the remote database, in the form -.TP -\fIserver\fR:\fIport\fR:\fIdatabasename\fR:\fIusername\fR:\fIpassword\fR -.P -Any of the fields may be omitted, but at least one colon must appear; -otherwise, the value is assumed to be the name of a local database. -.P -If \fBGNATSDB\fR is not set, it is assumed that the database is local -and that its name is \fIdefault\fR. -.SH "SEE ALSO" -.I Keeping Track: Managing Messages With GNATS -(also installed as the GNU Info file -.BR gnats.info ) -and -.I Reporting Problems Using send-pr -(also installed as the GNU Info file -.BR send-pr.info ). -.LP -.BR gnats (7), -.BR send-pr (1), -.BR query-pr (1), -.BR edit-pr (1), -.BR delete-pr (8), -.BR queue-pr (8), -.BR mkcat (8), -.BR rmcat (8), -.BR gen-index (8), -.BR mkdb (8). -.SH COPYING -Copyright (c) 1993, 1999 Free Software Foundation, Inc. -.PP -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. -.PP -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. -.PP -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 included in -translations approved by the Free Software Foundation instead of in -the original English. diff -x CVS -uNr gnats/gnats/man/gen-index.man gnats.new/gnats/man/gen-inde= x.man --- gnats/gnats/man/gen-index.man 1999-12-30 22:19:21.000000000 -0600 +++ gnats.new/gnats/man/gen-index.man 1969-12-31 18:00:00.000000000 -0600 @@ -1,124 +0,0 @@ -.\" Copyright (c) 1993 Free Software Foundation, Inc. -.\" See section COPYING for conditions for redistribution -.TH gen-index 8 "October 1993" "GNATS @VERSION@" "GNATS Administration Uti= lities" -.de BP -.sp -.ti -.2i -\(** -.. -.SH NAME -gen-index \- build an index to current GNATS database -.SH SYNOPSIS -.hy 0 -.na -.B gen\-index -.RS -[ -.B -n -| -.B --numeric -] -[ -.B -h -| -.B --help -] -.br -[ -.B -o -.I outfile -| -.BI --outfile=3D outfile -] -.br -[ -.B -d -.I databasename -| -.BI --database=3D databasename -] -.br -[ -.B -V -| -.B --version -] -.ad b -.hy 1 -.SH DESCRIPTION -Builds an index for the specified -.B GNATS -database. The index is printed to standard output by default. -.SH OPTIONS -.TP 0.5i -.B -n, --numeric -Sorts index entries numerically rather than by their order in the -.B `categories' -list. -.TP -.B -d \fIdatabasename\fB, --database=3D\fIdatabasename\fR -Specifies the database to be indexed. If no database is specified, -the database named \fIdefault\fR is assumed. This option overrides -the database specified in the \fBGNATSDB\fR environment variable. -.TP -.B -o \fIoutfile\fB, --outfile=3D\fIoutfile\fR -Prints the index to=20 -.I outfile -rather than to the standard output. -.TP -.B -h, --help -Prints usage for=20 -.BR gen\-index . -.TP -.B -V, --version -Prints the version number of -.BR gen\-index . -.SH ENVIRONMENT VARIABLES -The \fBGNATSDB\fR environment variable is used to determine which database= to -use. For a local database, it contains the name of the database to access. -.P -For network access via \fIgnatsd\fR, it contains a colon-separated list -of strings that describe the remote database, in the form -.TP -\fIserver\fR:\fIport\fR:\fIdatabasename\fR:\fIusername\fR:\fIpassword\fR -.P -Any of the fields may be omitted, but at least one colon must appear; -otherwise, the value is assumed to be the name of a local database. -.P -If \fBGNATSDB\fR is not set, it is assumed that the database is local -and that its name is \fIdefault\fR. -.SH "SEE ALSO" -.I Keeping Track: Managing Messages With GNATS -(also installed as the GNU Info file -.BR gnats.info ) -and -.I Reporting Problems Using send-pr -(also installed as the GNU Info file -.BR send-pr.info ). -.LP -.BR gnats (7), -.BR send-pr (1), -.BR edit-pr (1), -.BR query-pr (1), -.BR file-pr (8), -.BR queue-pr (8), -.BR mkdb (8), -.BR mkcat (8), -.BR rmcat (8). -.SH COPYING -Copyright (c) 1993 Free Software Foundation, Inc. -.PP -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. -.PP -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. -.PP -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 included in -translations approved by the Free Software Foundation instead of in -the original English. diff -x CVS -uNr gnats/gnats/man/gnats.man gnats.new/gnats/man/gnats.man --- gnats/gnats/man/gnats.man 2000-03-09 22:49:29.000000000 -0600 +++ gnats.new/gnats/man/gnats.man 1969-12-31 18:00:00.000000000 -0600 @@ -1,256 +0,0 @@ -.\" -*- nroff -*- -.\" ----------------------------------------------------------------------= ----- -.\" man page for GNATS (by Heinz G. Seidl, hgs@cygnus.com) -.\" updated April 1993 for GNATS @VERSION@ by Jeffrey Osier, jeffrey@cy= gnus.com -.\" -.\" This file is part of the GNU Problem Report Management System (GNAT= S) -.\" Copyright 1993 Cygnus Support -.\" -.\" This program 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 of the License, or (at your option) any later version. -.\" -.\" This program is distributed in the hope that it will be useful, -.\" but WITHOUT ANY WARRANTY; without even the implied warranty of -.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -.\" General Public License for more details. -.\" -.\" You should have received a copy of the GNU Library General Public -.\" License along with this program; if not, write to the Free -.\" Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA -.\" -.\" ----------------------------------------------------------------------= ----- -.\"=20 -.TH gnats 7 "December 1999" "GNATS @VERSION@" "Problem Report Management S= ystem" -.SH NAME -gnats \- Problem Report Management System -.SH DESCRIPTION -.B GNATS -is a bug-tracking tool designed for use at a central support site. -Software users who experience problems use electronic mail to -communicate these problems to the the maintainers of that software; -.B GNATS -partially automates the tracking of these problems by: -.TP -.B \(bu -organizing problem reports into a database and notifying responsible -parties of suspected bugs; -.TP -.B \(bu -allowing support personnel and their managers to edit, query and report -on accumulated bugs; and -.TP -.B \(bu -providing a reliable archive of problems with a given program and a -history of the life of the program by preserving its reported problems -and their subsequent solutions. -.LP -.B GNATS -offers many of the same features offered by more generic databases. -You can query and edit existing problem reports (\fIPR\fPs) as well as -obtain reports on groups of PRs. The database itself is simply an -ordered repository for problem reports; each PR receives a unique, -incremental -.IR PR number , -which identifies it throughout its lifetime. -.LP -Many of the primary functions available with=20 -.B GNATS -are accessible from within GNU=20 -.BR Emacs . -.SH "PROBLEM REPORT STATES" -PRs go through several states in their lifetimes. The set of states is -site-specific. -.LP -The default set of states are: -.TP 2i -.I open -the initial state of every PR; -this means the PR has been filed and the person or group responsible -for it has been notified of the suspected problem -.TP -.I analyzed -the problem has been examined and work toward a solution has begun -.TP -.I feedback -a solution has been found and tested at the support site, and sent to -the party who reported the problem; that party is testing the solution -.TP -.I closed -the solution has been confirmed by the party which reported it -.LP -In some cases, it may be necessary to suspend work on a bug; in this -case, its state changes to -.I suspended -rather than=20 -.IR closed . -.SH STRUCTURE -Incoming PRs are assigned an incremental serial number and filed -according to category. An index is kept concurrently to accelerate -searches of the database. -.LP -All=20 -.B GNATS -administration and database files are located in subdirectories of a -directory associated with each database. Databases are named, and=20 -the association between database names and directories is described -by the \fBdatabases\fR file, which is found on this system in=20 -.B @PREFIX@/share/gnats/databases. -.LP -.I Problem Reports -are segregated into subdirectories within the database directory by -category. For example, problems submitted with a category of -.I gcc -will be filed in the database subdirectory -.BR gcc . -.LP -.B GNATS -administration files are kept in the database subdirectory -.BR gnats-adm : -.TP 1.5i -.B dbconfig -describes the structure of the database, and various database-specific -options -.TP -.B categories -table of valid categories and parties responsible for them -.TP -.B responsible -table of responsible parties and their email addresses -.TP -.B submitters -database of sites which submit PRs -.TP -.B current -keeps track of incremental PR numbers assigned -.TP -.B index -database index -.LP -Administrative programs and programs internal to -.B GNATS -are kept in the directory -.BR @PREFIX@/libexec/gnats -while those meant for public use are installed in -.BR @PREFIX@/bin . -.LP -.B @PREFIX@/libexec/gnats -contains the programs: -.TP 1.5i -.B mkdb -used by the -.B GNATS -administrator to create a new database -.TP -.B mkcat -used by the -.B GNATS -administrator to create new categories [obsolete] -.TP -.B rmcat -used by the -.B GNATS -administrator to remove outdated categories [obsolete] -.TP -.B gen\-index -used by the -.B GNATS -administrator to generate a new version of the index -.TP -.B queue-pr -mail control program which accepts incoming messages and periodically -submits them to the database via=20 -.B cron -by feeding them through the program -.BR file-pr (8) -.TP -.B pr-edit -program which is mainly responsible for editing existing PRs and filing -new ones; it is used by -.BR edit\-pr \ and\ file\-pr -.TP -.B file-pr -script which uses \fBpr\-edit\fR to file new PRs -.TP -.B at-pr -automatically notifies responsible parties if a PR is not analyzed -within a requisite period defined in the -.B submitters -file -.TP -.B delete-pr -used to delete closed PRs -.LP -.B @PREFIX@/bin -contains the programs -.TP 1.5i -.B query-pr -used to query the database -.TP -.B edit-pr -used to edit individual PRs -.TP -.B send-pr -used to submit problems to=20 -.B GNATS -.LP -Documentation exists for all programs associated with -.B GNATS. -.SH "SEE ALSO" -.I Keeping Track: Managing Messages With GNATS -(also installed as the GNU Info file -.BR gnats.info ) -and -.I Reporting Problems Using send-pr -(also installed as the GNU Info file -.BR send-pr.info ). -.LP -.BR gnats (7), -.BR send\-pr (1), -.BR edit\-pr (1), -.BR query\-pr (1), -.BR file\-pr (8), -.BR queue-pr (8), -.BR delete\-pr (8), -.BR mkcat (8), -.BR mkdb (8), -.BR rmcat (8), -.BR gen\-index (8), -.BR pr\-edit (8) -.SH HISTORY -.B GNATS=20 -was greatly inspired by the BSD=20 -.BR sendbug (1) -and -.BR bugfiler (8) -programs. It was originally written in C++, Elisp, shell script, and -awk. It presently consists of utilities written in C, shell script, -and Elisp. -.SH AUTHORS -.B GNATS -was originally written by Heinz G. Seidl (Cygnus Support). Subsequent -iterations were developed by Brendan Kehoe (Cygnus Support) and Jason -Merrill (Cygnus Support), with help from Tim Wicinski. Documentation -was initially developed by Jeffrey Osier (Cygnus Support) and Brendan -Kehoe (Cygnus Support). -.P -Version 4.x was a substantial rewrite done by Bob Manson (Juniper -Networks). -.SH COPYING -Copyright (c) 1992, 1993, 1999, 2000 Free Software Foundation -.PP -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. -.PP -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. -.PP -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 included in -translations approved by the Free Software Foundation instead of in -the original English. diff -x CVS -uNr gnats/gnats/man/gnatsd.man gnats.new/gnats/man/gnatsd.man --- gnats/gnats/man/gnatsd.man 2000-03-16 22:31:08.000000000 -0600 +++ gnats.new/gnats/man/gnatsd.man 1969-12-31 18:00:00.000000000 -0600 @@ -1,843 +0,0 @@ -.\" Copyright (c) 2000 Free Software Foundation, Inc. -.\" See section COPYING for conditions for redistribution -.TH gnatsd 8 "January 2000" "GNATS @VERSION@" "GNATS Admininstration Utili= ties" -.de BP -.sp -.ti -.2i -\(** -.. -.SH NAME -gnatsd \- GNATS network server -.SH SYNOPSIS -.hy 0 -.na -.TP -.B gnatsd -[\fB\-\-database\fR\ \fIdatabase\fR\ |\ \fB\-d\fR\ \fIdatabase\fR] -[\fB\-\-not\-inetd\fR\ |\ \fB\-n\fR] -[\fB\-\-max-access-level\fR\ \fIlevel\fR\ |\ \fB\-m\fR\ \fIlevel\fR] -[\fB\-\-version\fR\ |\ \fB\-V\fR] -[\fB\-\-help\fR\ |\ \fB\-h\fR] -.ad b -.hy 1 -.SH DESCRIPTION -\fBgnatsd\fR is used to service remote GNATS requests such as querying -\fIPR\fRs, \fIPR\fR creation, deletion, and editing, and miscellaneous -database queries. It uses a simple ASCII-based command protocol -(similar to SMTP or POP3) for communicating with remote clients.=20 -.P -It also provides an almost completely useless security model based -either on IP-based authentication (generally a \fBterrible\fR idea) or -cleartext username/passwords (mmmm, network snooping). \fBIt is -strongly recommended that some other scheme (such as \fIssh\fR(8)\fB -tunneling) be used if security is even remotely an issue\fR. (The -next release of GNATS will provide a more useful builtin security -protocol, probably based on \fIssh\fR.) -.P -In the meantime, it is possible to restrict network access to a -particular access level by using the \fB\-\-max-access-level\fR -argument. -.P -All of the GNATS clients are capable of communicating via the GNATS -remote protocol to perform their functions. -.P -\fBgnatsd\fR should be run as the user \fB@GNATS_USER@\fR. It is usually -started from \fIinetd\fR(8). -.SH OPTIONS -.TP 0.5i -.B \-V\fR,\fB \-\-version -Prints the program version to stdout and exits. -.TP 0.5i -.B \-h\fR,\fB \-\-help -Prints a short help text to stdout and exits. -.TP 0.5i -.B \-d\fR,\fB \-\-database -Specifies the default database which is to be serviced by this -invocation of \fBgnatsd\fR. (The selected database may be changed via -the \fBCHDB\fR command; this is simply the default if no \fBCHDB\fR -command is issued.) If no database is specified, the database named -\fIdefault\fR is assumed. This option overrides the database -specified in the \fBGNATSDB\fR environment variable. -.TP 0.5i -\fB\-\-not\-inetd\fR,\ \fB\-n\fR -As its name suggests, indicates that \fBgnatsd\fR is not being invoked -from \fIinetd\fR. This can be used when testing \fBgnatsd\fR, or if -it being run via \fIssh\fR or some other mechanism. -.P -.RS 0.5i -This has the effect of using the local hostname where \fBgnatsd\fR is -being invoked for authentication purposes, rather than the remote -address of the connecting client. -.RE -.TP 0.5i -\fB\-\-max-access-level\fR,\ \fB\-m\fR -Specifies the maximum access level that the connecting client can -authenticate to. Authentication is as normal but if the user or host -authenticates at a higher level, access level is set to this level. -.SH COMMAND PROTOCOL -Commands are issued to \fBgnatsd\fR as one or more words followed by a -carriage-return/linefeed pair. For example, the \fBCHDB\fR (change -databases) command is sent as -.RS -CHDB \fIdatabase\fR -.RE -[the CRLF will not be explicitly written for future examples] -.P -Replies from \fBgnatsd\fR are returned as one or more \fIresponse line\fRs -containing a 3-digit numeric code followed by a human-readable string; -the line is terminated with a pair. For example, one possible -response to the \fBCHDB\fR command above would be: -.RS -210 Now accessing GNATS database 'database'. -.RE -.P -The three-digit code is normally followed by a single ASCII space -(character 0x20). However, if additional response lines are to be -returned from the server, there will be a single dash (`-') instead of -the space character after the three-digit code. -.P -Response code values are divided into ranges. The first digit -reflects the general type of response (such as "successful" or -"error"), and the subsequent digits identify the specific type of -response. -.TP -Codes 200-299 -Positive response indicating that the command was successful. No -subsequent data will be transmitted with the response. [In -particular, code 210 (\fBCODE_OK\fR) is used as the positive result -code for most simple commands.] -.RS -.P -Commands that expect additional data from the client (such as -\fBSUBM\fR or \fBVFLD\fR) use a two-step mechanism for sending the -data. The server will respond to the initial command with either a -211 (\fBCODE_SEND_PR\fR) or 212 (\fBCODE_SEND_TEXT\fR) response line, -or an error code if an error occurred with the initial command. The -client is then expected to send the remaining data using the same -quoting mechanism as described for server responses in the 300-349 -range. The server will then send a final response line to the -command. -.RE -.TP -Codes 300-399 -Positive response indicating that the query request was successful, -and that a \fIPR\fR or other data will follow. Codes 300-349 are used -when transmitting \fIPR\fRs, and 350-399 are used for other responses. -.P -.RS -Codes in the 300-349 range are followed by a series of CRLF-terminated -lines containing the command response, usually a \fIPR\fR. The final -line of the result is a single period (`.'). Result lines that begin -with a period have an extra period prepended to them. -.P -Codes in the 350-399 range use a different scheme for sending their -responses. The three-digit numeric code will be followed by either a -dash (`-') or a single space. If the code is followed by a dash, that -indicates that another response line will follow. The final line of -the response has a single space after the three-digit code. -.P -In previous versions of the protocol the first line of a -CODE_INFORMATION (310) response was to be ignored. This is no longer -the case. Instead, any lines marked with code CODE_INFORMATION_FILLER -(351) are to be ignored. This allows the server to transmit -additional headers or other human-readable text that can be safely -ignored by the clients. -.RE -.TP -Codes 400-599=20 -An error occurred, usually because of invalid command parameters or -invalid input from the client, missing arguments to the comamand, or a -command was issued out of sequence. The human-readable message -associated with the response line describes the general problem -encountered with the command. -.P -.RS -Multiple error messages may be returned from a command; in this case -the `-' continuation character is used on all but the last response -line. -.RE -.TP -Codes 600-799 -An internal error occurred on the server, a timeout occurred reading -data from the client, or a network failure occurred. These errors are -of the "this should not occur" nature, and retrying the operation may -resolve the problem. Fortunately, most GNATS transactions are -idempotent; unfortunately, locking the database or a \fIPR\fR are not -repeatable actions (we cannot determine if an existing lock is the one -we originally requested, or someone else's). -.SH COMMANDS -Note that the set of GNATS commands and their responses is somewhat -inconsistent and is very much in flux. At present the GNATS clients -are rather simple-minded and not very strict about processing -responses. For example, if the server were to issue a code 300 -(\fBCODE_PR_READY\fR) response to a \fBCHDB\fR command, the client -would happily expect to see a PR appear (and would print it out if one -was sent). -.P -It is thus suggested that any clients that use the GNATS protocol be -equally flexible about the way received responses are handled; in -particular, only the first digit of the response code should be -assumed to be meaningful, although subsequent digits are needed in -some cases (codes 300-399). \fBNo attempt should be made to parse the -message strings on error response lines; they are only intended to be -read by humans, and will be changed on a regular basis.\fR -.P -Almost every command may result in the response 440 (\fBCODE_CMD_ERROR\fR). -This indicates that there was a problem with the command arguments, -usually because of insufficient or too many arguments being specified. -.TP 0.5i -\fBUSER\fR [<\fIuserid\fR> <\fIpassword\fR>] -Specifies the userid and password for database access. Either both a -username and password must be specified, or they both may be omitted; -in the latter case, the current access level is returned. -.RS 0.5i -.P -The possible server responses are: -.TP -350 (\fBCODE_INFORMATION\fR) -The current access level is specified. -.TP -422 (\fBCODE_NO_ACCESS\fR) -A matching username and password could not be found. -.TP -200 (\fBCODE_OK\fR) -A matching username and password was found, and the login was -successful. -.RE -.TP 0.5i -\fBQUIT\fR -Requests that the connection be closed. Possible responses: -.RS 0.5i -.TP -201 (\fBCODE_CLOSING\fR) -Normal exit. -.P -The quit command has the dubious distinction of being the only command -that cannot fail. -.RE -.TP 0.5i -\fBLIST\fR <\fIlist\ type\fR> -Describes various aspects of the database. The lists are returned as -a list of records, one per line. Each line may contain a number of -colon-separated fields. -.P -.RS 0.5i -Possible values for \fIlist type\fR include -.RS 0.25i -.TP -\fBCategories\fR -Describes the legal categories for the database. -.TP -\fBSubmitters\fR -Describes the set of submitters for the database. -.TP -\fBResponsible\fR -Lists the names in the responsible administrative file, including their -full names and email addresses. -.TP -\fBStates\fR -Lists the states listed in the state administrative file, including -the state type (usually blank for most states; the closed state has a -special type). -.TP -\fBClasses\fR -Lists the set of PR classes and their associated human-readable descriptio= ns. -.TP -\fBFieldNames\fR -Lists the entire set of PR fields. -.TP -\fBInitialInputFields\fR -Lists the fields that should be provided when a PR is initially entered. -.TP -\fBDatabases\fR -Lists the set of databases. -.RE -.P -The possible responses are: -.TP -301 (\fBCODE_TEXT_READY\fR) -Normal response, followed by the records making up the list as described -above. -.TP -416 (\fBCODE_INVALID_LIST\fR) -The requested list does not exist. -.RE -.TP 0.5i -\fBFTYP\fR <\fIfield\fR> [<\fIfield\fR> ...] -Describes the type of data held in the field(s) specified with the -command. The currently-defined data types are: -.RS 0.5i -.TP -Text -A plain text field, containing exactly one line. -.TP -MultiText -A text field possibly containing multiple lines of text. -.TP -Enum -An enumerated data field; the value is restricted to one entry out of -a list of values associated with the field. -.TP -MultiEnum -The field contains one or more enumerated values. Values are separated -with spaces or colons (\fB:\fR). -.TP -Integer -The field contains an integer value, possibly signed. -.TP -Date -The field contains a date. -.TP -TextWithRegex -The value in the field must match one or more regular expressions associat= ed -with the field. -.P -The possible responses are: -.TP -350 (\fBCODE_INFORMATION\fR) -The normal response; the supplied text is the data type. -.TP -410 (\fBCODE_INVALID_FIELD_NAME\fR) -The specified field does not exist. -.P -If multiple field names were given, multiple response lines will be sent, -one for each field, using the standard continuation protocol; each response -except the last will have a dash (`-') immedately after the response -code. -.RE -.TP -\fBFDSC\fR <\fIfield\fR> [<\fIfield\fR> ... ] -Returns a human-readable description of the listed field(s). The possible -responses are: -.RS 0.5i -.TP -350 (\fBCODE_INFORMATION\fR) -The normal response; the supplied text is the field description. -.TP -410 (\fBCODE_INVALID_FIELD_NAME\fR) -The specified field does not exist. -.P -Like the \fBFVLD\fR command, the standard continuation protocol will -be used if multiple fields were specified with the command. -.RE -.TP -\fBFIELDFLAGS\fR <\fIfield\fR> [<\fIfield\fR> ... ] -Returns a set of flags describing the specified field(s). The possible -responses are either 410\ (\fBCODE_INVALID_FIELD_NAME\fR), meaning that -the specified field is invalid or nonexistent, or 350\ (\fBCODE_INFORMATIO= N\fR) -which contains the set of flags for the field. The flags may be blank, -which indicate that no special flags have been set for this field. -.RS 0.5i -.P -Like the \fBFDSC\fR and \fBFTYP\fR commands, multiple field names may be -listed with the command, and a response line will be returned for -each one in the order that the fields appear on the command line. -.P -The flags include: -.TP -\fItextsearch\fR -The field will be searched when a text field search is requested. -.TP -\fIallowAnyValue\fR -For fields that contain enumerated values, any legal value may be used in= =20 -the field, not just ones that appear in the enumerated list. -.TP -\fIrequireChangeReason\fR -If the field is edited, a reason for the change must be supplied in -the new \fIPR\fR text describing the reason for the change. The -reason must be supplied as a multitext \fIPR\fR field in the new -\fIPR\fR whose name is \fIfield\fR-Changed-Why (where \fIfield\fR is -the name of the field being edited). -.TP -\fIreadonly\fR -The field is read-only, and cannot be edited. -.RE -.TP -\fBFVLD\fR <\fIfield\fR> -Returns one or more regular expressions or strings that describe the -valid types of data that can be placed in \fIfield\fR. Exactly what is -returned is dependent on the type of data that can be stored in the field. -For most fields a regular expression is returned; for enumerated fields, t= he -returned values are the list of legal strings that can be held in the -field. -.P -.RS 0.5i -The possible responses are: -.TP -301 (\fBCODE_TEXT_READY\fR) -The normal response, which is followed by the list of regexps or strings. -.TP -410 (\fBCODE_INVALID_FIELD_NAME\fR) -The specified field does not exist. -.RE -.TP 0.5i -\fBVFLD\fR <\fIfield\fR> -\fBVFLD\fR can be used to validate a given value for a field in the -database. The client issues the \fBVFLD\fR command with the name of -the field to validate as an argument. The server will either respond -with 212 (\fBCODE_SEND_TEXT\fR), or 410 -(\fBCODE_INVALID_FIELD_NAME\fR) if the specified field does not exist. -.P -.RS 0.5i -Once the 212 response is received from the server, the client should -then send the line(s) of text to be validated, using the normal quoting -mechanism described for \fIPR\fRs. The final line of text is followed -by a line containing a single period, again as when sending \fIPR\fR -text. -.P -The server will then either respond with 210 (\fBCODE_OK\fR), indicating t= hat -the text is acceptable, or one or more error codes describing the problems -with the field contents. -.RE -.TP 0.5i -\fBINPUTDEFAULT\fR <\fIfield\fR> [<\fIfield\fR> ... ] -Returns the suggested default value for a field when a \fIPR\fR is -initially created. The possible responses are either 410\ -(\fBCODE_INVALID_FIELD_NAME\fR), meaning that the specified field is -invalid or nonexistent, or 350\ (\fBCODE_INFORMATION\fR) which -contains the default value for the field. -.RS 0.5i -.P -Like the \fBFDSC\fR and \fBFTYP\fR commands, multiple field names may be -listed with the command, and a response line will be returned for -each one in the order that the fields appear on the command line. -.RE -.TP 0.5i -\fBRSET\fR -Used to reset the internal server state. The current query expression is -cleared, and the index of PRs may be reread if it has been updated since t= he -start of the session. -.RS 0.5i -The possible responses are: -.TP -200 (\fBCODE_OK\fR) -The state has been reset. -.TP -440 (\fBCODE_CMD_ERROR\fR) -One or more arguments were supplied to the command. -.TP -6xx (\fIinternal error\fR) -There were problems resetting the state (usually because the index -could not be reread). The session will be immediately terminated. -.RE -.TP -\fBLKDB\fR -Locks the main GNATS database. No subsequent database locks will -succeed until the lock is removed. Sessions that attempt to write to -the database will fail. -.RS 0.5i -The possible responses are: -.TP -200 (\fBCODE_OK\fR) -The lock has been established. -.TP -440 (\fBCODE_CMD_ERROR\fR) -One or more arguments were supplied to the command. -.TP -431 (\fBCODE_GNATS_LOCKED\fR) -The database is already locked, and the lock could not be obtained after -10 seconds. -.TP -6xx (\fIinternal error\fR) -An internal error occurred, usually because of permission or other -filesystem-related problems. The lock may or may not have been -established. -.RE -.TP -\fBUNDB\fR -Unlocks the database. Any session may steal a database lock; no -checking of any sort is done. -.RS 0.5i -The possible responses are: -.TP -200 (\fBCODE_OK\fR) -The lock has been removed. -.TP -432 (\fBCODE_GNATS_NOT_LOCKED\fR) -The database was not locked. -.TP -440 (\fBCODE_CMD_ERROR\fR) -One or more arguments were supplied to the command. -.TP -6xx (\fIinternal error\fR) -The database lock could not be removed, usually because of permissions or -other filesystem-related issues. -.RE -.TP -\fBLOCK\fR <\fIPR\fR> <\fIuser\fR> [<\fIpid\fR>] -Locks the specified \fIPR\fR, marking the lock with the name -\fIuser\fR and the optional \fIpid\fR. (No checking is done that the -\fIuser\fR or \fIpid\fR arguments are valid or meaningful; they are -simply treated as strings.) -.RS 0.5i -.P -The \fBEDIT\fR command requires that the \fIPR\fR be locked before it -may be successfully executed. However, it does not require that the -lock is owned by the editing session, so the usefulness of the lock is -simply as an advisory measure. -.P -The \fBAPPN\fR and \fBREPL\fR commands lock the \fIPR\fR as part of -the editing process, and they do not require that the \fIPR\fR be -locked \fIbefore\fR they are invoked. -.P -The possible responses are: -.TP -440 (\fBCODE_CMD_ERROR\fR) -Insufficient or too many arguments were specified to the command. -.TP -300 (\fBCODE_PR_READY\fR) -The lock was successfully obtained; the text of the \fIPR\fR (using -the standard quoting mechanism for \fIPR\fRs) follows. -.TP -400 (\fBCODE_NONEXISTENT_PR\fR) -The \fIPR\fR specified does not exist. -.TP -430 (\fBCODE_LOCKED_PR\fR) -The \fIPR\fR is already locked by another session. -.TP -6xx (\fIinternal error\fR) -The \fIPR\fR lock could not be created, usually because of permissions or -other filesystem-related issues. -.RE -.TP -\fBUNLK\fR <\fIPR\fR> -Unlocks \fIPR\fR. Any user may unlock a \fIPR\fR, as no checking is done -to determine if the requesting session owns the lock. -.RS 0.5i -.P -The possible responses are: -.TP -440 (\fBCODE_CMD_ERROR\fR) -Insufficient or too many arguments were specified to the command. -.TP -200 (\fBCODE_OK\fR) -The \fIPR\fR was successfully unlocked. -.TP -433 (\fBCODE_PR_NOT_LOCKED\fR) -The \fIPR\fR was not locked. -.TP -6xx (\fIinternal error\fR) -The \fIPR\fR could not be unlocked, usually because of permission or -other filesystem-related problems. -.RE -.TP -\fBDELETE\fR <\fIPR\fR> -Deletes the specified \fIPR\fR. The user making the request must have -\fIadmin\fR privileges. If successful, the \fIPR\fR is removed from the -filesystem and the index file; a gap will be left in the numbering sequence -for \fIPR\fRs. No checks are made that the \fIPR\fR is closed. -.RS 0.5i -.P -The possible responses are: -.TP -200 (\fBCODE_OK\fR) -The \fIPR\fR was successfully deleted. -.TP -422 (\fBCODE_NO_ACCESS\fR) -The user requesting the delete does not have \fIadmin\fR privileges. -.TP -430 (\fBCODE_LOCKED_PR\fR) -The \fIPR\fR is locked by another session. -.TP -431 (\fBCODE_GNATS_LOCKED\fR) -The database has been locked, and no \fIPR\fRs may be updated until the -lock is cleared. -.TP -6xx (\fIinternal error\fR) -The \fIPR\fR could not be successfully deleted, usually because of -permission or other filesystem-related problems. -.RE -.TP -\fBCHEK\fR [initial] -Used to check the text of an entire \fIPR\fR for errors. Unlike the -\fBVFLD\fR command, it accepts an entire \fIPR\fR at once instead of -the contents of an individual field. -.RS 0.5i -.P -The \fIinitial\fR argument indicates that the PR text to be checked is -for a \fIPR\fR that will be newly created, rather than an edit or=20 -replacement of an existing PR. -.P -After the \fBCHEK\fR command is issued, the server will respond with eithe= r a -440 (\fBCODE_CMD_ERROR\fR) response indicating that the command -arguments were incorrect, or a 211 (\fBCODE_SEND_PR\fR) response code will -be sent. -.P -Once the 211 response is received from the server, the client should send -the \fIPR\fR using the normal \fIPR\fR quoting mechanism; the final line of -the \fIPR\fR is then followed by a line containing a single period, as usu= al. -.P -The server will then respond with either a 200 (\fBCODE_OK\fR) -response, indicating there were no problems with the supplied text, or -one or more error codes listing the problems with the \fIPR\fR. -.RE -.TP -\fBEDIT\fR <\fIPR\fR> -Verifies the replacement text for \fIPR\fR. If the command is successful,= the -contents of \fIPR\fR are completely replaced with the supplied text. -\fIPR\fR must previously have been locked with the \fBLOCK\fR command. -.RS 0.5i -.P -The possible responses are: -.TP -431 (\fBCODE_GNATS_LOCKED\fR) -The database has been locked, and no \fIPR\fRs may be updated until the -lock is cleared. -.TP -433 (\fBCODE_PR_NOT_LOCKED\fR) -The \fIPR\fR was not previously locked with the \fBLOCK\fR command. -.TP -400 (\fBCODE_NONEXISTENT_PR\fR) -The specified \fIPR\fR does not currently exist. The \fBSUBM\fR command -should be used to create new \fIPR\fRs. -.TP -211 (\fBCODE_SEND_PR\fR) -The client should now transmit the replacement \fIPR\fR text using the -normal \fIPR\fR quoting mechanism. After the \fIPR\fR has been sent, -the server will respond with either a 200 (\fBCODE_OK\fR) response -indicating the edit was successful, or one or more error codes -listing problems with either with the replacement \fIPR\fR text, or -errors encountered while updating the \fIPR\fR file or index. -.RE -.TP -\fBAPPN\fR <\fIPR\fR> <\fIfield\fR> -.TP -\fBREPL\fR <\fIPR\fR> <\fIfield\fR> -Appends to or replaces the contents of \fIfield\fR in \fIPR\fR with -the supplied text. The command returns a 201\ (\fBCODE_SEND_TEXT\fR) -response; the client should then transmit the new field contents using -the standard \fIPR\fR quoting mechanism. After the server has read -the new contents, it then attempts to make the requested change to the -\fIPR\fR. -.RS 0.5i -.P -The possible responses are: -.TP -200 (\fBCODE_OK\fR) -The \fIPR\fR field was successfully changed. -.TP -400 (\fBCODE_NONEXISTENT_PR\fR) -The \fIPR\fR specified does not exist. -.TP -410 (\fBCODE_INVALID_FIELD_NAME\fR) -The specified field does not exist. -.TP -402 (\fBCODE_UNREADABLE_PR\fR) -The \fIPR\fR could not be read. -.TP -431 (\fBCODE_GNATS_LOCKED\fR) -The database has been locked, and no \fIPR\fRs may be updated until the -lock is cleared. -.TP -430 (\fBCODE_LOCKED_PR\fR) -The \fIPR\fR is locked, and may not be altered until the lock is cleared. -.TP -413 (\fBCODE_INVALID_FIELD_CONTENTS\fR) -The supplied (or resulting) field contents are not valid for the field. -.TP -6xx (\fIinternal error\fR) -An internal error occurred, usually because of permission or other -filesystem-related problems. The \fIPR\fR may or may not have been -altered. -.RE -.P -\fBSUBM\fR -Submits a new \fIPR\fR into the database. The supplied text is verified f= or -correctness, and if no problems are found a new \fIPR\fR is created. -.RS 0.5i -.P -The possible responses are: -.TP -431 (\fBCODE_GNATS_LOCKED\fR) -The database has been locked, and no \fIPR\fRs may be submitted until the -lock is cleared. -.TP -211 (\fBCODE_SEND_PR\fR) -The client should now transmit the new \fIPR\fR text using the normal -quoting mechanism. After the \fIPR\fR has been sent, the server will -respond with either a 200 (\fBCODE_OK\fR) response indicating that the -new PR has been created (and mail sent to the appropriate persons), or -one or more error codes listing problems with the new \fIPR\fR text. -.RE -.TP -\fBCHDB\fR <\fIdatabase\fR> -Switches the current database to the name specified in the command. -.RS 0.5i -.P -The possible responses are: -.TP -422 (\fBCODE_NO_ACCESS\fR) -The user does not have permission to access the requested database. -.TP -417 (\fBCODE_INVALID_DATABASE\fR) -The database specified does not exist, or one or more configuration errors -in the database were encountered. -.TP -220 (\fBCODE_OK\fR) -The current database is now \fIdatabase\fR. Any operations performed -will now be applied to that database. -.RE -.TP -\fBDBLS\fR -Lists the known set of databases. -.RS 0.5i -.P -The possible responses are: -.TP -6xx (\fIinternal error\fR) -An internal error was encountered while trying to obtain the list of -available databases, usually due to lack of permissions or other -filesystem-related problems, or the list of databases is empty. -.TP -301 (\fBCODE_TEXT_READY\fR) -The list of databases follows, one per line, using the standard quoting -mechanism. Only the database names are sent. -.RE -.TP -\fBDBDESC\fR <\fIdatabasename\fR> -Returns a human-readable description of the specified database. Responses -include: -.RS 0.5i -.TP -6xx (\fIinternal error\fR) -An internal error was encountered while trying to read the list of -available databases, usually due to lack of permissions or other -filesystem-related problems, or the list of databases is empty. -.TP -350 (\fBCODE_INFORMATION\fR) -The normal response; the supplied text is the database description. -.TP -417 (\fBCODE_INVALID_DATABASE\fR) -The specified database name does not have an entry. -.RE -.TP -\fBEXPR\fR <\fIquery expression\fR> -Specifies a query expression used to limit which \fIPR\fRs are returned -from the \fBQUER\fR command. The expression uses the normal query -expression syntax, as described in the manual entry for query-pr(1). -.RS 0.5i -.P -Multiple \fBEXPR\fR commands may be issued; the expressions are -boolean \fIAND\fRed together. -.P -Expressions are cleared by the RSET command. -.P -Possible responses include: -.TP -415 (\fBCODE_INVALID_EXPR\fR) -The specified expression is invalid, and could not be parsed. -.TP -200 (\fBCODE_OK\fR) -The expression has been accepted, and will be used to limit the results -returned from \fBQUER\fR. -.RE -.TP 0.5i -\fBQFMT\fR <\fIquery format\fR> -Use the specified query format to format the output of the \fBQUER\fR comm= and. -The query format may be either the name of a query format known to the -server, or an actual query format. -.RS 0.5i -The possible responses are: -.TP -200 (\fBCODE_OK\fR) -The normal response, which indicates that the query format is acceptable. -.TP -440 (\fBCODE_CMD_ERROR\fR) -No query format was supplied. -.TP -418 (\fBCODE_INVALID_QUERY_FORMAT\fR) -The specified query format does not exist, or could not be parsed. -.RE -.TP -\fBQUER\fR [\fIPR\fR] [\fIPR\fR] [...] -Searches the contents of the database for \fIPR\fRs that match the -(optional) specified expressions with the \fBEXPR\fR command. If no -expressions were specified with \fBEXPR\fR, the entire set of \fIPR\fRs -is returned. -.RS 0.5i -.P -If one or more \fIPR\fRs are specified on the commandline, only those -\fIPR\fRs will be searched and/or output. -.P -The format of the output from the command is determined by the query -format selected with the \fBQFMT\fR command. -.P -The possible responses are: -.TP -418 (\fBCODE_INVALID_QUERY_FORMAT\fR) -A valid format was not specified with the \fBQFMT\fR command prior to -invoking \fBQUER\fR. -.TP -300 (\fBCODE_PR_READY\fR) -One or more \fIPR\fRs will be output using the requested query format. -The \fIPR\fR text is quoted using the normal quoting mechanisms for -\fIPR\fRs. -.TP -220 (\fBCODE_NO_PRS_MATCHED\fR) -No \fIPR\fRs met the specified criteria. -.RE -.TP -\fBADMV\fR <\fIfield\fR> <\fIkey\fR> [<\fIsubfield\fR>] -Returns an entry from an adm file associated with \fIfield\fR. -\fIkey\fR is used to look up the entry in the data file. If -\fIsubfield\fR is specified, only the value of that subfield is -returned; otherwise, all of the fields in the adm data file are -returned, separated by colons (`:'). -.RS 0.5i -.P -The responses are: -.TP -410 (\fBCODE_INVALID_FIELD_NAME\fR) -The specified field does not exist. -.TP -221 (\fBCODE_NO_ADM_ENTRY\fR) -An adm entry matching the key was not found, or the field does not have -an adm file associated with it. -.TP -350 (\fBCODE_INFORMATION\fR) -The normal response; the supplied text is the requested field(s). -.RE -.SH ENVIRONMENT VARIABLES -The \fBGNATSDB\fR environment variable is used to determine which -database to use. For a local database, it contains the name of the -database to access. \fBgnatsd\fR cannot service remote databases (tho -it might be interesting if it could) so the database is always assumed -to be local. -.P -If \fBGNATSDB\fR is not set and the --database option is not supplied, -it is assumed that the database is local and that its name is \fIdefault\f= R. -.SH "SEE ALSO" -.I Keeping Track: Managing Messages With GNATS -(also installed as the GNU Info file -.BR gnats.info ) -and -.I Reporting Problems Using send-pr -(also installed as the GNU Info file -.BR send-pr.info ). -.LP -.BR gnats (7), -.BR send-pr (1), -.BR edit-pr (1), -.BR query-pr (1), -.BR file-pr (8), -.BR queue-pr (8), -.BR rmcat (8), -.BR gen-index (8), -.BR mkcat (8). -.SH COPYING -Copyright (c) 2000 Free Software Foundation, Inc. -.PP -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. -.PP -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. -.PP -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 included in -translations approved by the Free Software Foundation instead of in -the original English. diff -x CVS -uNr gnats/gnats/man/mkcat.man gnats.new/gnats/man/mkcat.man --- gnats/gnats/man/mkcat.man 1999-12-30 22:19:21.000000000 -0600 +++ gnats.new/gnats/man/mkcat.man 1969-12-31 18:00:00.000000000 -0600 @@ -1,75 +0,0 @@ -.\" Copyright (c) 1993, 1999 Free Software Foundation, Inc. -.\" See section COPYING for conditions for redistribution -.TH mkcat 8 "December 1999" "GNATS @VERSION@" "GNATS Admininstration Utili= ties" -.de BP -.sp -.ti -.2i -\(** -.. -.SH NAME -mkcat \- create a new GNATS category -.SH SYNOPSIS -.hy 0 -.na -.TP -.B mkcat -[ -.BI -d \ databasename -| -.BI --database=3D databasename -] -.ad b -.hy 1 -.SH DESCRIPTION -Scans the database for any new categories, creating new subdirectories -in the database directory if any are found. -.P -This program is mostly obsolete since directories for categories are -automatically created as necessary, but is left for histerical -reasons. -.SH OPTIONS -.TP -.B -d\fR,\fB --database -Specifies the database to be scanned for new categories; if no -database is specified, the database named \fIdefault\fR is assumed. -This option overrides the database specified in the \fBGNATSDB\fR -environment variable. -.SH ENVIRONMENT VARIABLES -The \fBGNATSDB\fR environment variable is used to determine which database= to -use. For a local database, it contains the name of the database to access. -If \fBGNATSDB\fR is not set, the database named \fIdefault\fR is used. -.SH "SEE ALSO" -.I Keeping Track: Managing Messages With GNATS -(also installed as the GNU Info file -.BR gnats.info ) -and -.I Reporting Problems Using send-pr -(also installed as the GNU Info file -.BR send-pr.info ). -.LP -.BR gnats (7), -.BR send-pr (1), -.BR edit-pr (1), -.BR query-pr (1), -.BR file-pr (8), -.BR queue-pr (8), -.BR rmcat (8), -.BR gen-index (8), -.BR mkdb (8). -.SH COPYING -Copyright (c) 1993, 1999 Free Software Foundation, Inc. -.PP -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. -.PP -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. -.PP -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 included in -translations approved by the Free Software Foundation instead of in -the original English. diff -x CVS -uNr gnats/gnats/man/mkdb.man gnats.new/gnats/man/mkdb.man --- gnats/gnats/man/mkdb.man 2000-01-22 23:35:38.000000000 -0600 +++ gnats.new/gnats/man/mkdb.man 1969-12-31 18:00:00.000000000 -0600 @@ -1,68 +0,0 @@ -.\" Copyright (c) 1999 Free Software Foundation, Inc. -.\" See section COPYING for conditions for redistribution -.TH mkdb 8 "January 2000" "GNATS @VERSION@" "GNATS Admininstration Utiliti= es" -.de BP -.sp -.ti -.2i -\(** -.. -.SH NAME -mkdb \- create a new GNATS database -.SH SYNOPSIS -.hy 0 -.na -.TP -.B mkdb \fBdirectory\fR -.ad b -.hy 1 -.SH DESCRIPTION -Creates a new database in \fBdirectory\fR. \fBdirectory\fR must not curre= ntly -exist; it will be created by \fBmkdb\fR, and will be populated with a set = of -default files copied from the @PREFIX@/share/gnats/defaults directory.=20 -.P -The command should be run as @GNATS_USER@. -.SH OPTIONS -.TP -.B directory -Specifies the pathname of the database to be created. -.br -An entry in -@PREFIX@/share/gnats/databases will \fBnot\fR be created for the new -database, and you will need to add one manually. (A sample entry for -the \fIdefault\fR database is present in the file.) -.SH "SEE ALSO" -.I Keeping Track: Managing Messages With GNATS -(also installed as the GNU Info file -.BR gnats.info ) -and -.I Reporting Problems Using send-pr -(also installed as the GNU Info file -.BR send-pr.info ). -.LP -.BR gnats (7), -.BR send-pr (1), -.BR edit-pr (1), -.BR query-pr (1), -.BR delete-pr (8), -.BR file-pr (8), -.BR queue-pr (8), -.BR rmcat (8), -.BR gen-index (8), -.BR mkcat (8). -.SH COPYING -Copyright (c) 2000 Free Software Foundation, Inc. -.PP -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. -.PP -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. -.PP -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 included in -translations approved by the Free Software Foundation instead of in -the original English. diff -x CVS -uNr gnats/gnats/man/pr-edit.man gnats.new/gnats/man/pr-edit.man --- gnats/gnats/man/pr-edit.man 2000-01-22 23:35:38.000000000 -0600 +++ gnats.new/gnats/man/pr-edit.man 1969-12-31 18:00:00.000000000 -0600 @@ -1,225 +0,0 @@ -.\" Copyright (c) 2000 Free Software Foundation, Inc. -.\" See section COPYING for conditions for redistribution -.TH pr-edit 8 "January 2000" "GNATS @VERSION@" "GNATS Admininstration Util= ities" -.de BP -.sp -.ti -.2i -\(** -.. -.SH NAME -pr\-edit \- creates, edits or deletes PRs -.SH SYNOPSIS -.hy 0 -.na -.TP -.B pr\-edit -[\fB\-\-lock\fR\ \fIusername\fR\ |\ \fB\-l\fR\ \fIusername\fR] -[\fB\-\-unlock\fR\ |\ \fB\-u\fR] -[\fB\-\-lockdb\fR\ |\ \fB\-L\fR] -[\fB\-\-unlockdb\fR\ |\ \fB\-U\fR] -[\fB\-\-check\fR\ |\ \fB\-c\fR] -[\fB\-\-check\-initial\fR\ |\ \fB\-C\fR] -[\fB\-\-submit\fR\ |\ \fB\-s\fR] -[\fB\-\-append\fR\ \fIfield\fR\ |\ \fB\-a\fR\ \fIfield\fR] -[\fB\-\-replace\fR\ \fIfield\fR\ |\ \fB\-r\fR\ \fIfield\fR] -[\fB\-\-delete\-pr\fR] -[\fB\-\-process\fR\ \fIprocess\-id\fR\ |\ \fB\-p\fR\ \fIprocess\-id\fR] -[\fB\-\-database\fR\ \fIdatabase\fR\ |\ \fB\-d\fR\ \fIdatabase\fR] -[\fB\-\-filename\fR\ \fIfilename\fR\ |\ \fB\-f\fR\ \fIfilename\fR] -[\fB\-\-version\fR\ |\ \fB\-V\fR] -[\fB\-\-help\fR\ |\ \fB\-h\fR] -[\fB\-\-user\fR\ \fInetid\fR\ |\ \fB\-v\fR\ \fInetid\fR] -[\fB\-\-passwd\fR\ \fIpassword\fR\ |\ \fB\-w\fR\ \fIpassword\fR] -[\fB\-\-host\fR\ \fIhost\fR\ |\ \fB\-H\fR\ \fIhost\fR] -[\fB\-\-port\fR\ \fIport\fR\ |\ \fB\-P\fR\ \fIport\fR] -[\fB\-\-debug\fR\ |\ \fB\-D\fR] -[\fBPR number\fR] -.ad b -.hy 1 -.SH DESCRIPTION -\fBpr\-edit\fR can be used to exit an existing \fIPR\fR by either -replacing or appending to particular fields within the \fIPR\fR, or -providing a new \fIPR\fR to replace the existing one. \fBpr\-edit\fR -can also be used to create new \fIPR\fRs from scratch, or delete -existing ones. -.P -\fBpr\-edit\fR also provides miscellaneous services for locking and -unlocking \fIPR\fRs, locking or unlocking an entire database, or -verifying that proposed \fIPR\fR contents are valid and correct. -.SH OPTIONS -.TP 0.5i -\fB\-\-lockdb\fR,\ \fB\-L\fR -Locks the specified database. No PRs may be edited, created or deleted -while the database is locked. -.LP -.RS 0.5i -This option is generally used when editing the index file. -.RE -.TP 0.5i -\fB\-\-unlockdb\fR,\ \fB\-U\fR -Unlocks the database. No check is made that the invoking user actually had -locked the database in the first place; hence, it is possible for anyone -to steal a database lock. -.TP -\fB\-\-check\fR,\ \fB\-c\fR -.TP -\fB\-\-check\-initial\fR,\ \fB\-C\fR -The \fB\-\-check\fR options are used to verify that a proposed -\fIPR\fR's field contents are valid. The \fIPR\fR is read in (either -from stdin or a file specified with \fB\-\-filename\fR), and its -fields are compared against the rules specified by the database -configuration of the selected database. Warnings are given for -enumerated fields whose contents do not contain one of the required -values or fields that do not match required regexps. -.P -.RS 0.5i -\fB\-\-check\-initial\fR is used to verify initial \fIPR\fRs, rather -than proposed edits of existing \fIPRs\fR. -.RE -.TP 0.5i -\fB\-\-submit\fR,\ \fB\-s\fR -Used to submit a new \fIPR\fR to the database. The \fIPR\fR is read -in and verified for content; if the \fIPR\fR is valid as an initial -\fIPR\fR, it is then added to the database. -.P -.RS 0.5i -A zero exit code is -returned if the submission was successful. Otherwise, the reason(s) -for the \fIPR\fR being rejected are printed to stdout, and a non-zero -exit code is returned. -.RE -.P -The following options require a \fIPR number\fR to be given. -.TP 0.5i -\fB\-\-delete\-pr\fR -Deletes the specified \fIPR\fR from the database. The \fIPR\fR must be -in a closed state, and not locked. -.LP -.RS 0.5i -Only the user \fB@GNATS_USER@\fR is permitted to delete \fIPR\fRs. -.RE -.TP 0.5i -\fB\-\-lock\fR\ \fIusername\fR,\ \fB\-l\fR\ \fIusername\fR -Locks the \fIPR\fR. \fIusername\fR is associated with the lock, so -the system administrator can determine who actually placed the lock on -the \fIPR\fR. However, anyone is permitted to remove locks on a -\fIPR\fR. -.P -.RS 0.5i -If the optional \fB\-\-process\-id\fR option is also given, that -\fIprocess\-id\fR is associated with the lock. -.RE -.TP 0.5i -\fB\-\-unlock\fR,\ \fB\-u\fR -Unlocks the \fIPR\fR. -.TP -\fB\-\-append\fR\ \fIfield\fR,\ \fB\-a\fR\ \fIfield\fR -.TP -\fB\-\-replace\fR\ \fIfield\fR,\ \fB\-r\fR\ \fIfield\fR -\fB\-\-append\fR and \fB\-\-replace\fR are used to append or replace -content of a specific field within a \fIPR\fR. The new field content -is read in from stdin (or from the file specified with the -\fB\-\-filename\fR option), and either appended or replaced to the -specified field. The field contents are verified for correctness -before the \fIPR\fR is rewritten. -.P -.RS 0.5i -If the edit is successful, a zero exit status is returned. If the edit -failed, a non-zero exit status is returned, and the reasons for the failure -are printed to stdout. -.RE -.TP 0.5i -\fB[PR number]\fR -If only a \fIPR number\fR is specified with no other options, a -replacement \fIPR\fR is read in (either from stdin or the file -specified with \fB\-\-filename\fR). If the \fIPR\fR contents are -valid and correct, the existing \fIPR\fR is replaced with the new -\fIPR\fR contents. -.P -.RS 0.5i -If the edit is successful, a zero exit status is returned. If the edit -failed, a non-zero exit status is returned, and the reasons for the failure -are printed to stdout. -.RE -.TP 0.5i -\fB\-\-database\fR\ \fIdatabase\fR,\ \fB\-d\fR\ \fIdatabase\fR -Specifies the database which is to be manipulated. If no database is -specified, the database named \fIdefault\fR is assumed. This option -overrides the database specified in the \fBGNATSDB\fR environment -variable. -.TP 0.5i -\fB\-\-filename\fR\ \fIfilename\fR,\ \fB\-f\fR\ \fIfilename\fR -For actions that require reading in a \fIPR\fR or field content, this -specifies the name of a file to read. If \fB\-\-filename\fR is not -specified, the \fIPR\fR or field content is read in from stdin. -.TP 0.5i -\fB\-\-version\fR,\ \fB\-V\fR -Displays the version number of the program. -.TP 0.5i -\fB\-\-help\fR,\ \fB\-h\fR -Prints a brief usage message. -.TP 0.5i -\fB\-\-host\fR\ \fIhost\fR,\ \fB\-H\fR\ \fIhost\fR -Hostname of the GNATS server. -.TP 0.5i -\fB\-\-port\fR\ \fIport\fR,\ \fB\-P\fR\ \fIport\fR -The port that the GNATS server runs on. -.TP 0.5i -\fB\-\-user\fR\ \fInetid\fR,\ \fB\-v\fR\ \fInetid\fR -Username used when logging into the GNATS server. -.TP 0.5i -\fB\-\-passwd\fR\ \fIpassword\fR,\ \fB\-w\fR\ \fIpassword\fR -Password used when logging into the GNATS server. -.TP 0.5i -\fB\-\-debug\fR,\ \fB\-D\fR -Used to debug network connections. -.SH ENVIRONMENT VARIABLES -The \fBGNATSDB\fR environment variable is used to determine which database= to -use. For a local database, it contains the name of the database to access. -.P -For network access via \fIgnatsd\fR, it contains a colon-separated list -of strings that describe the remote database, in the form -.TP -\fIserver\fR:\fIport\fR:\fIdatabasename\fR:\fIusername\fR:\fIpassword\fR -.P -Any of the fields may be omitted, but at least one colon must appear; -otherwise, the value is assumed to be the name of a local database. -.P -If \fBGNATSDB\fR is not set and the --database option is not supplied, -it is assumed that the database is local and that its name is -\fIdefault\fR. -.SH "SEE ALSO" -.I Keeping Track: Managing Messages With GNATS -(also installed as the GNU Info file -.BR gnats.info ) -and -.I Reporting Problems Using send-pr -(also installed as the GNU Info file -.BR send-pr.info ). -.LP -.BR gnats (7), -.BR send-pr (1), -.BR edit-pr (1), -.BR query-pr (1), -.BR file-pr (8), -.BR queue-pr (8), -.BR rmcat (8), -.BR gen-index (8), -.BR mkcat (8). -.SH COPYING -Copyright (c) 2000 Free Software Foundation, Inc. -.PP -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. -.PP -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. -.PP -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 included in -translations approved by the Free Software Foundation instead of in -the original English. diff -x CVS -uNr gnats/gnats/man/query-pr.man gnats.new/gnats/man/query-pr.= man --- gnats/gnats/man/query-pr.man 2000-03-09 22:49:29.000000000 -0600 +++ gnats.new/gnats/man/query-pr.man 1969-12-31 18:00:00.000000000 -0600 @@ -1,541 +0,0 @@ -.\" Copyright (c) 1993, 94, 95, 96, 1997, 1999 Free Software Foundation, I= nc. -.\" See section COPYING for conditions for redistribution .in +0.9i -.TH query-pr 1 "December 1999" "GNATS @VERSION@" "GNATS User Utilities" -.de BP -.sp -.ti -.2i -\(** -.. -.SH NAME -query-pr \- query problem reports in the GNATS database -.SH SYNOPSIS -.hy 0 -.na -.B query\-pr -.RS -[\fB\-\-debug\fR\ |\ \fB\-D\fR] -[\fB\-\-help\fR\ |\ \fB\-h\fR] -[\fB\-\-version\fR\ |\ \fB\-V\fR] -[\fB\-\-output\fR\ \fIfile\fR\ |\ \fB\-o\fR\ \fIfile\fR] -[\fB\-\-list\-databases\fR] -[\fB\-\-list\-fields\fR] -[\fB\-\-list\-input\-fields\fR] -[\fB\-\-responsible\-address\fR\ \fIaddress\fR] -[\fB\-\-field\-type\fR\ \fItype\fR] -[\fB\-\-field\-description\fR\ \fIdescription\fR] -[\fB\-\-valid\-values\fR\ \fIvalues\fR] -[\fB\-\-format\fR\ \fIformat\fR\ |\ \fB\-f\fR\ \fIformat\fR] -[\fB\-\-full\fR\ |\ \fB\-F\fR] -[\fB\-\-summary\fR\ |\ \fB\-q\fR] -[\fB\-\-database\fR\ \fIdatabase\fR\ |\ \fB\-d\fR\ \fIdatabase\fR] -[\fB\-\-and\fR\ |\ \fB\-&\fR] -[\fB\-\-or\fR\ |\ \fB\-|\fR] -[\fB\-\-expr\fR\ \fIexpr\fR] -[\fIgnats-id .\|.\|.\fR] -.SS Non-network-mode options: -.RS -[\fB\-\-print\-sh\-vars\fR] -[\fB\-\-print\-directory\-for\-database\fR] -.SS Network-mode-only options: -.RS -[\fB\-\-host\fR\ \fIhost\fR\ |\ \fB\-H\fR\ \fIhost\fR] -[\fB\-\-port\fR\ \fIport\fR] -[\fB\-\-user\fR\ \fIuser\fR\ |\ \fB\-v\fR\ \fIuser\fR] -[\fB\-\-passwd\fR\ \fIpasswd\fR\ |\ \fB\-w\fR\ \fIpasswd\fR] -.SS Deprecated Options -.RS -[\fB\-\-list\-categories\fR\ |\ \fB\-j\fR] -[\fB\-\-list\-classes\fR\ |\ \fB\-J\fR] -[\fB\-\-list\-responsible\fR\ |\ \fB\-k\fR] -[\fB\-\-list\-submitters\fR\ |\ \fB\-l\fR] -[\fB\-\-list\-states\fR\ |\ \fB\-T\fR] -[\fB\-\-category\fR\ \fIcategory\fR\ |\ \fB\-c\fR\ \fIcategory\fR] -[\fB\-\-synopsis\fR\ \fIsynopsis\fR\ |\ \fB\-y\fR\ \fIsynopsis\fR] -[\fB\-\-confidential\fR\ \fIconfidential\fR\ |\ \fB\-C\fR\ \fIconfidential= \fR] -[\fB\-\-multitext\fR\ \fImultitext\fR\ |\ \fB\-m\fR\ \fImultitext\fR] -[\fB\-\-originator\fR\ \fIoriginator\fR\ |\ \fB\-O\fR\ \fIoriginator\fR] -[\fB\-\-release\fR\ \fIrelease\fR\ |\ \fB\-A\fR\ \fIrelease\fR] -[\fB\-\-class\fR\ \fIclass\fR\ |\ \fB\-L\fR\ \fIclass\fR] -[\fB\-\-cases\fR\ \fIcases\fR\ |\ \fB\-E\fR\ \fIcases\fR] -[\fB\-\-quarter\fR\ \fIquarter\fR\ |\ \fB\-Q\fR\ \fIquarter\fR] -[\fB\-\-keywords\fR\ \fIkeywords\fR\ |\ \fB\-K\fR\ \fIkeywords\fR] -[\fB\-\-priority\fR\ \fIpriority\fR\ |\ \fB\-p\fR\ \fIpriority\fR] -[\fB\-\-responsible\fR\ \fIresponsible\fR\ |\ \fB\-r\fR\ \fIresponsible\fR] -[\fB\-\-restricted\fR\ |\ \fB\-R\fR] -[\fB\-\-severity\fR\ \fIseverity\fR\ |\ \fB\-e\fR\ \fIseverity\fR] -[\fB\-\-skip\-closed\fR\ |\ \fB\-x\fR] -[\fB\-\-sql\fR\ |\ \fB\-i\fR] -[\fB\-\-sql2\fR\ |\ \fB\-I\fR] -[\fB\-\-state\fR\ \fIstate\fR\ |\ \fB\-s\fR\ \fIstate\fR] -[\fB\-\-submitter\fR\ \fIsubmitter\fR\ |\ \fB\-S\fR\ \fIsubmitter\fR] -[\fB\-\-text\fR\ \fItext\fR\ |\ \fB\-t\fR\ \fItext\fR] -[\fB\-\-required\-before\fR\ \fIdate\fR\ |\ \fB\-u\fR\ \fIdate\fR] -[\fB\-\-required\-after\fR\ \fIdate\fR\ |\ \fB\-U\fR\ \fIdate\fR] -[\fB\-\-arrived\-before\fR\ \fIdate\fR\ |\ \fB\-b\fR\ \fIdate\fR] -[\fB\-\-arrived\-after\fR\ \fIdate\fR\ |\ \fB\-a\fR\ \fIdate\fR] -[\fB\-\-modified\-before\fR\ \fIdate\fR\ |\ \fB\-B\fR\ \fIdate\fR] -[\fB\-\-modified\-after\fR\ \fIdate\fR\ |\ \fB\-M\fR\ \fIdate\fR] -[\fB\-\-closed\-before\fR\ \fIdate\fR\ |\ \fB\-z\fR\ \fIdate\fR] -[\fB\-\-closed\-after\fR\ \fIdate\fR\ |\ \fB\-Z\fR\ \fIdate\fR] -.ad b -.hy 1 -.SH DESCRIPTION -Queries the=20 -.B GNATS -database according to options and returns either selected Problem -Reports (\fIPR\fRs) or other requested information. \fBquery-pr\fR -can query \fIPR\fRs located in either a local database or via -\fBgnatsd\fR. -.LP -\fIPR\fRs may be selected via the use of the \fB\-\-expr\fR option, -directly by number, or by the use of the (now deprecated) -field-specific query operators. -.LP -By default, query options are connected with a logical -.BR AND . -For example, -.RS -\fBquery\-pr\fR \fB\-\-category=3D\fIfoo\fR \fB\-\-responsible=3D\fIbar\fR -.RE -only prints PRs which have a \fBCategory\fR field of \fIfoo\fR and a=20 -\fBResponsible\fR field of \fIbar\fR. -.LP -The -.B \-\-or -option may be used to connect query options with a logical \fBOR\fR. For -example, -.RS -\fBquery\-pr\fR \fB\-\-category=3D\fIbaz\fR \fB\-\-or\fR \fB\-\-responsibl= e=3D\fIblee\fR -.RE -prints PRs which have either a \fBCategory\fR field of \fIbaz\fR \fIor\fR a -\fBResponsible\fR field of \fIblee\fR. -.LP -The use of these options is strongly discouraged, as they will be -deleted in the next release. The expressions specified by the -\fB\-\-expr\fR option are much more flexible. -.SH OPTIONS -.TP 0.5i -\fB\-\-help\fR,\ \fB\-h\fR -Prints a (rather longish) help message. -.TP -\fB\-\-version\fR,\ \fB\-V\fR -Displays the program version to stdout. -.TP -\fB\-\-output\fR\ \fIfile\fR,\ \fB\-o\fR\ \fIfile\fR -The results of the query will be placed in this file. -.TP -\fB\-\-database\fR\ \fIdatabase\fR,\ \fB\-d\fR\ \fIdatabase\fR -Specifies the database to be used for the query. If no database is -specified, the database named \fIdefault\fR is assumed. (This option -overrides the database specified in the \fBGNATSDB\fR environment -variable; see the \fBENVIRONMENT VARIABLES\fR section for more -information.) -.TP -\fB\-\-list\-categories\fR,\ \fB\-j\fR -Lists the available \fIPR\fR categories for the selected database.=20=20 -.TP -\fB\-\-list\-classes\fR,\ \fB\-J\fR -Lists the available \fIPR\fR classes for the selected database. -.TP -\fB\-\-list\-responsible\fR,\ \fB\-k\fR -Lists the users that appear in the database's responsible list. -.TP -\fB\-\-list\-submitters\fR,\ \fB\-l\fR -Lists the valid submitters for this database. -.TP -\fB\-\-list\-states\fR,\ \fB\-T\fR -Lists the valid \fIPR\fR states for \fIPR\fRs in this database. -.PP -The previous \fB\-\-list-*\fR options are deprecated and will be removed in -the next release; their functionality can be replaced with -.RE -.PP -.RS 1.5i -\fBquery-pr\fR \fB\-\-valid-values\fR \fIfield\fR -.RE -.PP -where \fIfield\fR is one of \fBCategory\fR, \fBClass\fR, \fBResponsible\fR, -\fBSubmitter-Id\fR, or \fBState\fR. -.TP -\fB\-\-list\-databases\fR -Lists the known databases. -.TP -\fB\-\-list\-fields\fR -Lists the entire set of field names for \fIPR\fRs in the selected -database. -.TP -\fB\-\-list\-input\-fields\fR -Lists the fields that should be provided when creating a new \fIPR\fR -for the currently-specified database. The fields are listed in an -order that would make sense when used in a template or form. -.TP -\fB\-\-field\-type\fR\ \fIfield\fR -Returns the data type contained in \fIPR\fR field \fIfield\fR. The -current set of data types includes \fBtext\fR, \fBmultitext\fR, -\fBenum\fR, \fBmultienum\fR, \fBinteger\fR, \fBdate\fR, and -\fBtext-with-regex-qualifier\fR. -.TP -\fB\-\-field\-description\fR\ \fIfield\fR -Returns a human-readable description of the intended purpose of \fIfield\f= R. -.TP -\fB\-\-valid\-values\fR\ \fIfield\fR -For fields of type \fBenum\fR, a list of valid values (one per line) is -returned. Otherwise, a regular expression is returned that describes the -legal values in \fIfield\fR. -.TP -\fB\-\-responsible\-address\fR\ \fIname\fR -The mail address of \fIname\fR is returned; \fIname\fR is assumed to -be a name either appearing in the database's \fBresponsible\fR list, -or is otherwise a user on the system. -.TP -\fB\-\-print\-sh\-vars\fR -A set of \fI/bin/sh\fR variables is returned that describe the selected -database. They include: -.RS -.TP -GNATSDB -The name of the currently-selected database. -.TP -GNATSDB_VALID -Set to 1 if the selected database is valid. -.TP -GNATSDBDIR -The directory where the database contents are stored. -.TP -DEBUG_MODE -Set to 1 if debug mode has been enabled for the database. -.TP -DEFAULTCATEGORY -The default category for \fIPR\fRs in the database. -.TP -DEFAULTSTATE -The default state for \fIPR\fRs in the database. -.RE -.TP -\fB\-\-print\-directory\-for\-database\fR -Returns the directory where the selected database is located. -.TP -\fB\-\-format\fR\ \fIformat\fR,\ \fB\-f\fR\ \fIformat\fR -Used to specify the format of the output \fIPR\fRs, See FORMATS below -for a complete description. -.TP -\fB\-\-full\fR,\ \fB\-F\fR -When printing \fIPR\fRs, the entre PR is displayed. This is exactly -equivalent to -.PP -.RS 1i -\fBquery-pr\fR \fB\-\-format\fR \fBfull\fR -.RE -.TP -\fB\-\-summary\fR,\ \fB\-q\fR -When printing \fIPR\fRs, a summary format is used. This is exactly=20 -equivalent to -.PP -.RS 1i -\fBquery-pr\fR \fB\-\-format\fR \fBsummary\fR -.RE -.TP -\fB\-\-debug\fR,\ \fB\-D\fR -Enables debugging output for network queries. -.TP -\fB\-\-host\fR\ \fIhost\fR,\ \fB\-H\fR\ \fIhost\fR -Specifies the hostname of the \fBgnatsd\fR server to communicate with. -This overrides the value in the \fBGNATSDB\fR environment variable. -.TP -\fB\-\-port\fR\ \fIport\fR -Specifies the port number of the \fBgnatsd\fR server to communicate with. -This overrides the value in the \fBGNATSDB\fR environment variable. -.TP -\fB\-\-user\fR\ \fIuser\fR,\ \fB\-v\fR\ \fIuser\fR -Specifies the username to login with when connecting to the \fBgnatsd\fR=20 -server. This overrides the value in the \fBGNATSDB\fR environment variabl= e. -.TP -\fB\-\-passwd\fR\ \fIpasswd\fR,\ \fB\-w\fR\ \fIpasswd\fR -Specifies the password to login with when connecting to the \fBgnatsd\fR=20 -server. This overrides the value in the \fBGNATSDB\fR environment variabl= e. -.TP -\fB\-\-and\fR,\ \fB\-&\fR, \fB\-\-or\fR,\ \fB\-|,\fR -These options are used when connecting multiple query operators together. -They specify whether the previous and subsequent options are to be logical= ly -\fBAND\fRed or logically \fBOR\fRed. -.TP -\fB\-\-expr\fR\ \fIexpr\fR -Specifies a query expression to use when searching for PRs. See the -\fBQUERY EXPRESSIONS\fR section. -.PP -The remaining deprecated options are not described here, since their -use is fairly obvious and their functionality is completely replaced -by the use of the \fB\-\-expr\fR option. (Some sort of shorthand -option for querying fields may appear in the next release.) -.SH FORMATS -Printing formats for \fIPR\fRs are in one of three forms: -.TP -\fBformatname\fR -This is a \fInamed format\fR which is described by the database -(specifically, these formats are described in the \fIdbconfig\fR -file associated with the database). The default configuration -contains five such formats: \fIstandard\fR, \fIfull\fR, \fIsummary\fR, -\fIsql\fR, and \fIsql2\fR. -.PP -.RS -The first three are the ones most commonly used when performing queries. -\fIstandard\fR is the format used by default if no other format is specifi= ed. -.PP -Use of the latter two are discouraged; they are merely kept for historical -purposes. -.PP -Other named formats may have been added by the database administrator. -.RE -.TP -\fBfieldname\fR -A single field name may appear here. Only the contents of this field will -be displayed. -.TP -"\fIprintf string\fR" \fIfieldname\fR \fIfieldname\fR . . . - -This provides a rather flexible mechanism for formatting \fIPR\fR -output. (The formatting is identical to that provided by the named -formats described by the database configuration.) The printf string -can contain the following % sequences: -.PP -.RS -\fB%[positionalspecifiers]s\fR: Prints the field as a string. The positi= onal -specifiers are similar to those of printf, as +, - and digit qualifiers -can be used to force a particular alignment of the field contents. -.PP -\fB%[positionalspecifiers]S\fR: Similar to %s, except that the field conte= nts -are terminated at the first space character. -.PP -\fB%[positionalspecifiers]d\fR: Similar to %s, except that the field -contents are written as a numeric value. For integer fields, the -value is written as a number. For enumerated fields, the field is -converted into a numeric equivalent (i.e. if the field can have two -possible values, the result will be either 1 or 2). For date fields, -the value is written as seconds since Jan 1, 1970. -.PP -\fB%F\fR: The field is written as it would appear within a \fIPR\fR, -complete with field header. -.PP -\fB%D\fR: For date fields, the date is written in a standard GNATS format. -.PP -\fB%Q\fR: For date fields, the date is written in an arbitrary "SQL" forma= t. -.RE -.SH QUERY EXPRESSIONS -Query expressions are used to select specific \fIPR\fRs based on their fie= ld -contents. The general form is -.P -.RS -\fIfieldname\fR|"\fIvalue\fR" \fIoperator\fR \fIfieldname\fR|"\fIvalue\fR"= [\fIbooleanop\fR ...] -.RE -.P -\fIvalue\fR is a literal string or regular expression; it must be -surrounded by double quotes, otherwise it is interpreted as a -\fIfieldname\fR. -.P -\fIfieldname\fR is the name of a field in the \fIPR\fR. -.P -\fIoperator\fR is one of: -.TP -\fI=3D\fR -The value of the left-hand side of the expression must exactly match -the regular expression on the right-hand side of the expression. -.TP -\fI~\fR -Some portion of the left-hand side of the expression must match the -regular expression on the right-hand side. -.TP -\fI=3D=3D\fR -The value of the left-hand side must be equal to the value -on the right-hand side of the expression. -.RS -.PP -The equality of two values depends on what type of data is stored in -the field(s) being queried. For example, when querying a field -containing integer values, literal strings are interpreted as -integers. The query expression -.P -.RS -Number =3D=3D "0123" -.RE -.P -is identical to -.P -.RS -Number =3D=3D "123" -.RE -.P -as the leading zero is ignored. If the values were treated as strings ins= tead -of integers, then the two comparisons would return different results. -.RE -.TP -\fI!=3D\fR -The not-equal operator. Produces the opposite result of the \fI=3D=3D\fR -operator. -.TP -\fI<\fR,\fI>\fR -The left-hand side must have a value less than or greater than the -right-hand side. Comparisons are done depending on the type of data -being queried; in particular, integer fields and dates use a numeric -comparison, and enumerated fields are ordered depending on the numeric -equivalent of their enumerated values. -.PP -\fIbooleanop\fR is either | [or], or & [and]. The query expression -.RS -Category=3D"baz" | Responsible=3D"blee" -.RE -is identical to the second query example with \fB\-\-or\fR given earlier; -it selects all \fIPR\fRs with a Category field of \fIbaz\fR or a Responsib= le -field of \fIblee\fR. -.PP -The not operator \fI!\fR may be used to negate a test: -.RS -! Category=3D"foo" -.RE -searches for \fIPR\fRs where the category is \fInot\fR equal to the=20 -regular expression \fIfoo\fR. -.PP -Parenthesis may be used to force a particular interpretation of the -expression: -.RS -!(Category=3D"foo" & Submitter-Id=3D"blaz") -.RE -skips \fIPR\fRs where the \fBCategory\fR field is equal to \fIfoo\fR and t= he -\fBSubmitter-Id\fR field is equal to \fIblaz\fR. Parenthesis may be -nested to any arbitrary depth. -.P -Fieldnames can be specified in several ways. The simplest and most obvious -is just a name: -.RS -Category=3D"foo" -.RE -checks the value of the category field for the value "foo".=20=20 -.P -A fieldname qualifier may be prepended to the name of the field; a -colon is used to separate the qualifier from the name. To refer -directly to a builtin field name: -.P -.RS -builtin:Number=3D"123" -.RE -.P -In this case, \fINumber\fR is interpreted as the builtin name of the field -to check. (This is useful if the fields have been renamed. For more -discussion of builtin field names, see dbconfig(5).) -.P -To scan all fields of a particular type, the \fIfieldtype\fR qualifier may -be used: -.P -.RS -fieldtype:Text=3D"bar" -.RE -.P -searches all text fields for the regular expression \fIbar\fR. -.P -Note that it is not necessary that the right-hand side of the expression be -a literal string. To query all \fIPR\fRs where the \fIPR\fR has been modi= fied=20 -since it was closed, the expression -.P -.RS -Last-Modified !=3D Closed-Date -.RE -.P -will work; for each \fIPR\fR, it compares the value of its Last-Modified -field against its Closed-Date field, and returns those \fIPR\fRs where the -values differ. However, this query will also return all \fIPR\fRs with -empty Last-Modified or Closed-Date fields. To further narrow the -search: -.P -.RS -Last-Modified !=3D Closed-Date & Last-Modified !=3D "" & Closed-Date !=3D = "" -.RE -.P -In general, comparing fields of two different types (an integer field -against a date field, for example) will probably not do what you want. -.P -Also, a field specifier may be followed by the name of a subfield -in braces: -.P -.RS -State[type] !=3D "closed" -.RE -.P -or even -.P -.RS -builtin:State[type] !=3D "closed" -.RE -.P -Subfields are further discussed in dbconfig(5). - -.SH QUERY BY MAIL -.B query-pr -can also be accessed by electronic mail, if your version -of GNATS is configured for this. To use this feature, simply send -mail to the address=20 -.BI query-pr@ your-site -with command line arguments or options in the=20 -.B Subject: -line of the mail header. GNATS replies to your mail with the results -of your query. The default settings for the -.B query-pr -mail server are shown below; to override the -.B \-\-state -parameter, specify -.BI \-\-state=3D state -in the -.B Subject: -line of the mail header. You can not query on confidential Problem -Reports by mail. -.TP 1i -.B \-\-restricted \-\-state=3D"open|analyzed|feedback|suspended" -.SH ENVIRONMENT VARIABLES -The \fBGNATSDB\fR environment variable is used to determine which database= to -use. For a local database, it contains the name of the database to access. -.P -For network access via \fIgnatsd\fR, it contains a colon-separated list -of strings that describe the remote database in the form -.TP -\fIserver\fR:\fIport\fR:\fIdatabasename\fR:\fIusername\fR:\fIpassword\fR -.P -Any of the fields may be omitted except for \fIserver\fR, but at -least one colon must appear; otherwise, the value is assumed to be the -name of a local database. -.P -If \fBGNATSDB\fR is not set, it is assumed that the database is local -and that its name is \fIdefault\fR. -.SH "SEE ALSO" -.I Keeping Track: Managing Messages With GNATS -(also installed as the GNU Info file -.BR gnats.info ) -and -.I Reporting Problems Using send-pr -(also installed as the GNU Info file -.BR send-pr.info ). -.LP -.BR gnats (7), -.BR send-pr (1), -.BR edit-pr (1), -.BR file-pr (8), -.BR queue-pr (8), -.BR nquery-pr (1), -.BR mkcat (8), -.BR rmcat (8), -.BR gen-index (8), -.BR mkdb (8). -.SH COPYING -Copyright (c) 1993, 94, 95, 96, 1997, 1999 Free Software Foundation, Inc. -.PP -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. -.PP -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. -.PP -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 included in -translations approved by the Free Software Foundation instead of in -the original English. diff -x CVS -uNr gnats/gnats/man/queue-pr.man gnats.new/gnats/man/queue-pr.= man --- gnats/gnats/man/queue-pr.man 1999-12-30 22:19:21.000000000 -0600 +++ gnats.new/gnats/man/queue-pr.man 1969-12-31 18:00:00.000000000 -0600 @@ -1,124 +0,0 @@ -.\" Copyright (c) 1993 Free Software Foundation, Inc. -.\" See section COPYING for conditions for redistribution -.TH queue-pr 8 "December 1999" "GNATS @VERSION@" "GNATS Administration Uti= lities" -.de BP -.sp -.ti -.2i -\(** -.. -.SH NAME -queue-pr \- incoming mail control for GNATS -.SH SYNOPSIS -.hy 0 -.na -.TP 1i -.B queue-pr -[ -.B \-q | \-\-queue -] -[ -.B \-r | \-\-run -] -.br -[ -.B \-f \fIfilename\fB | \-\-file=3D\fIfilename\fR -] -.br -[ -.B \-d \fIdatabase\fB | \-\-database=3D\fIdatabase\fR -] -.ad b -.hy 1 -.SH DESCRIPTION -.B `queue-pr -q'=20 -should run through a=20 -.BR pipe (2V) -via the mail=20 -.BR aliases (5) -mechanism to automatically place incoming bug reports in a queue=20 -directory for -.B GNATS. -.LP -Run -.B `queue-pr -r' -via -.BR cron (8) -to periodically empty the=20 -.B GNATS -queue, filing new bug reports in the database. -.LP -Always use one of [ -.B \-q | \-\-queue -] or [ -.B \-r | \-\-run -] (but not both), in each call to=20 -.B queue-pr. -These are mutually exclusive functions in order to avoid collisions. -.SH OPTIONS -.TP 1i -.B \-q, \-\-queue -Accept standard input as an incoming mail message, placing this message in -an incrementally numbered file in the database subdirectory \fBgnats-queue= \fR -for future handling. -.TP -.B \-r, \-\-run -Redirect files from the database subdirectory \fBgnats-queue\fR to -.BR file-pr (8) -which files and creates index entries for each. -.TP -.B \-f \fIfilename\fR or \fB\-\-file=3D\fIfilename\fR -Treat -.I filename -as input rather than reading from standard input (used with the -.B \-\-queue -option). -.TP -.B \-d \fIdatabase\fR or \fB\-\-database=3D\fIdatabasename\fR -Used with the=20 -.B \-\-queue -or -.B \-\-run -options, use the database named -.I database -rather than the database \fIdefault\fR or the database specified by the -.B GNATSDB -environment variable. -.SH "ENVIRONMENT VARIABLES" -The \fBGNATSDB\fR environment variable is used to determine which database= to -use. For a local database, it contains the name of the database to access. -If \fBGNATSDB\fR is not set, the database named \fIdefault\fR is used. -.SH "SEE ALSO" -.I Keeping Track: Managing Messages With GNATS -(also installed as the GNU Info file -.BR gnats.info ) -and -.I Reporting Problems Using send-pr -(also installed as the GNU Info file -.BR send-pr.info ). -.LP -.BR gnats (7), -.BR send-pr (1), -.BR query-pr (1), -.BR edit-pr (1), -.BR file-pr (8), -.BR mkcat (8), -.BR rmcat (8), -.BR gen-index (8), -.BR mkdb (8). -.SH COPYING -Copyright (c) 1993 Free Software Foundation, Inc. -.PP -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. -.PP -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. -.PP -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 included in -translations approved by the Free Software Foundation instead of in -the original English. diff -x CVS -uNr gnats/gnats/man/rmcat.man gnats.new/gnats/man/rmcat.man --- gnats/gnats/man/rmcat.man 2000-01-22 23:35:38.000000000 -0600 +++ gnats.new/gnats/man/rmcat.man 1969-12-31 18:00:00.000000000 -0600 @@ -1,75 +0,0 @@ -.\" Copyright (c) 1993, 2000 Free Software Foundation, Inc. -.\" See section COPYING for conditions for redistribution -.TH rmcat 8 "January 2000" "GNATS @VERSION@" "GNATS Admininstration Utilit= ies" -.de BP -.sp -.ti -.2i -\(** -.. -.SH NAME -rmcat \- remove GNATS categories -.SH SYNOPSIS -.hy 0 -.na -.TP -.B rmcat -.I category -[ -.I category... -] -.ad b -.hy 1 -.SH DESCRIPTION -Removes any named -.I category -from the -.B GNATS -installation.=20=20 -Before calling -.BR rmcat , -you must first remove -.I category -from the list of categories in the database. You must also reclassify -or remove all problem reports associated with -.I category -(i.e.,=20 -.IR category 's -subdirectory must be empty). -.P -rmcat is mostly useless now, but is kept for histerical reasons. -.SH "SEE ALSO" -.I Keeping Track: Managing Messages With GNATS -(also installed as the GNU Info file -.BR gnats.info ) -and -.I Reporting Problems Using send-pr -(also installed as the GNU Info file -.BR send-pr.info ). -.LP -.BR gnats (7), -.BR send-pr (1), -.BR edit-pr (1), -.BR delete-pr (8), -.BR query-pr (1), -.BR file-pr (8), -.BR queue-pr (8), -.BR gen-index (8), -.BR mkcat (8), -.BR mkdb (8). -.SH COPYING -Copyright (c) 1993, 2000 Free Software Foundation, Inc. -.PP -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. -.PP -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. -.PP -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 included in -translations approved by the Free Software Foundation instead of in -the original English. diff -x CVS -uNr gnats/install-sh gnats.new/install-sh --- gnats/install-sh 1999-10-26 02:10:15.000000000 -0500 +++ gnats.new/install-sh 1969-12-31 18:00:00.000000000 -0600 @@ -1,251 +0,0 @@ -#!/bin/sh -# -# install - install a program, script, or datafile -# This comes from X11R5 (mit/util/scripts/install.sh). -# -# Copyright 1991 by the Massachusetts Institute of Technology -# -# Permission to use, copy, modify, distribute, and sell this software and = its -# documentation for any purpose is hereby granted without fee, provided th= at -# the above copyright notice appear in all copies and that both that -# copyright notice and this permission notice appear in supporting -# documentation, and that the name of M.I.T. not be used in advertising or -# publicity pertaining to distribution of the software without specific, -# written prior permission. M.I.T. makes no representations about the -# suitability of this software for any purpose. It is provided "as is" -# without express or implied warranty. -# -# 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. It can only install one file at a time, a restriction -# shared with many OS's install programs. - - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit=3D"${DOITPROG-}" - - -# put in absolute paths if you don't have them in your path; or use env. v= ars. - -mvprog=3D"${MVPROG-mv}" -cpprog=3D"${CPPROG-cp}" -chmodprog=3D"${CHMODPROG-chmod}" -chownprog=3D"${CHOWNPROG-chown}" -chgrpprog=3D"${CHGRPPROG-chgrp}" -stripprog=3D"${STRIPPROG-strip}" -rmprog=3D"${RMPROG-rm}" -mkdirprog=3D"${MKDIRPROG-mkdir}" - -transformbasename=3D"" -transform_arg=3D"" -instcmd=3D"$mvprog" -chmodcmd=3D"$chmodprog 0755" -chowncmd=3D"" -chgrpcmd=3D"" -stripcmd=3D"" -rmcmd=3D"$rmprog -f" -mvcmd=3D"$mvprog" -src=3D"" -dst=3D"" -dir_arg=3D"" - -while [ x"$1" !=3D x ]; do - case $1 in - -c) instcmd=3D"$cpprog" - shift - continue;; - - -d) dir_arg=3Dtrue - shift - continue;; - - -m) chmodcmd=3D"$chmodprog $2" - shift - shift - continue;; - - -o) chowncmd=3D"$chownprog $2" - shift - shift - continue;; - - -g) chgrpcmd=3D"$chgrpprog $2" - shift - shift - continue;; - - -s) stripcmd=3D"$stripprog" - shift - continue;; - - -t=3D*) transformarg=3D`echo $1 | sed 's/-t=3D//'` - shift - continue;; - - -b=3D*) transformbasename=3D`echo $1 | sed 's/-b=3D//'` - shift - continue;; - - *) if [ x"$src" =3D x ] - then - src=3D$1 - else - # this colon is to work around a 386BSD /bin/sh bug - : - dst=3D$1 - fi - shift - continue;; - esac -done - -if [ x"$src" =3D x ] -then - echo "install: no input file specified" - exit 1 -else - true -fi - -if [ x"$dir_arg" !=3D x ]; then - dst=3D$src - src=3D"" -=09 - if [ -d $dst ]; then - instcmd=3D: - chmodcmd=3D"" - else - instcmd=3Dmkdir - 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=20 -# if $src (and thus $dsttmp) contains '*'. - - if [ -f $src -o -d $src ] - then - true - else - echo "install: $src does not exist" - exit 1 - fi -=09 - if [ x"$dst" =3D 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=3D"$dst"/`basename $src` - else - true - fi -fi - -## this sed command emulates the dirname command -dstdir=3D`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=3D'=09 -' -IFS=3D"${IFS-${defaultIFS}}" - -oIFS=3D"${IFS}" -# Some sh's can't handle IFS=3D/ for some reason. -IFS=3D'%' -set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` -IFS=3D"${oIFS}" - -pathcomp=3D'' - -while [ $# -ne 0 ] ; do - pathcomp=3D"${pathcomp}${1}" - shift - - if [ ! -d "${pathcomp}" ] ; - then - $mkdirprog "${pathcomp}" - else - true - fi - - pathcomp=3D"${pathcomp}/" -done -fi - -if [ x"$dir_arg" !=3D x ] -then - $doit $instcmd $dst && - - if [ x"$chowncmd" !=3D x ]; then $doit $chowncmd $dst; else true ; fi && - if [ x"$chgrpcmd" !=3D x ]; then $doit $chgrpcmd $dst; else true ; fi && - if [ x"$stripcmd" !=3D x ]; then $doit $stripcmd $dst; else true ; fi && - if [ x"$chmodcmd" !=3D 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" =3D x ]=20 - then - dstfile=3D`basename $dst` - else - dstfile=3D`basename $dst $transformbasename |=20 - sed $transformarg`$transformbasename - fi - -# don't allow the sed command to completely eliminate the filename - - if [ x"$dstfile" =3D x ]=20 - then - dstfile=3D`basename $dst` - else - true - fi - -# Make a temp file name in the proper directory. - - dsttmp=3D$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" !=3D x ]; then $doit $chowncmd $dsttmp; else true;fi && - if [ x"$chgrpcmd" !=3D x ]; then $doit $chgrpcmd $dsttmp; else true;fi && - if [ x"$stripcmd" !=3D x ]; then $doit $stripcmd $dsttmp; else true;fi && - if [ x"$chmodcmd" !=3D 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=20 - -fi && - - -exit 0 diff -x CVS -uNr gnats/missing gnats.new/missing --- gnats/missing 1999-10-26 02:10:16.000000000 -0500 +++ gnats.new/missing 1969-12-31 18:00:00.000000000 -0600 @@ -1,190 +0,0 @@ -#! /bin/sh -# Common stub for a few missing GNU programs while installing. -# Copyright (C) 1996, 1997 Free Software Foundation, Inc. -# Franc,ois Pinard , 1996. - -# This program 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 program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -if test $# -eq 0; then - echo 1>&2 "Try \`$0 --help' for more information" - exit 1 -fi - -case "$1" in - - -h|--h|--he|--hel|--help) - echo "\ -$0 [OPTION]... PROGRAM [ARGUMENT]... - -Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an -error status if there is no known handling for PROGRAM. - -Options: - -h, --help display this help and exit - -v, --version output version information and exit - -Supported PROGRAM values: - aclocal touch file \`aclocal.m4' - autoconf touch file \`configure' - autoheader touch file \`config.h.in' - automake touch all \`Makefile.in' files - bison create \`y.tab.[ch]', if possible, from existing .[ch] - flex create \`lex.yy.c', if possible, from existing .c - lex create \`lex.yy.c', if possible, from existing .c - makeinfo touch the output file - yacc create \`y.tab.[ch]', if possible, from existing .[ch]" - ;; - - -v|--v|--ve|--ver|--vers|--versi|--versio|--version) - echo "missing - GNU libit 0.0" - ;; - - -*) - echo 1>&2 "$0: Unknown \`$1' option" - echo 1>&2 "Try \`$0 --help' for more information" - exit 1 - ;; - - aclocal) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified \`acinclude.m4' or \`configure.in'. You might want - to install the \`Automake' and \`Perl' packages. Grab them from - any GNU archive site." - touch aclocal.m4 - ;; - - autoconf) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified \`configure.in'. You might want to install the - \`Autoconf' and \`GNU m4' packages. Grab them from any GNU - archive site." - touch configure - ;; - - autoheader) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified \`acconfig.h' or \`configure.in'. You might want - to install the \`Autoconf' and \`GNU m4' packages. Grab them - from any GNU archive site." - files=3D`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' configu= re.in` - test -z "$files" && files=3D"config.h" - touch_files=3D - for f in $files; do - case "$f" in - *:*) touch_files=3D"$touch_files "`echo "$f" | - sed -e 's/^[^:]*://' -e 's/:.*//'`;; - *) touch_files=3D"$touch_files $f.in";; - esac - done - touch $touch_files - ;; - - automake) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'. - You might want to install the \`Automake' and \`Perl' packages. - Grab them from any GNU archive site." - find . -type f -name Makefile.am -print | - sed 's/\.am$/.in/' | - while read f; do touch "$f"; done - ;; - - bison|yacc) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified a \`.y' file. You may need the \`Bison' package - in order for those modifications to take effect. You can get - \`Bison' from any GNU archive site." - rm -f y.tab.c y.tab.h - if [ $# -ne 1 ]; then - eval LASTARG=3D"\${$#}" - case "$LASTARG" in - *.y) - SRCFILE=3D`echo "$LASTARG" | sed 's/y$/c/'` - if [ -f "$SRCFILE" ]; then - cp "$SRCFILE" y.tab.c - fi - SRCFILE=3D`echo "$LASTARG" | sed 's/y$/h/'` - if [ -f "$SRCFILE" ]; then - cp "$SRCFILE" y.tab.h - fi - ;; - esac - fi - if [ ! -f y.tab.h ]; then - echo >y.tab.h - fi - if [ ! -f y.tab.c ]; then - echo 'main() { return 0; }' >y.tab.c - fi - ;; - - lex|flex) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified a \`.l' file. You may need the \`Flex' package - in order for those modifications to take effect. You can get - \`Flex' from any GNU archive site." - rm -f lex.yy.c - if [ $# -ne 1 ]; then - eval LASTARG=3D"\${$#}" - case "$LASTARG" in - *.l) - SRCFILE=3D`echo "$LASTARG" | sed 's/l$/c/'` - if [ -f "$SRCFILE" ]; then - cp "$SRCFILE" lex.yy.c - fi - ;; - esac - fi - if [ ! -f lex.yy.c ]; then - echo 'main() { return 0; }' >lex.yy.c - fi - ;; - - makeinfo) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. You should only need it if - you modified a \`.texi' or \`.texinfo' file, or any other file - indirectly affecting the aspect of the manual. The spurious - call might also be the consequence of using a buggy \`make' (AIX, - DU, IRIX). You might want to install the \`Texinfo' package or - the \`GNU make' package. Grab either from any GNU archive site." - file=3D`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` - if test -z "$file"; then - file=3D`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` - file=3D`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $f= ile` - fi - touch $file - ;; - - *) - echo 1>&2 "\ -WARNING: \`$1' is needed, and you do not seem to have it handy on your - system. You might have modified some files without having the - proper tools for further handling them. Check the \`README' file, - it often tells you about the needed prerequirements for installing - this package. You may also peek at any GNU archive site, in case - some other package would contain this missing \`$1' program." - exit 1 - ;; -esac - -exit 0 diff -x CVS -uNr gnats/texinfo/texinfo.tex gnats.new/texinfo/texinfo.tex --- gnats/texinfo/texinfo.tex 1998-11-05 13:54:14.000000000 -0600 +++ gnats.new/texinfo/texinfo.tex 2004-11-30 09:43:14.000000000 -0600 @@ -1,52 +1,80 @@ -%% TeX macros to handle Texinfo files. -%% $Id: texinfo.tex,v 2.201 1997/05/24 22:06:39 karl Exp $ - -% Copyright (C) 1985, 86, 88, 90, 91, 92, 93, -% 94, 95, 96, 97 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! - - -% Send bug reports to bug-texinfo@prep.ai.mit.edu. -% Please include a *precise* test case in each bug report. - - -% 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. +% texinfo.tex -- TeX macros to handle Texinfo files. +% +% Load plain if necessary, i.e., if running under initex. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi +% +\def\texinfoversion{2004-04-07.08} +% +% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, +% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 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. +% +% As a special exception, when this file is read by TeX when processing +% a Texinfo source document, you may use the result without +% restriction. (This has been our intent since Texinfo was invented.) +%=20 +% Please try the latest version of texinfo.tex before submitting bug +% reports; you can get the latest version from: +% http://www.gnu.org/software/texinfo/ (the Texinfo home page), or +% ftp://tug.org/tex/texinfo.tex +% (and all CTAN mirrors, see http://www.ctan.org). +% The texinfo.tex in any given distribution could well be out +% of date, so if that's what you're using, please check. +% +% Send bug reports to bug-texinfo@gnu.org. Please include including a +% complete document in each bug report with which we can reproduce the +% problem. Patches are, of course, greatly appreciated. +% +% To process a Texinfo manual with TeX, it's most reliable to use the +% texi2dvi shell script that comes with the distribution. For a simple +% manual foo.texi, however, you can get away with this: +% tex foo.texi +% texindex foo.?? +% tex foo.texi +% tex foo.texi +% dvips foo.dvi -o # or whatever; this makes foo.ps. +% The extra TeX runs get the cross-reference information correct. +% Sometimes one run after texindex suffices, and sometimes you need more +% than two; texi2dvi does it as many times as necessary. +% +% It is possible to adapt texinfo.tex for other languages, to some +% extent. You can get the existing language-specific files from the +% full Texinfo distribution. +%=20 +% The GNU Texinfo home page is http://www.gnu.org/software/texinfo. + =20 -% This automatically updates the version number based on RCS. -\def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}} -\deftexinfoversion$Revision: 2.201 $ -\message{Loading texinfo package [Version \texinfoversion]:} +\message{Loading texinfo [version \texinfoversion]:} =20 % 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{} +\everyjob{\message{[Texinfo version \texinfoversion]}% \catcode`+=3D\active \catcode`\_=3D\active} =20 -% Save some parts of plain tex whose names we will redefine. +\message{Basics,} +\chardef\other=3D12 =20 +% We never want plain's \outer definition of \+ in Texinfo. +% For @tex, we can use \tabalign. +\let\+ =3D \relax + +% Save some plain tex macros whose names we will redefine. \let\ptexb=3D\b \let\ptexbullet=3D\bullet \let\ptexc=3D\c @@ -54,88 +82,199 @@ \let\ptexdot=3D\. \let\ptexdots=3D\dots \let\ptexend=3D\end -\let\ptexequiv =3D \equiv +\let\ptexequiv=3D\equiv +\let\ptexexclam=3D\! +\let\ptexfootnote=3D\footnote +\let\ptexgtr=3D> +\let\ptexhat=3D^ \let\ptexi=3D\i +\let\ptexindent=3D\indent +\let\ptexnoindent=3D\noindent +\let\ptexinsert=3D\insert \let\ptexlbrace=3D\{ +\let\ptexless=3D< +\let\ptexplus=3D+ \let\ptexrbrace=3D\} +\let\ptexslash=3D\/ \let\ptexstar=3D\* \let\ptext=3D\t =20 -% 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`@ =3D 11 - % Avoid using \@M directly, because that causes trouble - % if the definition is written into an index file. - \global\let\tiepenalty =3D \@M - \gdef\tie{\leavevmode\penalty\tiepenalty\ } -} - - -\message{Basics,} -\chardef\other=3D12 - % If this character appears in an error message or help string, it % starts a new line in the output. \newlinechar =3D `^^J =20 -% 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 o= f Contents}}\fi% -\ifx\putwordShortContents\undefined{\gdef\putwordShortContents{Short Conte= nts}}\fi% -\ifx\putwordAppendix\undefined{\gdef\putwordAppendix{Appendix}}\fi% +% 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 =3D \empty % Pre-3.0. +\else + \def\linenumber{l.\the\inputlineno:\space} +\fi + +% Set up fixed words for English if not already set. +\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi +\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi +\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi +\ifx\putwordin\undefined \gdef\putwordin{in}\fi +\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is= empty)}\fi +\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Inde= x is nonexistent)}\fi +\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi +\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{I= nstance Variable of}\fi +\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi +\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi +\ifx\putwordof\undefined \gdef\putwordof{of}\fi +\ifx\putwordon\undefined \gdef\putwordon{on}\fi +\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi +\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi +\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi +\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi +\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi +\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi +\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi +% +\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi +\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi +\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi +\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi +\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi +\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi +\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi +\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi +\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi +\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi +\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi +\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi +% +\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi +\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi +\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi +\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi +\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi + +% In some macros, we cannot use the `\? notation---the left quote is +% in some cases the escape char. +\chardef\colonChar =3D `\: +\chardef\commaChar =3D `\, +\chardef\dotChar =3D `\. +\chardef\exclamChar=3D `\! +\chardef\questChar =3D `\? +\chardef\semiChar =3D `\; +\chardef\underChar =3D `\_ + +\chardef\spaceChar =3D `\ % +\chardef\spacecat =3D 10 +\def\spaceisspace{\catcode\spaceChar=3D\spacecat} =20 % Ignore a token. % \def\gobble#1{} =20 -\hyphenation{ap-pen-dix} -\hyphenation{mini-buf-fer mini-buf-fers} -\hyphenation{eshell} +% The following is used inside several \edef's. +\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname} + +% Hyphenation fixes. +\hyphenation{ + Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script + ap-pen-dix bit-map bit-maps + data-base data-bases eshell fall-ing half-way long-est man-u-script + man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm + par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces + spell-ing spell-ings + stand-alone strong-est time-stamp time-stamps which-ever white-space + wide-spread wrap-around +} =20 % Margin to add to right of even pages, to left of odd pages. -\newdimen \bindingoffset -\newdimen \normaloffset +\newdimen\bindingoffset +\newdimen\normaloffset \newdimen\pagewidth \newdimen\pageheight =20 +% 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=3D0pt} + +% @| 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 outpu= t. + \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 + }% + }% +} + % 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. +% since that produces some useless output on the terminal. We also make +% some effort to order the tracing commands to reduce output in the log +% file; cf. trace.sty in LaTeX. % \def\gloggingall{\begingroup \globaldefs =3D 1 \loggingall \endgroup}% -\def\loggingall{\tracingcommands2 \tracingstats2 - \tracingpages1 \tracingoutput1 \tracinglostchars1 - \tracingmacros2 \tracingparagraphs1 \tracingrestores1 - \showboxbreadth\maxdimen\showboxdepth\maxdimen +\def\loggingall{% + \tracingstats2 + \tracingpages1 + \tracinglostchars2 % 2 gives us more in etex + \tracingparagraphs1 + \tracingoutput1 + \tracingmacros2 + \tracingrestores1 + \showboxbreadth\maxdimen \showboxdepth\maxdimen + \ifx\eTeXversion\undefined\else % etex gives us more logging + \tracingscantokens1 + \tracingifs1 + \tracinggroups1 + \tracingnesting2 + \tracingassigns1 + \fi + \tracingcommands3 % 3 gives us more in etex + \errorcontextlines16 }% =20 +% add check for \lastpenalty to plain's definitions. If the last thing +% we did was a \nobreak, we don't want to insert more space. +% +\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamou= nt + \removelastskip\penalty-50\smallskip\fi\fi} +\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount + \removelastskip\penalty-100\medskip\fi\fi} +\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount + \removelastskip\penalty-200\bigskip\fi\fi} + % For @cropmarks command. % Do @cropmarks to get crop marks. -%=20 +% \newif\ifcropmarks \let\cropmarks =3D \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=3D1pc\cornerthick=3D.3pt % These set size of cropmarks -\outerhsize=3D7in -%\outervsize=3D9.5in -% Alternative @smallbook page size is 9.25in -\outervsize=3D9.25in -\topandbottommargin=3D.75in +\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines +\newdimen\cornerlong \cornerlong=3D1pc +\newdimen\cornerthick \cornerthick=3D.3pt +\newdimen\topandbottommargin \topandbottommargin=3D.75in =20 % Main output routine. \chardef\PAGE =3D 255 @@ -167,15 +306,21 @@ \normalturnoffactive % \ in index entries must not stay \, e.g., if % the page break happens to be in the middle of an exam= ple. \shipout\vbox{% + % Do this early so pdf references go to the beginning of the page. + \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi + % \ifcropmarks \vbox to \outervsize\bgroup \hsize =3D \outerhsize - \line{\ewtop\hfil\ewtop}% - \nointerlineskip - \line{% - \vbox{\moveleft\cornerthick\nstop}% - \hfill - \vbox{\moveright\cornerthick\nstop}% - }% + \vskip-\topandbottommargin + \vtop to0pt{% + \line{\ewtop\hfil\ewtop}% + \nointerlineskip + \line{% + \vbox{\moveleft\cornerthick\nstop}% + \hfill + \vbox{\moveright\cornerthick\nstop}% + }% + \vss}% \vskip\topandbottommargin \line\bgroup \hfil % center the page within the outer (page) hsize. @@ -185,24 +330,32 @@ % \unvbox\headlinebox \pagebody{#1}% - \unvbox\footlinebox + \ifdim\ht\footlinebox > 0pt + % Only leave this space if the footline is nonempty. + % (We lessened \vsize for it in \oddfootingxxx.) + % The \baselineskip=3D24pt 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 =3D \cornerthick - \line{% - \vbox{\moveleft\cornerthick\nsbot}% - \hfill - \vbox{\moveright\cornerthick\nsbot}% + \vbox to0pt{\vss + \line{% + \vbox{\moveleft\cornerthick\nsbot}% + \hfill + \vbox{\moveright\cornerthick\nsbot}% + }% + \nointerlineskip + \line{\ewbot\hfil\ewbot}% }% - \nointerlineskip - \line{\ewbot\hfil\ewbot}% \egroup % \vbox from first cropmarks clause \fi }% end of \shipout\vbox - }% end of group with \turnoffactive + }% end of group with \normalturnoffactive \advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi } @@ -235,149 +388,168 @@ % 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 =3D #1% +\def\parsearg{\parseargusing{}} +\def\parseargusing#1#2{% + \def\next{#2}% \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 + \spaceisspace + #1% + \parseargline\empty% Insert the \empty token, see \finishparsearg belo= w. } =20 -% 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}% + \argremovecomment #1\comment\ArgTerm% }% } =20 -% 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 =3D {#1}} -\def\argremovecomment#1\comment#2\relax{\toks0 =3D {#1}} +% First remove any @comment, then any @c comment. +\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} +\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} =20 -% \argremovec{,omment} might leave us with trailing spaces, though; e.g., +% Each occurence of `\^^M' or `\^^M' is replaced by a single space. +% +% \argremovec might leave us with trailing space, 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. +% This space token undergoes the same procedure and is eventually removed +% by \finishparsearg. % -\def\removeactivespaces#1{% - \begingroup - \ignoreactivespaces - \edef\temp{#1}% - \global\toks0 =3D \expandafter{\temp}% - \endgroup +\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} +\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} +\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% + \def\temp{#3}% + \ifx\temp\empty + % We cannot use \next here, as it holds the macro to run; + % thus we reuse \temp. + \let\temp\finishparsearg + \else + \let\temp\argcheckspaces + \fi + % Put the space token in: + \temp#1 #3\ArgTerm } =20 -% Change the active space to expand to nothing. +% If a _delimited_ argument is enclosed in braces, they get stripped; so +% to get _exactly_ the rest of the line, we had to prevent such situation. +% We prepended an \empty token at the very beginning and we expand it now, +% just before passing the control to \next. +% (Similarily, we have to think about #3 of \argcheckspacesY above: it is +% either the null string, or it ends with \^^M---thus there is no danger +% that a pair of braces would be stripped. % -\begingroup +% But first, we have to remove the trailing space token. +% +\def\finishparsearg#1 \ArgTerm{\expandafter\next\expandafter{#1}} + +% \parseargdef\foo{...} +% is roughly equivalent to +% \def\foo{\parsearg\Xfoo} +% \def\Xfoo#1{...} +% +% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my +% favourite TeX trick. --kasal, 16nov03 + +\def\parseargdef#1{% + \expandafter \doparseargdef \csname\string#1\endcsname #1% +} +\def\doparseargdef#1#2{% + \def#2{\parsearg#1}% + \def#1##1% +} + +% Several utility definitions with active space: +{ \obeyspaces - \gdef\ignoreactivespaces{\obeyspaces\let =3D\empty} -\endgroup + \gdef\obeyedspace{ } + + % 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. + % + \gdef\sepspaces{\obeyspaces\let =3D\tie} + + % 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 \ ). + \gdef\unsepspaces{\let =3D\space} +} =20 =20 \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=3D\relax \fi \= next} =20 -%% 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=3D\EMsimple \errmessage{Undefined command @begin #1}}\else -\csname #1\endcsname\fi} +% Define the framework for environments in texinfo.tex. It's used like th= is: +%=20 +% \envdef\foo{...} +% \def\Efoo{...} +%=20=20=20 +% It's the responsibility of \envdef to insert \begingroup before the +% actual body; @end closes the group after calling \Efoo. \envdef also +% defines \thisenv, so the current environment is known; @end checks +% whether the environment name matches. The \checkenv macro can also be +% used to check whether the current environment is the one expected. +%=20 +% Non-false conditionals (@iftex, @ifset) don't fit into this, so they +% are not treated as enviroments; they don't open a group. (The +% implementation of @end takes care not to call \endgroup in this +% special case.) + + +% At runtime, environments start with this: +\def\startenvironment#1{\begingroup\def\thisenv{#1}} +% initialize +\let\thisenv\empty + +% ... but they get defined via ``\envdef\foo{...}'': +\long\def\envdef#1#2{\def#1{\startenvironment#1#2}} +\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} =20 -% @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 =3D \EMsimple - \errmessage{Undefined command `@end \endthing'}% - \else - \unmatchedenderror\endthing - \fi +% Check whether we're in the right environment: +\def\checkenv#1{% + \def\temp{#1}% + \ifx\thisenv\temp \else - % Everything's ok; the right environment has been started. - \csname E\endthing\endcsname + \badenverr \fi } =20 -% There is an environment #1, but it hasn't been started. Give an error. -% -\def\unmatchedenderror#1{% +% Evironment mismatch, #1 expected: +\def\badenverr{% \errhelp =3D \EMsimple - \errmessage{This `@end #1' doesn't have a matching `@#1'}% + \errmessage{This command can appear only \inenvironment\temp, + not \inenvironment\thisenv}% +} +\def\inenvironment#1{% + \ifx#1\empty + out of any environment% + \else + in environment \expandafter\string#1% + \fi } =20 -% Define the control sequence \E#1 to give an unmatched @end error. +% @end foo executes the definition of \Efoo. +% But first, it executes a specialized version of \checkenv % -\def\defineunmatchedend#1{% - \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}% +\parseargdef\end{% + \if 1\csname iscond.#1\endcsname + \else + % The general wording of \badenverr may not be ideal, but... --kasal, = 06nov03 + \expandafter\checkenv\csname#1\endcsname + \csname E#1\endcsname + \endgroup + \fi } =20 +\newhelp\EMsimple{Press RETURN to continue.} =20 -% Single-spacing is done by various environments (specifically, in -% \nonfillstart and \quotations). -\newskip\singlespaceskip \singlespaceskip =3D 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 -} =20 %% Simple single-character @ commands =20 % @@ prints an @ % Kludge this until the fonts are right (grr). -\def\@{{\tt \char '100}} +\def\@{{\tt\char64}} =20 % This is turned off because it was never documented % and you can use @w{...} around a quote to suppress ligatures. @@ -387,21 +559,27 @@ %\def\'{{'}} =20 % Used to generate quoted braces. -\def\mylbrace {{\tt \char '173}} -\def\myrbrace {{\tt \char '175}} +\def\mylbrace {{\tt\char123}} +\def\myrbrace {{\tt\char125}} \let\{=3D\mylbrace \let\}=3D\myrbrace \begingroup - % Definitions to produce actual \{ & \} command in an index. - \catcode`\{ =3D 12 \catcode`\} =3D 12 + % Definitions to produce \{ and \} commands for indices, + % and @{ and @} for the aux file. + \catcode`\{ =3D \other \catcode`\} =3D \other \catcode`\[ =3D 1 \catcode`\] =3D 2 - \catcode`\@ =3D 0 \catcode`\\ =3D 12 - @gdef@lbracecmd[\{]% - @gdef@rbracecmd[\}]% -@endgroup + \catcode`\! =3D 0 \catcode`\\ =3D \other + !gdef!lbracecmd[\{]% + !gdef!rbracecmd[\}]% + !gdef!lbraceatcmd[@{]% + !gdef!rbraceatcmd[@}]% +!endgroup + +% @comma{} to avoid , parsing problems. +\let\comma =3D , =20 % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent -% Others are defined by plain TeX: @` @' @" @^ @~ @=3D @v @H. +% Others are defined by plain TeX: @` @' @" @^ @~ @=3D @u @v @H. \let\, =3D \c \let\dotaccent =3D \. \def\ringaccent#1{{\accent23 #1}} @@ -409,10 +587,12 @@ \let\ubaraccent =3D \b \let\udotaccent =3D \d =20 -% Other special characters: @questiondown @exclamdown -% Plain TeX defines: @AA @AE @O @OE @L (and lowercase versions) @ss. +% Other special characters: @questiondown @exclamdown @ordf @ordm +% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. \def\questiondown{?`} \def\exclamdown{!`} +\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} +\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} =20 % Dotless i and dotless j, used for accents. \def\imacro{i} @@ -425,23 +605,54 @@ \fi\fi } =20 +% The \TeX{} logo, as in plain, but resetting the spacing so that a +% period following counts as ending a sentence. (Idea found in latex.) +%=20 +\edef\TeX{\TeX \spacefactor=3D3000 } + +% @LaTeX{} logo. Not quite the same results as the definition in +% latex.ltx, since we use a different font for the raised A; it's most +% convenient for us to use an explicitly smaller font, rather than using +% the \scriptstyle font (since we don't reset \scriptstyle and +% \scriptscriptstyle). +%=20 +\def\LaTeX{% + L\kern-.36em + {\setbox0=3D\hbox{T}% + \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}% + \kern-.15em + \TeX +} + +% 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`@ =3D 11 + % Avoid using \@M directly, because that causes trouble + % if the definition is written into an index file. + \global\let\tiepenalty =3D \@M + \gdef\tie{\leavevmode\penalty\tiepenalty\ } +} + % @: forces normal size whitespace following. \def\:{\spacefactor=3D1000 } =20 % @* forces a line break. \def\*{\hfil\break\hbox{}\ignorespaces} =20 +% @/ allows a line break. +\let\/=3D\allowbreak + % @. is an end-of-sentence period. \def\.{.\spacefactor=3D3000 } =20 -% @enddots{} is an end-of-sentence ellipsis. -\gdef\enddots{$\mathinner{\ldotp\ldotp\ldotp\ldotp}$\spacefactor=3D3000} - % @! is an end-of-sentence bang. -\gdef\!{!\spacefactor=3D3000 } +\def\!{!\spacefactor=3D3000 } =20 % @? is an end-of-sentence query. -\gdef\?{?\spacefactor=3D3000 } +\def\?{?\spacefactor=3D3000 } =20 % @w prevents a word break. Without the \leavevmode, @w at the % beginning of a paragraph, when TeX is still in vertical mode, would @@ -456,47 +667,24 @@ % therefore, no glue is inserted, and the space between the headline and % the text is small, which looks bad. % -\def\group{\begingroup - \ifnum\catcode13=3D\active \else +% Another complication is that the group might be very large. This can +% cause the glue on the previous page to be unduly stretched, because it +% does not have much material. In this case, it's better to add an +% explicit \vfill so that the extra space is at the bottom. The +% threshold for doing this is if the group is more than \vfilllimit +% percent of a page (\vfilllimit can be changed inside of @tex). +% +\newbox\groupbox +\def\vfilllimit{0.7} +% +\envdef\group{% + \ifnum\catcode`\^^M=3D\active \else \errhelp =3D \groupinvalidhelp \errmessage{@group invalid in context where filling is enabled}% \fi + \startsavinginserts % - % 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 =3D {\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 - % + \setbox\groupbox =3D \vtop\bgroup % 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 @@ -506,6 +694,32 @@ \comment } % +% The \vtop produces a box with normal height and large depth; thus, TeX p= uts +% \baselineskip glue before it, and (when the next line of text is done) +% \lineskip glue after it. Thus, space below is not quite equal to space +% above. But it's pretty close. +\def\Egroup{% + % To get correct interline space between the last line of the group + % and the first line afterwards, we have to propagate \prevdepth. + \endgraf % Not \par, as it may have been set to \lisppar. + \global\dimen1 =3D \prevdepth + \egroup % End the \vtop. + % \dimen0 is the vertical size of the group's box. + \dimen0 =3D \ht\groupbox \advance\dimen0 by \dp\groupbox + % \dimen2 is how much space is left on the page (more or less). + \dimen2 =3D \pageheight \advance\dimen2 by -\pagetotal + % if the group doesn't fit on the current page, and it's a big big + % group, force a page break. + \ifdim \dimen0 > \dimen2 + \ifdim \pagetotal < \vfilllimit\pageheight + \page + \fi + \fi + \box\groupbox + \prevdepth =3D \dimen1 + \checkinserts +} +% % TeX puts in an \escapechar (i.e., `@') at the beginning of the help % message, so this ends up printing `@group can only ...'. % @@ -518,60 +732,60 @@ =20 \newdimen\mil \mil=3D0.001in =20 -\def\need{\parsearg\needx} - % Old definition--didn't work. -%\def\needx #1{\par % +%\parseargdef\need{\par % %% This method tries to make TeX break the page naturally %% if the depth of the box does not fit. %{\baselineskip=3D0pt% -%\vtop to #1\mil{\vfil}\kern -#1\mil\penalty 10000 +%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak %\prevdepth=3D-1000pt %}} =20 -\def\needx#1{% - % Go into vertical mode, so we don't make a big box in the middle of a +\parseargdef\need{% + % Ensure 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 + % If the @need value is less than one line space, it's useless. + \dimen0 =3D #1\mil + \dimen2 =3D \ht\strutbox + \advance\dimen2 by \dp\strutbox + \ifdim\dimen0 > \dimen2 + % + % Do a \strut just to make the height of this box be normal, so the + % normal leading is inserted relative to the preceding line. + % And a page break here is fine. + \vtop to #1\mil{\strut\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 + \fi } =20 -% @br forces paragraph break +% @br forces paragraph break (and is undocumented). =20 \let\br =3D \par =20 -% @dots{} output some dots - -\def\dots{$\ldots$} - -% @page forces the start of a new page - +% @page forces the start of a new page. +% \def\page{\par\vfill\supereject} =20 % @exdent text.... @@ -582,467 +796,648 @@ \newskip\exdentamount =20 % 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\brea= k}} +\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\bre= ak} =20 % 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=3D\inmarginspacing \vbox{\noindent #1}}\null}}} +\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount + \leftline{\hskip\leftskip{\rm#1}}}} + +% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current +% paragraph. For more general purposes, use the \margin insertion +% class. WHICH is `l' or `r'. +% \newskip\inmarginspacing \inmarginspacing=3D1cm \def\strutdepth{\dp\strutbox} - -%\hbox{{\rm#1}}\hfil\break}} +% +\def\doinmargin#1#2{\strut\vadjust{% + \nobreak + \kern-\strutdepth + \vtop to \strutdepth{% + \baselineskip=3D\strutdepth + \vss + % if you have multiple lines of stuff to put here, you'll need to + % make the vbox yourself of the appropriate size. + \ifx#1l% + \llap{\ignorespaces #2\hskip\inmarginspacing}% + \else + \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% + \fi + \null + }% +}} +\def\inleftmargin{\doinmargin l} +\def\inrightmargin{\doinmargin r} +% +% @inmargin{TEXT [, RIGHT-TEXT]} +% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; +% else use TEXT for both). +% +\def\inmargin#1{\parseinmargin #1,,\finish} +\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. + \setbox0 =3D \hbox{\ignorespaces #2}% + \ifdim\wd0 > 0pt + \def\lefttext{#1}% have both texts + \def\righttext{#2}% + \else + \def\lefttext{#1}% have only one text + \def\righttext{#1}% + \fi + % + \ifodd\pageno + \def\temp{\inrightmargin\righttext}% odd page -> outside is right marg= in + \else + \def\temp{\inleftmargin\lefttext}% + \fi + \temp +} =20 % @include file insert text of that file as input. -% Allow normal characters that we make active in the argument (a file nam= e). -\def\include{\begingroup - \catcode`\\=3D12 - \catcode`~=3D12 - \catcode`^=3D12 - \catcode`_=3D12 - \catcode`|=3D12 - \catcode`<=3D12 - \catcode`>=3D12 - \catcode`+=3D12 - \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\include{\parseargusing\filenamecatcodes\includezzz} +\def\includezzz#1{% + \pushthisfilestack \def\thisfile{#1}% - \input\thisfile -\endgroup} + {% + \makevalueexpandable + \def\temp{\input #1 }% + \expandafter + }\temp + \popthisfilestack +} +\def\filenamecatcodes{% + \catcode`\\=3D\other + \catcode`~=3D\other + \catcode`^=3D\other + \catcode`_=3D\other + \catcode`|=3D\other + \catcode`<=3D\other + \catcode`>=3D\other + \catcode`+=3D\other + \catcode`-=3D\other +} =20 -\def\thisfile{} +\def\pushthisfilestack{% + \expandafter\pushthisfilestackX\popthisfilestack\StackTerm +} +\def\pushthisfilestackX{% + \expandafter\pushthisfilestackY\thisfile\StackTerm +} +\def\pushthisfilestackY #1\StackTerm #2\StackTerm {% + \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% +} =20 -% @center line outputs that line, centered +\def\popthisfilestack{\errthisfilestackempty} +\def\errthisfilestackempty{\errmessage{Internal error: + the stack of filenames is empty.}} =20 -\def\center{\parsearg\centerzzz} -\def\centerzzz #1{{\advance\hsize by -\leftskip -\advance\hsize by -\rightskip -\centerline{#1}}} +\def\thisfile{} + +% @center line +% outputs that line, centered. +% +\parseargdef\center{% + \ifhmode + \let\next\centerH + \else + \let\next\centerV + \fi + \next{\hfil \ignorespaces#1\unskip \hfil}% +} +\def\centerH#1{% + {% + \hfil\break + \advance\hsize by -\leftskip + \advance\hsize by -\rightskip + \line{#1}% + \break + }% +} +\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}} =20 % @sp n outputs n lines of vertical space =20 -\def\sp{\parsearg\spxxx} -\def\spxxx #1{\vskip #1\baselineskip} +\parseargdef\sp{\vskip #1\baselineskip} =20 % @comment ...line which is ignored... % @c is the same as @comment % @ignore ... @end ignore is another way to write a comment =20 -\def\comment{\catcode 64=3D\other \catcode 123=3D\other \catcode 125=3D\ot= her% -\parsearg \commentxxx} - -\def\commentxxx #1{\catcode 64=3D0 \catcode 123=3D1 \catcode 125=3D2 } +\def\comment{\begingroup \catcode`\^^M=3D\other% +\catcode`\@=3D\other \catcode`\{=3D\other \catcode`\}=3D\other% +\commentxxx} +{\catcode`\^^M=3D\other \gdef\commentxxx#1^^M{\endgroup}} =20 \let\c=3D\comment =20 -% @paragraphindent is defined for the Info formatting commands only. -\let\paragraphindent=3D\comment +% @paragraphindent NCHARS +% We'll use ems for NCHARS, close enough. +% NCHARS can also be the word `asis' or `none'. +% We cannot feasibly implement @paragraphindent asis, though. +% +\def\asisword{asis} % no translation, these are keywords +\def\noneword{none} +% +\parseargdef\paragraphindent{% + \def\temp{#1}% + \ifx\temp\asisword + \else + \ifx\temp\noneword + \defaultparindent =3D 0pt + \else + \defaultparindent =3D #1em + \fi + \fi + \parindent =3D \defaultparindent +} =20 -% Prevent errors for section commands. -% Used in @ignore and in failing conditionals. -\def\ignoresections{% -\let\chapter=3D\relax -\let\unnumbered=3D\relax -\let\top=3D\relax -\let\unnumberedsec=3D\relax -\let\unnumberedsection=3D\relax -\let\unnumberedsubsec=3D\relax -\let\unnumberedsubsection=3D\relax -\let\unnumberedsubsubsec=3D\relax -\let\unnumberedsubsubsection=3D\relax -\let\section=3D\relax -\let\subsec=3D\relax -\let\subsubsec=3D\relax -\let\subsection=3D\relax -\let\subsubsection=3D\relax -\let\appendix=3D\relax -\let\appendixsec=3D\relax -\let\appendixsection=3D\relax -\let\appendixsubsec=3D\relax -\let\appendixsubsection=3D\relax -\let\appendixsubsubsec=3D\relax -\let\appendixsubsubsection=3D\relax -\let\contents=3D\relax -\let\smallbook=3D\relax -\let\titlepage=3D\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 =3D \relax - \let\defcv =3D \relax - \let\deffn =3D \relax - \let\deffnx =3D \relax - \let\defindex =3D \relax - \let\defivar =3D \relax - \let\defmac =3D \relax - \let\defmethod =3D \relax - \let\defop =3D \relax - \let\defopt =3D \relax - \let\defspec =3D \relax - \let\deftp =3D \relax - \let\deftypefn =3D \relax - \let\deftypefun =3D \relax - \let\deftypevar =3D \relax - \let\deftypevr =3D \relax - \let\defun =3D \relax - \let\defvar =3D \relax - \let\defvr =3D \relax - \let\ref =3D \relax - \let\xref =3D \relax - \let\printindex =3D \relax - \let\pxref =3D \relax - \let\settitle =3D \relax - \let\setchapternewpage =3D \relax - \let\setchapterstyle =3D \relax - \let\everyheading =3D \relax - \let\evenheading =3D \relax - \let\oddheading =3D \relax - \let\everyfooting =3D \relax - \let\evenfooting =3D \relax - \let\oddfooting =3D \relax - \let\headings =3D \relax - \let\include =3D \relax - \let\lowersections =3D \relax - \let\down =3D \relax - \let\raisesections =3D \relax - \let\up =3D \relax - \let\set =3D \relax - \let\clear =3D \relax - \let\item =3D \relax +% @exampleindent NCHARS +% We'll use ems for NCHARS like @paragraphindent. +% It seems @exampleindent asis isn't necessary, but +% I preserve it to make it similar to @paragraphindent. +\parseargdef\exampleindent{% + \def\temp{#1}% + \ifx\temp\asisword + \else + \ifx\temp\noneword + \lispnarrowing =3D 0pt + \else + \lispnarrowing =3D #1em + \fi + \fi } =20 -% Ignore @ignore ... @end ignore. +% @firstparagraphindent WORD +% If WORD is `none', then suppress indentation of the first paragraph +% after a section heading. If WORD is `insert', then do indent at such +% paragraphs. +% +% The paragraph indentation is suppressed or not by calling +% \suppressfirstparagraphindent, which the sectioning commands do. +% We switch the definition of this back and forth according to WORD. +% By default, we suppress indentation. % -\def\ignore{\doignore{ignore}} - -% Also ignore @ifinfo, @ifhtml, @html, @menu, and @direntry text. +\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent} +\def\insertword{insert} % -\def\ifinfo{\doignore{ifinfo}} -\def\ifhtml{\doignore{ifhtml}} -\def\html{\doignore{html}} -\def\menu{\doignore{menu}} -\def\direntry{\doignore{direntry}} +\parseargdef\firstparagraphindent{% + \def\temp{#1}% + \ifx\temp\noneword + \let\suppressfirstparagraphindent =3D \dosuppressfirstparagraphindent + \else\ifx\temp\insertword + \let\suppressfirstparagraphindent =3D \relax + \else + \errhelp =3D \EMsimple + \errmessage{Unknown @firstparagraphindent option `\temp'}% + \fi\fi +} =20 -% 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 =3D \comment +% Here is how we actually suppress indentation. Redefine \everypar to +% \kern backwards by \parindent, and then reset itself to empty. +% +% We also make \indent itself not actually do anything until the next +% paragraph. +% +\gdef\dosuppressfirstparagraphindent{% + \gdef\indent{% + \restorefirstparagraphindent + \indent + }% + \gdef\noindent{% + \restorefirstparagraphindent + \noindent + }% + \global\everypar =3D {% + \kern -\parindent + \restorefirstparagraphindent + }% +} =20 +\gdef\restorefirstparagraphindent{% + \global \let \indent =3D \ptexindent + \global \let \noindent =3D \ptexnoindent + \global \everypar =3D {}% +} =20 -% @dircategory CATEGORY -- specify a category of the dir file -% which this file should belong to. Ignore this in TeX. -\let\dircategory =3D \comment =20 -% Ignore text until a line `@end #1'. +% @asis just yields its argument. Used with @table, for example. % -\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 w= ants. - \catcode32 =3D 10 - % - % And now expand that command. - \doignoretext -} +\def\asis#1{#1} =20 -% What we do to finish off ignored text. +% @math outputs its argument in math mode. % -\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 han= gs).} - \immediate\write16{If you are running another version of TeX, relax.} - \immediate\write16{If you are running Unix TeX 3.0, kill this TeX proc= ess.} - \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 distributio= n} - \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=3Ddummy\let\obstexwarn=3D\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 =3D \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 =3D \nullfont \let\tenit =3D \nullfont \let\tensl =3D \nu= llfont - \let\tenbf =3D \nullfont \let\tentt =3D \nullfont \let\smallcaps =3D= \nullfont - \let\tensf =3D \nullfont - % Similarly for index fonts (mostly for their use in - % smallexample) - \let\indrm =3D \nullfont \let\indit =3D \nullfont \let\indsl =3D \nu= llfont - \let\indbf =3D \nullfont \let\indtt =3D \nullfont \let\indsc =3D \nu= llfont - \let\indsf =3D \nullfont - % - % Don't complain when characters are missing from the fonts. - \tracinglostchars =3D 0 - % - % Don't bother to do space factor calculations. - \frenchspacing - % - % Don't report underfull hboxes. - \hbadness =3D 10000 - % - % Do minimal line-breaking. - \pretolerance =3D 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` =3D10 - \catcode`\-=3D12 \catcode`\_=3D12 % 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 =3D \empty - \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx insert= ed. - \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=3D\relax} - -% @value{foo} gets the text saved in variable foo. -% -\def\value{\begingroup - \catcode`\-=3D12 \catcode`\_=3D12 % 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. +% One complication: _ usually means subscripts, but it could also mean +% an actual _ character, as in @math{@var{some_variable} + 1}. So make +% _ active, and distinguish by seeing if the current family is \slfam, +% which is what @var uses. +{ + \catcode\underChar =3D \active + \gdef\mathunderscore{% + \catcode\underChar=3D\active + \def_{\ifnum\fam=3D\slfam \_\else\sb\fi}% + } +} +% Another complication: we want \\ (and @\) to output a \ character. +% FYI, plain.tex uses \\ as a temporary control sequence (why?), but +% this is not advertised and we don't care. Texinfo does not +% otherwise define @\. +% +% The \mathchar is class=3D0=3Dordinary, family=3D7=3Dttfam, position=3D5C= =3D\. +\def\mathbackslash{\ifnum\fam=3D\ttfam \mathchar"075C \else\backslash \fi} +% +\def\math{% + \tex + \mathunderscore + \let\\ =3D \mathbackslash + \mathactive + $\finishmath +} +\def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. + +% Some active characters (such as <) are spaced differently in math. +% We have to reset their definitions in case the @math was an argument +% to a command which sets the catcodes (such as @item or @section). % -\def\ifclear{\parsearg\ifclearxxx} -\def\ifclearxxx #1{% - \expandafter\ifx\csname SET#1\endcsname\relax - \expandafter\ifclearsucceed - \else - \expandafter\ifclearfail - \fi +{ + \catcode`^ =3D \active + \catcode`< =3D \active + \catcode`> =3D \active + \catcode`+ =3D \active + \gdef\mathactive{% + \let^ =3D \ptexhat + \let< =3D \ptexless + \let> =3D \ptexgtr + \let+ =3D \ptexplus + } } -\def\ifclearsucceed{\conditionalsucceed{ifclear}} -\def\ifclearfail{\nestedignore{ifclear}} -\defineunmatchedend{ifclear} =20 -% @iftex always succeeds; we read the text following, through @end -% iftex). But `@end iftex' should be valid only after an @iftex. -% -\def\iftex{\conditionalsucceed{iftex}} -\defineunmatchedend{iftex} +% @bullet and @minus need the same treatment as @math, just above. +\def\bullet{$\ptexbullet$} +\def\minus{$-$} =20 -% 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.) +% @dots{} outputs 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\conditionalsucceed#1{% - \edef\temp{% - % Remember the current value of \E#1. - \let\nece{prevE#1} =3D \nece{E#1}% - % - % At the `@end #1', redefine \E#1 to be its previous value. - \def\nece{E#1}{\let\nece{E#1} =3D \nece{prevE#1}}% +\def\dots{% + \leavevmode + \hbox to 1.5em{% + \hskip 0pt plus 0.25fil + .\hfil.\hfil.% + \hskip 0pt plus 0.5fil }% - \temp } =20 -% 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. +% @enddots{} is an end-of-sentence ellipsis. % -\let\implicitmath =3D $ -\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=3D\node -\let\lastnode=3D\relax +\def\enddots{% + \dots + \spacefactor=3D3000 +} =20 -\def\donoderef{\ifx\lastnode\relax\else -\expandafter\expandafter\expandafter\setref{\lastnode}\fi -\global\let\lastnode=3D\relax} - -\def\unnumbnoderef{\ifx\lastnode\relax\else -\expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi -\global\let\lastnode=3D\relax} - -\def\appendixnoderef{\ifx\lastnode\relax\else -\expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi -\global\let\lastnode=3D\relax} +% @comma{} is so commas can be inserted into text without messing up +% Texinfo's parsing. +%=20 +\let\comma =3D , =20 % @refill is a no-op. \let\refill=3D\relax =20 +% If working on a large document in chapters, it is convenient to +% be able to disable indexing, cross-referencing, and contents, for test r= uns. +% This is done with @novalidate (before @setfilename). +% +\newif\iflinks \linkstrue % by default we want the aux files. +\let\novalidate =3D \linksfalse + % @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=3D\comment % Ignore extra @setfilename cmds. + \iflinks + \tryauxfile + % Open the new aux file. TeX will close it automatically at exit. + \immediate\openout\auxfile=3D\jobname.aux + \fi % \openindices needs to do some work in any case. + \openindices + \let\setfilename=3D\comment % Ignore extra @setfilename cmds. + % + % If texinfo.cnf is present on the system, read it. + % Useful for site-wide @afourpaper, etc. + \openin 1 texinfo.cnf + \ifeof 1 \else \input texinfo.cnf \fi + \closein 1 + % \comment % Ignore the actual filename. } =20 +% Called from \setfilename. +% +\def\openindices{% + \newindex{cp}% + \newcodeindex{fn}% + \newcodeindex{vr}% + \newcodeindex{tp}% + \newcodeindex{ky}% + \newcodeindex{pg}% +} + % @bye. \outer\def\bye{\pagealignmacro\tracingstats=3D1\ptexend} =20 -% \def\macro#1{\begingroup\ignoresections\catcode`\#=3D6\def\macrotemp{#1}= \parsearg\macroxxx} -% \def\macroxxx#1#2 \end macro{% -% \expandafter\gdef\macrotemp#1{#2}% -% \endgroup} - -%\def\linemacro#1{\begingroup\ignoresections\catcode`\#=3D6\def\macrotemp{= #1}\parsearg\linemacroxxx} -%\def\linemacroxxx#1#2 \end linemacro{% -%\let\parsearg=3D\relax -%\edef\macrotempx{\csname M\butfirst\expandafter\string\macrotemp\endcsnam= e}% -%\expandafter\xdef\macrotemp{\parsearg\macrotempx}% -%\expandafter\gdef\macrotempx#1{#2}% -%\endgroup} =20 -%\def\butfirst#1{} +\message{pdf,} +% adobe `portable' document format +\newcount\tempnum +\newcount\lnkcount +\newtoks\filename +\newcount\filenamelength +\newcount\pgn +\newtoks\toksA +\newtoks\toksB +\newtoks\toksC +\newtoks\toksD +\newbox\boxA +\newcount\countA +\newif\ifpdf +\newif\ifpdfmakepagedest + +% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=3D1 +% can be set). So we test for \relax and 0 as well as \undefined, +% borrowed from ifpdf.sty. +\ifx\pdfoutput\undefined +\else + \ifx\pdfoutput\relax + \else + \ifcase\pdfoutput + \else + \pdftrue + \fi + \fi +\fi +% +\ifpdf + \input pdfcolor + \pdfcatalog{/PageMode /UseOutlines}% + \def\dopdfimage#1#2#3{% + \def\imagewidth{#2}% + \def\imageheight{#3}% + % without \immediate, pdftex seg faults when the same image is + % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) + \ifnum\pdftexversion < 14 + \immediate\pdfimage + \else + \immediate\pdfximage + \fi + \ifx\empty\imagewidth\else width \imagewidth \fi + \ifx\empty\imageheight\else height \imageheight \fi + \ifnum\pdftexversion<13 + #1.pdf% + \else + {#1.pdf}% + \fi + \ifnum\pdftexversion < 14 \else + \pdfrefximage \pdflastximage + \fi} + \def\pdfmkdest#1{{% + % We have to set dummies so commands such as @code in a section title + % aren't expanded. + \atdummies + \normalturnoffactive + \pdfdest name{#1} xyz% + }} + \def\pdfmkpgn#1{#1} + \let\linkcolor =3D \Blue % was Cyan, but that seems light? + \def\endlink{\Black\pdfendlink} + % Adding outlines to PDF; macros for calculating structure of outlines + % come from Petr Olsak + \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% + \else \csname#1\endcsname \fi} + \def\advancenumber#1{\tempnum=3D\expnumber{#1}\relax + \advance\tempnum by 1 + \expandafter\xdef\csname#1\endcsname{\the\tempnum}} + % + % #1 is the section text. #2 is the pdf expression for the number + % of subentries (or empty, for subsubsections). #3 is the node + % text, which might be empty if this toc entry had no + % corresponding node. #4 is the page number. + %=20 + \def\dopdfoutline#1#2#3#4{% + % Generate a link to the node text if that exists; else, use the + % page number. We could generate a destination for the section + % text in the case where a section has no node, but it doesn't + % seem worthwhile, since most documents are normally structured. + \def\pdfoutlinedest{#3}% + \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}\fi + % + \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{#1}% + } + % + \def\pdfmakeoutlines{% + \begingroup + % Thanh's hack / proper braces in bookmarks + \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=3D\mylbrace + \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=3D\myrbrace + % + % Read toc silently, to get counts of subentries for \pdfoutline. + \def\numchapentry##1##2##3##4{% + \def\thischapnum{##2}% + \let\thissecnum\empty + \let\thissubsecnum\empty + }% + \def\numsecentry##1##2##3##4{% + \advancenumber{chap\thischapnum}% + \def\thissecnum{##2}% + \let\thissubsecnum\empty + }% + \def\numsubsecentry##1##2##3##4{% + \advancenumber{sec\thissecnum}% + \def\thissubsecnum{##2}% + }% + \def\numsubsubsecentry##1##2##3##4{% + \advancenumber{subsec\thissubsecnum}% + }% + \let\thischapnum\empty + \let\thissecnum\empty + \let\thissubsecnum\empty + % + % use \def rather than \let here because we redefine \chapentry et + % al. a second time, below. + \def\appentry{\numchapentry}% + \def\appsecentry{\numsecentry}% + \def\appsubsecentry{\numsubsecentry}% + \def\appsubsubsecentry{\numsubsubsecentry}% + \def\unnchapentry{\numchapentry}% + \def\unnsecentry{\numsecentry}% + \def\unnsubsecentry{\numsubsecentry}% + \def\unnsubsubsecentry{\numsubsubsecentry}% + \input \jobname.toc + % + % Read toc second time, this time actually producing the outlines. + % The `-' means take the \expnumber as the absolute number of + % subentries, which we calculated on our first read of the .toc abov= e. + %=20 + % We use the node names as the destinations. + \def\numchapentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% + \def\numsecentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% + \def\numsubsecentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% + \def\numsubsubsecentry##1##2##3##4{% count is always zero + \dopdfoutline{##1}{}{##3}{##4}}% + % + % PDF outlines are displayed using system fonts, instead of + % document fonts. Therefore we cannot use special characters, + % since the encoding is unknown. For example, the eogonek from + % Latin 2 (0xea) gets translated to a | character. Info from + % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. + %=20 + % xx to do this right, we have to translate 8-bit characters to + % their "best" equivalent, based on the @documentencoding. Right + % now, I guess we'll just let the pdf reader have its way. + \indexnofonts + \turnoffactive + \input \jobname.toc + \endgroup + } + % + \def\makelinks #1,{% + \def\params{#1}\def\E{END}% + \ifx\params\E + \let\nextmakelinks=3D\relax + \else + \let\nextmakelinks=3D\makelinks + \ifnum\lnkcount>0,\fi + \picknum{#1}% + \startlink attr{/Border [0 0 0]} + goto name{\pdfmkpgn{\the\pgn}}% + \linkcolor #1% + \advance\lnkcount by 1% + \endlink + \fi + \nextmakelinks + } + \def\picknum#1{\expandafter\pn#1} + \def\pn#1{% + \def\p{#1}% + \ifx\p\lbrace + \let\nextpn=3D\ppn + \else + \let\nextpn=3D\ppnn + \def\first{#1} + \fi + \nextpn + } + \def\ppn#1{\pgn=3D#1\gobble} + \def\ppnn{\pgn=3D\first} + \def\pdfmklnk#1{\lnkcount=3D0\makelinks #1,END,} + \def\skipspaces#1{\def\PP{#1}\def\D{|}% + \ifx\PP\D\let\nextsp\relax + \else\let\nextsp\skipspaces + \ifx\p\space\else\addtokens{\filename}{\PP}% + \advance\filenamelength by 1 + \fi + \fi + \nextsp} + \def\getfilename#1{\filenamelength=3D0\expandafter\skipspaces#1|\relax} + \ifnum\pdftexversion < 14 + \let \startlink \pdfannotlink + \else + \let \startlink \pdfstartlink + \fi + \def\pdfurl#1{% + \begingroup + \normalturnoffactive\def\@{@}% + \makevalueexpandable + \leavevmode\Red + \startlink attr{/Border [0 0 0]}% + user{/Subtype /Link /A << /S /URI /URI (#1) >>}% + \endgroup} + \def\pdfgettoks#1.{\setbox\boxA=3D\hbox{\toksA=3D{#1.}\toksB=3D{}\maketo= ks}} + \def\addtokens#1#2{\edef\addtoks{\noexpand#1=3D{\the#1#2}}\addtoks} + \def\adn#1{\addtokens{\toksC}{#1}\global\countA=3D1\let\next=3D\maketoks} + \def\poptoks#1#2|ENDTOKS|{\let\first=3D#1\toksD=3D{#1}\toksA=3D{#2}} + \def\maketoks{% + \expandafter\poptoks\the\toksA|ENDTOKS|\relax + \ifx\first0\adn0 + \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 + \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 + \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 + \else + \ifnum0=3D\countA\else\makelink\fi + \ifx\first.\let\next=3D\done\else + \let\next=3D\maketoks + \addtokens{\toksB}{\the\toksD} + \ifx\first,\addtokens{\toksB}{\space}\fi + \fi + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \next} + \def\makelink{\addtokens{\toksB}% + {\noexpand\pdflink{\the\toksC}}\toksC=3D{}\global\countA=3D0} + \def\pdflink#1{% + \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} + \linkcolor #1\endlink} + \def\done{\edef\st{\global\noexpand\toksA=3D{\the\toksB}}\st} +\else + \let\pdfmkdest =3D \gobble + \let\pdfurl =3D \gobble + \let\endlink =3D \relax + \let\linkcolor =3D \relax + \let\pdfmakeoutlines =3D \relax +\fi % \ifx\pdfoutput =20 =20 \message{fonts,} =20 -% Font-change commands. +% Change the current font style to #1, remembering it in \curfontstyle. +% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in +% italics, not bold italics. +%=20 +\def\setfontstyle#1{% + \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. + \csname ten#1\endcsname % change the current font +} + +% Select #1 fonts with the current style. +%=20 +\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsnam= e} + +\def\rm{\fam=3D0 \setfontstyle{rm}} +\def\it{\fam=3D\itfam \setfontstyle{it}} +\def\sl{\fam=3D\slfam \setfontstyle{sl}} +\def\bf{\fam=3D\bffam \setfontstyle{bf}} +\def\tt{\fam=3D\ttfam \setfontstyle{tt}} =20 -% Texinfo supports the sans serif font style, which plain TeX does not. -% So we set up a \sf analogous to plain's \rm, etc. +% Texinfo sort of supports the sans serif font style, which plain TeX does= not. +% So we set up a \sf. \newfam\sffam -\def\sf{\fam=3D\sffam \tensf} +\def\sf{\fam=3D\sffam \setfontstyle{sf}} \let\li =3D \sf % Sometimes we call it \li, not \sf. =20 -% We don't need math for this one. -\def\ttsl{\tenttsl} +% We don't need math for this font style. +\def\ttsl{\setfontstyle{ttsl}} =20 -%% Try out Computer Modern fonts at \magstephalf -\let\mainmagstep=3D\magstephalf +% Default leading. +\newdimen\textleading \textleading =3D 13.2pt + +% 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 =3D #1\relax + \normallineskip =3D \lineskipfactor\normalbaselineskip + \normalbaselines + \setbox\strutbox =3D\hbox{% + \vrule width0pt height\strutheightpercent\baselineskip + depth \strutdepthpercent \baselineskip + }% +} =20 % Set the font macro #1 to the font named #2, adding on the % specified font prefix (normally `cm'). @@ -1072,17 +1467,18 @@ \def\scshape{csc} \def\scbshape{csc} =20 +% Text fonts (11.2pt, magstep1). +\newcount\mainmagstep \ifx\bigger\relax -\let\mainmagstep=3D\magstep1 -\setfont\textrm\rmshape{12}{1000} -\setfont\texttt\ttshape{12}{1000} + % not really supported. + \mainmagstep=3D\magstep1 + \setfont\textrm\rmshape{12}{1000} + \setfont\texttt\ttshape{12}{1000} \else -\setfont\textrm\rmshape{10}{\mainmagstep} -\setfont\texttt\ttshape{10}{\mainmagstep} + \mainmagstep=3D\magstephalf + \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} @@ -1092,27 +1488,49 @@ \font\texti=3Dcmmi10 scaled \mainmagstep \font\textsy=3Dcmsy10 scaled \mainmagstep =20 -% A few fonts for @defun, etc. -\setfont\defbf\bxshape{10}{\magstep1} %was 1314 +% A few fonts for @defun names and args. +\setfont\defbf\bfshape{10}{\magstep1} \setfont\deftt\ttshape{10}{\magstep1} -\def\df{\let\tentt=3D\deftt \let\tenbf =3D \defbf \bf} +\setfont\defttsl\ttslshape{10}{\magstep1} +\def\df{\let\tentt=3D\deftt \let\tenbf =3D \defbf \let\tenttsl=3D\defttsl = \bf} =20 -% 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=3D\indit -\let\indtt=3D\ninett -\let\indttsl=3D\ninett -\let\indsf=3D\indrm -\let\indbf=3D\indrm -\setfont\indsc\scshape{10}{900} -\font\indi=3Dcmmi9 -\font\indsy=3Dcmsy9 +% Fonts for indices, footnotes, small examples (9pt). +\setfont\smallrm\rmshape{9}{1000} +\setfont\smalltt\ttshape{9}{1000} +\setfont\smallbf\bfshape{10}{900} +\setfont\smallit\itshape{9}{1000} +\setfont\smallsl\slshape{9}{1000} +\setfont\smallsf\sfshape{9}{1000} +\setfont\smallsc\scshape{10}{900} +\setfont\smallttsl\ttslshape{10}{900} +\font\smalli=3Dcmmi9 +\font\smallsy=3Dcmsy9 + +% Fonts for small examples (8pt). +\setfont\smallerrm\rmshape{8}{1000} +\setfont\smallertt\ttshape{8}{1000} +\setfont\smallerbf\bfshape{10}{800} +\setfont\smallerit\itshape{8}{1000} +\setfont\smallersl\slshape{8}{1000} +\setfont\smallersf\sfshape{8}{1000} +\setfont\smallersc\scshape{10}{800} +\setfont\smallerttsl\ttslshape{10}{800} +\font\smalleri=3Dcmmi8 +\font\smallersy=3Dcmsy8 + +% Fonts for title page (20.4pt): +\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=3D\titlerm +\setfont\titlesc\scbshape{10}{\magstep4} +\font\titlei=3Dcmmi12 scaled \magstep3 +\font\titlesy=3Dcmsy10 scaled \magstep4 +\def\authorrm{\secrm} +\def\authortt{\sectt} =20 % Chapter (and unnumbered) fonts (17.28pt). \setfont\chaprm\rmbshape{12}{\magstep2} @@ -1120,7 +1538,7 @@ \setfont\chapsl\slbshape{10}{\magstep3} \setfont\chaptt\ttbshape{12}{\magstep2} \setfont\chapttsl\ttslshape{10}{\magstep3} -\setfont\chapsf\sfbshape{12}{\magstep2} +\setfont\chapsf\sfbshape{17}{1000} \let\chapbf=3D\chaprm \setfont\chapsc\scbshape{10}{\magstep3} \font\chapi=3Dcmmi12 scaled \magstep2 @@ -1138,109 +1556,168 @@ \font\seci=3Dcmmi12 scaled \magstep1 \font\secsy=3Dcmsy10 scaled \magstep2 =20 -% \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 large= r than -%\setfont\ssecsl\slshape{10}{1315} % being scaled magstep1. -%\setfont\ssectt\ttshape{10}{1315} -%\setfont\ssecsf\sfshape{10}{1315} - -%\let\ssecbf=3D\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}{\magstep1} +\setfont\ssecttsl\ttslshape{10}{1315} \setfont\ssecsf\sfbshape{12}{\magstephalf} \let\ssecbf\ssecrm -\setfont\ssecsc\scbshape{10}{\magstep1} +\setfont\ssecsc\scbshape{10}{1315} \font\sseci=3Dcmmi12 scaled \magstephalf -\font\ssecsy=3Dcmsy10 scaled \magstep1 -% The smallcaps and symbol fonts should actually be scaled \magstep1.5, -% but that is not a standard magnification. +\font\ssecsy=3Dcmsy10 scaled 1315 =20 -% Fonts for title page: -\setfont\titlerm\rmbshape{12}{\magstep3} -\let\authorrm =3D \secrm +% Reduced fonts for @acro in text (10pt). +\setfont\reducedrm\rmshape{10}{1000} +\setfont\reducedtt\ttshape{10}{1000} +\setfont\reducedbf\bfshape{10}{1000} +\setfont\reducedit\itshape{10}{1000} +\setfont\reducedsl\slshape{10}{1000} +\setfont\reducedsf\sfshape{10}{1000} +\setfont\reducedsc\scshape{10}{1000} +\setfont\reducedttsl\ttslshape{10}{1000} +\font\reducedi=3Dcmmi10 +\font\reducedsy=3Dcmsy10 =20 % 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). +% texinfo doesn't allow for producing subscripts and superscripts except +% in the main text, we don't bother to reset \scriptfont and +% \scriptscriptfont (which would also require loading a lot more fonts). % \def\resetmathfonts{% - \textfont0 =3D \tenrm \textfont1 =3D \teni \textfont2 =3D \tensy - \textfont\itfam =3D \tenit \textfont\slfam =3D \tensl \textfont\bffam = =3D \tenbf - \textfont\ttfam =3D \tentt \textfont\sffam =3D \tensf + \textfont0=3D\tenrm \textfont1=3D\teni \textfont2=3D\tensy + \textfont\itfam=3D\tenit \textfont\slfam=3D\tensl \textfont\bffam=3D\ten= bf + \textfont\ttfam=3D\tentt \textfont\sffam=3D\tensf } =20 - % 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=3D\bffam -% \tenbf}, for example. By redefining \tenbf, we obviate the need to -% redefine \bf itself. +% of just \STYLE. We do this because \STYLE needs to also set the +% current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire +% \tenSTYLE to set the current font. +%=20 +% Each font-changing command also sets the names \lsize (one size lower) +% and \lllsize (three sizes lower). These relative commands are used in +% the LaTeX logo and acronyms. +%=20 +% This all needs generalizing, badly. +%=20 \def\textfonts{% \let\tenrm=3D\textrm \let\tenit=3D\textit \let\tensl=3D\textsl \let\tenbf=3D\textbf \let\tentt=3D\texttt \let\smallcaps=3D\textsc - \let\tensf=3D\textsf \let\teni=3D\texti \let\tensy=3D\textsy \let\tentts= l=3D\textttsl - \resetmathfonts} + \let\tensf=3D\textsf \let\teni=3D\texti \let\tensy=3D\textsy + \let\tenttsl=3D\textttsl + \def\lsize{reduced}\def\lllsize{smaller}% + \resetmathfonts \setleading{\textleading}} +\def\titlefonts{% + \let\tenrm=3D\titlerm \let\tenit=3D\titleit \let\tensl=3D\titlesl + \let\tenbf=3D\titlebf \let\tentt=3D\titlett \let\smallcaps=3D\titlesc + \let\tensf=3D\titlesf \let\teni=3D\titlei \let\tensy=3D\titlesy + \let\tenttsl=3D\titlettsl + \def\lsize{chap}\def\lllsize{subsec}% + \resetmathfonts \setleading{25pt}} +\def\titlefont#1{{\titlefonts\rm #1}} \def\chapfonts{% \let\tenrm=3D\chaprm \let\tenit=3D\chapit \let\tensl=3D\chapsl \let\tenbf=3D\chapbf \let\tentt=3D\chaptt \let\smallcaps=3D\chapsc \let\tensf=3D\chapsf \let\teni=3D\chapi \let\tensy=3D\chapsy \let\tentts= l=3D\chapttsl + \def\lsize{sec}\def\lllsize{text}% \resetmathfonts \setleading{19pt}} \def\secfonts{% \let\tenrm=3D\secrm \let\tenit=3D\secit \let\tensl=3D\secsl \let\tenbf=3D\secbf \let\tentt=3D\sectt \let\smallcaps=3D\secsc - \let\tensf=3D\secsf \let\teni=3D\seci \let\tensy=3D\secsy \let\tenttsl= =3D\secttsl + \let\tensf=3D\secsf \let\teni=3D\seci \let\tensy=3D\secsy + \let\tenttsl=3D\secttsl + \def\lsize{subsec}\def\lllsize{reduced}% \resetmathfonts \setleading{16pt}} \def\subsecfonts{% \let\tenrm=3D\ssecrm \let\tenit=3D\ssecit \let\tensl=3D\ssecsl \let\tenbf=3D\ssecbf \let\tentt=3D\ssectt \let\smallcaps=3D\ssecsc - \let\tensf=3D\ssecsf \let\teni=3D\sseci \let\tensy=3D\ssecsy \let\tentts= l=3D\ssecttsl + \let\tensf=3D\ssecsf \let\teni=3D\sseci \let\tensy=3D\ssecsy + \let\tenttsl=3D\ssecttsl + \def\lsize{text}\def\lllsize{small}% \resetmathfonts \setleading{15pt}} -\let\subsubsecfonts =3D \subsecfonts % Maybe make sssec fonts scaled magst= ephalf? -\def\indexfonts{% - \let\tenrm=3D\indrm \let\tenit=3D\indit \let\tensl=3D\indsl - \let\tenbf=3D\indbf \let\tentt=3D\indtt \let\smallcaps=3D\indsc - \let\tensf=3D\indsf \let\teni=3D\indi \let\tensy=3D\indsy \let\tenttsl= =3D\indttsl - \resetmathfonts \setleading{12pt}} +\let\subsubsecfonts =3D \subsecfonts +\def\reducedfonts{% + \let\tenrm=3D\reducedrm \let\tenit=3D\reducedit \let\tensl=3D\reducedsl + \let\tenbf=3D\reducedbf \let\tentt=3D\reducedtt \let\reducedcaps=3D\redu= cedsc + \let\tensf=3D\reducedsf \let\teni=3D\reducedi \let\tensy=3D\reducedsy + \let\tenttsl=3D\reducedttsl + \def\lsize{small}\def\lllsize{smaller}% + \resetmathfonts \setleading{10.5pt}} +\def\smallfonts{% + \let\tenrm=3D\smallrm \let\tenit=3D\smallit \let\tensl=3D\smallsl + \let\tenbf=3D\smallbf \let\tentt=3D\smalltt \let\smallcaps=3D\smallsc + \let\tensf=3D\smallsf \let\teni=3D\smalli \let\tensy=3D\smallsy + \let\tenttsl=3D\smallttsl + \def\lsize{smaller}\def\lllsize{smaller}% + \resetmathfonts \setleading{10.5pt}} +\def\smallerfonts{% + \let\tenrm=3D\smallerrm \let\tenit=3D\smallerit \let\tensl=3D\smallersl + \let\tenbf=3D\smallerbf \let\tentt=3D\smallertt \let\smallcaps=3D\smalle= rsc + \let\tensf=3D\smallersf \let\teni=3D\smalleri \let\tensy=3D\smallersy + \let\tenttsl=3D\smallerttsl + \def\lsize{smaller}\def\lllsize{smaller}% + \resetmathfonts \setleading{9.5pt}} + +% Set the fonts to use with the @small... environments. +\let\smallexamplefonts =3D \smallfonts + +% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample +% can fit this many characters: +% 8.5x11=3D86 smallbook=3D72 a4=3D90 a5=3D69 +% If we use \scriptfonts (8pt), then we can fit this many characters: +% 8.5x11=3D90+ smallbook=3D80 a4=3D90+ a5=3D77 +% For me, subjectively, the few extra characters that fit aren't worth +% the additional smallness of 8pt. So I'm making the default 9pt. +% +% By the way, for comparison, here's what fits with @example (10pt): +% 8.5x11=3D71 smallbook=3D60 a4=3D75 a5=3D58 +% +% I wish the USA used A4 paper. +% --karl, 24jan03. + =20 % Set up the default fonts, so we can use them for creating boxes. % -\textfonts +\textfonts \rm + +% Define these so they can be easily changed for other fonts. +\def\angleleft{$\langle$} +\def\angleright{$\rangle$} =20 % Count depth in font-changes, for error checks \newcount\fontdepth \fontdepth=3D0 =20 % Fonts for short table of contents. \setfont\shortcontrm\rmshape{12}{1000} -\setfont\shortcontbf\bxshape{12}{1000} +\setfont\shortcontbf\bfshape{10}{\magstep1} % no cmb12 \setfont\shortcontsl\slshape{12}{1000} +\setfont\shortconttt\ttshape{12}{1000} =20 %% Add scribe-like font environments, plus @l for inline lisp (usually sans %% serif) and @ii for TeX italic =20 % \smartitalic{ARG} outputs arg in italics, followed by an italic correcti= on % 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} +\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else + \ptexslash\fi\fi\fi} +\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx} +\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx} + +% like \smartslanted except unconditionally uses \ttsl. +% @var is set to this for defun arguments. +\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx} + +% like \smartslanted except unconditionally use \sl. We never want +% ttsl for book titles, do we? +\def\cite#1{{\sl #1}\futurelet\next\smartitalicx} =20 \let\i=3D\smartitalic -\let\var=3D\smartitalic -\let\dfn=3D\smartitalic +\let\var=3D\smartslanted +\let\dfn=3D\smartslanted \let\emph=3D\smartitalic -\let\cite=3D\smartitalic =20 \def\b#1{{\bf #1}} \let\strong=3D\b @@ -1252,25 +1729,37 @@ \def\nohyphenation{\hyphenchar\font =3D -1 \aftergroup\restorehyphenation} \def\restorehyphenation{\hyphenchar\font =3D `- } =20 +% Set sfcode to normal for the chars that usually have another value. +% Can't use plain's \frenchspacing because it uses the `\x notation, and +% sometimes \x has an active definition that messes things up. +% +\catcode`@=3D11 + \def\frenchspacing{% + \sfcode\dotChar =3D\@m \sfcode\questChar=3D\@m \sfcode\exclamChar=3D\= @m + \sfcode\colonChar=3D\@m \sfcode\semiChar =3D\@m \sfcode\commaChar =3D\= @m + } +\catcode`@=3D\other + \def\t#1{% {\tt \rawbackslash \frenchspacing #1}% \null } -\let\ttfont=3D\t -\def\samp #1{`\tclose{#1}'\null} -\setfont\smallrm\rmshape{8}{1000} -\font\smallsy=3Dcmsy9 -\def\key#1{{\smallrm\textfont2=3D\smallsy \leavevmode\hbox{% - \raise0.4pt\hbox{$\langle$}\kern-.08em\vtop{% +\def\samp#1{`\tclose{#1}'\null} +\setfont\keyrm\rmshape{8}{1000} +\font\keysy=3Dcmsy9 +\def\key#1{{\keyrm\textfont2=3D\keysy \leavevmode\hbox{% + \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% \vbox{\hrule\kern-0.4pt - \hbox{\raise0.4pt\hbox{\vphantom{$\langle$}}#1}}% + \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% \kern-0.4pt\hrule}% - \kern-.06em\raise0.4pt\hbox{$\rangle$}}}} + \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} =20 +% @file, @option are the same as @samp. \let\file=3D\samp +\let\option=3D\samp =20 % @code is a modification of @t, % which makes spaces the same size as normal in the surrounding text. @@ -1295,7 +1784,7 @@ \null } =20 -% We *must* turn on hyphenation at `-' and `_' in \code. +% 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. =20 @@ -1305,43 +1794,116 @@ % and arrange explicitly to hyphenate at a dash. % -- rms. { -\catcode`\-=3D\active -\catcode`\_=3D\active -\catcode`\|=3D\active -\global\def\code{\begingroup \catcode`\-=3D\active \let-\codedash \catcode= `\_=3D\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 =3D to an _ that is a -% subscript character anyway. Then, @cindex @samp{_} (for example) -% fails. --karl -\global\def\indexbreaks{% - \catcode`\-=3D\active \let-\realdash -} + \catcode`\-=3D\active + \catcode`\_=3D\active + % + \global\def\code{\begingroup + \catcode`\-=3D\active \let-\codedash + \catcode`\_=3D\active \let_\codeunder + \codex + } } =20 \def\realdash{-} \def\codedash{-\discretionary{}{}{}} -\def\codeunder{\ifusingtt{\normalunderscore\discretionary{}{}{}}{\_}} +\def\codeunder{% + % this is all so @math{@code{var_name}+1} can work. In math mode, _ + % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) + % will therefore expand the active definition of _, which is us + % (inside @code that is), therefore an endless loop. + \ifusingtt{\ifmmode + \mathchar"075F % class 0=3Dordinary, family 7=3Dttfam, pos = 0x5F=3D_. + \else\normalunderscore \fi + \discretionary{}{}{}}% + {\_}% +} \def\codex #1{\tclose{#1}\endgroup} =20 -%\let\exp=3D\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). +\parseargdef\kbdinputstyle{% + \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}% + \else + \errhelp =3D \EMsimple + \errmessage{Unknown @kbdinputstyle option `\arg'}% + \fi\fi\fi +} +\def\worddistinct{distinct} +\def\wordexample{example} +\def\wordcode{code} + +% Default is `distinct.' +\kbdinputstyle distinct + \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{\ttsl\look}}\fi -\else{\tclose{\ttsl\look}}\fi} +\else{\tclose{\kbdfont\look}}\fi +\else{\tclose{\kbdfont\look}}\fi} + +% For @indicateurl, @env, @command quotes seem unnecessary, so use \code. +\let\indicateurl=3D\code +\let\env=3D\code +\let\command=3D\code + +% @uref (abbreviation for `urlref') takes an optional (comma-separated) +% second argument specifying the text to display and an optional third +% arg as text to display instead of (rather than in addition to) the url +% itself. First (mandatory) arg is the url. Perhaps eventually put in +% a hypertex \special here. +% +\def\uref#1{\douref #1,,,\finish} +\def\douref#1,#2,#3,#4\finish{\begingroup + \unsepspaces + \pdfurl{#1}% + \setbox0 =3D \hbox{\ignorespaces #3}% + \ifdim\wd0 > 0pt + \unhbox0 % third arg given, show only that + \else + \setbox0 =3D \hbox{\ignorespaces #2}% + \ifdim\wd0 > 0pt + \ifpdf + \unhbox0 % PDF: 2nd arg given, show only it + \else + \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url + \fi + \else + \code{#1}% only url given, so show it + \fi + \fi + \endlink +\endgroup} + +% @url synonym for @uref, since that's how everyone uses it. +%=20 +\let\url=3D\uref =20 -% @url, @email. Quotes do not seem necessary. -\let\url=3D\code % perhaps include a hypertex \special eventually -% rms does not like the angle brackets --karl, 17may97. -%\def\email#1{$\langle${\tt #1}$\rangle$} -\let\email=3D\code +% rms does not like angle brackets --karl, 17may97. +% So now @email is just like @uref, unless we are pdf. +% +%\def\email#1{\angleleft{\tt #1}\angleright} +\ifpdf + \def\email#1{\doemail#1,,\finish} + \def\doemail#1,#2,#3\finish{\begingroup + \unsepspaces + \pdfurl{mailto:#1}% + \setbox0 =3D \hbox{\ignorespaces #2}% + \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi + \endlink + \endgroup} +\else + \let\email=3D\uref +\fi =20 % Check if we are currently using a typewriter font. Since all the % Computer Modern typewriter fonts have zero interword stretch (and @@ -1351,8 +1913,7 @@ \def\ifmonospace{\ifdim\fontdimen3\font=3D0pt } =20 % 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. +% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. % \def\dmn#1{\thinspace #1} =20 @@ -1363,14 +1924,34 @@ % Polish suppressed-l. --karl, 22sep96. %\def\l#1{{\li #1}\null} =20 +% Explicit font changes: @r, @sc, undocumented @ii. \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 =20 -% @pounds{} is a sterling sign. +\def\acronym#1{\doacronym #1,,\finish} +\def\doacronym#1,#2,#3\finish{% + {\selectfonts\lsize #1}% + \def\temp{#2}% + \ifx\temp\empty \else + \space ({\unsepspaces \ignorespaces \temp \unskip})% + \fi +} + +% @pounds{} is a sterling sign, which is in the CM italic font. +%=20 \def\pounds{{\it\$}} =20 +% @registeredsymbol - R in a circle. The font for the R should really +% be smaller yet, but lllsize is the best we can do for now. +% Adapted from the plain.tex definition of \copyright. +% +\def\registeredsymbol{% + $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}% + \hfil\crcr\Orb}}% + }$% +} + =20 \message{page headings,} =20 @@ -1378,87 +1959,124 @@ \newskip\titlepagebottomglue \titlepagebottomglue =3D 2pc =20 % First the title page. Must do @settitle before @titlepage. -\def\titlefont#1{{\titlerm #1}} - \newif\ifseenauthor \newif\iffinishedtitlepage =20 -\def\shorttitlepage{\parsearg\shorttitlepagezzz} -\def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerli= ne{#1}% +% Do an implicit @contents or @shortcontents after @end titlepage if the +% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. +% +\newif\ifsetcontentsaftertitlepage + \let\setcontentsaftertitlepage =3D \setcontentsaftertitlepagetrue +\newif\ifsetshortcontentsaftertitlepage + \let\setshortcontentsaftertitlepage =3D \setshortcontentsaftertitlepagetr= ue + +\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \center= line{#1}% \endgroup\page\hbox{}\page} =20 -\def\titlepage{\begingroup \parindent=3D0pt \textfonts - \let\subtitlerm=3D\tenrm -% I deinstalled the following change because \cmr12 is undefined. -% This change was not in the ChangeLog anyway. --rms. -% \let\subtitlerm=3D\cmr12 - \def\subtitlefont{\subtitlerm \normalbaselineskip =3D 13pt \normalbasel= ines}% - % - \def\authorfont{\authorrm \normalbaselineskip =3D 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{\titlefont{##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\seenauthortr= ue\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 secon= d. - \let\oldpage =3D \page - \def\page{% +\envdef\titlepage{% + % Open one extra group, as we want to close it in the middle of \Etitlep= age. + \begingroup + \parindent=3D0pt \textfonts + % Leave some space at the very top of the page. + \vglue\titlepagetopglue + % No rule at page bottom unless we print one at the top with @title. + \finishedtitlepagetrue + % + % 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 seco= nd. + \let\oldpage =3D \page + \def\page{% \iffinishedtitlepage\else - \finishtitlepage + \finishtitlepage \fi - \oldpage \let\page =3D \oldpage - \hbox{}}% -% \def\page{\oldpage \hbox{}} + \page + \null + }% } =20 \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 + \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 + % + % Need this before the \...aftertitlepage checks so that if they are + % in effect the toc pages will come out with page numbers. + \HEADINGSon + % + % If they want short, they certainly want long too. + \ifsetshortcontentsaftertitlepage + \shortcontents + \contents + \global\let\shortcontents =3D \relax + \global\let\contents =3D \relax + \fi + % + \ifsetcontentsaftertitlepage + \contents + \global\let\contents =3D \relax + \global\let\shortcontents =3D \relax + \fi } =20 \def\finishtitlepage{% - \vskip4pt \hrule height 2pt width \hsize - \vskip\titlepagebottomglue - \finishedtitlepagetrue + \vskip4pt \hrule height 2pt width \hsize + \vskip\titlepagebottomglue + \finishedtitlepagetrue +} + +%%% Macros to be used within @titlepage: + +\let\subtitlerm=3D\tenrm +\def\subtitlefont{\subtitlerm \normalbaselineskip =3D 13pt \normalbaseline= s} + +\def\authorfont{\authorrm \normalbaselineskip =3D 16pt \normalbaselines + \let\tt=3D\authortt} + +\parseargdef\title{% + \checkenv\titlepage + \leftline{\titlefonts\rm #1} + % print a rule at the page bottom also. + \finishedtitlepagefalse + \vskip4pt \hrule height 4pt width \hsize \vskip4pt +} + +\parseargdef\subtitle{% + \checkenv\titlepage + {\subtitlefont \rightline{#1}}% +} + +% @author should come last, but may come many times. +% It can also be used inside @quotation. +%=20 +\parseargdef\author{% + \def\temp{\quotation}% + \ifx\thisenv\temp + \def\quotationauthor{#1}% printed in \Equotation. + \else + \checkenv\titlepage + \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi + {\authorfont \leftline{#1}}% + \fi } =20 + %%% Set up page headings and footings. =20 \let\thispage=3D\folio =20 -\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 +\newtoks\evenheadline % headline on even pages +\newtoks\oddheadline % headline on odd pages +\newtoks\evenfootline % footline on even pages +\newtoks\oddfootline % footline on odd pages =20 -% Now make Tex use those variables +% Now make TeX use those variables \headline=3D{{\textfonts\rm \ifodd\pageno \the\oddheadline \else \the\evenheadline \fi}} \footline=3D{{\textfonts\rm \ifodd\pageno \the\oddfootline @@ -1472,43 +2090,37 @@ % @evenfooting @thisfile|| % @oddfooting ||@thisfile =20 -\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`\@=3D0 % =20 -\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish} -\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{% +\def\evenheading{\parsearg\evenheadingxxx} +\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} +\def\evenheadingyyy #1\|#2\|#3\|#4\finish{% \global\evenheadline=3D{\rlap{\centerline{#2}}\line{#1\hfil#3}}} =20 -\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish} -\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{% +\def\oddheading{\parsearg\oddheadingxxx} +\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} +\def\oddheadingyyy #1\|#2\|#3\|#4\finish{% \global\oddheadline=3D{\rlap{\centerline{#2}}\line{#1\hfil#3}}} =20 -\gdef\everyheadingxxx #1{\everyheadingyyy #1@|@|@|@|\finish} -\gdef\everyheadingyyy #1@|#2@|#3@|#4\finish{% -\global\evenheadline=3D{\rlap{\centerline{#2}}\line{#1\hfil#3}} -\global\oddheadline=3D{\rlap{\centerline{#2}}\line{#1\hfil#3}}} +\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% =20 -\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish} -\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{% +\def\evenfooting{\parsearg\evenfootingxxx} +\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} +\def\evenfootingyyy #1\|#2\|#3\|#4\finish{% \global\evenfootline=3D{\rlap{\centerline{#2}}\line{#1\hfil#3}}} =20 -\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish} -\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{% -\global\oddfootline=3D{\rlap{\centerline{#2}}\line{#1\hfil#3}}} - -\gdef\everyfootingxxx #1{\everyfootingyyy #1@|@|@|@|\finish} -\gdef\everyfootingyyy #1@|#2@|#3@|#4\finish{% -\global\evenfootline=3D{\rlap{\centerline{#2}}\line{#1\hfil#3}} -\global\oddfootline=3D{\rlap{\centerline{#2}}\line{#1\hfil#3}}} -% -}% unbind the catcode of @. +\def\oddfooting{\parsearg\oddfootingxxx} +\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} +\def\oddfootingyyy #1\|#2\|#3\|#4\finish{% + \global\oddfootline =3D {\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 +} + +\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} + =20 % @headings double turns headings on for double-sided printing. % @headings single turns headings on for single-sided printing. @@ -1522,7 +2134,7 @@ =20 \def\headings #1 {\csname HEADINGS#1\endcsname} =20 -\def\HEADINGSoff{ +\def\HEADINGSoff{% \global\evenheadline=3D{\hfil} \global\evenfootline=3D{\hfil} \global\oddheadline=3D{\hfil} \global\oddfootline=3D{\hfil}} \HEADINGSoff @@ -1531,7 +2143,7 @@ % 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{ +\def\HEADINGSdouble{% \global\pageno=3D1 \global\evenfootline=3D{\hfil} \global\oddfootline=3D{\hfil} @@ -1543,7 +2155,7 @@ =20 % For single-sided printing, chapter title goes across top left of page, % page number on top right. -\def\HEADINGSsingle{ +\def\HEADINGSsingle{% \global\pageno=3D1 \global\evenfootline=3D{\hfil} \global\oddfootline=3D{\hfil} @@ -1573,41 +2185,28 @@ } =20 % 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 +% This produces Day Month Year style of output. +% Only define if not already defined, in case a txi-??.tex file has set +% up a different format (e.g., txi-cs.tex does this). +\ifx\today\undefined +\def\today{% + \number\day\space + \ifcase\month + \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr + \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug + \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec + \fi + \space\number\year} +\fi =20 -% These don't work. For one thing, \+ is defined as outer. -% So these macros cannot even be defined. +% @settitle line... specifies the title of the document, for headings. +% It generates no output of its own. +\def\thistitle{\putwordNoTitle} +\def\settitle{\parsearg{\gdef\thistitle}} =20 -%\def\tabs{\parsearg\tabszzz} -%\def\tabszzz #1{\settabs\+#1\cr} -%\def\tabline{\parsearg\tablinezzz} -%\def\tablinezzz #1{\+#1\cr} -%\def\&{&} =20 -% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x). +\message{tables,} +% Tables -- @table, @ftable, @vtable, @item(x). =20 % default indentation of table text \newdimen\tableindent \tableindent=3D.8in @@ -1619,7 +2218,7 @@ % used internally for \itemindent minus \itemmargin \newdimen\itemmax =20 -% Note @table, @vtable, and @vtable define @item, @itemx, etc., with +% Note @table, @ftable, 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). @@ -1631,30 +2230,13 @@ \def\internalBitem{\smallbreak \parsearg\itemzzz} \def\internalBitemx{\itemxpar \parsearg\itemzzz} =20 -\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xite= mzzz} -\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitem= zzz} - -\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=3D\hbox{\itemfont{#1}}% + \setbox0=3D\hbox{\itemindicate{#1}}% \itemindex{#1}% \nobreak % This prevents a break before @itemx. % - % Be sure we are not still in the middle of a paragraph. - %{\parskip =3D 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 @@ -1675,114 +2257,125 @@ % \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 + % 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 + % \baselineskip glue.) However, if what follows is an environment + % such as @example, there will be no \parskip glue; then + % the negative vskip we just would cause the example and the item to + % crash together. So we use this bizarre value of 10001 as a signal + % to \aboveenvbreak to insert \parskip glue after all. + % (Possibly there are other commands that could be followed by + % @example which need the same treatment, but not section titles; or + % maybe section titles are the only special case and they should be + % penalty 10001...) + \penalty 10001 \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. + % following text (if any) will end up on the same line. \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=3D\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=3D\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=3D#1% -\ifnum 0#3>0 \advance \leftskip by #3\mil \fi % -\ifnum 0#4>0 \tableindent=3D#4\mil \fi % -\ifnum 0#5>0 \advance \rightskip by #5\mil \fi % -\def\itemfont{#2}% -\itemmax=3D\tableindent % -\advance \itemmax by -\itemmargin % -\advance \leftskip by \tableindent % -\exdentamount=3D\tableindent -\parindent =3D 0pt -\parskip =3D \smallskipamount -\ifdim \parskip=3D0pt \parskip=3D2pt \fi% -\def\Etable{\endgraf\afterenvbreak\endgroup}% -\let\item =3D \internalBitem % -\let\itemx =3D \internalBitemx % -\let\kitem =3D \internalBkitem % -\let\kitemx =3D \internalBkitemx % -\let\xitem =3D \internalBxitem % -\let\xitemx =3D \internalBxitemx % + % Do this with kerns and \unhbox so that if there is a footnote in + % the item text, it can migrate to the main vertical list and + % eventually be printed. + \nobreak\kern-\tableindent + \dimen0 =3D \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 b= y -\wd0 + \unhbox0 + \nobreak\kern\dimen0 + \endgroup + \itemxneedsnegativevskiptrue + \fi +} + +\def\item{\errmessage{@item while not in a list environment}} +\def\itemx{\errmessage{@itemx while not in a list environment}} + +% @table, @ftable, @vtable. +\envdef\table{% + \let\itemindex\gobble + \tablex +} +\envdef\ftable{% + \def\itemindex ##1{\doind {fn}{\code{##1}}}% + \tablex +} +\envdef\vtable{% + \def\itemindex ##1{\doind {vr}{\code{##1}}}% + \tablex +} +\def\tablex#1{% + \def\itemindicate{#1}% + \parsearg\tabley } +\def\tabley#1{% + {% + \makevalueexpandable + \edef\temp{\noexpand\tablez #1\space\space\space}% + \expandafter + }\temp \endtablez +} +\def\tablez #1 #2 #3 #4\endtablez{% + \aboveenvbreak + \ifnum 0#1>0 \advance \leftskip by #1\mil \fi + \ifnum 0#2>0 \tableindent=3D#2\mil \fi + \ifnum 0#3>0 \advance \rightskip by #3\mil \fi + \itemmax=3D\tableindent + \advance \itemmax by -\itemmargin + \advance \leftskip by \tableindent + \exdentamount=3D\tableindent + \parindent =3D 0pt + \parskip =3D \smallskipamount + \ifdim \parskip=3D0pt \parskip=3D2pt \fi + \let\item =3D \internalBitem + \let\itemx =3D \internalBitemx +} +\def\Etable{\endgraf\afterenvbreak} +\let\Eftable\Etable +\let\Evtable\Etable +\let\Eitemize\Etable +\let\Eenumerate\Etable =20 % This is the counter used by @enumerate, which is really @itemize =20 \newcount \itemno =20 -\def\itemize{\parsearg\itemizezzz} +\envdef\itemize{\parsearg\doitemize} =20 -\def\itemizezzz #1{% - \begingroup % ended by the @end itemsize - \itemizey {#1}{\Eitemize} -} - -\def\itemizey #1#2{% -\aboveenvbreak % -\itemmax=3D\itemindent % -\advance \itemmax by -\itemmargin % -\advance \leftskip by \itemindent % -\exdentamount=3D\itemindent -\parindent =3D 0pt % -\parskip =3D \smallskipamount % -\ifdim \parskip=3D0pt \parskip=3D2pt \fi% -\def#2{\endgraf\afterenvbreak\endgroup}% -\def\itemcontents{#1}% -\let\item=3D\itemizeitem} +\def\doitemize#1{% + \aboveenvbreak + \itemmax=3D\itemindent + \advance\itemmax by -\itemmargin + \advance\leftskip by \itemindent + \exdentamount=3D\itemindent + \parindent=3D0pt + \parskip=3D\smallskipamount + \ifdim\parskip=3D0pt \parskip=3D2pt \fi + \def\itemcontents{#1}% + % @itemize with no arg is equivalent to @itemize @bullet. + \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi + \let\item=3D\itemizeitem +} =20 -% Set sfcode to normal for the chars that usually have another value. -% These are `.?!:;,' -\def\frenchspacing{\sfcode46=3D1000 \sfcode63=3D1000 \sfcode33=3D1000 - \sfcode58=3D1000 \sfcode59=3D1000 \sfcode44=3D1000 } +% Definition of @item while inside @itemize and @enumerate. +% +\def\itemizeitem{% + \advance\itemno by 1 % for enumerations + {\let\par=3D\endgraf \smallbreak}% reasonable place to break + {% + % If the document has an @itemize directly after a section title, a + % \nobreak will be last on the list, and \sectionheading will have + % done a \vskip-\parskip. In that case, we don't want to zero + % parskip, or the item text will crash with the heading. On the + % other hand, when there is normal text preceding the item (as there + % usually is), we do want to zero parskip, or there would be too much + % space. In that case, we won't have a \nobreak before. At least + % that's the theory. + \ifnum\lastpenalty<10000 \parskip=3D0in \fi + \noindent + \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% + \vadjust{\penalty 1200}}% not good to break after first line of item. + \flushcr +} =20 % \splitoff TOKENS\endmark defines \first to be the first token in % TOKENS, and \rest to be the remainder. @@ -1793,11 +2386,8 @@ % 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} +\envparseargdef\enumerate{\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 @@ -1868,13 +2458,13 @@ }% } =20 -% Call itemizey, adding a period to the first argument and supplying the +% Call \doitemize, 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 + \doitemize{#1.}\flushcr } =20 % @alphaenumerate and @capsenumerate are abbreviations for giving an arg @@ -1885,16 +2475,6 @@ \def\Ealphaenumerate{\Eenumerate} \def\Ecapsenumerate{\Eenumerate} =20 -% Definition of @item while inside @itemize. - -\def\itemizeitem{% -\advance\itemno by 1 -{\let\par=3D\endgraf \smallbreak}% -\ifhmode \errmessage{In hmode at itemizeitem}\fi -{\parskip=3D0in \hskip 0pt -\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}% -\vadjust{\penalty 1200}}% -\flushcr} =20 % @multitable macros % Amy Hendrickson, 8/18/94, 3/6/96 @@ -1921,24 +2501,14 @@ % @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} =20 % 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. =20 -% @item, @tab, @multitable or @end multitable do not need to be on their -% own lines, but it will not hurt if they are. +% @item, @tab do not need to be on their own lines, but it will not hurt +% if they are. =20 % Sample multitable: =20 @@ -1964,10 +2534,7 @@ % @multitablelinespace is space to leave between table items, baseline % to baseline. % 0pt means it depends on current normal line spacing. - -%%%% -% Dimensions - +% \newskip\multitableparskip \newskip\multitableparindent \newdimen\multitablecolspace @@ -1977,129 +2544,175 @@ \multitablecolspace=3D12pt \multitablelinespace=3D0pt =20 -%%%% % Macros used to set up halign preamble: +% \let\endsetuptable\relax \def\xendsetuptable{\endsetuptable} \let\columnfractions\relax \def\xcolumnfractions{\columnfractions} \newif\ifsetpercent =20 -%% 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} +% #1 is the @columnfraction, usually a decimal number like .5, but might +% be just 1. We just use it, whatever it is. +%=20 +\def\pickupwholefraction#1 {% + \global\advance\colcount by 1 + \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}% + \setuptable +} =20 \newcount\colcount -\def\setuptable#1{\def\firstarg{#1}% -\ifx\firstarg\xendsetuptable\let\go\relax% -\else - \ifx\firstarg\xcolumnfractions\global\setpercenttrue% +\def\setuptable#1{% + \def\firstarg{#1}% + \ifx\firstarg\xendsetuptable + \let\go =3D \relax \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. + \ifx\firstarg\xcolumnfractions + \global\setpercenttrue + \else + \ifsetpercent + \let\go\pickupwholefraction + \else + \global\advance\colcount by 1 + \setbox0=3D\hbox{#1\unskip\space}% Add a normal word space as a + % separator; typically that is always in the input, any= way. + \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% + \fi + \fi + \ifx\go\pickupwholefraction + % Put the argument back for the \pickupwholefraction call, so + % we'll always have a period there to be parsed. + \def\go{\pickupwholefraction#1}% \else - \global\advance\colcount by1 - \setbox0=3D\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}% + \let\go =3D \setuptable \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. + \fi + \go +} =20 +% multitable-only commands. +% +% @headitem starts a heading row, which we typeset in bold. +% Assignments have to be global since we are inside the implicit group +% of an alignment entry. Note that \everycr resets \everytab. +\def\headitem{\checkenv\multitable \crcr \global\everytab=3D{\bf}\the\ever= ytab}% +% +% A \tab used to include \hskip1sp. But then the space in a template +% line is not enough. That is bad. So let's go back to just `&' until +% we encounter the problem it was intended to solve again. +% --karl, nathan@acm.org, 20apr99. +\def\tab{\checkenv\multitable &\the\everytab}% =20 -%%%% % @multitable ... @end multitable definitions: - -\def\multitable{\parsearg\dotable} - -\def\dotable#1{\bgroup -\let\item\cr -\tolerance=3D9500 -\hbadness=3D9500 -\setmultitablespacing -\parskip=3D\multitableparskip -\parindent=3D\multitableparindent -\overfullrule=3D0pt -\global\colcount=3D0\relax% -\def\Emultitable{\global\setpercentfalse\global\everycr{}\cr\egroup\egroup= }% - % To parse everything between @multitable and @item : -\setuptable#1 \endsetuptable - % Need to reset this to 0 after \setuptable. -\global\colcount=3D0\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=3D\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 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. -\ifnum\colcount=3D1 -\else - \ifsetpercent - \else - % If user has 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=3D\multitablecolspace: -\leftskip=3D\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 mark= ing - % characters. - \noindent\ignorespaces##\unskip\multistrut}\cr - % \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. -\global\everycr{\noalign{% -% \filbreak%% keeps underfull box messages off when table breaks over page= s. -% 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=3D0\relax}} +% +\newtoks\everytab % insert after every tab. +% +\envdef\multitable{% + \vskip\parskip + \startsavinginserts + % + % @item within a multitable starts a normal row. + \let\item\crcr + % + \tolerance=3D9500 + \hbadness=3D9500 + \setmultitablespacing + \parskip=3D\multitableparskip + \parindent=3D\multitableparindent + \overfullrule=3D0pt + \global\colcount=3D0 + % + \everycr =3D {% + \noalign{% + \global\everytab=3D{}% + \global\colcount=3D0 % Reset the column counter. + % Check for saved footnotes, etc. + \checkinserts + % Keeps underfull box messages off when table breaks over pages. + %\filbreak + % 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. + }% + }% + % + \parsearg\domultitable +} +\def\domultitable#1{% + % To parse everything between @multitable and @item: + \setuptable#1 \endsetuptable + % + % 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 + \multistrut + \vtop{% + % Use the current \colcount to find the correct column width: + \hsize=3D\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=3D0pt + \ifnum\colcount=3D1 + % 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=3D\multitablecolspace: + \leftskip=3D\multitablecolspace + \fi + % Ignoring space at the beginning and end avoids an occasional spuri= ous + % 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 coun= try. + % Is automatically provided with highlighting sequences respectively + % marking characters. + \noindent\ignorespaces##\unskip\multistrut + }\cr +} +\def\Emultitable{% + \crcr + \egroup % end the \halign + \global\setpercentfalse } =20 \def\setmultitablespacing{% test to see if user has set \multitablelinespa= ce. % If so, do nothing. If not, give it an appropriate dimension based on % current baselineskip. \ifdim\multitablelinespace=3D0pt +\setbox0=3D\vbox{X}\global\multitablelinespace=3D\the\baselineskip +\global\advance\multitablelinespace by-\ht0 %% strut to put in table in case some entry doesn't have descenders, %% to keep lines equally spaced \let\multistrut =3D \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 +%% FIXME: what is \box0 supposed to be? \gdef\multistrut{\vrule height\multitablelinespace depth\dp0 width0pt\relax} \fi +%% 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. \ifdim\multitableparskip>\multitablelinespace \global\multitableparskip=3D\multitablelinespace \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller @@ -2112,6 +2725,216 @@ \fi} =20 =20 +\message{conditionals,} + +% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, +% @ifnotxml always succeed. They currently do nothing; we don't +% attempt to check whether the conditionals are properly nested. But we +% have to remember that they are conditionals, so that @end doesn't +% attempt to close an environment group. +% +\def\makecond#1{% + \expandafter\let\csname #1\endcsname =3D \relax + \expandafter\let\csname iscond.#1\endcsname =3D 1 +} +\makecond{iftex} +\makecond{ifnotdocbook} +\makecond{ifnothtml} +\makecond{ifnotinfo} +\makecond{ifnotplaintext} +\makecond{ifnotxml} + +% Ignore @ignore, @ifhtml, @ifinfo, and the like. +% +\def\direntry{\doignore{direntry}} +\def\documentdescription{\doignore{documentdescription}} +\def\docbook{\doignore{docbook}} +\def\html{\doignore{html}} +\def\ifdocbook{\doignore{ifdocbook}} +\def\ifhtml{\doignore{ifhtml}} +\def\ifinfo{\doignore{ifinfo}} +\def\ifnottex{\doignore{ifnottex}} +\def\ifplaintext{\doignore{ifplaintext}} +\def\ifxml{\doignore{ifxml}} +\def\ignore{\doignore{ignore}} +\def\menu{\doignore{menu}} +\def\xml{\doignore{xml}} + +% Ignore text until a line `@end #1', keeping track of nested conditionals. +% +% A count to remember the depth of nesting. +\newcount\doignorecount + +\def\doignore#1{\begingroup + % Scan in ``verbatim'' mode: + \catcode`\@ =3D \other + \catcode`\{ =3D \other + \catcode`\} =3D \other + % + % Make sure that spaces turn into tokens that match what \doignoretext w= ants. + \spaceisspace + % + % Count number of #1's that we've seen. + \doignorecount =3D 0 + % + % Swallow text until we reach the matching `@end #1'. + \dodoignore {#1}% +} + +{ \catcode`_=3D11 % We want to use \_STOP_ which cannot appear in texinfo = source. + \obeylines % + % + \gdef\dodoignore#1{% + % #1 contains the string `ifinfo'. + % + % Define a command to find the next `@end #1', which must be on a line + % by itself. + \long\def\doignoretext##1^^M@end #1{\doignoretextyyy##1^^M@#1\_STOP_}% + % And this command to find another #1 command, at the beginning of a + % line. (Otherwise, we would consider a line `@c @ifset', for + % example, to count as an @ifset for nesting.) + \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% + % + % And now expand that command. + \obeylines % + \doignoretext ^^M% + }% +} + +\def\doignoreyyy#1{% + \def\temp{#1}% + \ifx\temp\empty % Nothing found. + \let\next\doignoretextzzz + \else % Found a nested condition, ... + \advance\doignorecount by 1 + \let\next\doignoretextyyy % ..., look for another. + % If we're here, #1 ends with ^^M\ifinfo (for example). + \fi + \next #1% the token \_STOP_ is present just after this macro. +} + +% We have to swallow the remaining "\_STOP_". +%=20 +\def\doignoretextzzz#1{% + \ifnum\doignorecount =3D 0 % We have just found the outermost @end. + \let\next\enddoignore + \else % Still inside a nested condition. + \advance\doignorecount by -1 + \let\next\doignoretext % Look for the next @end. + \fi + \next +} + +% Finish off ignored text. +\def\enddoignore{\endgroup\ignorespaces} + + +% @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. +% We rely on the fact that \parsearg sets \catcode`\ =3D10. +% +\parseargdef\set{\setyyy#1 \endsetyyy} +\def\setyyy#1 #2\endsetyyy{% + {% + \makevalueexpandable + \def\temp{#2}% + \edef\next{\gdef\makecsname{SET#1}}% + \ifx\temp\empty + \next{}% + \else + \setzzz#2\endsetzzz + \fi + }% +} +% Remove the trailing space \setxxx inserted. +\def\setzzz#1 \endsetzzz{\next{#1}} + +% @clear VAR clears (i.e., unsets) the variable VAR. +% +\parseargdef\clear{% + {% + \makevalueexpandable + \global\expandafter\let\csname SET#1\endcsname=3D\relax + }% +} + +% @value{foo} gets the text saved in variable foo. +\def\value{\begingroup\makevalueexpandable\valuexxx} +\def\valuexxx#1{\expandablevalue{#1}\endgroup} +{ + \catcode`\- =3D \active \catcode`\_ =3D \active + % + \gdef\makevalueexpandable{% + \let\value =3D \expandablevalue + % We don't want these characters active, ... + \catcode`\-=3D\other \catcode`\_=3D\other + % ..., but we might end up with active ones in the argument if + % we're called from @code, as @code{@value{foo-bar_}}, though. + % So \let them to their normal equivalents. + \let-\realdash \let_\normalunderscore + } +} + +% We have this subroutine so that we can handle at least some @value's +% properly in indexes (we call \makevalueexpandable in \indexdummies). +% The command has to be fully expandable (if the variable is set), since +% the result winds up in the index file. This means that if the +% variable's value contains other Texinfo commands, it's almost certain +% it will fail (although perhaps we could fix that with sufficient work +% to do a one-level expansion on the result, instead of complete). +% +\def\expandablevalue#1{% + \expandafter\ifx\csname SET#1\endcsname\relax + {[No value for ``#1'']}% + \message{Variable `#1', used in @value, is not set.}% + \else + \csname SET#1\endcsname + \fi +} + +% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined +% with @set. +% +% To get special treatment of `@end ifset,' call \makeond and the redefine. +% +\makecond{ifset} +\def\ifset{\parsearg{\doifset{\let\next=3D\ifsetfail}}} +\def\doifset#1#2{% + {% + \makevalueexpandable + \let\next=3D\empty + \expandafter\ifx\csname SET#2\endcsname\relax + #1% If not set, redefine \next. + \fi + \expandafter + }\next +} +\def\ifsetfail{\doignore{ifset}} + +% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been +% defined with @set, or has been undefined with @clear. +% +% The `\else' inside the `\doifset' parameter is a trick to reuse the +% above code: if the variable is not set, do nothing, if it is set, +% then redefine \next to \ifclearfail. +% +\makecond{ifclear} +\def\ifclear{\parsearg{\doifset{\else \let\next=3D\ifclearfail}}} +\def\ifclearfail{\doignore{ifclear}} + +% @dircategory CATEGORY -- specify a category of the dir file +% which this file should belong to. Ignore this in TeX. +\let\dircategory=3D\comment + +% @defininfoenclose. +\let\definfoenclose=3D\comment + + \message{indexing,} % Index generation facilities =20 @@ -2127,45 +2950,59 @@ % 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}} +% +\def\newindex#1{% + \iflinks + \expandafter\newwrite \csname#1indfile\endcsname + \openout \csname#1indfile\endcsname \jobname.#1 % Open the file + \fi + \expandafter\xdef\csname#1index\endcsname{% % Define @#1index + \noexpand\doindex{#1}} } =20 % @defindex foo =3D=3D \newindex{foo} - +% \def\defindex{\parsearg\newindex} =20 % 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} +% +\def\newcodeindex#1{% + \iflinks + \expandafter\newwrite \csname#1indfile\endcsname + \openout \csname#1indfile\endcsname \jobname.#1 + \fi + \expandafter\xdef\csname#1index\endcsname{% + \noexpand\docodeindex{#1}}% } =20 -\def\defcodeindex{\parsearg\newcodeindex} =20 % @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 inde= x. -\def\synindex #1 #2 {% -\expandafter\let\expandafter\synindexfoo\expandafter=3D\csname#2indfile\en= dcsname -\expandafter\let\csname#1indfile\endcsname=3D\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=3D\csname#2indfile\en= dcsname -\expandafter\let\csname#1indfile\endcsname=3D\synindexfoo -\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex -\noexpand\docodeindex {#2}}% +% +\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} +\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} + +% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), +% #3 the target index (bar). +\def\dosynindex#1#2#3{% + % Only do \closeout if we haven't already done it, else we'll end up + % closing the target index. + \expandafter \ifx\csname donesynindex#2\endcsname \undefined + % The \closeout helps reduce unnecessary open files; the limit on the + % Acorn RISC OS is a mere 16 files. + \expandafter\closeout\csname#2indfile\endcsname + \expandafter\let\csname\donesynindex#2\endcsname =3D 1 + \fi + % redefine \fooindfile: + \expandafter\let\expandafter\temp\expandafter=3D\csname#3indfile\endcsna= me + \expandafter\let\csname#2indfile\endcsname=3D\temp + % redefine \fooindex: + \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% } =20 % Define \doindex, the driver for all \fooindex macros. @@ -2185,200 +3022,392 @@ \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} =20 +% Take care of Texinfo commands that can appear in an index entry. +% Since there are some commands we want to expand, and others we don't, +% we have to laboriously prevent expansion for those that we don't. +% \def\indexdummies{% -% Take care of the plain tex accent commands. -\def\"{\realbackslash "}% -\def\`{\realbackslash `}% -\def\'{\realbackslash '}% -\def\^{\realbackslash ^}% -\def\~{\realbackslash ~}% -\def\=3D{\realbackslash =3D}% -\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\{ =3D \lbracecmd -%\let\} =3D \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\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}}% -\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 =3D\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\@{@}% change to @@ when we switch to @ as escape char in index file= s. + \def\ {\realbackslash\space }% + % Need these in case \tex is in effect and \{ is a \delimiter again. + % But can't use \lbracecmd and \rbracecmd because texindex assumes + % braces and backslashes are used only as delimiters. + \let\{ =3D \mylbrace + \let\} =3D \myrbrace + % + % \definedummyword defines \#1 as \realbackslash #1\space, thus + % effectively preventing its expansion. This is used only for control + % words, not control letters, because the \space would be incorrect + % for control characters, but is needed to separate the control word + % from whatever follows. + % + % For control letters, we have \definedummyletter, which omits the + % space. + % + % These can be used both for control words that take an argument and + % those that do not. If it is followed by {arg} in the input, then + % that will dutifully get written to the index (or wherever). + % + \def\definedummyword##1{% + \expandafter\def\csname ##1\endcsname{\realbackslash ##1\space}% + }% + \def\definedummyletter##1{% + \expandafter\def\csname ##1\endcsname{\realbackslash ##1}% + }% + % + % Do the redefinitions. + \commondummies +} =20 -\def\indexnofonts{% -% Just ignore accents. -\let\,=3D\indexdummyfont -\let\"=3D\indexdummyfont -\let\`=3D\indexdummyfont -\let\'=3D\indexdummyfont -\let\^=3D\indexdummyfont -\let\~=3D\indexdummyfont -\let\=3D=3D\indexdummyfont -\let\b=3D\indexdummyfont -\let\c=3D\indexdummyfont -\let\d=3D\indexdummyfont -\let\u=3D\indexdummyfont -\let\v=3D\indexdummyfont -\let\H=3D\indexdummyfont -\let\dotless=3D\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=3D\indexdummyfont -\let\t=3D\indexdummyfont -\let\r=3D\indexdummyfont -\let\i=3D\indexdummyfont -\let\b=3D\indexdummyfont -\let\emph=3D\indexdummyfont -\let\strong=3D\indexdummyfont -\let\cite=3D\indexdummyfont -\let\sc=3D\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=3D\indexdummyfont -\let\tclose=3D\indexdummyfont -\let\code=3D\indexdummyfont -\let\file=3D\indexdummyfont -\let\samp=3D\indexdummyfont -\let\kbd=3D\indexdummyfont -\let\key=3D\indexdummyfont -\let\var=3D\indexdummyfont -\let\TeX=3D\indexdummytex -\let\dots=3D\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. +% For the aux file, @ is the escape character. So we want to redefine +% everything using @ instead of \realbackslash. When everything uses +% @, this will be simpler. +% +\def\atdummies{% + \def\@{@@}% + \def\ {@ }% + \let\{ =3D \lbraceatcmd + \let\} =3D \rbraceatcmd + % + % (See comments in \indexdummies.) + \def\definedummyword##1{% + \expandafter\def\csname ##1\endcsname{@##1\space}% + }% + \def\definedummyletter##1{% + \expandafter\def\csname ##1\endcsname{@##1}% + }% + % + % Do the redefinitions. + \commondummies +} + +% Called from \indexdummies and \atdummies. \definedummyword and +% \definedummyletter must be defined first. +% +\def\commondummies{% + % + \normalturnoffactive + % + \commondummiesnofonts + % + \definedummyletter{_}% + % + % Non-English letters. + \definedummyword{AA}% + \definedummyword{AE}% + \definedummyword{L}% + \definedummyword{OE}% + \definedummyword{O}% + \definedummyword{aa}% + \definedummyword{ae}% + \definedummyword{l}% + \definedummyword{oe}% + \definedummyword{o}% + \definedummyword{ss}% + \definedummyword{exclamdown}% + \definedummyword{questiondown}% + \definedummyword{ordf}% + \definedummyword{ordm}% + % + % Although these internal commands shouldn't show up, sometimes they do. + \definedummyword{bf}% + \definedummyword{gtr}% + \definedummyword{hat}% + \definedummyword{less}% + \definedummyword{sf}% + \definedummyword{sl}% + \definedummyword{tclose}% + \definedummyword{tt}% + % + \definedummyword{LaTeX}% + \definedummyword{TeX}% + % + % Assorted special characters. + \definedummyword{bullet}% + \definedummyword{copyright}% + \definedummyword{registeredsymbol}% + \definedummyword{dots}% + \definedummyword{enddots}% + \definedummyword{equiv}% + \definedummyword{error}% + \definedummyword{expansion}% + \definedummyword{minus}% + \definedummyword{pounds}% + \definedummyword{point}% + \definedummyword{print}% + \definedummyword{result}% + % + % Handle some cases of @value -- where it does not contain any + % (non-fully-expandable) commands. + \makevalueexpandable + % + % Normal spaces, not active ones. + \unsepspaces + % + % No macro expansion. + \turnoffmacros +} =20 -{\catcode`\@=3D0 \catcode`\\=3D\other -@gdef@realbackslash{\}} +% \commondummiesnofonts: common to \commondummies and \indexnofonts. +% +% Better have this without active chars. +{ + \catcode`\~=3D\other + \gdef\commondummiesnofonts{% + % Control letters and accents. + \definedummyletter{!}% + \definedummyletter{"}% + \definedummyletter{'}% + \definedummyletter{*}% + \definedummyletter{,}% + \definedummyletter{.}% + \definedummyletter{/}% + \definedummyletter{:}% + \definedummyletter{=3D}% + \definedummyletter{?}% + \definedummyletter{^}% + \definedummyletter{`}% + \definedummyletter{~}% + \definedummyword{u}% + \definedummyword{v}% + \definedummyword{H}% + \definedummyword{dotaccent}% + \definedummyword{ringaccent}% + \definedummyword{tieaccent}% + \definedummyword{ubaraccent}% + \definedummyword{udotaccent}% + \definedummyword{dotless}% + % + % Texinfo font commands. + \definedummyword{b}% + \definedummyword{i}% + \definedummyword{r}% + \definedummyword{sc}% + \definedummyword{t}% + % + % Commands that take arguments. + \definedummyword{acronym}% + \definedummyword{cite}% + \definedummyword{code}% + \definedummyword{command}% + \definedummyword{dfn}% + \definedummyword{emph}% + \definedummyword{env}% + \definedummyword{file}% + \definedummyword{kbd}% + \definedummyword{key}% + \definedummyword{math}% + \definedummyword{option}% + \definedummyword{samp}% + \definedummyword{strong}% + \definedummyword{tie}% + \definedummyword{uref}% + \definedummyword{url}% + \definedummyword{var}% + \definedummyword{verb}% + \definedummyword{w}% + } +} + +% \indexnofonts is used when outputting the strings to sort the index +% by, and when constructing control sequence names. It eliminates all +% control sequences and just writes whatever the best ASCII sort string +% would be for a given command (usually its argument). +% +\def\indexnofonts{% + \def\definedummyword##1{% + \expandafter\let\csname ##1\endcsname\asis + }% + % We can just ignore the accent commands and other control letters. + \def\definedummyletter##1{% + \expandafter\def\csname ##1\endcsname{}% + }% + % + \commondummiesnofonts + % + % Don't no-op \tt, since it isn't a user-level command + % and is used in the definitions of the active chars like <, >, |, etc. + % Likewise with the other plain tex font commands. + %\let\tt=3D\asis + % + \def\ { }% + \def\@{@}% + % how to handle braces? + \def\_{\normalunderscore}% + % + % Non-English letters. + \def\AA{AA}% + \def\AE{AE}% + \def\L{L}% + \def\OE{OE}% + \def\O{O}% + \def\aa{aa}% + \def\ae{ae}% + \def\l{l}% + \def\oe{oe}% + \def\o{o}% + \def\ss{ss}% + \def\exclamdown{!}% + \def\questiondown{?}% + \def\ordf{a}% + \def\ordm{o}% + % + \def\LaTeX{LaTeX}% + \def\TeX{TeX}% + % + % Assorted special characters. + % (The following {} will end up in the sort string, but that's ok.) + \def\bullet{bullet}% + \def\copyright{copyright}% + \def\registeredsymbol{R}% + \def\dots{...}% + \def\enddots{...}% + \def\equiv{=3D=3D}% + \def\error{error}% + \def\expansion{=3D=3D>}% + \def\minus{-}% + \def\pounds{pounds}% + \def\point{.}% + \def\print{-|}% + \def\result{=3D>}% +} =20 \let\indexbackslash=3D0 %overridden during \printindex. +\let\SETmarginindex=3D\relax % put index entries in margin (undocumented)? + +% Most index entries go through here, but \dosubind is the general case. +% #1 is the index name, #2 is the entry text. +\def\doind#1#2{\dosubind{#1}{#2}{}} + +% Workhorse for all \fooindexes. +% #1 is name of index, #2 is stuff to put there, #3 is subentry -- +% empty if called from \doind, as we usually are (the main exception +% is with most defuns, which call us directly). +% +\def\dosubind#1#2#3{% + \iflinks + {% + % Store the main index entry text (including the third arg). + \toks0 =3D {#2}% + % If third arg is present, precede it with a space. + \def\thirdarg{#3}% + \ifx\thirdarg\empty \else + \toks0 =3D \expandafter{\the\toks0 \space #3}% + \fi + % + \edef\writeto{\csname#1indfile\endcsname}% + % + \ifvmode + \dosubindsanitize + \else + \dosubindwrite + \fi + }% + \fi +} =20 -\let\SETmarginindex=3D\relax %initialize! -% workhorse for all \fooindexes -% #1 is name of index, #2 is stuff to put there -\def\doind #1#2{% +% Write the entry in \toks0 to the index file: +% +\def\dosubindwrite{% % Put the index entry in the margin if desired. \ifx\SETmarginindex\relax\else - \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}% + \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% \fi - {% - \count255=3D\lastpenalty - {% - \indexdummies % Must do this here, since \bf, etc expand at this sta= ge - \escapechar=3D`\\ - {% - \let\folio=3D0% We will expand all macros now EXCEPT \folio. - \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't define= d 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 =3D {#2}% - \edef\temp{% - \write\csname#1indfile\endcsname{% - \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}% - }% - \temp - }% - }% - \penalty\count255 + % + % Remember, we are within a group. + \indexdummies % Must do this here, since \bf, etc expand at this stage + \escapechar=3D`\\ + \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now + % so it will be output as is; and it will print as backslash. + % + % Process the index entry with all font commands turned off, to + % get the string to sort by. + {\indexnofonts + \edef\temp{\the\toks0}% need full expansion + \xdef\indexsorttmp{\temp}% + }% + % + % Set up the complete index entry, with both the sort key and + % the original text, including any font commands. We write + % three arguments to \entry to the .?? file (four in the + % subentry case), texindex reduces to two when writing the .??s + % sorted result. + \edef\temp{% + \write\writeto{% + \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% }% + \temp } =20 -\def\dosubind #1#2#3{% -{\count10=3D\lastpenalty % -{\indexdummies % Must do this here, since \bf, etc expand at this stage -\escapechar=3D`\\% -{\let\folio=3D0% -\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}} +% Take care of unwanted page breaks: +% +% If a skip is the last thing on the list now, preserve it +% by backing up by \lastskip, doing the \write, then inserting +% the skip again. Otherwise, the whatsit generated by the +% \write will make \lastskip zero. The result is that sequences +% like this: +% @end defun +% @tindex whatever +% @defun ... +% will have extra space inserted, because the \medbreak in the +% start of the @defun won't see the skip inserted by the @end of +% the previous defun. +% +% But don't do any of this if we're not in vertical mode. We +% don't want to do a \vskip and prematurely end a paragraph. +% +% Avoid page breaks due to these extra skips, too. +% +% But wait, there is a catch there: +% We'll have to check whether \lastskip is zero skip. \ifdim is not +% sufficient for this purpose, as it ignores stretch and shrink parts +% of the skip. The only way seems to be to check the textual +% representation of the skip. +% +% The following is almost like \def\zeroskipmacro{0.0pt} except that +% the ``p'' and ``t'' characters have catcode \other, not 11 (letter). +% +\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} +% +% ..., ready, GO: +% +\def\dosubindsanitize{% + % \lastskip and \lastpenalty cannot both be nonzero simultaneously. + \skip0 =3D \lastskip + \edef\lastskipmacro{\the\lastskip}% + \count255 =3D \lastpenalty + % + % If \lastskip is nonzero, that means the last item was a + % skip. And since a skip is discardable, that means this + % -\skip0 glue we're inserting is preceded by a + % non-discardable item, therefore it is not a potential + % breakpoint, therefore no \nobreak needed. + \ifx\lastskipmacro\zeroskipmacro + \else + \vskip-\skip0 + \fi + % + \dosubindwrite + % + \ifx\lastskipmacro\zeroskipmacro + % if \lastskip was zero, perhaps the last item was a + % penalty, and perhaps it was >=3D10000, e.g., a \nobreak. + % In that case, we want to re-insert the penalty; since we + % just inserted a non-discardable item, any following glue + % (such as a \parskip) would be a breakpoint. For example: + % @deffn deffn-whatever + % @vindex index-whatever + % Description. + % would allow a break between the index-whatever whatsit + % and the "Description." paragraph. + \ifnum\count255>9999 \nobreak \fi + \else + % On the other hand, if we had a nonzero \lastskip, + % this make-up glue would be preceded by a non-discardable item + % (the whatsit from the \write), so we must insert a \nobreak. + \nobreak\vskip\skip0 + \fi +} =20 % The index entry written in the file actually looks like % \entry {sortstring}{page}{topic} @@ -2415,22 +3444,26 @@ % @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 +\parseargdef\printindex{\begingroup \dobreak \chapheadingskip{10000}% % - \indexfonts \rm + \smallfonts \rm \tolerance =3D 9500 - \indexbreaks + \everypar =3D {}% don't want the \kern\-parindent from indentation suppr= ession. % % 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`\@ =3D 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) + \putwordIndexNonexistent \else % % If the index file exists but is empty, then \openin leaves \ifeof @@ -2438,14 +3471,13 @@ % it can discover if there is anything in it. \read 1 to \temp \ifeof 1 - (Index is empty) + \putwordIndexIsEmpty \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 chan= ge % to make right now. - \def\indexbackslash{\rawbackslashxx}% + \def\indexbackslash{\backslashcurfont}% \catcode`\\ =3D 0 - \catcode`\@ =3D 11 \escapechar =3D `\\ \begindoublecolumns \input \jobname.#1s @@ -2458,77 +3490,119 @@ % These macros are used by the sorted index file itself. % Change them to control the appearance of the index. =20 -% Same as \bigskipamount except no shrink. -% \balancecolumns gets confused if there is any shrink. -\newskip\initialskipamount \initialskipamount 12pt plus4pt - -\def\initial #1{% -{\let\tentt=3D\sectt \let\tt=3D\sectt \let\sf=3D\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 =3D 0in - % - % No extra space above this paragraph. - \parskip =3D 0in - % - % Do not prefer a separate line ending with a hyphen to fewer lines. - \finalhyphendemerits =3D 0 +\def\initial#1{{% + % Some minor font changes for the special characters. + \let\tentt=3D\sectt \let\tt=3D\sectt \let\sf=3D\sectt + % + % Remove any glue we may have, we'll be inserting our own. + \removelastskip + % + % We like breaks before the index initials, so insert a bonus. + \penalty -300 + % + % Typeset the initial. Making this add up to a whole number of + % baselineskips increases the chance of the dots lining up from column + % to column. It still won't often be perfect, because of the stretch + % we need before each entry, but it's better. + % + % No shrink because it confuses \balancecolumns. + \vskip 1.67\baselineskip plus .5\baselineskip + \leftline{\secbf #1}% + \vskip .33\baselineskip plus .1\baselineskip % - % \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=3D2em - % - % When the entry text needs to be broken, just fill out the first line - % with blank space. - \rightskip =3D 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} + % Do our best not to break after the initial. + \nobreak +}} + +% \entry typesets a paragraph consisting of the text (#1), dot leaders, and +% then page number (#2) flushed to the right margin. It is used for index +% and table of contents entries. The paragraph is indented by \leftskip. +% +% A straightforward implementation would start like this: +% \def\entry#1#2{... +% But this frozes the catcodes in the argument, and can cause problems to +% @code, which sets - active. This problem was fixed by a kludge--- +% ``-'' was active throughout whole index, but this isn't really right. +%=20 +% The right solution is to prevent \entry from swallowing the whole text. +% --kasal, 21nov03 +\def\entry{% + \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 =3D 0in + % + % No extra space above this paragraph. + \parskip =3D 0in + % + % Do not prefer a separate line ending with a hyphen to fewer lines. + \finalhyphendemerits =3D 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 =3D 2em + % + % When the entry text needs to be broken, just fill out the first line + % with blank space. + \rightskip =3D 0pt plus1fil + % + % A bit of stretch before each entry for the benefit of balancing + % columns. + \vskip 0pt plus1pt + % + % Swallow the left brace of the text (first parameter): + \afterassignment\doentry + \let\temp =3D +} +\def\doentry{% + \bgroup % Instead of the swallowed brace. + \noindent + \aftergroup\finishentry + % And now comes the text of the entry. +} +\def\finishentry#1{% + % #1 is the page number. + % + % 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{#1}% + \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. + \ifpdf + \pdfgettoks#1.% + \ \the\toksA + \else + \ #1% + \fi + \fi + \par + \endgroup +} =20 % Like \dotfill except takes at least 1 em. \def\indexdotfill{\cleaders @@ -2537,11 +3611,18 @@ \def\primary #1{\line{#1\hfil}} =20 \newskip\secondaryindent \secondaryindent=3D0.5cm - -\def\secondary #1#2{ -{\parfillskip=3D0in \parskip=3D0in -\hangindent =3D1in \hangafter=3D1 -\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\par +\def\secondary#1#2{{% + \parfillskip=3D0in + \parskip=3D0in + \hangindent=3D1in + \hangafter=3D1 + \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill + \ifpdf + \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. + \else + #2 + \fi + \par }} =20 % Define two-column mode, which we use to typeset indexes. @@ -2554,27 +3635,29 @@ =20 \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns % Grab any single-column material above us. - \output =3D {\global\setbox\partialpage =3D \vbox{% - %=20 + \output =3D {% + % % 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 =3D {\doublecolumnout}% + % that case we just ship out what is in \partialpage with the normal + % output routine. Generally, \partialpage will be empty when this + % runs and this will be a no-op. See the indexspread.tex test case. + \ifvoid\partialpage \else + \onepageout{\pagecontents\partialpage}% + \fi + % + \global\setbox\partialpage =3D \vbox{% + % Unvbox the main output page. + \unvbox\PAGE + \kern-\topskip \kern\baselineskip + }% + }% + \eject % run that output routine to set \partialpage + % + % Use the double-column output routine for subsequent pages. + \output =3D {\doublecolumnout}% % % Change the page size parameters. We could do this once outside this % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 @@ -2601,57 +3684,99 @@ % since nobody clobbers \vsize.) \vsize =3D 2\vsize } + +% The double-column output routine for all double-column pages except +% the last. +% \def\doublecolumnout{% \splittopskip=3D\topskip \splitmaxdepth=3D\maxdepth % Get the available space for the double columns -- the normal % (undoubled) page height minus any material left over from the % previous page. - \dimen@=3D\pageheight \advance\dimen@ by-\ht\partialpage + \dimen@ =3D \vsize + \divide\dimen@ by 2 + \advance\dimen@ by -\ht\partialpage + % % box0 will be the left-hand column, box2 the right. \setbox0=3D\vsplit255 to\dimen@ \setbox2=3D\vsplit255 to\dimen@ \onepageout\pagesofar \unvbox255 \penalty\outputpenalty } +% +% Re-output the contents of the output page -- any previous material, +% followed by the two boxes we just split, in box0 and box2. \def\pagesofar{% - % Re-output the contents of the output page -- any previous material, - % followed by the two boxes we just split. \unvbox\partialpage + % \hsize =3D \doublecolumnhsize - \wd0=3D\hsize \wd2=3D\hsize \hbox to\pagewidth{\box0\hfil\box2}% + \wd0=3D\hsize \wd2=3D\hsize + \hbox to\pagewidth{\box0\hfil\box2}% } +% +% All done with double columns. \def\enddoublecolumns{% - \output =3D {\balancecolumns}\eject % split what we have + \output =3D {% + % Split the last of the double-column material. Leave it on the + % current page, no automatic page break. + \balancecolumns + % + % If we end up splitting too much material for the current page, + % though, there will be another page break right after this \output + % invocation ends. Having called \balancecolumns once, we do not + % want to call it again. Therefore, reset \output to its normal + % definition right away. (We hope \balancecolumns will never be + % called on to balance too much material, but if it is, this makes + % the output somewhat more palatable.) + \global\output =3D {\onepageout{\pagecontents\PAGE}}% + }% + \eject \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 was set to the doubled \vsize above, since we restarted + % the current page. We're now back to normal single-column + % typesetting, so reset \pagegoal to the normal \vsize (after the + % \endgroup where \vsize got restored). \pagegoal =3D \vsize } +% +% Called at the end of the double column material. \def\balancecolumns{% - % Called at the end of the double column material. - \setbox0 =3D \vbox{\unvbox255}% + \setbox0 =3D \vbox{\unvbox255}% like \box255 but more efficient, see p.1= 20. \dimen@ =3D \ht0 \advance\dimen@ by \topskip \advance\dimen@ by-\baselineskip - \divide\dimen@ by 2 + \divide\dimen@ by 2 % target to split to + %debug\message{final 2-column material height=3D\the\ht0, target=3D\the\= dimen@.}% \splittopskip =3D \topskip % Loop until we get a decent breakpoint. - {\vbadness=3D10000 \loop - \global\setbox3=3D\copy0 - \global\setbox1=3D\vsplit3 to\dimen@ - \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt - \repeat}% + {% + \vbadness =3D 10000 + \loop + \global\setbox3 =3D \copy0 + \global\setbox1 =3D \vsplit3 to \dimen@ + \ifdim\ht3>\dimen@ + \global\advance\dimen@ by 1pt + \repeat + }% + %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.= }% \setbox0=3D\vbox to\dimen@{\unvbox1}% \setbox2=3D\vbox to\dimen@{\unvbox3}% + % \pagesofar } \catcode`\@ =3D \other =20 =20 \message{sectioning,} -% Define chapters, sections, etc. +% Chapters, sections, etc. =20 +% \unnumberedno is an oxymoron, of course. But we count the unnumbered +% sections so that we can refer to them unambiguously in the pdf +% outlines by their "section number". We avoid collisions with chapter +% numbers by starting them at 10000. (If a document ever has 10000 +% chapters, we're in trouble anyway, I'm sure.) +\newcount\unnumberedno \unnumberedno =3D 10000 \newcount\chapno \newcount\secno \secno=3D0 \newcount\subsecno \subsecno=3D0 @@ -2659,55 +3784,55 @@ =20 % This counter is funny since it counts through charcodes of letters A, B,= ... \newcount\appendixno \appendixno =3D `\@ -\def\appendixletter{\char\the\appendixno} - -\newwrite\contentsfile -% This is called from \setfilename. -\def\opencontents{\openout\contentsfile =3D \jobname.toc } +% +% \def\appendixletter{\char\the\appendixno} +% We do the following ugly conditional instead of the above simple +% construct for the sake of pdftex, which needs the actual +% letter in the expansion, not just typeset. +%=20 +\def\appendixletter{% + \ifnum\appendixno=3D`A A% + \else\ifnum\appendixno=3D`B B% + \else\ifnum\appendixno=3D`C C% + \else\ifnum\appendixno=3D`D D% + \else\ifnum\appendixno=3D`E E% + \else\ifnum\appendixno=3D`F F% + \else\ifnum\appendixno=3D`G G% + \else\ifnum\appendixno=3D`H H% + \else\ifnum\appendixno=3D`I I% + \else\ifnum\appendixno=3D`J J% + \else\ifnum\appendixno=3D`K K% + \else\ifnum\appendixno=3D`L L% + \else\ifnum\appendixno=3D`M M% + \else\ifnum\appendixno=3D`N N% + \else\ifnum\appendixno=3D`O O% + \else\ifnum\appendixno=3D`P P% + \else\ifnum\appendixno=3D`Q Q% + \else\ifnum\appendixno=3D`R R% + \else\ifnum\appendixno=3D`S S% + \else\ifnum\appendixno=3D`T T% + \else\ifnum\appendixno=3D`U U% + \else\ifnum\appendixno=3D`V V% + \else\ifnum\appendixno=3D`W W% + \else\ifnum\appendixno=3D`X X% + \else\ifnum\appendixno=3D`Y Y% + \else\ifnum\appendixno=3D`Z Z% + % The \the is necessary, despite appearances, because \appendixletter is + % expanded while writing the .toc file. \char\appendixno is not + % expandable, thus it is written literally, thus all appendixes come out + % with the same letter (or @) in the toc without it. + \else\char\the\appendixno + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} =20 % 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=3D\relax - \let\frenchspacing=3D\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\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}}% -} +% page headings and footings can use it. @section does likewise. +% However, they are not reliable, because we don't use marks. +\def\thischapter{} +\def\thissection{} =20 \newcount\absseclevel % used to calculate proper heading level -\newcount\secbase\secbase=3D0 % @raise/lowersections modify this count +\newcount\secbase\secbase=3D0 % @raisesections/@lowersections modify this = count =20 % @raisesections: treat @section as chapter, @subsection as section, etc. \def\raisesections{\global\advance\secbase by -1} @@ -2717,308 +3842,250 @@ \def\lowersections{\global\advance\secbase by 1} \let\down=3D\lowersections % original BFox name =20 -% 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=3D\secbase\advance\absseclevel by #1 -\ifcase\absseclevel - \chapterzzz{#2} -\or - \seczzz{#2} -\or - \numberedsubseczzz{#2} -\or - \numberedsubsubseczzz{#2} -\else - \ifnum \absseclevel<0 - \chapterzzz{#2} +% we only have subsub. +\chardef\maxseclevel =3D 3 +% +% A numbered section within an unnumbered changes to unnumbered too. +% To achive this, remember the "biggest" unnum. sec. we are currently in: +\chardef\unmlevel =3D \maxseclevel +% +% Trace whether the current chapter is an appendix or not: +% \chapheadtype is "N" or "A", unnumbered chapters are ignored. +\def\chapheadtype{N} + +% Choose a heading macro +% #1 is heading type +% #2 is heading level +% #3 is text for heading +\def\genhead#1#2#3{% + % Compute the abs. sec. level: + \absseclevel=3D#2 + \advance\absseclevel by \secbase + % Make sure \absseclevel doesn't fall outside the range: + \ifnum \absseclevel < 0 + \absseclevel =3D 0 \else - \numberedsubsubseczzz{#2} + \ifnum \absseclevel > 3 + \absseclevel =3D 3 + \fi \fi -\fi -} - -% like \numhead, but chooses appendix heading levels -\def\apphead#1#2{\absseclevel=3D\secbase\advance\absseclevel by #1 -\ifcase\absseclevel - \appendixzzz{#2} -\or - \appendixsectionzzz{#2} -\or - \appendixsubseczzz{#2} -\or - \appendixsubsubseczzz{#2} -\else - \ifnum \absseclevel<0 - \appendixzzz{#2} + % The heading type: + \def\headtype{#1}% + \if \headtype U% + \ifnum \absseclevel < \unmlevel + \chardef\unmlevel =3D \absseclevel + \fi \else - \appendixsubsubseczzz{#2} + % Check for appendix sections: + \ifnum \absseclevel =3D 0 + \edef\chapheadtype{\headtype}% + \else + \if \headtype A\if \chapheadtype N% + \errmessage{@appendix... within a non-appendix chapter}% + \fi\fi + \fi + % Check for numbered within unnumbered: + \ifnum \absseclevel > \unmlevel + \def\headtype{U}% + \else + \chardef\unmlevel =3D 3 + \fi \fi -\fi -} - -% like \numhead, but chooses numberless heading levels -\def\unnmhead#1#2{\absseclevel=3D\secbase\advance\absseclevel by #1 -\ifcase\absseclevel - \unnumberedzzz{#2} -\or - \unnumberedseczzz{#2} -\or - \unnumberedsubseczzz{#2} -\or - \unnumberedsubsubseczzz{#2} -\else - \ifnum \absseclevel<0 - \unnumberedzzz{#2} + % Now print the heading: + \if \headtype U% + \ifcase\absseclevel + \unnumberedzzz{#3}% + \or \unnumberedseczzz{#3}% + \or \unnumberedsubseczzz{#3}% + \or \unnumberedsubsubseczzz{#3}% + \fi \else - \unnumberedsubsubseczzz{#2} + \if \headtype A% + \ifcase\absseclevel + \appendixzzz{#3}% + \or \appendixsectionzzz{#3}% + \or \appendixsubseczzz{#3}% + \or \appendixsubsubseczzz{#3}% + \fi + \else + \ifcase\absseclevel + \chapterzzz{#3}% + \or \seczzz{#3}% + \or \numberedsubseczzz{#3}% + \or \numberedsubsubseczzz{#3}% + \fi + \fi \fi -\fi + \suppressfirstparagraphindent } =20 +% an interface: +\def\numhead{\genhead N} +\def\apphead{\genhead A} +\def\unnmhead{\genhead U} =20 -\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=3D0 \subsecno=3D0 \subsubsecno=3D0 -\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 =3D {#1}% -\edef\temp{{\realbackslash chapentry{\the\toks0}{\the\chapno}{\noexpand\fo= lio}}}% -\escapechar=3D`\\% -\write \contentsfile \temp % -\donoderef % -\global\let\section =3D \numberedsec -\global\let\subsection =3D \numberedsubsec -\global\let\subsubsection =3D \numberedsubsubsec -}} - -\outer\def\appendix{\parsearg\appendixyyy} -\def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz -\def\appendixzzz #1{\seccheck{appendix}% -\secno=3D0 \subsecno=3D0 \subsubsecno=3D0 -\global\advance \appendixno by 1 \message{Appendix \appendixletter}% -\chapmacro {#1}{\putwordAppendix{} \appendixletter}% -\gdef\thissection{#1}% -\gdef\thischaptername{#1}% -\xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischapte= rname}% -{\chapternofonts% -\toks0 =3D {#1}% -\edef\temp{{\realbackslash chapentry{\the\toks0}% - {\putwordAppendix{} \appendixletter}{\noexpand\folio}}}% -\escapechar=3D`\\% -\write \contentsfile \temp % -\appendixnoderef % -\global\let\section =3D \appendixsec -\global\let\subsection =3D \appendixsubsec -\global\let\subsubsection =3D \appendixsubsubsec -}} +% @chapter, @appendix, @unnumbered. Increment top-level counter, reset +% all lower-level sectioning counters to zero. +%=20 +% Also set \chaplevelprefix, which we prepend to @float sequence numbers +% (e.g., figures), q.v. By default (before any chapter), that is empty. +\let\chaplevelprefix =3D \empty +%=20 +\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapte= rzzz +\def\chapterzzz#1{% + % section resetting is \global in case the chapter is in a group, such + % as an @include file. + \global\secno=3D0 \global\subsecno=3D0 \global\subsubsecno=3D0 + \global\advance\chapno by 1 + % + % Used for \float. + \gdef\chaplevelprefix{\the\chapno.}% + \resetallfloatnos + % + \message{\putwordChapter\space \the\chapno}% + % + % Write the actual heading. + \chapmacro{#1}{Ynumbered}{\the\chapno}% + % + % So @section and the like are numbered underneath this chapter. + \global\let\section =3D \numberedsec + \global\let\subsection =3D \numberedsubsec + \global\let\subsubsection =3D \numberedsubsubsec +} + +\outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appen= dixzzz +\def\appendixzzz#1{% + \global\secno=3D0 \global\subsecno=3D0 \global\subsubsecno=3D0 + \global\advance\appendixno by 1 + \gdef\chaplevelprefix{\appendixletter.}% + \resetallfloatnos + % + \def\appendixnum{\putwordAppendix\space \appendixletter}% + \message{\appendixnum}% + % + \chapmacro{#1}{Yappendix}{\appendixletter}% + % + \global\let\section =3D \appendixsec + \global\let\subsection =3D \appendixsubsec + \global\let\subsubsection =3D \appendixsubsubsec +} + +\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls u= nnumberedzzz +\def\unnumberedzzz#1{% + \global\secno=3D0 \global\subsecno=3D0 \global\subsubsecno=3D0 + \global\advance\unnumberedno by 1 + % + % Since an unnumbered has no number, no prefix for figures. + \global\let\chaplevelprefix =3D \empty + \resetallfloatnos + % + % 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 . (We also do this for + % the toc entries.) + \toks0 =3D {#1}% + \message{(\the\toks0)}% + % + \chapmacro{#1}{Ynothing}{\the\unnumberedno}% + % + \global\let\section =3D \unnumberedsec + \global\let\subsection =3D \unnumberedsubsec + \global\let\subsubsection =3D \unnumberedsubsubsec +} =20 % @centerchap is like @unnumbered, but the heading is centered. -\outer\def\centerchap{\parsearg\centerchapyyy} -\def\centerchapyyy #1{{\let\unnumbchapmacro=3D\centerchapmacro \unnumbered= yyy{#1}}} - -\outer\def\top{\parsearg\unnumberedyyy} -\outer\def\unnumbered{\parsearg\unnumberedyyy} -\def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumbere= dzzz -\def\unnumberedzzz #1{\seccheck{unnumbered}% -\secno=3D0 \subsecno=3D0 \subsubsecno=3D0 -% -% 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 =3D {#1}\message{(\the\toks0)}% -% -\unnumbchapmacro {#1}% -\gdef\thischapter{#1}\gdef\thissection{#1}% -{\chapternofonts% -\toks0 =3D {#1}% -\edef\temp{{\realbackslash unnumbchapentry{\the\toks0}{\noexpand\folio}}}% -\escapechar=3D`\\% -\write \contentsfile \temp % -\unnumbnoderef % -\global\let\section =3D \unnumberedsec -\global\let\subsection =3D \unnumberedsubsec -\global\let\subsubsection =3D \unnumberedsubsubsec -}} - -\outer\def\numberedsec{\parsearg\secyyy} -\def\secyyy #1{\numhead1{#1}} % normally calls seczzz -\def\seczzz #1{\seccheck{section}% -\subsecno=3D0 \subsubsecno=3D0 \global\advance \secno by 1 % -\gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}% -{\chapternofonts% -\toks0 =3D {#1}% -\edef\temp{{\realbackslash secentry % -{\the\toks0}{\the\chapno}{\the\secno}{\noexpand\folio}}}% -\escapechar=3D`\\% -\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=3D0 \subsubsecno=3D0 \global\advance \secno by 1 % -\gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}% -{\chapternofonts% -\toks0 =3D {#1}% -\edef\temp{{\realbackslash secentry % -{\the\toks0}{\appendixletter}{\the\secno}{\noexpand\folio}}}% -\escapechar=3D`\\% -\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 =3D {#1}% -\edef\temp{{\realbackslash unnumbsecentry{\the\toks0}{\noexpand\folio}}}% -\escapechar=3D`\\% -\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=3D0 \global\advance \subsecno by 1 % -\subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}% -{\chapternofonts% -\toks0 =3D {#1}% -\edef\temp{{\realbackslash subsecentry % -{\the\toks0}{\the\chapno}{\the\secno}{\the\subsecno}{\noexpand\folio}}}% -\escapechar=3D`\\% -\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=3D0 \global\advance \subsecno by 1 % -\subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}% -{\chapternofonts% -\toks0 =3D {#1}% -\edef\temp{{\realbackslash subsecentry % -{\the\toks0}{\appendixletter}{\the\secno}{\the\subsecno}{\noexpand\folio}}= }% -\escapechar=3D`\\% -\write \contentsfile \temp % -\appendixnoderef % -\penalty 10000 % -}} - -\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy} -\def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubs= eczzz -\def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}% -\plainsubsecheading {#1}\gdef\thissection{#1}% -{\chapternofonts% -\toks0 =3D {#1}% -\edef\temp{{\realbackslash unnumbsubsecentry{\the\toks0}{\noexpand\folio}}= }% -\escapechar=3D`\\% -\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 =3D {#1}% -\edef\temp{{\realbackslash subsubsecentry{\the\toks0} - {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno} - {\noexpand\folio}}}% -\escapechar=3D`\\% -\write \contentsfile \temp % -\donoderef % -\penalty 10000 % -}} +\outer\parseargdef\centerchap{% + % Well, we could do the following in a group, but that would break + % an assumption that \chapmacro is called at the outermost level. + % Thus we are safer this way: --kasal, 24feb04 + \let\centerparametersmaybe =3D \centerparameters + \unnmhead0{#1}% + \let\centerparametersmaybe =3D \relax +} =20 -\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 =3D {#1}% -\edef\temp{{\realbackslash subsubsecentry{\the\toks0}% - {\appendixletter} - {\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}% -\escapechar=3D`\\% -\write \contentsfile \temp % -\appendixnoderef % -\penalty 10000 % -}} +% @top is like @unnumbered. +\let\top\unnumbered =20 -\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy} -\def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubs= eczzz -\def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}% -\plainsubsubsecheading {#1}\gdef\thissection{#1}% -{\chapternofonts% -\toks0 =3D {#1}% -\edef\temp{{\realbackslash unnumbsubsubsecentry{\the\toks0}{\noexpand\foli= o}}}% -\escapechar=3D`\\% -\write \contentsfile \temp % -\unnumbnoderef % -\penalty 10000 % -}} +% Sections. +\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz +\def\seczzz#1{% + \global\subsecno=3D0 \global\subsubsecno=3D0 \global\advance\secno by 1 + \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% +} + +\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendi= xsectionzzz +\def\appendixsectionzzz#1{% + \global\subsecno=3D0 \global\subsubsecno=3D0 \global\advance\secno by 1 + \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% +} +\let\appendixsec\appendixsection + +\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumber= edseczzz +\def\unnumberedseczzz#1{% + \global\subsecno=3D0 \global\subsubsecno=3D0 \global\advance\secno by 1 + \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% +} =20 -% 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} +% Subsections. +\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numbered= subseczzz +\def\numberedsubseczzz#1{% + \global\subsubsecno=3D0 \global\advance\subsecno by 1 + \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subse= cno}% +} + +\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendix= subseczzz +\def\appendixsubseczzz#1{% + \global\subsubsecno=3D0 \global\advance\subsecno by 1 + \sectionheading{#1}{subsec}{Yappendix}% + {\appendixletter.\the\secno.\the\subsecno}% +} + +\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumb= eredsubseczzz +\def\unnumberedsubseczzz#1{% + \global\subsubsecno=3D0 \global\advance\subsecno by 1 + \sectionheading{#1}{subsec}{Ynothing}% + {\the\unnumberedno.\the\secno.\the\subsecno}% +} + +% Subsubsections. +\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsub= subseczzz +\def\numberedsubsubseczzz#1{% + \global\advance\subsubsecno by 1 + \sectionheading{#1}{subsubsec}{Ynumbered}% + {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% +} + +\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsub= subseczzz +\def\appendixsubsubseczzz#1{% + \global\advance\subsubsecno by 1 + \sectionheading{#1}{subsubsec}{Yappendix}% + {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecn= o}% +} + +\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumbere= dsubsubseczzz +\def\unnumberedsubsubseczzz#1{% + \global\advance\subsubsecno by 1 + \sectionheading{#1}{subsubsec}{Ynothing}% + {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubse= cno}% +} =20 % 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 =3D \numberedsec -\global\let\subsection =3D \numberedsubsec -\global\let\subsubsection =3D \numberedsubsubsec +\let\section =3D \numberedsec +\let\subsection =3D \numberedsubsec +\let\subsubsection =3D \numberedsubsubsec =20 % Define @majorheading, @heading and @subheading =20 -% NOTE on use of \vbox for chapter headings, section headings, and -% such: +% 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 @@ -3027,23 +4094,27 @@ % if justification is not attempted. Hence \raggedright. =20 =20 -\def\majorheading{\parsearg\majorheadingzzz} -\def\majorheadingzzz #1{% -{\advance\chapheadingskip by 10pt \chapbreak }% -{\chapfonts \vbox{\hyphenpenalty=3D10000\tolerance=3D5000 - \parindent=3D0pt\raggedright - \rm #1\hfill}}\bigskip \par\penalty 200} - -\def\chapheading{\parsearg\chapheadingzzz} -\def\chapheadingzzz #1{\chapbreak % -{\chapfonts \vbox{\hyphenpenalty=3D10000\tolerance=3D5000 - \parindent=3D0pt\raggedright - \rm #1\hfill}}\bigskip \par\penalty 200} +\def\majorheading{% + {\advance\chapheadingskip by 10pt \chapbreak }% + \parsearg\chapheadingzzz +} + +\def\chapheading{\chapbreak \parsearg\chapheadingzzz} +\def\chapheadingzzz#1{% + {\chapfonts \vbox{\hyphenpenalty=3D10000\tolerance=3D5000 + \parindent=3D0pt\raggedright + \rm #1\hfill}}% + \bigskip \par\penalty 200\relax + \suppressfirstparagraphindent +} =20 % @heading, @subheading, @subsubheading. -\def\heading{\parsearg\plainsecheading} -\def\subheading{\parsearg\plainsubsecheading} -\def\subsubheading{\parsearg\plainsubsubsecheading} +\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} + \suppressfirstparagraphindent} +\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} + \suppressfirstparagraphindent} +\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} + \suppressfirstparagraphindent} =20 % These macros generate a chapter, section, etc. heading only % (including whitespace, linebreaking, etc. around it), @@ -3052,8 +4123,6 @@ %%% Args are the skip and penalty (usually negative) \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\f= i} =20 -\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) =20 @@ -3065,18 +4134,18 @@ =20 \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} =20 -\def\CHAPPAGoff{ +\def\CHAPPAGoff{% \global\let\contentsalignmacro =3D \chappager \global\let\pchapsepmacro=3D\chapbreak \global\let\pagealignmacro=3D\chappager} =20 -\def\CHAPPAGon{ +\def\CHAPPAGon{% \global\let\contentsalignmacro =3D \chappager \global\let\pchapsepmacro=3D\chappager \global\let\pagealignmacro=3D\chappager \global\def\HEADINGSon{\HEADINGSsingle}} =20 -\def\CHAPPAGodd{ +\def\CHAPPAGodd{% \global\let\contentsalignmacro =3D \chapoddpage \global\let\pchapsepmacro=3D\chapoddpage \global\let\pagealignmacro=3D\chapoddpage @@ -3084,221 +4153,394 @@ =20 \CHAPPAGon =20 -\def\CHAPFplain{ -\global\let\chapmacro=3D\chfplain -\global\let\unnumbchapmacro=3D\unnchfplain -\global\let\centerchapmacro=3D\centerchfplain} - -% Plain chapter opening. -% #1 is the text, #2 the chapter number or empty if unnumbered. -\def\chfplain#1#2{% +% Chapter opening. +%=20 +% #1 is the text, #2 is the section type (Ynumbered, Ynothing, +% Yappendix, Yomitfromtoc), #3 the chapter number. +%=20 +% To test against our argument. +\def\Ynothingkeyword{Ynothing} +\def\Yomitfromtockeyword{Yomitfromtoc} +\def\Yappendixkeyword{Yappendix} +% +\def\chapmacro#1#2#3{% \pchapsepmacro {% \chapfonts \rm - \def\chapnum{#2}% - \setbox0 =3D \hbox{#2\ifx\chapnum\empty\else\enspace\fi}% + % + % Have to define \thissection before calling \donoderef, because the + % xref code eventually uses it. On the other hand, it has to be called + % after \pchapsepmacro, or the headline will change too soon. + \gdef\thissection{#1}% + \gdef\thischaptername{#1}% + % + % Only insert the separating space if we have a chapter/appendix + % number, and don't print the unnumbered ``number''. + \def\temptype{#2}% + \ifx\temptype\Ynothingkeyword + \setbox0 =3D \hbox{}% + \def\toctype{unnchap}% + \def\thischapter{#1}% + \else\ifx\temptype\Yomitfromtockeyword + \setbox0 =3D \hbox{}% contents like unnumbered, but no toc entry + \def\toctype{omit}% + \xdef\thischapter{}% + \else\ifx\temptype\Yappendixkeyword + \setbox0 =3D \hbox{\putwordAppendix{} #3\enspace}% + \def\toctype{app}% + % We don't substitute the actual chapter name into \thischapter + % because we don't want its macros evaluated now. And we don't + % use \thissection because that changes with each section. + % + \xdef\thischapter{\putwordAppendix{} \appendixletter: + \noexpand\thischaptername}% + \else + \setbox0 =3D \hbox{#3\enspace}% + \def\toctype{numchap}% + \xdef\thischapter{\putwordChapter{} \the\chapno: + \noexpand\thischaptername}% + \fi\fi\fi + % + % Write the toc entry for this chapter. Must come before the + % \donoderef, because we include the current node name in the toc + % entry, and \donoderef resets it to empty. + \writetocentry{\toctype}{#1}{#3}% + % + % For pdftex, we have to write out the node definition (aka, make + % the pdfdest) after any page break, but before the actual text has + % been typeset. If the destination for the pdf outline is after the + % text, then jumping from the outline may wind up with the text not + % being visible, for instance under high magnification. + \donoderef{#2}% + % + % Typeset the actual heading. \vbox{\hyphenpenalty=3D10000 \tolerance=3D5000 \parindent=3D0pt \ragge= dright - \hangindent =3D \wd0 \centerparametersmaybe + \hangindent=3D\wd0 \centerparametersmaybe \unhbox0 #1\par}% }% \nobreak\bigskip % no page break after a chapter title \nobreak } =20 -% Plain opening for unnumbered. -\def\unnchfplain#1{\chfplain{#1}{}} - % @centerchap -- centered and unnumbered. \let\centerparametersmaybe =3D \relax -\def\centerchfplain#1{{% - \def\centerparametersmaybe{% - \advance\rightskip by 3\rightskip - \leftskip =3D \rightskip - \parfillskip =3D 0pt - }% - \chfplain{#1}{}% -}} +\def\centerparameters{% + \advance\rightskip by 3\rightskip + \leftskip =3D \rightskip + \parfillskip =3D 0pt +} =20 -\CHAPFplain % The default =20 +% I don't think this chapter style is supported any more, so I'm not +% updating it with the new noderef stuff. We'll see. --karl, 11aug03. +%=20 +\def\setchapterstyle #1 {\csname CHAPF#1\endcsname} +% \def\unnchfopen #1{% \chapoddpage {\chapfonts \vbox{\hyphenpenalty=3D10000\tolerance=3D5000 \parindent=3D0pt\raggedright - \rm #1\hfill}}\bigskip \par\penalty 10000 % + \rm #1\hfill}}\bigskip \par\nobreak } - \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=3D10000\tolerance=3D5000 \parindent=3D0pt - \hfill {\rm #1}\hfill}}\bigskip \par\penalty 10000 % + \hfill {\rm #1}\hfill}}\bigskip \par\nobreak } +\def\CHAPFopen{% + \global\let\chapmacro=3D\chfopen + \global\let\centerchapmacro=3D\centerchfopen} =20 -\def\CHAPFopen{ -\global\let\chapmacro=3D\chfopen -\global\let\unnumbchapmacro=3D\unnchfopen -\global\let\centerchapmacro=3D\centerchfopen} =20 - -% Section titles. +% Section titles. These macros combine the section number parts and +% call the generic \sectionheading to do the printing. +%=20 \newskip\secheadingskip -\def\secheadingbreak{\dobreak \secheadingskip {-1000}} -\def\secheading#1#2#3{\sectionheading{sec}{#2.#3}{#1}} -\def\plainsecheading#1{\sectionheading{sec}{}{#1}} +\def\secheadingbreak{\dobreak \secheadingskip{-1000}} =20 % 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}} +\newskip\subsecheadingskip +\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} =20 % Subsubsection titles. -\let\subsubsecheadingskip =3D \subsecheadingskip -\let\subsubsecheadingbreak =3D \subsecheadingbreak -\def\subsubsecheading#1#2#3#4#5{\sectionheading{subsubsec}{#2.#3.#4.#5}{#1= }} -\def\plainsubsubsecheading#1{\sectionheading{subsubsec}{}{#1}} +\def\subsubsecheadingskip{\subsecheadingskip} +\def\subsubsecheadingbreak{\subsecheadingbreak} =20 =20 -% 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 - }% +% Print any size, any type, section title. +%=20 +% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is +% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the +% section number. +%=20 +\def\sectionheading#1#2#3#4{% {% % Switch to the right set of fonts. - \csname #1fonts\endcsname \rm + \csname #2fonts\endcsname \rm + % + % Insert space above the heading. + \csname #2headingbreak\endcsname % - % Only insert the separating space if we have a section number. - \def\secnum{#2}% - \setbox0 =3D \hbox{#2\ifx\secnum\empty\else\enspace\fi}% + % Only insert the space after the number if we have a section number. + \def\sectionlevel{#2}% + \def\temptype{#3}% % + \ifx\temptype\Ynothingkeyword + \setbox0 =3D \hbox{}% + \def\toctype{unn}% + \gdef\thissection{#1}% + \else\ifx\temptype\Yomitfromtockeyword + % for @headings -- no section number, don't include in toc, + % and don't redefine \thissection. + \setbox0 =3D \hbox{}% + \def\toctype{omit}% + \let\sectionlevel=3D\empty + \else\ifx\temptype\Yappendixkeyword + \setbox0 =3D \hbox{#4\enspace}% + \def\toctype{app}% + \gdef\thissection{#1}% + \else + \setbox0 =3D \hbox{#4\enspace}% + \def\toctype{num}% + \gdef\thissection{#1}% + \fi\fi\fi + % + % Write the toc entry (before \donoderef). See comments in \chfplain. + \writetocentry{\toctype\sectionlevel}{#1}{#4}% + % + % Write the node reference (=3D pdf destination for pdftex). + % Again, see comments in \chfplain. + \donoderef{#3}% + % + % Output the actual section heading. \vbox{\hyphenpenalty=3D10000 \tolerance=3D5000 \parindent=3D0pt \ragge= dright - \hangindent =3D \wd0 % zero if no section number - \unhbox0 #3}% + \hangindent=3D\wd0 % zero if no section number + \unhbox0 #1}% }% - \ifdim\parskip<10pt \nobreak\kern10pt\nobreak\kern-\parskip\fi \nobreak + % Add extra space after the heading -- half of whatever came above it. + % Don't allow stretch, though. + \kern .5 \csname #2headingskip\endcsname + % + % Do not let the kern be a potential breakpoint, as it would be if it + % was followed by glue. + \nobreak + % + % We'll almost certainly start a paragraph next, so don't let that + % glue accumulate. (Not a breakpoint because it's preceded by a + % discardable item.) + \vskip-\parskip + % + % This \nobreak is purely so the last item on the list is a \penalty + % of 10000. This is so other code, for instance \parsebodycommon, can + % check for and avoid allowing breakpoints. Otherwise, it would + % insert a valid breakpoint between: + % @section sec-whatever + % @deffn def-whatever + \nobreak } =20 =20 -\message{toc printing,} -% Finish up the main text and prepare to read what we've written -% to \contentsfile. +\message{toc,} +% Table of contents. +\newwrite\tocfile + +% Write an entry to the toc file, opening it if necessary. +% Called from @chapter, etc.=20=20 +%=20 +% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} +% We append the current node name (if any) and page number as additional +% arguments for the \{chap,sec,...}entry macros which will eventually +% read this. The node name is used in the pdf outlines as the +% destination to jump to. +%=20 +% We open the .toc file for writing here instead of at @setfilename (or +% any other fixed time) so that @contents can be anywhere in the document. +% But if #1 is `omit', then we don't do anything. This is used for the +% table of contents chapter openings themselves. +% +\newif\iftocfileopened +\def\omitkeyword{omit}% +% +\def\writetocentry#1#2#3{% + \edef\writetoctype{#1}% + \ifx\writetoctype\omitkeyword \else + \iftocfileopened\else + \immediate\openout\tocfile =3D \jobname.toc + \global\tocfileopenedtrue + \fi + % + \iflinks + \toks0 =3D {#2}% + \toks2 =3D \expandafter{\lastnode}% + \edef\temp{\write\tocfile{\realbackslash #1entry{\the\toks0}{#3}% + {\the\toks2}{\noexpand\folio}}}% + \temp + \fi + \fi + % + % Tell \shipout to create a pdf destination on each page, if we're + % writing pdf. These are used in the table of contents. We can't + % just write one on every page because the title pages are numbered + % 1 and 2 (the page numbers aren't printed), and so are the first + % two pages of the document. Thus, we'd have two destinations named + % `1', and two named `2'. + \ifpdf \global\pdfmakepagedesttrue \fi +} =20 \newskip\contentsrightmargin \contentsrightmargin=3D1in +\newcount\savepageno +\newcount\lastnegativepageno \lastnegativepageno =3D -1 + +% Prepare to read what we've written to \tocfile. +% \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 =3D -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`\\=3D0 \catcode`\{=3D1 \catcode`\}=3D2 \catcode`\@=3D11 - \catcode`\^=3D7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi - \raggedbottom % Worry more about breakpoints than the bo= ttom. - \advance\hsize by -\contentsrightmargin % Don't use the full line le= ngth. + % 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\tocfile + % + % Don't need to put `Contents' or `Short Contents' in the headline. + % It is abundantly clear what they are. + \def\thischapter{}% + \chapmacro{#1}{Yomitfromtoc}{}% + % + \savepageno =3D \pageno + \begingroup % Set up to handle contents files properly. + \catcode`\\=3D0 \catcode`\{=3D1 \catcode`\}=3D2 \catcode`\@=3D11 + % We can't do this, because then an actual ^ in a section + % title fails, e.g., @chapter ^ -- exponentiation. --karl, 9jul97. + %\catcode`\^=3D7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi + \raggedbottom % Worry more about breakpoints than the bott= om. + \advance\hsize by -\contentsrightmargin % Don't use the full line leng= th. + % + % Roman numerals for page numbers. + \ifnum \pageno>0 \global\pageno =3D \lastnegativepageno \fi } =20 =20 % Normal (long) toc. -\outer\def\contents{% - \startcontents{\putwordTableofContents}% +\def\contents{% + \startcontents{\putwordTOC}% + \openin 1 \jobname.toc + \ifeof 1 \else \input \jobname.toc - \endgroup - \vfill \eject + \fi + \vfill \eject + \contentsalignmacro % in case @setchapternewpage odd is in effect + \ifeof 1 \else + \pdfmakeoutlines + \fi + \closein 1 + \endgroup + \lastnegativepageno =3D \pageno + \global\pageno =3D \savepageno } =20 % And just the chapters. -\outer\def\summarycontents{% - \startcontents{\putwordShortContents}% - % - \let\chapentry =3D \shortchapentry - \let\unnumbchapentry =3D \shortunnumberedentry - % We want a true roman here for the page numbers. - \secfonts - \let\rm=3D\shortcontrm \let\bf=3D\shortcontbf \let\sl=3D\shortcontsl - \rm - \hyphenpenalty =3D 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{} +\def\summarycontents{% + \startcontents{\putwordShortTOC}% + % + \let\numchapentry =3D \shortchapentry + \let\appentry =3D \shortchapentry + \let\unnchapentry =3D \shortunnchapentry + % We want a true roman here for the page numbers. + \secfonts + \let\rm=3D\shortcontrm \let\bf=3D\shortcontbf + \let\sl=3D\shortcontsl \let\tt=3D\shortconttt + \rm + \hyphenpenalty =3D 10000 + \advance\baselineskip by 1pt % Open it up a little. + \def\numsecentry##1##2##3##4{} + \let\appsecentry =3D \numsecentry + \let\unnsecentry =3D \numsecentry + \let\numsubsecentry =3D \numsecentry + \let\appsubsecentry =3D \numsecentry + \let\unnsubsecentry =3D \numsecentry + \let\numsubsubsecentry =3D \numsecentry + \let\appsubsubsecentry =3D \numsecentry + \let\unnsubsubsecentry =3D \numsecentry + \openin 1 \jobname.toc + \ifeof 1 \else \input \jobname.toc - \endgroup - \vfill \eject + \fi + \closein 1 + \vfill \eject + \contentsalignmacro % in case @setchapternewpage odd is in effect + \endgroup + \lastnegativepageno =3D \pageno + \global\pageno =3D \savepageno } \let\shortcontents =3D \summarycontents =20 -% 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 =3D \hbox{\shortcontrm \putwordAppendix } -\newdimen\shortappendixwidth \shortappendixwidth =3D \wd0 - +% The arg is, e.g., `A' for an appendix, or `3' for a chapter. +% \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 =3D \hbox{#1}% - \dimen0 =3D \ifdim\wd0 > \shortappendixwidth \shortappendixwidth \else 0= pt \fi - % - % This space should be plenty, since a single number is .5em, and the + % This space should be enough, since a single number is .5em, and the % widest letter (M) is 1em, at least in the Computer Modern fonts. + % But use \hss just in case. % (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}% + %=20 + % We'd like to right-justify chapter numbers, but that looks strange + % with appendix letters. And right-justifying numbers and + % left-justifying letters looks strange when there is less than 10 + % chapters. Have to read the whole toc once to know how many chapters + % there are before deciding ... + \hbox to 1em{#1\hss}% +} + +% 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, ... + +% Chapters, in the main contents. +\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} +% +% Chapters, in the short toc. +% See comments in \dochapentry re vbox and related settings. +\def\shortchapentry#1#2#3#4{% + \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egr= oup}% } =20 -\def\unnumbchapentry#1#2{\dochapentry{#1}{#2}} -\def\shortunnumberedentry#1#2{\tocentry{#1}{\doshortpageno{#2}}} +% Appendices, in the main contents. +% Need the word Appendix, and a fixed-size box. +%=20 +\def\appendixbox#1{% + % We use M since it's probably the widest letter. + \setbox0 =3D \hbox{\putwordAppendix{} M}% + \hbox to \wd0{\putwordAppendix{} #1\hss}} +% +\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} + +% Unnumbered chapters. +\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} +\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egrou= p}} =20 % Sections. -\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}} -\def\unnumbsecentry#1#2{\dosecentry{#1}{#2}} +\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} +\let\appsecentry=3D\numsecentry +\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} =20 % Subsections. -\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}} -\def\unnumbsubsecentry#1#2{\dosubsecentry{#1}{#2}} +\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} +\let\appsubsecentry=3D\numsubsecentry +\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} =20 % 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}} +\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} +\let\appsubsubsecentry=3D\numsubsubsecentry +\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} =20 % This parameter controls the indentation of the various levels. -\newdimen\tocindent \tocindent =3D 3pc +% Same as \defaultparindent. +\newdimen\tocindent \tocindent =3D 15pt =20 % Now for the actual typesetting. In all these, #1 is the text and #2 is t= he % page number. @@ -3309,36 +4551,28 @@ \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselin= eskip \begingroup \chapentryfonts - \tocentry{#1}{\dopageno{#2}}% + \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup \nobreak\vskip .25\baselineskip plus.1\baselineskip } =20 \def\dosecentry#1#2{\begingroup \secentryfonts \leftskip=3D\tocindent - \tocentry{#1}{\dopageno{#2}}% + \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} =20 \def\dosubsecentry#1#2{\begingroup \subsecentryfonts \leftskip=3D2\tocindent - \tocentry{#1}{\dopageno{#2}}% + \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} =20 \def\dosubsubsecentry#1#2{\begingroup \subsubsecentryfonts \leftskip=3D3\tocindent - \tocentry{#1}{\dopageno{#2}}% + \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} =20 -% 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.) -% -% \turnoffactive is for the sake of @" used for umlauts. -\def\tocentry#1#2{\begingroup - \vskip 0pt plus1pt % allow a little stretch for the sake of nice page br= eaks - \entry{\turnoffactive #1}{\turnoffactive #2}% -\endgroup} +% We use the same \entry macro as for the index entries. +\let\tocentry =3D \entry =20 % Space between chapter (or whatever) number and the title. \def\labelspace{\hskip1em \relax} @@ -3348,90 +4582,90 @@ =20 \def\chapentryfonts{\secfonts \rm} \def\secentryfonts{\textfonts} -\let\subsecentryfonts =3D \textfonts -\let\subsubsecentryfonts =3D \textfonts +\def\subsecentryfonts{\textfonts} +\def\subsubsecentryfonts{\textfonts} =20 =20 \message{environments,} +% @foo ... @end foo. =20 +% @point{}, @result{}, @expansion{}, @print{}, @equiv{}. +% % 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 =3D \hbox to 1em{\hfil$\Rightarrow$\hfil} -%\global\setbox\longdblarrowbox =3D \hbox to 1em{\hfil$\mapsto$\hfil} -%\global\setbox\pushcharbox =3D \hbox to 1em{\hfil$\dashv$\hfil} -%\global\setbox\equivbox =3D \hbox to 1em{\hfil$\ptexequiv$\hfil} -% Adapted from the manmac format (p.420 of TeXbook) -%\global\setbox\bullbox =3D \hbox to 1em{\kern.15em\vrule height .75ex wid= th .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}} =20 +% The @error{} command. % Adapted from the TeXbook's \boxit. +% +\newbox\errorbox +% {\tentt \global\dimen0 =3D 3em}% Width of the box. \dimen2 =3D .55pt % Thickness of rules % The text. (`r' is open on the right, `e' somewhat less so on the left.) \setbox0 =3D \hbox{\kern-.75pt \tensf error\kern-1.5pt} - -\global\setbox\errorbox=3D\hbox to \dimen0{\hfil +% +\setbox\errorbox=3D\hbox to \dimen0{\hfil \hsize =3D \dimen0 \advance\hsize by -5.8pt % Space to left+right. \advance\hsize by -2\dimen2 % Rules. - \vbox{ + \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} =20 % @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. =20 -\def\tex{\begingroup -\catcode `\\=3D0 \catcode `\{=3D1 \catcode `\}=3D2 -\catcode `\$=3D3 \catcode `\&=3D4 \catcode `\#=3D6 -\catcode `\^=3D7 \catcode `\_=3D8 \catcode `\~=3D13 \let~=3D\tie -\catcode `\%=3D14 -\catcode 43=3D12 % plus -\catcode`\"=3D12 -\catcode`\=3D=3D12 -\catcode`\|=3D12 -\catcode`\<=3D12 -\catcode`\>=3D12 -\escapechar=3D`\\ -% -\let\,=3D\ptexcomma -\let\{=3D\ptexlbrace -\let\}=3D\ptexrbrace -\let\.=3D\ptexdot -\let\*=3D\ptexstar -\let\dots=3D\ptexdots -\def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% -\def\enddots{\relax\ifmmode\endldots\else$\mathsurround=3D0pt \endldots\,$= \fi}% -\def\@{@}% -\let\bullet=3D\ptexbullet -\let\b=3D\ptexb \let\c=3D\ptexc \let\i=3D\ptexi \let\t=3D\ptext -% -\let\Etex=3D\endgroup} - -% Define @lisp ... @endlisp. -% @lisp does a \begingroup so it can rebind things, -% including the definition of @endlisp (which normally is erroneous). +\envdef\tex{% + \catcode `\\=3D0 \catcode `\{=3D1 \catcode `\}=3D2 + \catcode `\$=3D3 \catcode `\&=3D4 \catcode `\#=3D6 + \catcode `\^=3D7 \catcode `\_=3D8 \catcode `\~=3D\active \let~=3D\tie + \catcode `\%=3D14 + \catcode `\+=3D\other + \catcode `\"=3D\other + \catcode `\|=3D\other + \catcode `\<=3D\other + \catcode `\>=3D\other + \escapechar=3D`\\ + % + \let\b=3D\ptexb + \let\bullet=3D\ptexbullet + \let\c=3D\ptexc + \let\,=3D\ptexcomma + \let\.=3D\ptexdot + \let\dots=3D\ptexdots + \let\equiv=3D\ptexequiv + \let\!=3D\ptexexclam + \let\i=3D\ptexi + \let\indent=3D\ptexindent + \let\noindent=3D\ptexnoindent + \let\{=3D\ptexlbrace + \let\+=3D\tabalign + \let\}=3D\ptexrbrace + \let\/=3D\ptexslash + \let\*=3D\ptexstar + \let\t=3D\ptext + % + \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% + \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=3D0pt \endldots\= ,$\fi}% + \def\@{@}% +} +% There is no need to define \Etex. + +% Define @lisp ... @end lisp. +% @lisp environment forms a group so it can rebind things, +% including the definition of @end lisp (which normally is erroneous). =20 % Amount to narrow the margins by for @lisp. \newskip\lispnarrowing \lispnarrowing=3D0.4in @@ -3441,38 +4675,36 @@ % have any width. \def\lisppar{\null\endgraf} =20 -% 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 =3D\tie}} - -% Define \obeyedspace to be our active space, whatever it is. This is -% for use in \parsearg. -{\sepspaces% -\global\let\obeyedspace=3D } - % This space is always present above and below environments. \newskip\envskipamount \envskipamount =3D 0pt =20 % 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 +% start of the next paragraph will insert \parskip. % -\def\aboveenvbreak{{\advance\envskipamount by \parskip -\endgraf \ifdim\lastskip<\envskipamount -\removelastskip \penalty-50 \vskip\envskipamount \fi}} +\def\aboveenvbreak{{% + % =3D10000 instead of <10000 because of a special case in \itemzzz, q.v. + \ifnum \lastpenalty=3D10000 \else + \advance\envskipamount by \parskip + \endgraf + \ifdim\lastskip<\envskipamount + \removelastskip + % it's not a good place to break if the last penalty was \nobreak + % or better ... + \ifnum\lastpenalty<10000 \penalty-50 \fi + \vskip\envskipamount + \fi + \fi +}} =20 \let\afterenvbreak =3D \aboveenvbreak =20 % \nonarrowing is a flag. If "set", @lisp etc don't narrow margins. \let\nonarrowing=3D\relax =20 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% \cartouche: draw rectangle w/rounded corners around argument +% @cartouche ... @end cartouche: draw rectangle w/rounded corners around +% environment contents. \font\circle=3Dlcircle10 \newdimen\circthick \newdimen\cartouter\newdimen\cartinner @@ -3492,54 +4724,54 @@ % \newskip\lskip\newskip\rskip =20 -\long\def\cartouche{% -\begingroup - \lskip=3D\leftskip \rskip=3D\rightskip - \leftskip=3D0pt\rightskip=3D0pt %we want these *outside*. - \cartinner=3D\hsize \advance\cartinner by-\lskip - \advance\cartinner by-\rskip - \cartouter=3D\hsize - \advance\cartouter by 18pt % allow for 3pt kerns on either -% side, and for 6pt waste from -% each corner char - \normbskip=3D\baselineskip \normpskip=3D\parskip \normlskip=3D\lin= eskip - % Flag to tell @lisp, etc., not to narrow margin. - \let\nonarrowing=3D\comment - \vbox\bgroup - \baselineskip=3D0pt\parskip=3D0pt\lineskip=3D0pt - \carttop - \hbox\bgroup - \hskip\lskip - \vrule\kern3pt - \vbox\bgroup - \hsize=3D\cartinner - \kern3pt - \begingroup - \baselineskip=3D\normbskip - \lineskip=3D\normlskip - \parskip=3D\normpskip - \vskip -\parskip +\envdef\cartouche{% + \ifhmode\par\fi % can't be in the midst of a paragraph. + \startsavinginserts + \lskip=3D\leftskip \rskip=3D\rightskip + \leftskip=3D0pt\rightskip=3D0pt % we want these *outside*. + \cartinner=3D\hsize \advance\cartinner by-\lskip + \advance\cartinner by-\rskip + \cartouter=3D\hsize + \advance\cartouter by 18.4pt % allow for 3pt kerns on either + % side, and for 6pt waste from + % each corner char, and rule thickness + \normbskip=3D\baselineskip \normpskip=3D\parskip \normlskip=3D\lineskip + % Flag to tell @lisp, etc., not to narrow margin. + \let\nonarrowing=3D\comment + \vbox\bgroup + \baselineskip=3D0pt\parskip=3D0pt\lineskip=3D0pt + \carttop + \hbox\bgroup + \hskip\lskip + \vrule\kern3pt + \vbox\bgroup + \kern3pt + \hsize=3D\cartinner + \baselineskip=3D\normbskip + \lineskip=3D\normlskip + \parskip=3D\normpskip + \vskip -\parskip + \comment % For explanation, see the end of \def\group. +} \def\Ecartouche{% - \endgroup - \kern3pt - \egroup - \kern3pt\vrule - \hskip\rskip - \egroup - \cartbot - \egroup -\endgroup -}} + \ifhmode\par\fi + \kern3pt + \egroup + \kern3pt\vrule + \hskip\rskip + \egroup + \cartbot + \egroup + \checkinserts +} =20 =20 % 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 =3D 12pt % Don't be fussy \sepspaces % Make spaces be word-separators rather than space tokens. - \singlespace \let\par =3D \lisppar % don't ignore blank lines \obeylines % each line of input is a line of output \parskip =3D 0pt @@ -3550,95 +4782,99 @@ \ifx\nonarrowing\relax \advance \leftskip by \lispnarrowing \exdentamount=3D\lispnarrowing - \let\exdent=3D\nofillexdent - \let\nonarrowing=3D\relax \fi + \let\exdent=3D\nofillexdent } =20 -% 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}% +% If you want all examples etc. small: @set dispenvsize small. +% If you want even small examples the full size: @set dispenvsize nosmall. +% This affects the following displayed environments: +% @example, @display, @format, @lisp +% +\def\smallword{small} +\def\nosmallword{nosmall} +\let\SETdispenvsize\relax +\def\setnormaldispenv{% + \ifx\SETdispenvsize\smallword + \smallexamplefonts \rm + \fi +} +\def\setsmalldispenv{% + \ifx\SETdispenvsize\nosmallword + \else + \smallexamplefonts \rm + \fi +} =20 -% This macro is -\def\lisp{\begingroup - \nonfillstart - \let\Elisp =3D \nonfillfinish - \tt - \rawbackslash % have \ input char produce \ char from current font - \gobble +% We often define two environments, @foo and @smallfoo. +% Let's do it by one command: +\def\makedispenv #1#2{ + \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2} + \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2} + \expandafter\let\csname E#1\endcsname \afterenvbreak + \expandafter\let\csname Esmall#1\endcsname \afterenvbreak } =20 -% Define the \E... control sequence only if we are inside the -% environment, so the error checking in \end will work. +% Define two synonyms: +\def\maketwodispenvs #1#2#3{ + \makedispenv{#1}{#3} + \makedispenv{#2}{#3} +} + +% @lisp: indented, narrowed, typewriter font; @example: same as @lisp. % -% We must call \lisp last in the definition, since it reads the -% return following the @example (or whatever) command. +% @smallexample and @smalllisp: use smaller fonts. +% Originally contributed by Pavel@xerox. % -\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp} -\def\smallexample{\begingroup \def\Esmallexample{\nonfillfinish\endgroup}\= lisp} -\def\smalllisp{\begingroup \def\Esmalllisp{\nonfillfinish\endgroup}\lisp} +\maketwodispenvs {lisp}{example}{% + \nonfillstart + \tt + \let\kbdfont =3D \kbdexamplefont % Allow @kbd to do something special. + \gobble % eat return +} =20 -% @smallexample and @smalllisp. This is not used unless the @smallbook -% command is given. Originally contributed by Pavel@xerox. +% @display/@smalldisplay: same as @lisp except keep current font. % -\def\smalllispx{\begingroup +\makedispenv {display}{% \nonfillstart - \let\Esmalllisp =3D \nonfillfinish - \let\Esmallexample =3D \nonfillfinish - % - % Smaller fonts for small examples. - \indexfonts \tt - \rawbackslash % make \ output the \ character from the current font (tt) \gobble } =20 -% This is @display; same as @lisp except use roman font. +% @format/@smallformat: same as @display except don't narrow margins. % -\def\display{\begingroup +\makedispenv{format}{% + \let\nonarrowing =3D t% \nonfillstart - \let\Edisplay =3D \nonfillfinish \gobble } =20 -% This is @format; same as @display except don't narrow margins. -% -\def\format{\begingroup - \let\nonarrowing =3D t +% @flushleft: same as @format, but doesn't obey \SETdispenvsize. +\envdef\flushleft{% + \let\nonarrowing =3D t% \nonfillstart - \let\Eformat =3D \nonfillfinish \gobble } +\let\Eflushleft =3D \afterenvbreak =20 -% @flushleft (same as @format) and @flushright. +% @flushright. % -\def\flushleft{\begingroup - \let\nonarrowing =3D t +\envdef\flushright{% + \let\nonarrowing =3D t% \nonfillstart - \let\Eflushleft =3D \nonfillfinish + \advance\leftskip by 0pt plus 1fill \gobble } -\def\flushright{\begingroup - \let\nonarrowing =3D t - \nonfillstart - \let\Eflushright =3D \nonfillfinish - \advance\leftskip by 0pt plus 1fill - \gobble} +\let\Eflushright =3D \afterenvbreak + =20 % @quotation does normal linebreaking (hence we can't use \nonfillstart) -% and narrows the margins. +% and narrows the margins. We keep \parskip nonzero in general, since +% we're doing normal filling. So, when using \aboveenvbreak and +% \afterenvbreak, temporarily make \parskip 0. % -\def\quotation{% - \begingroup\inENV %This group ends at the end of the @quotation body +\envdef\quotation{% {\parskip=3D0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip - \singlespace \parindent=3D0pt - % 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 =3D 0pt \nonfillfinish}% % % @cartouche defines \nonarrowing to inhibit narrowing at next level dow= n. \ifx\nonarrowing\relax @@ -3647,693 +4883,1192 @@ \exdentamount =3D \lispnarrowing \let\nonarrowing =3D \relax \fi + \parsearg\quotationlabel } =20 -\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=3D.4in -\newskip\defargsindent \defargsindent=3D50pt -\newskip\deftypemargin \deftypemargin=3D12pt -\newskip\deflastargmargin \deflastargmargin=3D18pt - -\newcount\parencount -% define \functionparens, which makes ( and ) and & do special things. -% \functionparens affects the group it is contained in. -\def\activeparens{% -\catcode`\(=3D\active \catcode`\)=3D\active \catcode`\&=3D\active -\catcode`\[=3D\active \catcode`\]=3D\active} - -% Make control sequences which act like normal parenthesis chars. -\let\lparen =3D ( \let\rparen =3D ) +% We have retained a nonzero parskip for the environment, since we're +% doing normal filling. +%=20 +\def\Equotation{% + \par + \ifx\quotationauthor\undefined\else + % indent a bit. + \leftline{\kern 2\leftskip \sl ---\quotationauthor}% + \fi + {\parskip=3D0pt \afterenvbreak}% +} =20 -{\activeparens % Now, smart parens don't turn on until &foo (see \amprm) +% If we're given an argument, typeset it in bold with a colon after. +\def\quotationlabel#1{% + \def\temp{#1}% + \ifx\temp\empty \else + {\bf #1: }% + \fi +} =20 -% 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(=3D\lparen \global\let)=3D\rparen -\global\let[=3D\lbrack \global\let]=3D\rbrack =20 -\gdef\functionparens{\boldbrax\let&=3D\amprm\parencount=3D0 } -\gdef\boldbrax{\let(=3D\opnr\let)=3D\clnr\let[=3D\lbrb\let]=3D\rbrb} -% This is used to turn on special parens -% but make & act ordinary (given that it's active). -\gdef\boldbraxnoamp{\let(=3D\opnr\let)=3D\clnr\let[=3D\lbrb\let]=3D\rbrb\l= et&=3D\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(=3D\opnested - \global\advance\parencount by 1 -} +% LaTeX-like @verbatim...@end verbatim and @verb{...} +% If we want to allow any as delimiter, +% we need the curly braces so that makeinfo sees the @verb command, eg: +% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org +% +% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. +% +% [Knuth] p.344; only we need to do the other characters Texinfo sets +% active too. Otherwise, they get lost as the first character on a +% verbatim line. +\def\dospecials{% + \do\ \do\\\do\{\do\}\do\$\do\&% + \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% + \do\<\do\>\do\|\do\@\do+\do\"% +} +% +% [Knuth] p. 380 +\def\uncatcodespecials{% + \def\do##1{\catcode`##1=3D\other}\dospecials} +% +% [Knuth] pp. 380,381,391 +% Disable Spanish ligatures ?` and !` of \tt font +\begingroup + \catcode`\`=3D\active\gdef`{\relax\lq} +\endgroup % -% This is the definition of ( when already inside a level of parens. -\gdef\opnested{\char`\(\global\advance\parencount by 1 } +% Setup for the @verb command. % -\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=3D1 {\rm \char `\)}\sl \let(=3D\oprm \else \char `\) = \fi - \global\advance \parencount by -1 } -% If we encounter &foo, then turn on ()-hacking afterwards -\gdef\amprm#1 {{\rm\}\let(=3D\oprm \let)=3D\clrm\ } +% Eight spaces for a tab +\begingroup + \catcode`\^^I=3D\active + \gdef\tabeightspaces{\catcode`\^^I=3D\active\def^^I{\ \ \ \ \ \ \ \ }} +\endgroup % -\gdef\normalparens{\boldbrax\let&=3D\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=3D\leftskip -\advance\dimen2 by -\defbodyindent -\dimen3=3D\rightskip -\advance\dimen3 by -\defbodyindent -\noindent % -\setbox0=3D\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}% -\dimen0=3D\hsize \advance \dimen0 by -\wd0 % compute size for first line -\dimen1=3D\hsize \advance \dimen1 by -\defargsindent %size for continuatio= ns -\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 linebrea= king -{% 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=3D10000 \hbadness=3D10000 -\advance\leftskip by -\defbodyindent -\exdentamount=3D\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=3D0in -\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent -\exdentamount=3D\defbodyindent -\begingroup % -\catcode 61=3D\active % 61 is `=3D' -\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=3D0in -\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent -\exdentamount=3D\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=3D0in -\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent -\exdentamount=3D\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 definitionb= ody -\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=3D0in -\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent -\exdentamount=3D\defbodyindent -\begingroup % -\catcode 61=3D\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=3D0in - \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent - \exdentamount=3D\defbodyindent - \begingroup\obeylines -} - -\def\defvrparsebody#1#2#3#4 {% - \parsebodycommon{#1}{#2}{#3}% - \spacesplit{#3{#4}}% +\def\setupverb{% + \tt % easiest (and conventionally used) font for verbatim + \def\par{\leavevmode\endgraf}% + \catcode`\`=3D\active + \tabeightspaces + % Respect line breaks, + % print special symbols as themselves, and + % make each space count + % must do in this order: + \obeylines \uncatcodespecials \sepspaces } =20 -% 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=3D\defvrparsebody +% Setup for the @verbatim environment % -% 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. +% Real tab expansion +\newdimen\tabw \setbox0=3D\hbox{\tt\space} \tabw=3D8\wd0 % tab amount % -\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\starttabbox{\setbox0=3D\hbox\bgroup} +\begingroup + \catcode`\^^I=3D\active + \gdef\tabexpand{% + \catcode`\^^I=3D\active + \def^^I{\leavevmode\egroup + \dimen0=3D\wd0 % the width so far, or since the previous tab + \divide\dimen0 by\tabw + \multiply\dimen0 by\tabw % compute previous multiple of \tabw + \advance\dimen0 by\tabw % advance to next multiple of \tabw + \wd0=3D\dimen0 \box0 \starttabbox + }% + } +\endgroup +\def\setupverbatim{% + \nonfillstart + \advance\leftskip by -\defbodyindent + % Easiest (and conventionally used) font for verbatim + \tt + \def\par{\leavevmode\egroup\box0\endgraf}% + \catcode`\`=3D\active + \tabexpand + % Respect line breaks, + % print special symbols as themselves, and + % make each space count + % must do in this order: + \obeylines \uncatcodespecials \sepspaces + \everypar{\starttabbox}% +} + +% Do the @verb magic: verbatim text is quoted by unique +% delimiter characters. Before first delimiter expect a +% right brace, after last delimiter expect closing brace: % -\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\doverb'{'#1'}'{#1} % -\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=3D0in -\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent -\exdentamount=3D\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=3D0 -#1% -\hyphenchar\tensl=3D45 -\ifnum\parencount=3D0 \else \errmessage{Unbalanced parentheses in @def}\fi% -\interlinepenalty=3D10000 -\advance\rightskip by 0pt plus 1fil -\endgraf\penalty 10000\vskip -\parskip\penalty 10000% +% [Knuth] p. 382; only eat outer {} +\begingroup + \catcode`[=3D1\catcode`]=3D2\catcode`\{=3D\other\catcode`\}=3D\other + \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] +\endgroup +% +\def\verb{\begingroup\setupverb\doverb} +% +% +% Do the @verbatim magic: define the macro \doverbatim so that +% the (first) argument ends when '@end verbatim' is reached, ie: +% +% \def\doverbatim#1@end verbatim{#1} +% +% For Texinfo it's a lot easier than for LaTeX, +% because texinfo's \verbatim doesn't stop at '\end{verbatim}': +% we need not redefine '\', '{' and '}'. +% +% Inspired by LaTeX's verbatim command set [latex.ltx] +% +\begingroup + \catcode`\ =3D\active + \obeylines % + % ignore everything up to the first ^^M, that's the newline at the end + % of the @verbatim input line itself. Otherwise we get an extra blank + % line in the output. + \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% + % We really want {...\end verbatim} in the body of the macro, but + % without the active space; thus we have to use \xdef and \gobble. +\endgroup +% +\envdef\verbatim{% + \setupverbatim\doverbatim } +\let\Everbatim =3D \afterenvbreak + =20 -\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=3D10000 -\advance\rightskip by 0pt plus 1fil -\endgraf\penalty 10000\vskip -\parskip\penalty 10000% +% @verbatiminclude FILE - insert text of file in verbatim environment. +% +\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} +% +\def\doverbatiminclude#1{% + {% + \makevalueexpandable + \setupverbatim + \input #1 + \afterenvbreak + }% } =20 -% Do complete processing of one @defun or @defunx line already parsed. +% @copying ... @end copying. +% Save the text away for @insertcopying later. Many commands won't be +% allowed in this context, but that's ok. +% +% We save the uninterpreted tokens, rather than creating a box. +% Saving the text in a box would be much easier, but then all the +% typesetting commands (@smallbook, font changes, etc.) have to be done +% beforehand -- and a) we want @copying to be done first in the source +% file; b) letting users define the frontmatter in as flexible order as +% possible is very desirable. +% +\def\copying{\begingroup + % Define a command to swallow text until we reach `@end copying'. + % \ is the escape char in this texinfo.tex file, so it is the + % delimiter for the command; @ will be the escape char when we read + % it, but that doesn't matter. + \long\def\docopying##1\end copying{\gdef\copyingtext{##1}\enddocopying}% + % + % We must preserve ^^M's in the input file; see \insertcopying below. + \catcode`\^^M =3D \active + \docopying +} + +% What we do to finish off the copying text. +% +\def\enddocopying{\endgroup\ignorespaces} + +% @insertcopying. Here we must play games with ^^M's. On the one hand, +% we need them to delimit commands such as `@end quotation', so they +% must be active. On the other hand, we certainly don't want every +% end-of-line to be a \par, as would happen with the normal active +% definition of ^^M. On the third hand, two ^^M's in a row should still +% generate a \par. +% +% Our approach is to make ^^M insert a space and a penalty1 normally; +% then it can also check if \lastpenalty=3D1. If it does, then manually +% do \par. +% +% This messes up the normal definitions of @c[omment], so we redefine +% it. Similarly for @ignore. (These commands are used in the gcc +% manual for man page generation.) +% +% Seems pretty fragile, most line-oriented commands will presumably +% fail, but for the limited use of getting the copying text (which +% should be quite simple) inserted, we can hope it's ok. +% +{\catcode`\^^M=3D\active % +\gdef\insertcopying{\begingroup % + \parindent =3D 0pt % looks wrong on title page + \def^^M{% + \ifnum \lastpenalty=3D1 % + \par % + \else % + \space \penalty 1 % + \fi % + }% + % + % Fix @c[omment] for catcode 13 ^^M's. + \def\c##1^^M{\ignorespaces}% + \let\comment =3D \c % + % + % Don't bother jumping through all the hoops that \doignore does, it + % would be very hard since the catcodes are already set. + \long\def\ignore##1\end ignore{\ignorespaces}% + % + \copyingtext % +\endgroup}% +} =20 -% @deffn Command forward-char nchars +\message{defuns,} +% @defun etc. =20 -\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader} +\newskip\defbodyindent \defbodyindent=3D.4in +\newskip\defargsindent \defargsindent=3D50pt +\newskip\deflastargmargin \deflastargmargin=3D18pt =20 -\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}% -\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup % -\catcode 61=3D\other % Turn off change made in \defparsebody +% Start the processing of @deffn: +\def\startdefun{% + \ifnum\lastpenalty<10000 + \medbreak + \else + % If there are two @def commands in a row, we'll have a \nobreak, + % which is there to keep the function description together with its + % header. But if there's nothing but headers, we need to allow a + % break somewhere. Check for penalty 10002 (inserted by + % \defargscommonending) instead of 10000, since the sectioning + % commands insert a \penalty10000, and we don't want to allow a break + % between a section heading and a defun. + \ifnum\lastpenalty=3D10002 \penalty2000 \fi + % + % Similarly, after a section heading, do not allow a break. + % But do insert the glue. + \medskip % preceded by discardable penalty, so not a breakpoint + \fi + % + \parindent=3D0in + \advance\leftskip by \defbodyindent + \exdentamount=3D\defbodyindent } =20 -% @defun =3D=3D @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=3D\other % Turn off change made in \defparsebody +\def\dodefunx#1{% + % First, check whether we are in the right environment: + \checkenv#1% + % + % As above, allow line break if we have multiple x headers in a row. + % It's not a great place, though. + \ifnum\lastpenalty=3D10002 \penalty3000 \fi + % + % And now, it's time to reuse the body of the original defun: + \expandafter\gobbledefun#1% } +\def\gobbledefun#1\startdefun{} =20 -% @deftypefun int foobar (int @var{foo}, float @var{bar}) +% \printdefunline \deffnheader{text} +% +\def\printdefunline#1#2{% + \begingroup + % call \deffnheader: + #1#2 \endheader + % common ending: + \interlinepenalty =3D 10000 + \advance\rightskip by 0pt plus 1fil + \endgraf + \nobreak\vskip -\parskip + \penalty 10002 % signal to \startdefun and \dodefunx + % Some of the @defun-type tags do not enable magic parentheses, + % rendering the following check redundant. But we don't optimize. + \checkparencounts + \endgroup +} =20 -\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader} +\def\Edefun{\endgraf\medbreak} =20 -% #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=3D\other % Turn off change made in \defparsebody +% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; +% the only thing remainnig is to define \deffnheader. +% +\def\makedefun#1{% + \expandafter\let\csname E#1\endcsname =3D \Edefun + \edef\temp{\noexpand\domakedefun + \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% + \temp } =20 -% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar}) - -\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader} +% \domakedefun \deffn \deffnx \deffnheader +% +% Define \deffn and \deffnx, without parameters. +% \deffnheader has to be defined explicitly. +% +\def\domakedefun#1#2#3{% + \envdef#1{% + \startdefun + \parseargusing\activeparens{\printdefunline#3}% + }% + \def#2{\dodefunx#1}% + \def#3% +} =20 -% \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} +%%% Untyped functions: =20 -% #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=3D\other % Turn off change made in \defparsebody -} +% @deffn category name args +\makedefun{deffn}{\deffngeneral{}} =20 -% @defmac =3D=3D @deffn Macro +% @deffn category class name args +\makedefun{defop}#1 {\defopon{#1\ \putwordon}} =20 -\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader} +% \defopon {category on}class name args +\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } =20 -\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index -\begingroup\defname {#1}{Macro}% -\defunargs {#2}\endgroup % -\catcode 61=3D\other % Turn off change made in \defparsebody +% \deffngeneral {subind}category name args +% +\def\deffngeneral#1#2 #3 #4\endheader{% + % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. + \dosubind{fn}{\code{#3}}{#1}% + \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% } =20 -% @defspec =3D=3D @deffn Special Form +%%% Typed functions: =20 -\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader} +% @deftypefn category type name args +\makedefun{deftypefn}{\deftypefngeneral{}} =20 -\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function ind= ex -\begingroup\defname {#1}{Special Form}% -\defunargs {#2}\endgroup % -\catcode 61=3D\other % Turn off change made in \defparsebody -} +% @deftypeop category class type name args +\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} =20 -% This definition is run if you use @defunx -% anywhere other than immediately after a @defun or @defunx. +% \deftypeopon {category on}class type name args +\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#= 2}} } =20 -\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}} +% \deftypefngeneral {subind}category type name args +% +\def\deftypefngeneral#1#2 #3 #4 #5\endheader{% + \dosubind{fn}{\code{#4}}{#1}% + \defname{#2}{#3}{#4}\defunargs{#5\unskip}% +} =20 -% @defmethod, and so on +%%% Typed variables: =20 -% @defop {Funny Method} foo-class frobnicate argument +% @deftypevr category type var args +\makedefun{deftypevr}{\deftypecvgeneral{}} =20 -\def\defop #1 {\def\defoptype{#1}% -\defopparsebody\Edefop\defopx\defopheader\defoptype} +% @deftypecv category class type var args +\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} =20 -\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 % -} +% \deftypecvof {category of}class type var args +\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#= 2}} } =20 -% @deftypemethod foo-class return-type foo-method args -% -\def\deftypemethod{% - \defmethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader} +% \deftypecvgeneral {subind}category type var args % -% #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 +\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% + \dosubind{vr}{\code{#4}}{#1}% + \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } =20 -% @defmethod =3D=3D @defop Method +%%% Untyped variables: =20 -\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader} +% @defvr category var args +\makedefun{defvr}#1 {\deftypevrheader{#1} {} } =20 -\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 +% @defcv category class var args +\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} =20 -\def\defcv #1 {\def\defcvtype{#1}% -\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype} +% \defcvof {category of}class var args +\def\defcvof#1#2 {\deftypecvof{#1}#2 {} } =20 -\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 % +%%% Type: +% @deftp category name args +\makedefun{deftp}#1 #2 #3\endheader{% + \doind{tp}{\code{#2}}% + \defname{#1}{}{#2}\defunargs{#3\unskip}% } =20 -% @defivar =3D=3D @defcv {Instance Variable} +% Remaining @defun-like shortcuts: +\makedefun{defun}{\deffnheader{\putwordDeffunc} } +\makedefun{defmac}{\deffnheader{\putwordDefmac} } +\makedefun{defspec}{\deffnheader{\putwordDefspec} } +\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } +\makedefun{defvar}{\defvrheader{\putwordDefvar} } +\makedefun{defopt}{\defvrheader{\putwordDefopt} } +\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } +\makedefun{defmethod}{\defopon\putwordMethodon} +\makedefun{deftypemethod}{\deftypeopon\putwordMethodon} +\makedefun{defivar}{\defcvof\putwordInstanceVariableof} +\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} =20 -\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 % +% \defname, which formats the name of the @def (not the args). +% #1 is the category, such as "Function". +% #2 is the return type, if any. +% #3 is the function name. +%=20 +% We are followed by (but not passed) the arguments, if any. +% +\def\defname#1#2#3{% + % Get the values of \leftskip and \rightskip as they were outside the @d= ef... + \advance\leftskip by -\defbodyindent + % + % How we'll format the type name. Putting it in brackets helps + % distinguish it from the body text that may end up on the next line + % just below it. + \def\temp{#1}% + \setbox0=3D\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\= fi} + % + % Figure out line sizes for the paragraph shape. + % The first line needs space for \box0; but if \rightskip is nonzero, + % we need only space for the part of \box0 which exceeds it: + \dimen0=3D\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip + % The continuations: + \dimen2=3D\hsize \advance\dimen2 by -\defargsindent + % (plain.tex says that \dimen1 should be used only as global.) + \parshape 2 0in \dimen0 \defargsindent \dimen2 + % + % Put the type name to the right margin. + \noindent + \hbox to 0pt{% + \hfil\box0 \kern-\hsize + % \hsize has to be shortened this way: + \kern\leftskip + % Intentionally do not respect \rightskip, since we need the space. + }% + % + % Allow all lines to be underfull without complaint: + \tolerance=3D10000 \hbadness=3D10000 + \exdentamount=3D\defbodyindent + {% + % defun fonts. We use typewriter by default (used to be bold) because: + % . we're printing identifiers, they should be in tt in principle. + % . in languages with many accents, such as Czech or French, it's + % common to leave accents off identifiers. The result looks ok in + % tt, but exceedingly strange in rm. + % . we don't want -- and --- to be treated as ligatures. + % . this still does not fix the ?` and !` ligatures, but so far no + % one has made identifiers using them :). + \df \tt + \def\temp{#2}% return value type + \ifx\temp\empty\else \tclose{\temp} \fi + #3% output function name + }% + {\rm\enskip}% hskip 0.5 em of \tenrm + % + \boldbrax + % arguments will be output next, if any. } =20 -% These definitions are run if you use @defmethodx, etc., -% anywhere other than immediately after a @defmethod, etc. +% Print arguments in slanted roman (not ttsl), inconsistently with using +% tt for the name. This is because literal text is sometimes needed in +% the argument list (groff manual), and ttsl and tt are not very +% distinguishable. Prevent hyphenation at `-' chars. +%=20 +\def\defunargs#1{% + % use sl by default (not ttsl),=20 + % tt for the names. + \df \sl \hyphenchar\font=3D0 + % + % On the other hand, if an argument has two dashes (for instance), we + % want a way to get ttsl. Let's try @var for that. + \let\var=3D\ttslanted + #1% + \sl\hyphenchar\font=3D45 +} =20 -\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}} +% We want ()&[] to print specially on the defun line. +% +\def\activeparens{% + \catcode`\(=3D\active \catcode`\)=3D\active + \catcode`\[=3D\active \catcode`\]=3D\active + \catcode`\&=3D\active +} =20 -% Now @defvar +% Make control sequences which act like normal parenthesis chars. +\let\lparen =3D ( \let\rparen =3D ) =20 -% 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=3D10000 -\endgraf\penalty 10000\vskip -\parskip\penalty 10000} +% 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. +{ + \activeparens + \global\let(=3D\lparen \global\let)=3D\rparen + \global\let[=3D\lbrack \global\let]=3D\rbrack + \global\let& =3D \& =20 -% @defvr Counter foo-count + \gdef\boldbrax{\let(=3D\opnr\let)=3D\clnr\let[=3D\lbrb\let]=3D\rbrb} + \gdef\magicamp{\let&=3D\amprm} +} =20 -\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader} +\newcount\parencount =20 -\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}% -\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup} +% If we encounter &foo, then turn on ()-hacking afterwards +\newif\ifampseen +\def\amprm#1 {\ampseentrue{\bf\ }} =20 -% @defvar =3D=3D @defvr Variable +\def\parenfont{% + \ifampseen + % At the first level, print parens in roman, + % otherwise use the default font. + \ifnum \parencount=3D1 \rm \fi + \else + % The \sf parens (in \boldbrax) actually are a little bolder than + % the contained text. This is especially needed for [ and ] . + \sf + \fi +} +\def\infirstlevel#1{% + \ifampseen + \ifnum\parencount=3D1 + #1% + \fi + \fi +} +\def\bfafterword#1 {#1 \bf} =20 -\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader} +\def\opnr{% + \global\advance\parencount by 1 + {\parenfont(}% + \infirstlevel \bfafterword +} +\def\clnr{% + {\parenfont)}% + \infirstlevel \sl + \global\advance\parencount by -1 +} =20 -\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index -\begingroup\defname {#1}{Variable}% -\defvarargs {#2}\endgroup % +\newcount\brackcount +\def\lbrb{% + \global\advance\brackcount by 1 + {\bf[}% +} +\def\rbrb{% + {\bf]}% + \global\advance\brackcount by -1 } =20 -% @defopt =3D=3D @defvr {User Option} +\def\checkparencounts{% + \ifnum\parencount=3D0 \else \badparencount \fi + \ifnum\brackcount=3D0 \else \badbrackcount \fi +} +\def\badparencount{% + \errmessage{Unbalanced parentheses in @def}% + \global\parencount=3D0 +} +\def\badbrackcount{% + \errmessage{Unbalanced square braces in @def}% + \global\brackcount=3D0 +} =20 -\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader} =20 -\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index -\begingroup\defname {#1}{User Option}% -\defvarargs {#2}\endgroup % -} +\message{macros,} +% @macro. =20 -% @deftypevar int foobar +% To do this right we need a feature of e-TeX, \scantokens, +% which we arrange to emulate with a temporary file in ordinary TeX. +\ifx\eTeXversion\undefined + \newwrite\macscribble + \def\scantokens#1{% + \toks0=3D{#1\endinput}% + \immediate\openout\macscribble=3D\jobname.tmp + \immediate\write\macscribble{\the\toks0}% + \immediate\closeout\macscribble + \input \jobname.tmp + } +\fi =20 -\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader} +\def\scanmacro#1{% + \begingroup + \newlinechar`\^^M + \let\xeatspaces\eatspaces + % Undo catcode changes of \startcontents and \doprintindex + \catcode`\@=3D0 \catcode`\\=3D\other \escapechar=3D`\@ + % ... and \example + \spaceisspace + % + % Append \endinput to make sure that TeX does not see the ending newli= ne. + % + % I've verified that it is necessary both for e-TeX and for ordinary T= eX + % --kasal, 29nov03 + \scantokens{#1\endinput}% + \endgroup +} =20 -% #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 inde= x. -\def\deftypevarheader #1#2{% -\dovarind#2 \relax% Make entry in variables index -\begingroup\defname {\defheaderxcond#1\relax$$$#2}{Variable}% -\interlinepenalty=3D10000 -\endgraf\penalty 10000\vskip -\parskip\penalty 10000 -\endgroup} -\def\dovarind#1 #2\relax{\doind{vr}{\code{#1}}} +\newcount\paramno % Count of parameters +\newtoks\macname % Macro name +\newif\ifrecursive % Is it recursive? +\def\macrolist{} % List of all defined macros in the form + % \do\macro1\do\macro2... + +% Utility routines. +% This does \let #1 =3D #2, except with \csnames. +\def\cslet#1#2{% +\expandafter\expandafter +\expandafter\let +\expandafter\expandafter +\csname#1\endcsname +\csname#2\endcsname} =20 -% @deftypevr {Global Flag} int enable +% Trim leading and trailing spaces off a string. +% Concepts from aro-bend problem 15 (see CTAN). +{\catcode`\@=3D11 +\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} +\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} +\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} +\def\unbrace#1{#1} +\unbrace{\gdef\trim@@@ #1 } #2@{#1} +} =20 -\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader} +% Trim a single trailing ^^M off a string. +{\catcode`\^^M=3D\other \catcode`\Q=3D3% +\gdef\eatcr #1{\eatcra #1Q^^MQ}% +\gdef\eatcra#1^^MQ{\eatcrb#1Q}% +\gdef\eatcrb#1Q#2Q{#1}% +} =20 -\def\deftypevrheader #1#2#3{\dovarind#3 \relax% -\begingroup\defname {\defheaderxcond#2\relax$$$#3}{#1} -\interlinepenalty=3D10000 -\endgraf\penalty 10000\vskip -\parskip\penalty 10000 -\endgroup} +% Macro bodies are absorbed as an argument in a context where +% all characters are catcode 10, 11 or 12, except \ which is active +% (as in normal texinfo). It is necessary to change the definition of \. =20 -% This definition is run if you use @defvarx -% anywhere other than immediately after a @defvar or @defvarx. +% It's necessary to have hard CRs when the macro is executed. This is +% done by making ^^M (\endlinechar) catcode 12 when reading the macro +% body, and then making it the \newlinechar in \scanmacro. =20 -\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}} +\def\macrobodyctxt{% + \catcode`\~=3D\other + \catcode`\^=3D\other + \catcode`\_=3D\other + \catcode`\|=3D\other + \catcode`\<=3D\other + \catcode`\>=3D\other + \catcode`\+=3D\other + \catcode`\{=3D\other + \catcode`\}=3D\other + \catcode`\@=3D\other + \catcode`\^^M=3D\other + \usembodybackslash} =20 -% Now define @deftp -% Args are printed in bold, a slight difference from @defvar. +\def\macroargctxt{% + \catcode`\~=3D\other + \catcode`\^=3D\other + \catcode`\_=3D\other + \catcode`\|=3D\other + \catcode`\<=3D\other + \catcode`\>=3D\other + \catcode`\+=3D\other + \catcode`\@=3D\other + \catcode`\\=3D\other} =20 -\def\deftpargs #1{\bf \defvarargs{#1}} +% \mbodybackslash is the definition of \ in @macro bodies. +% It maps \foo\ =3D> \csname macarg.foo\endcsname =3D> #N +% where N is the macro parameter number. +% We define \csname macarg.\endcsname to be \realbackslash, so +% \\ in macro replacement text gets you a backslash. + +{\catcode`@=3D0 @catcode`@\=3D@active + @gdef@usembodybackslash{@let\=3D@mbodybackslash} + @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} +} +\expandafter\def\csname macarg.\endcsname{\realbackslash} + +\def\macro{\recursivefalse\parsearg\macroxxx} +\def\rmacro{\recursivetrue\parsearg\macroxxx} + +\def\macroxxx#1{% + \getargs{#1}% now \macname is the macname and \argl the arglist + \ifx\argl\empty % no arguments + \paramno=3D0% + \else + \expandafter\parsemargdef \argl;% + \fi + \if1\csname ismacro.\the\macname\endcsname + \message{Warning: redefining \the\macname}% + \else + \expandafter\ifx\csname \the\macname\endcsname \relax + \else \errmessage{Macro name \the\macname\space already defined}\fi + \global\cslet{macsave.\the\macname}{\the\macname}% + \global\expandafter\let\csname ismacro.\the\macname\endcsname=3D1% + % Add the macroname to \macrolist + \toks0 =3D \expandafter{\macrolist\do}% + \xdef\macrolist{\the\toks0 + \expandafter\noexpand\csname\the\macname\endcsname}% + \fi + \begingroup \macrobodyctxt + \ifrecursive \expandafter\parsermacbody + \else \expandafter\parsemacbody + \fi} + +\parseargdef\unmacro{% + \if1\csname ismacro.#1\endcsname + \global\cslet{#1}{macsave.#1}% + \global\expandafter\let \csname ismacro.#1\endcsname=3D0% + % Remove the macro name from \macrolist: + \begingroup + \expandafter\let\csname#1\endcsname \relax + \let\do\unmacrodo + \xdef\macrolist{\macrolist}% + \endgroup + \else + \errmessage{Macro #1 not defined}% + \fi +} =20 -% @deftp Class window height width ... +% Called by \do from \dounmacro on each macro. The idea is to omit any +% macro definitions that have been changed to \relax. +% +\def\unmacrodo#1{% + \ifx#1\relax + % remove this + \else + \noexpand\do \noexpand #1% + \fi +} =20 -\def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader} +% This makes use of the obscure feature that if the last token of a +% is #, then the preceding argument is delimited by +% an opening brace, and that opening brace is not consumed. +\def\getargs#1{\getargsxxx#1{}} +\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} +\def\getmacname #1 #2\relax{\macname=3D{#1}} +\def\getmacargs#1{\def\argl{#1}} + +% Parse the optional {params} list. Set up \paramno and \paramlist +% so \defmacro knows what to do. Define \macarg.blah for each blah +% in the params list, to be ##N where N is the position in that list. +% That gets used by \mbodybackslash (above). + +% We need to get `macro parameter char #' into several definitions. +% The technique used is stolen from LaTeX: let \hash be something +% unexpandable, insert that wherever you need a #, and then redefine +% it to # just before using the token list produced. +% +% The same technique is used to protect \eatspaces till just before +% the macro is used. + +\def\parsemargdef#1;{\paramno=3D0\def\paramlist{}% + \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,} +\def\parsemargdefxxx#1,{% + \if#1;\let\next=3D\relax + \else \let\next=3D\parsemargdefxxx + \advance\paramno by 1% + \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname + {\xeatspaces{\hash\the\paramno}}% + \edef\paramlist{\paramlist\hash\the\paramno,}% + \fi\next} + +% These two commands read recursive and nonrecursive macro bodies. +% (They're different since rec and nonrec macros end differently.) + +\long\def\parsemacbody#1@end macro% +{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% +\long\def\parsermacbody#1@end rmacro% +{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% + +% This defines the macro itself. There are six cases: recursive and +% nonrecursive macros of zero, one, and many arguments. +% Much magic with \expandafter here. +% \xdef is used so that macro definitions will survive the file +% they're defined in; @include reads the file inside a group. +\def\defmacro{% + \let\hash=3D##% convert placeholders to macro parameter chars + \ifrecursive + \ifcase\paramno + % 0 + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\scanmacro{\temp}}% + \or % 1 + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\braceorline + \expandafter\noexpand\csname\the\macname xxx\endcsname}% + \expandafter\xdef\csname\the\macname xxx\endcsname##1{% + \egroup\noexpand\scanmacro{\temp}}% + \else % many + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\csname\the\macname xx\endcsname}% + \expandafter\xdef\csname\the\macname xx\endcsname##1{% + \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% + \expandafter\expandafter + \expandafter\xdef + \expandafter\expandafter + \csname\the\macname xxx\endcsname + \paramlist{\egroup\noexpand\scanmacro{\temp}}% + \fi + \else + \ifcase\paramno + % 0 + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \or % 1 + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\braceorline + \expandafter\noexpand\csname\the\macname xxx\endcsname}% + \expandafter\xdef\csname\the\macname xxx\endcsname##1{% + \egroup + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \else % many + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \expandafter\noexpand\csname\the\macname xx\endcsname}% + \expandafter\xdef\csname\the\macname xx\endcsname##1{% + \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% + \expandafter\expandafter + \expandafter\xdef + \expandafter\expandafter + \csname\the\macname xxx\endcsname + \paramlist{% + \egroup + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \fi + \fi} =20 -\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}% -\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup} +\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} =20 -% This definition is run if you use @deftpx, etc -% anywhere other than immediately after a @deftp, etc. +% \braceorline decides whether the next nonwhitespace character is a +% {. If so it reads up to the closing }, if not, it reads the whole +% line. Whatever was read is then fed to the next control sequence +% as an argument (by \parsebrace or \parsearg) +\def\braceorline#1{\let\next=3D#1\futurelet\nchar\braceorlinexxx} +\def\braceorlinexxx{% + \ifx\nchar\bgroup\else + \expandafter\parsearg + \fi \next} + +% We mant to disable all macros during \shipout so that they are not +% expanded by \write. +\def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=3D\relax}% + \edef\next{\macrolist}\expandafter\endgroup\next} + + +% @alias. +% We need some trickery to remove the optional spaces around the equal +% sign. Just make them active and then expand them all to nothing. +\def\alias{\parseargusing\obeyspaces\aliasxxx} +\def\aliasxxx #1{\aliasyyy#1\relax} +\def\aliasyyy #1=3D#2\relax{% + {% + \expandafter\let\obeyedspace=3D\empty + \xdef\next{\global\let\makecsname{#1}=3D\makecsname{#2}}% + }% + \next +} =20 -\def\deftpx #1 {\errmessage{@deftpx in invalid context}} =20 +\message{cross references,} =20 -\message{cross reference,} -% Define cross-reference macros -\newwrite \auxfile +\newwrite\auxfile =20 -\newif\ifhavexrefs % True if xref values are known. +\newif\ifhavexrefs % True if xref values are known. \newif\ifwarnedxrefs % True if we warned once that they aren't known. =20 -% @inforef is simple. +% @inforef is relatively simple. \def\inforef #1{\inforefzzz #1,,,,**} \def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} = \file{\ignorespaces #3{}}, node \samp{\ignorespaces#1{}}} =20 -% \setref{foo} defines a cross-reference point named foo. +% @node's only job in TeX is to define \lastnode, which is used in +% cross-references. The @node line might or might not have commas, and +% might or might not have spaces before the first comma, like: +% @node foo , bar , ... +% We don't want such trailing spaces in the node name. +%=20 +\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} +% +% also remove a trailing comma, in case of something like this: +% @node Help-Cross, , , Cross-refs +\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} +\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} + +\let\nwnode=3D\node +\let\lastnode=3D\empty + +% Write a cross-reference definition for the current node. #1 is the +% type (Ynumbered, Yappendix, Ynothing). +%=20 +\def\donoderef#1{% + \ifx\lastnode\empty\else + \setref{\lastnode}{#1}% + \global\let\lastnode=3D\empty + \fi +} + +% @anchor{NAME} -- define xref target at arbitrary point. +% +\newcount\savesfregister +% +\def\savesf{\relax \ifhmode \savesfregister=3D\spacefactor \fi} +\def\restoresf{\relax \ifhmode \spacefactor=3D\savesfregister \fi} +\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} + +% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an +% anchor), which consists of three parts: +% 1) NAME-title - the current sectioning name taken from \thissection, +% or the anchor name. +% 2) NAME-snt - section number and type, passed as the SNT arg, or +% empty for anchors. +% 3) NAME-pg - the page number. +%=20 +% This is called from \donoderef, \anchor, and \dofloat. In the case of +% floats, there is an additional part, which is not written here: +% 4) NAME-lof - the text as it should appear in a @listoffloats. +%=20 +\def\setref#1#2{% + \pdfmkdest{#1}% + \iflinks + {% + \atdummies % preserve commands, but don't expand them + \turnoffactive + \otherbackslash + \edef\writexrdef##1##2{% + \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef + ##1}{##2}}% these are parameters of \writexrdef + }% + \toks0 =3D \expandafter{\thissection}% + \immediate \writexrdef{title}{\the\toks0 }% + \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. + \writexrdef{pg}{\folio}% will be written later, during \shipout + }% + \fi +} =20 -\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. +% @xref, @pxref, and @ref generate cross-references. 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 + \unsepspaces \def\printedmanual{\ignorespaces #5}% - \def\printednodename{\ignorespaces #3}% - \setbox1=3D\hbox{\printedmanual}% - \setbox0=3D\hbox{\printednodename}% + \def\printedrefname{\ignorespaces #3}% + \setbox1=3D\hbox{\printedmanual\unskip}% + \setbox0=3D\hbox{\printedrefname\unskip}% \ifdim \wd0 =3D 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}% + \def\printedrefname{\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% + \ifdim \wd1 > 0pt % It is in another manual, so we don't have it. - \def\printednodename{\ignorespaces #1}% + \def\printedrefname{\ignorespaces #1}% \else \ifhavexrefs % We know the real title if we have the xref values. - \def\printednodename{\refx{#1-title}{}}% + \def\printedrefname{\refx{#1-title}{}}% \else % Otherwise just copy the Info node name. - \def\printednodename{\ignorespaces #1}% + \def\printedrefname{\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}{}% + % Make link in pdf output. + \ifpdf + \leavevmode + \getfilename{#4}% + {\turnoffactive \otherbackslash + \ifnum\filenamelength>0 + \startlink attr{/Border [0 0 0]}% + goto file{\the\filename.pdf} name{#1}% + \else + \startlink attr{/Border [0 0 0]}% + goto name{\pdfmkpgn{#1}}% + \fi + }% + \linkcolor \fi + % + % Float references are printed completely differently: "Figure 1.2" + % instead of "[somenode], p.3". We distinguish them by the + % LABEL-title being set to a magic string. + {% + % Have to otherify everything special to allow the \csname to + % include an _ in the xref name, etc. + \indexnofonts + \turnoffactive + \otherbackslash + \expandafter\global\expandafter\let\expandafter\Xthisreftitle + \csname XR#1-title\endcsname + }% + \iffloat\Xthisreftitle + % If the user specified the print name (third arg) to the ref, + % print it instead of our usual "Figure 1.2". + \ifdim\wd0 =3D 0pt + \refx{#1-snt}% + \else + \printedrefname + \fi + % + % if the user also gave the printed manual name (fifth arg), append + % "in MANUALNAME".=20 + \ifdim \wd1 > 0pt + \space \putwordin{} \cite{\printedmanual}% + \fi + \else + % node/anchor (non-float) references. + %=20 + % 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 manua= ls + % are best written with fairly long node names, containing hyphens, th= is + % 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{} ``\printedrefname'' \putwordin{} \cite{\printedman= ual}% + \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 \otherbackslash + % Only output a following space if the -snt ref is nonempty; for + % @unnumbered and @anchor, it won't be. + \setbox2 =3D \hbox{\ignorespaces \refx{#1-snt}{}}% + \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi + }% + % output the `[mynode]' via a macro so it can be overridden. + \xrefprintnodename\printedrefname + % + % But we always want a comma and a space: + ,\space + % + % output the `page 3'. + \turnoffactive \otherbackslash \putwordpage\tie\refx{#1-pg}{}% + \fi + \fi + \endlink \endgroup} =20 -% \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=3D0 \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=3D0 \putwordChapter\xreftie\the\chapno % -\else \ifnum \subsecno=3D0 \putwordSection\xreftie\the\chapno.\the\secno % -\else \ifnum \subsubsecno=3D0 % -\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno % -\else % -\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsec= no % -\fi \fi \fi } - -\def\Yappendixletterandtype{% -\ifnum\secno=3D0 \putwordAppendix\xreftie'char\the\appendixno{}% -\else \ifnum \subsecno=3D0 \putwordSection\xreftie'char\the\appendixno.\th= e\secno % -\else \ifnum \subsubsecno=3D0 % -\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} +% This macro is called from \xrefX for the `[nodename]' part of xref +% output. It's a separate macro only so it can be changed more easily, +% since square brackets don't work well in some documents. Particularly +% one that Bob is working on :). +% +\def\xrefprintnodename#1{[#1]} =20 -% 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. +% Things referred to by \setref. % -\ifx\inputlineno\thisisundefined - \let\linenumber =3D \empty % Non-3.0. -\else - \def\linenumber{\the\inputlineno:\space} -\fi +\def\Ynothing{} +\def\Yomitfromtoc{} +\def\Ynumbered{% + \ifnum\secno=3D0 + \putwordChapter@tie \the\chapno + \else \ifnum\subsecno=3D0 + \putwordSection@tie \the\chapno.\the\secno + \else \ifnum\subsubsecno=3D0 + \putwordSection@tie \the\chapno.\the\secno.\the\subsecno + \else + \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubse= cno + \fi\fi\fi +} +\def\Yappendix{% + \ifnum\secno=3D0 + \putwordAppendix@tie @char\the\appendixno{}% + \else \ifnum\subsecno=3D0 + \putwordSection@tie @char\the\appendixno.\the\secno + \else \ifnum\subsubsecno=3D0 + \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno + \else + \putwordSection@tie + @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno + \fi\fi\fi +} =20 % Define \refx{NAME}{SUFFIX} to reference a cross-reference string named N= AME. % If its value is nonempty, SUFFIX is output afterward. - +% \def\refx#1#2{% - \expandafter\ifx\csname X#1\endcsname\relax + {% + \indexnofonts + \otherbackslash + \expandafter\global\expandafter\let\expandafter\thisrefX + \csname XR#1\endcsname + }% + \ifx\thisrefX\relax % If not defined, say something at least. - $\langle$un\-de\-fined$\rangle$% - \ifhavexrefs - \message{\linenumber Undefined cross reference `#1'.}% - \else - \ifwarnedxrefs\else - \global\warnedxrefstrue - \message{Cross reference values unknown; you must run TeX again.}% + \angleleft un\-de\-fined\angleright + \iflinks + \ifhavexrefs + \message{\linenumber Undefined cross reference `#1'.}% + \else + \ifwarnedxrefs\else + \global\warnedxrefstrue + \message{Cross reference values unknown; you must run TeX again.= }% + \fi \fi \fi \else % It's defined, so just use it. - \csname X#1\endcsname + \thisrefX \fi #2% Output the suffix in any case. } =20 -% This is the macro invoked by entries in the aux file. -\def\xrdef #1#2{{% - \catcode`\'=3D\other - \expandafter\gdef\csname X#1\endcsname{#2}% -}} +% This is the macro invoked by entries in the aux file. Usually it's +% just a \def (we prepend XR to the control sequence name to avoid +% collisions). But if this is a float type, we have more work to do. +% +\def\xrdef#1#2{% + \expandafter\gdef\csname XR#1\endcsname{#2}% remember this xref value. + % + % Was that xref control sequence that we just defined for a float? + \expandafter\iffloat\csname XR#1\endcsname + % it was a float, and we have the (safe) float type in \iffloattype. + \expandafter\let\expandafter\floatlist + \csname floatlist\iffloattype\endcsname + %=20 + % Is this the first time we've seen this float type? + \expandafter\ifx\floatlist\relax + \toks0 =3D {\do}% yes, so just \do + \else + % had it before, so preserve previous elements in list. + \toks0 =3D \expandafter{\floatlist\do}% + \fi + % + % Remember this xref in the control sequence \floatlistFLOATTYPE, + % for later use in \listoffloats. + \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0{#1= }}% + \fi +} =20 % Read the last existing aux file, if any. No error if none exists. +%=20 +\def\tryauxfile{% + \openin 1 \jobname.aux + \ifeof 1 \else + \readauxfile + \global\havexrefstrue + \fi + \closein 1 +} + \def\readauxfile{\begingroup \catcode`\^^@=3D\other - \catcode`\=01=3D\other - \catcode`\=02=3D\other + \catcode`\^^A=3D\other + \catcode`\^^B=3D\other \catcode`\^^C=3D\other \catcode`\^^D=3D\other \catcode`\^^E=3D\other \catcode`\^^F=3D\other \catcode`\^^G=3D\other \catcode`\^^H=3D\other - \catcode`\=0B=3D\other + \catcode`\^^K=3D\other \catcode`\^^L=3D\other - \catcode`\=0E=3D\other - \catcode`\=0F=3D\other - \catcode`\=10=3D\other - \catcode`\=11=3D\other - \catcode`\=12=3D\other - \catcode`\=13=3D\other - \catcode`\=14=3D\other - \catcode`\=15=3D\other - \catcode`\=16=3D\other - \catcode`\=17=3D\other - \catcode`\=18=3D\other - \catcode`\=19=3D\other - \catcode26=3D\other + \catcode`\^^N=3D\other + \catcode`\^^P=3D\other + \catcode`\^^Q=3D\other + \catcode`\^^R=3D\other + \catcode`\^^S=3D\other + \catcode`\^^T=3D\other + \catcode`\^^U=3D\other + \catcode`\^^V=3D\other + \catcode`\^^W=3D\other + \catcode`\^^X=3D\other + \catcode`\^^Z=3D\other \catcode`\^^[=3D\other \catcode`\^^\=3D\other \catcode`\^^]=3D\other \catcode`\^^^=3D\other \catcode`\^^_=3D\other - \catcode`\@=3D\other - \catcode`\^=3D\other - % It was suggested to define this as 7, which would allow ^^e4 etc. + % It was suggested to set the catcode of ^ to 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 ^ @@ -4346,6 +6081,9 @@ % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter % and then to call \auxhat in \setq. % + \catcode`\^=3D\other + % + % Special characters. Should be turned off anyway, but... \catcode`\~=3D\other \catcode`\[=3D\other \catcode`\]=3D\other @@ -4357,9 +6095,19 @@ \catcode`\$=3D\other \catcode`\#=3D\other \catcode`\&=3D\other - % `\+ does not work, so use 43. - \catcode43=3D\other - % Make the characters 128-255 be printing characters + \catcode`\%=3D\other + \catcode`+=3D\other % avoid \+ for paranoia even though we've turned it = off + % + % This is to support \ in node names and titles, since the \ + % characters end up in a \csname. It's easier than + % leaving it active and making its active definition an actual \ + % character. What I don't understand is why it works in the *value* + % of the xrdef. Seems like it should be a catcode12 \, and that + % should not typeset properly. But it works, so I'm moving on for + % now. --karl, 15jan04. + \catcode`\\=3D\other + % + % Make the characters 128-255 be printing characters. {% \count 1=3D128 \def\loop{% @@ -4368,31 +6116,18 @@ \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. + % + % @ is our escape character in .aux files, and we need braces. \catcode`\{=3D1 \catcode`\}=3D2 - \catcode`\%=3D\other - \catcode`\'=3D0 - \catcode`\\=3D\other + \catcode`\@=3D0 % - \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=3D\jobname.aux + \input \jobname.aux \endgroup} =20 =20 -% Footnotes. +\message{insertions,} +% including footnotes. =20 \newcount \footnoteno =20 @@ -4403,40 +6138,42 @@ % space to prevent strange expansion errors.) \def\supereject{\par\penalty -20000\footnoteno =3D0 } =20 -% @footnotestyle is meaningful for info output only.. +% @footnotestyle is meaningful for info output only. \let\footnotestyle=3D\comment =20 -\let\ptexfootnote=3D\footnote - {\catcode `\@=3D11 % % Auto-number footnotes. Otherwise like plain. \gdef\footnote{% + \let\indent=3D\ptexindent + \let\noindent=3D\ptexnoindent \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 + \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi % % Remove inadvertent blank space before typesetting the footnote number. \unskip \thisfootno\@sf - \footnotezzz + \dofootnote }% =20 % 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 +% Oh yes, they do; otherwise, @ifset (and anything else that uses +% \parseargline) fails inside footnotes because the tokens are fixed when % the footnote is read. --karl, 16nov96. % -\long\gdef\footnotezzz{\insert\footins\bgroup +\gdef\dofootnote{% + \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. + \hsize=3D\pagewidth \interlinepenalty\interfootnotelinepenalty \splittopskip\ht\strutbox % top baseline for broken footnotes \splitmaxdepth\dp\strutbox @@ -4447,8 +6184,17 @@ \xspaceskip\z@skip \parindent\defaultparindent % - % Hang the footnote text off the number. - \hang + \smallfonts \rm + % + % Because we use hanging indentation in footnotes, a @noindent appears + % to exdent this text, so make it be a no-op. makeinfo does not use + % hanging indentation so @noindent can still be needed within footnote + % text after an @example or the like (not that this is good style). + \let\noindent =3D \relax + % + % Hang the footnote text off the number. Use \everypar in case the + % footnote extends for more than one paragraph. + \everypar =3D {\hang}% \textindent{\thisfootno}% % % Don't crash into the line above the footnote text. Since this @@ -4457,97 +6203,428 @@ \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 `\@=3D11 =20 -% 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} +% In case a @footnote appears in a vbox, save the footnote text and create +% the real \insert just after the vbox finished. Otherwise, the insertion +% would be lost. +% Similarily, if a @footnote appears inside an alignment, save the footnote +% text to a box and make the \insert when a row of the table is finished. +% And the same can be done for other insert classes. --kasal, 16nov03. + +% Replace the \insert primitive by a cheating macro. +% Deeper inside, just make sure that the saved insertions are not spilled +% out prematurely. +% +\def\startsavinginserts{% + \ifx \insert\ptexinsert + \let\insert\saveinsert + \else + \let\checkinserts\relax + \fi +} + +% This \insert replacement works for both \insert\footins{foo} and +% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo= }. % -\def\setleading#1{% - \normalbaselineskip =3D #1\relax - \normallineskip =3D \lineskipfactor\normalbaselineskip - \normalbaselines - \setbox\strutbox =3D\hbox{% - \vrule width0pt height\strutheightpercent\baselineskip - depth \strutdepthpercent \baselineskip - }% +\def\saveinsert#1{% + \edef\next{\noexpand\savetobox \makeSAVEname#1}% + \afterassignment\next + % swallow the left brace + \let\temp =3D } +\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} +\def\savetobox#1{\global\setbox#1 =3D \vbox\bgroup \unvbox#1} =20 -% @| 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\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} + +\def\placesaveins#1{% + \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname + {\box#1}% +} + +% eat @SAVE -- beware, all of them have catcode \other: +{ + \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) + \gdef\gobblesave @SAVE{} +} + +% initialization: +\def\newsaveins #1{% + \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% + \next +} +\def\newsaveinsX #1{% + \csname newbox\endcsname #1% + \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts + \checksaveins #1}% +} + +% initialize: +\let\checkinserts\empty +\newsaveins\footins +\newsaveins\margin + + +% @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 =3D epsf.tex +\ifeof 1 \else + % Do not bother showing banner with epsf.tex v2.7k (available in + % doc/epsf.tex and on ctan). + \def\epsfannounce{\toks0 =3D }% + \input epsf.tex +\fi +\closein 1 % -\def\|{% - % \vadjust can only be used in horizontal mode. - \leavevmode +% We will only complain once about lack of epsf.tex. +\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://tug.org/tex/epsf.tex.} +% +\def\image#1{% + \ifx\epsfbox\undefined + \ifwarnednoepsf \else + \errhelp =3D \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 (ignored optional) html alt text. +% #5 is (ignored optional) extension. +% #6 is just the usual extra ignored arg for parsing this stuff. +\newif\ifimagevmode +\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup + \catcode`\^^M =3D 5 % in case we're inside an example + \normalturnoffactive % allow _ et al. in names + % If the image is by itself, center it. + \ifvmode + \imagevmodetrue + \nobreak\bigskip + % Usually we'll have text after the image which will insert + % \parskip glue, so insert it here too to equalize the space + % above and below. + \nobreak\vskip\parskip + \nobreak + \line\bgroup\hss + \fi % - % Append this vertical mode material after the current line in the outpu= t. - \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 + % Output the image. + \ifpdf + \dopdfimage{#1}{#2}{#3}% + \else + % \epsfbox itself resets \epsf?size at each figure. + \setbox0 =3D \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=3D#2\r= elax \fi + \setbox0 =3D \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=3D#3\r= elax \fi + \epsfbox{#1.eps}% + \fi + % + \ifimagevmode \hss \egroup \bigbreak \fi % space after the image +\endgroup} + + +% @float FLOATTYPE,LOC ... @end float for displayed figures, tables, etc. +% We don't actually implement floating yet, we just plop the float "here". +% But it seemed the best name for the future. +%=20 +\envparseargdef\float{\dofloat #1,,,\finish} + +% #1 is the optional FLOATTYPE, the text label for this float, typically +% "Figure", "Table", "Example", etc. Can't contain commas. If omitted, +% this float will not be numbered and cannot be referred to. +%=20 +% #2 is the optional xref label. Also must be present for the float to +% be referable. +%=20 +% #3 is the optional positioning argument; for now, it is ignored. It +% will somehow specify the positions allowed to float to (here, top, botto= m). +%=20 +% We keep a separate counter for each FLOATTYPE, which we reset at each +% chapter-level command. +\let\resetallfloatnos=3D\empty +% +\def\dofloat#1,#2,#3,#4\finish{% + \let\thiscaption=3D\empty + \let\thisshortcaption=3D\empty + % + % don't lose footnotes inside @float. + \startsavinginserts + % + % We can't be used inside a paragraph. + \par + % + \vtop\bgroup + \def\floattype{#1}% + \def\floatlabel{#2}% + \def\floatloc{#3}% we do nothing with this yet. % - % \vadjust-items are inserted at the left edge of the type. So - % the \llap here moves out into the left-hand margin. - \llap{% + \ifx\floattype\empty + \let\safefloattype=3D\empty + \else + {% + % the floattype might have accents or other special characters, + % but we need to use it in a control sequence name. + \indexnofonts + \turnoffactive + \xdef\safefloattype{\floattype}% + }% + \fi + % + % If label is given but no type, we handle that as the empty type. + \ifx\floatlabel\empty \else + % We want each FLOATTYPE to be numbered separately (Figure 1, + % Table 1, Figure 2, ...). (And if no label, no number.) + %=20 + \expandafter\getfloatno\csname\safefloattype floatno\endcsname + \global\advance\floatno by 1 % - % For a thicker or thinner bar, change the `1pt'. - \vrule height\baselineskip width1pt + {% + % This magic value for \thissection is output by \setref as the + % XREFLABEL-title value. \xrefX uses it to distinguish float + % labels (which have a completely different output format) from + % node and anchor labels. And \xrdef uses it to construct the + % lists of floats. + %=20 + \edef\thissection{\floatmagic=3D\safefloattype}% + \setref{\floatlabel}{Yfloat}% + }% + \fi + % + % start with \parskip glue, I guess. + \vskip\parskip + % + % Don't suppress indentation if a float happens to start a section. + \restorefirstparagraphindent +} + +% we have these possibilities: +% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap +% @float Foo,lbl & no caption: Foo 1.1 +% @float Foo & @caption{Cap}: Foo: Cap +% @float Foo & no caption: Foo +% @float ,lbl & Caption{Cap}: 1.1: Cap +% @float ,lbl & no caption: 1.1 +% @float & @caption{Cap}: Cap +% @float & no caption: +% +\def\Efloat{% + \let\floatident =3D \empty + % + % In all cases, if we have a float type, it comes first. + \ifx\floattype\empty \else \def\floatident{\floattype}\fi + % + % If we have an xref label, the number comes next. + \ifx\floatlabel\empty \else + \ifx\floattype\empty \else % if also had float type, need tie first. + \appendtomacro\floatident{\tie}% + \fi + % the number. + \appendtomacro\floatident{\chaplevelprefix\the\floatno}% + \fi + % + % Start the printed caption with what we've constructed in + % \floatident, but keep it separate; we need \floatident again. + \let\captionline =3D \floatident + % + \ifx\thiscaption\empty \else + \ifx\floatident\empty \else + \appendtomacro\captionline{: }% had ident, so need a colon between + \fi % - % This is the space between the bar and the text. - \hskip 12pt - }% - }% + % caption text. + \appendtomacro\captionline\thiscaption + \fi + % + % If we have anything to print, print it, with space before. + % Eventually this needs to become an \insert. + \ifx\captionline\empty \else + \vskip.5\parskip + \captionline + \fi + % + % If have an xref label, write the list of floats info. Do this + % after the caption, to avoid chance of it being a breakpoint. + \ifx\floatlabel\empty \else + % Write the text that goes in the lof to the aux file as + % \floatlabel-lof. Besides \floatident, we include the short + % caption if specified, else the full caption if specified, else not= hing. + {% + \atdummies \turnoffactive \otherbackslash + \immediate\write\auxfile{@xrdef{\floatlabel-lof}{% + \floatident + \ifx\thisshortcaption\empty + \ifx\thiscaption\empty \else : \thiscaption \fi + \else + : \thisshortcaption + \fi + }}% + }% + \fi + % + % Space below caption, if we printed anything. + \ifx\printedsomething\empty \else \vskip\parskip \fi + \egroup % end of \vtop + \checkinserts } =20 -% 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). +% Append the tokens #2 to the definition of macro #1, not expanding either. +%=20 +\newtoks\appendtomacroAtoks +\newtoks\appendtomacroBtoks +\def\appendtomacro#1#2{% + \appendtomacroAtoks =3D \expandafter{#1}% + \appendtomacroBtoks =3D {#2}% + \edef#1{\the\appendtomacroAtoks \the\appendtomacroBtoks}% +} + +% @caption, @shortcaption are easy. +%=20 +\long\def\caption#1{\checkenv\float \def\thiscaption{#1}} +\def\shortcaption#1{\checkenv\float \def\thisshortcaption{#1}} + +% The parameter is the control sequence identifying the counter we are +% going to use. Create it if it doesn't exist and assign it to \floatno. +\def\getfloatno#1{% + \ifx#1\relax + % Haven't seen this figure type before. + \csname newcount\endcsname #1% + % + % Remember to reset this floatno at the next chap. + \expandafter\gdef\expandafter\resetallfloatnos + \expandafter{\resetallfloatnos #1=3D0 }% + \fi + \let\floatno#1% +} + +% \setref calls this to get the XREFLABEL-snt value. We want an @xref +% to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we +% first read the @float command. +%=20 +\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% + +% Magic string used for the XREFLABEL-title value, so \xrefX can +% distinguish floats from other xref types. +\def\floatmagic{!!float!!} + +% #1 is the control sequence we are passed; we expand into a conditional +% which is true if #1 represents a float ref. That is, the magic +% \thissection value which we \setref above. +%=20 +\def\iffloat#1{\expandafter\doiffloat#1=3D=3D\finish} % -\def\finalout{\overfullrule=3D0pt} +% #1 is (maybe) the \floatmagic string. If so, #2 will be the +% (safe) float type for this float. We set \iffloattype to #2. +%=20 +\def\doiffloat#1=3D#2=3D#3\finish{% + \def\temp{#1}% + \def\iffloattype{#2}% + \ifx\temp\floatmagic +} =20 +% @listoffloats FLOATTYPE - print a list of floats like a table of content= s. +%=20 +\parseargdef\listoffloats{% + \def\floattype{#1}% floattype + {% + % the floattype might have accents or other special characters, + % but we need to use it in a control sequence name. + \indexnofonts + \turnoffactive + \xdef\safefloattype{\floattype}% + }% + % + % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. + \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax + \ifhavexrefs + % if the user said @listoffloats foo but never @float foo. + \message{\linenumber No `\safefloattype' floats to list.}% + \fi + \else + \begingroup + \leftskip=3D\tocindent % indent these entries like a toc + \let\do=3D\listoffloatsdo + \csname floatlist\safefloattype\endcsname + \endgroup + \fi +} =20 -% End of control word definitions. +% This is called on each entry in a list of floats. We're passed the +% xref label, in the form LABEL-title, which is how we save it in the +% aux file. We strip off the -title and look up \XRLABEL-lof, which +% has the text we're supposed to typeset here. +%=20 +% Figures without xref labels will not be included in the list (since +% they won't appear in the aux file). +%=20 +\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} +\def\listoffloatsdoentry#1-title\finish{{% + % Can't fully expand XR#1-lof because it can contain anything. Just + % pass the control sequence. On the other hand, XR#1-pg is just the + % page number, and we want to fully expand that so we can get a link + % in pdf output. + \toksA =3D \expandafter{\csname XR#1-lof\endcsname}% + % + % use the same \entry macro we use to generate the TOC and index. + \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% + \writeentry +}} =20 -\message{and turning on texinfo input format.} +\message{localization,} +% and i18n. =20 -\def\openindices{% - \newindex{cp}% - \newcodeindex{fn}% - \newcodeindex{vr}% - \newcodeindex{tp}% - \newcodeindex{ky}% - \newcodeindex{pg}% +% @documentlanguage is usually given very early, just after +% @setfilename. If done too late, it may not override everything +% properly. Single argument is the language abbreviation. +% It would be nice if we could set up a hyphenation file here. +% +\parseargdef\documentlanguage{% + \tex % read txi-??.tex file in plain TeX. + % Read the file if it exists. + \openin 1 txi-#1.tex + \ifeof 1 + \errhelp =3D \nolanghelp + \errmessage{Cannot read language file txi-#1.tex}% + \else + \input txi-#1.tex + \fi + \closein 1 + \endgroup } +\newhelp\nolanghelp{The given language definition file cannot be found or +is empty. Maybe you need to install it? In the current directory +should work if nowhere else does.} + + +% @documentencoding should change something in TeX eventually, most +% likely, but for now just recognize it. +\let\documentencoding =3D \comment =20 -% Set some numeric style parameters, for 8.5 x 11 format. =20 -\hsize =3D 6in -\hoffset =3D .25in +% Page size parameters. +% \newdimen\defaultparindent \defaultparindent =3D 15pt -\parindent =3D \defaultparindent -\parskip 3pt plus 2pt minus 1pt -\setleading{13.2pt} -\advance\topskip by 1.2cm =20 \chapheadingskip =3D 15pt plus 4pt minus 2pt \secheadingskip =3D 12pt plus 3pt minus 2pt \subsecheadingskip =3D 9pt plus 2pt minus 2pt =20 % Prevent underfull vbox error messages. -\vbadness=3D10000 +\vbadness =3D 10000 + +% Don't be so finicky about underfull hboxes, either. +\hbadness =3D 2000 =20 % Following George Bush, just get rid of widows and orphans. \widowpenalty=3D10000 @@ -4556,101 +6633,181 @@ % 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. +% \hsize. We call this whenever the paper size is set. % -\ifx\emergencystretch\thisisundefined - % Allow us to assign to \emergencystretch anyway. - \def\emergencystretch{\dimen0}% -\else - \emergencystretch =3D \hsize - \divide\emergencystretch by 45 -\fi +\def\setemergencystretch{% + \ifx\emergencystretch\thisisundefined + % Allow us to assign to \emergencystretch anyway. + \def\emergencystretch{\dimen0}% + \else + \emergencystretch =3D .15\hsize + \fi +} =20 -% Use @smallbook to reset parameters for 7x9.5 format (or else 7x9.25) -\def\smallbook{ - \global\chapheadingskip =3D 15pt plus 4pt minus 2pt - \global\secheadingskip =3D 12pt plus 3pt minus 2pt - \global\subsecheadingskip =3D 9pt plus 2pt minus 2pt - % - \global\lispnarrowing =3D 0.3in - \setleading{12pt} - \advance\topskip by -1cm - \global\parskip 2pt plus 1pt - \global\hsize =3D 5in - \global\vsize=3D7.5in - \global\tolerance=3D700 - \global\hfuzz=3D1pt - \global\contentsrightmargin=3D0pt - \global\deftypemargin=3D0pt - \global\defbodyindent=3D.5cm - % - \global\pagewidth=3D\hsize - \global\pageheight=3D\vsize - % - \global\let\smalllisp=3D\smalllispx - \global\let\smallexample=3D\smalllispx - \global\def\Esmallexample{\Esmalllisp} +% Parameters in order: 1) textheight; 2) textwidth; 3) voffset; +% 4) hoffset; 5) binding offset; 6) topskip; 7) physical page height; 8) +% physical page width. +% +% We also call \setleading{\textleading}, so the caller should define +% \textleading. The caller should also set \parskip. +% +\def\internalpagesizes#1#2#3#4#5#6#7#8{% + \voffset =3D #3\relax + \topskip =3D #6\relax + \splittopskip =3D \topskip + % + \vsize =3D #1\relax + \advance\vsize by \topskip + \outervsize =3D \vsize + \advance\outervsize by 2\topandbottommargin + \pageheight =3D \vsize + % + \hsize =3D #2\relax + \outerhsize =3D \hsize + \advance\outerhsize by 0.5in + \pagewidth =3D \hsize + % + \normaloffset =3D #4\relax + \bindingoffset =3D #5\relax + % + \ifpdf + \pdfpageheight #7\relax + \pdfpagewidth #8\relax + \fi + % + \setleading{\textleading} + % + \parindent =3D \defaultparindent + \setemergencystretch } =20 +% @letterpaper (the default). +\def\letterpaper{{\globaldefs =3D 1 + \parskip =3D 3pt plus 2pt minus 1pt + \textleading =3D 13.2pt + % + % If page is nothing but text, make it come out even. + \internalpagesizes{46\baselineskip}{6in}% + {\voffset}{.25in}% + {\bindingoffset}{36pt}% + {11in}{8.5in}% +}} + +% Use @smallbook to reset parameters for 7x9.5 (or so) format. +\def\smallbook{{\globaldefs =3D 1 + \parskip =3D 2pt plus 1pt + \textleading =3D 12pt + % + \internalpagesizes{7.5in}{5in}% + {\voffset}{.25in}% + {\bindingoffset}{16pt}% + {9.25in}{7in}% + % + \lispnarrowing =3D 0.3in + \tolerance =3D 700 + \hfuzz =3D 1pt + \contentsrightmargin =3D 0pt + \defbodyindent =3D .5cm +}} + % Use @afourpaper to print on European A4 paper. -\def\afourpaper{ -\global\tolerance=3D700 -\global\hfuzz=3D1pt -\setleading{12pt} -\global\parskip 15pt plus 1pt - -\global\vsize=3D 53\baselineskip -\advance\vsize by \topskip -%\global\hsize=3D 5.85in % A4 wide 10pt -\global\hsize=3D 6.5in -\global\outerhsize=3D\hsize -\global\advance\outerhsize by 0.5in -\global\outervsize=3D\vsize -\global\advance\outervsize by 0.6in - -\global\pagewidth=3D\hsize -\global\pageheight=3D\vsize -} - -\bindingoffset=3D0pt -\normaloffset=3D\hoffset -\pagewidth=3D\hsize -\pageheight=3D\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=3D #1 - \global\topskip=3D #6 - \advance\vsize by \topskip - \global\voffset=3D #3 - \global\hsize=3D #2 - \global\outerhsize=3D\hsize - \global\advance\outerhsize by 0.5in - \global\outervsize=3D\vsize - \global\advance\outervsize by 0.6in - \global\pagewidth=3D\hsize - \global\pageheight=3D\vsize - \global\normaloffset=3D #4 - \global\bindingoffset=3D #5} - -% A specific text layout, 24x15cm overall, intended for A4 paper. Top mar= gin -% 29mm, hence bottom margin 28mm, nominal side margin 3cm. -\def\afourlatex - {\global\tolerance=3D700 - \global\hfuzz=3D1pt - \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}{7m= m}} +\def\afourpaper{{\globaldefs =3D 1 + \parskip =3D 3pt plus 2pt minus 1pt + \textleading =3D 13.2pt + % + % Double-side printing via postscript on Laserjet 4050 + % prints double-sided nicely when \bindingoffset=3D10mm and \hoffset=3D-= 6mm. + % To change the settings for a different printer or situation, adjust + % \normaloffset until the front-side and back-side texts align. Then + % do the same for \bindingoffset. You can set these for testing in + % your texinfo source file like this: + % @tex + % \global\normaloffset =3D -6mm + % \global\bindingoffset =3D 10mm + % @end tex + \internalpagesizes{51\baselineskip}{160mm} + {\voffset}{\hoffset}% + {\bindingoffset}{44pt}% + {297mm}{210mm}% + % + \tolerance =3D 700 + \hfuzz =3D 1pt + \contentsrightmargin =3D 0pt + \defbodyindent =3D 5mm +}} + +% Use @afivepaper to print on European A5 paper. +% From romildo@urano.iceb.ufop.br, 2 July 2000. +% He also recommends making @example and @lisp be small. +\def\afivepaper{{\globaldefs =3D 1 + \parskip =3D 2pt plus 1pt minus 0.1pt + \textleading =3D 12.5pt + % + \internalpagesizes{160mm}{120mm}% + {\voffset}{\hoffset}% + {\bindingoffset}{8pt}% + {210mm}{148mm}% + % + \lispnarrowing =3D 0.2in + \tolerance =3D 800 + \hfuzz =3D 1.2pt + \contentsrightmargin =3D 0pt + \defbodyindent =3D 2mm + \tableindent =3D 12mm +}} + +% A specific text layout, 24x15cm overall, intended for A4 paper. +\def\afourlatex{{\globaldefs =3D 1 + \afourpaper + \internalpagesizes{237mm}{150mm}% + {\voffset}{4.6mm}% + {\bindingoffset}{7mm}% + {297mm}{210mm}% + % + % Must explicitly reset to 0 because we call \afourpaper. + \globaldefs =3D 0 +}} + +% Use @afourwide to print on A4 paper in landscape format. +\def\afourwide{{\globaldefs =3D 1 + \afourpaper + \internalpagesizes{241mm}{165mm}% + {\voffset}{-2.95mm}% + {\bindingoffset}{7mm}% + {297mm}{210mm}% + \globaldefs =3D 0 +}} + +% @pagesizes TEXTHEIGHT[,TEXTWIDTH] +% Perhaps we should allow setting the margins, \topskip, \parskip, +% and/or leading, also. Or perhaps we should compute them somehow. +% +\parseargdef\pagesizes{\pagesizesyyy #1,,\finish} +\def\pagesizesyyy#1,#2,#3\finish{{% + \setbox0 =3D \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=3D#2\relax \= fi + \globaldefs =3D 1 + % + \parskip =3D 3pt plus 2pt minus 1pt + \setleading{\textleading}% + % + \dimen0 =3D #1 + \advance\dimen0 by \voffset + % + \dimen2 =3D \hsize + \advance\dimen2 by \normaloffset + % + \internalpagesizes{#1}{\hsize}% + {\voffset}{\normaloffset}% + {\bindingoffset}{44pt}% + {\dimen0}{\dimen2}% +}} + +% Set default to letter. +% +\letterpaper + + +\message{and turning on texinfo input format.} =20 % Define macros to output various characters with catcode for normal text. \catcode`\"=3D\other @@ -4661,6 +6818,7 @@ \catcode`\<=3D\other \catcode`\>=3D\other \catcode`\+=3D\other +\catcode`\$=3D\other \def\normaldoublequote{"} \def\normaltilde{~} \def\normalcaret{^} @@ -4669,9 +6827,10 @@ \def\normalless{<} \def\normalgreater{>} \def\normalplus{+} +\def\normaldollar{$}%$ font-lock fix =20 -% 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, +% This macro is used to make a character print one way in \tt +% (where it can probably be output as-is), 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 @@ -4679,7 +6838,13 @@ % 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=3D0pt #1\else #2\fi} +\def\ifusingtt#1#2{\ifdim \fontdimen3\font=3D0pt #1\else #2\fi} + +% Same as above, but check for italic font. Actually this also catches +% non-italic slanted fonts since it is impossible to distinguish them from +% italic fonts. But since this is only used by $ and it uses \sl anyway +% this is not a problem. +\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} =20 % Turn off all special characters except @ % (and those which the user can use as if they were ordinary). @@ -4687,10 +6852,10 @@ % use math or other variants that look better in normal text. =20 \catcode`\"=3D\active -\def\activedoublequote{{\tt \char '042}} +\def\activedoublequote{{\tt\char34}} \let"=3D\activedoublequote \catcode`\~=3D\active -\def~{{\tt \char '176}} +\def~{{\tt\char126}} \chardef\hat=3D`\^ \catcode`\^=3D\active \def^{{\tt \hat}} @@ -4698,10 +6863,10 @@ \catcode`\_=3D\active \def_{\ifusingtt\normalunderscore\_} % Subroutine for the previous macro. -\def\_{\leavevmode \kern.06em \vbox{\hrule width.3em height.1ex}} +\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07e= m } =20 \catcode`\|=3D\active -\def|{{\tt \char '174}} +\def|{{\tt\char124}} \chardef \less=3D`\< \catcode`\<=3D\active \def<{{\tt \less}} @@ -4710,15 +6875,8 @@ \def>{{\tt \gtr}} \catcode`\+=3D\active \def+{{\tt \char 43}} -%\catcode 27=3D\active -%\def^^[{$\diamondsuit$} - -% Set up an active definition for =3D, but don't enable it most of the tim= e. -{\catcode`\=3D=3D\active -\global\def=3D{{\tt \char 61}}} - -\catcode`+=3D\active -\catcode`\_=3D\active +\catcode`\$=3D\active +\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix =20 % 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. @@ -4728,45 +6886,48 @@ =20 \catcode`\@=3D0 =20 -% \rawbackslashxx output one backslash character in current font -\global\chardef\rawbackslashxx=3D`\\ -%{\catcode`\\=3D\other -%@gdef@rawbackslashxx{\}} - -% \rawbackslash redefines \ as input to do \rawbackslashxx. +% \backslashcurfont outputs one backslash character in current font, +% as in \char`\\. +\global\chardef\backslashcurfont=3D`\\ +\global\let\rawbackslashxx=3D\backslashcurfont % let existing .??s files = work + +% \rawbackslash defines an active \ to do \backslashcurfont. +% \otherbackslash defines an active \ to be a literal `\' character with +% catcode other. {\catcode`\\=3D\active -@gdef@rawbackslash{@let\=3D@rawbackslashxx }} + @gdef@rawbackslash{@let\=3D@backslashcurfont} + @gdef@otherbackslash{@let\=3D@realbackslash} +} =20 -% \normalbackslash outputs one backslash in fixed width font. -\def\normalbackslash{{\tt\rawbackslashxx}} +% \realbackslash is an actual character `\' with catcode other. +{\catcode`\\=3D\other @gdef@realbackslash{\}} =20 -% Say @foo, not \foo, in error messages. -\escapechar=3D`\@ +% \normalbackslash outputs one backslash in fixed width font. +\def\normalbackslash{{\tt\backslashcurfont}} =20 -% \catcode 17=3D0 % Define control-q \catcode`\\=3D\active =20 % Used sometimes to turn off (effectively) the active characters % even after parsing them. -@def@turnoffactive{@let"=3D@normaldoublequote -@let\=3D@realbackslash -@let~=3D@normaltilde -@let^=3D@normalcaret -@let_=3D@normalunderscore -@let|=3D@normalverticalbar -@let<=3D@normalless -@let>=3D@normalgreater -@let+=3D@normalplus} - -@def@normalturnoffactive{@let"=3D@normaldoublequote -@let\=3D@normalbackslash -@let~=3D@normaltilde -@let^=3D@normalcaret -@let_=3D@normalunderscore -@let|=3D@normalverticalbar -@let<=3D@normalless -@let>=3D@normalgreater -@let+=3D@normalplus} +@def@turnoffactive{% + @let"=3D@normaldoublequote + @let\=3D@realbackslash + @let~=3D@normaltilde + @let^=3D@normalcaret + @let_=3D@normalunderscore + @let|=3D@normalverticalbar + @let<=3D@normalless + @let>=3D@normalgreater + @let+=3D@normalplus + @let$=3D@normaldollar %$ font-lock fix + @unsepspaces +} + +% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of +% the literal character `\'. (Thus, \ is not expandable when this is in +% effect.) +% +@def@normalturnoffactive{@turnoffactive @let\=3D@normalbackslash} =20 % Make _ and + \other characters, temporarily. % This is canceled by @fixbackslash. @@ -4785,16 +6946,31 @@ % 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\ =3D @normalbackslash @fi - @catcode`+=3D@active @catcode`@_=3D@active} +@gdef@fixbackslash{% + @ifx\@eatinput @let\ =3D @normalbackslash @fi + @catcode`+=3D@active + @catcode`@_=3D@active +} + +% Say @foo, not \foo, in error messages. +@escapechar =3D `@@ =20 -%% These look ok in all fonts, so just make them not special. The @rm bel= ow -%% makes sure that the current font starts out as the newly loaded cmr10 -@catcode`@$=3D@other @catcode`@%=3D@other @catcode`@&=3D@other @catcode`@#= =3D@other +% These look ok in all fonts, so just make them not special. +@catcode`@& =3D @other +@catcode`@# =3D @other +@catcode`@% =3D @other =20 -@textfonts -@rm =20 @c Local variables: +@c eval: (add-hook 'write-file-hooks 'time-stamp) @c page-delimiter: "^\\\\message" +@c time-stamp-start: "def\\\\texinfoversion{" +@c time-stamp-format: "%:y-%02m-%02d.%02H" +@c time-stamp-end: "}" @c End: + +@c vim:sw=3D2: + +@ignore + arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 +@end ignore --St7VIuEGZ6dlpu13-- --qtZFehHsKgwS5rPz Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature Content-Disposition: inline Content-length: 189 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.5 (GNU/Linux) iD8DBQFCHBFnDMcLGCBsWv0RAiz0AKChactvbkYvThF2QrYMMI26XtkoxwCfRWUj IJrJSG65KvXzVRrwV/mYmAo= =x9Wu -----END PGP SIGNATURE----- --qtZFehHsKgwS5rPz-- --===============1096106095== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 140 _______________________________________________ Help-gnats mailing list Help-gnats@gnu.org http://lists.gnu.org/mailman/listinfo/help-gnats --===============1096106095==--